You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
8.5 KiB
197 lines
8.5 KiB
Based on portage-3.0.8 and gentoo-20201101 snapshot
|
|
|
|
The specifics of this document (software versions and whatnot) are subject to
|
|
change as gentoo evolves, but I hope the big lines of it won't change too
|
|
much.
|
|
|
|
This guide starts off with a system built from build_cross.sh, built for
|
|
x86_64 with i686 multilib.
|
|
It might be possible to adapt both that script, and this guide for other
|
|
architectures, but this guide won't go into detail.
|
|
|
|
You should be running a system with a x86_64 kernel (with i686 support).
|
|
Install the required sources (listed in gentoo.wget-list) into /sources.
|
|
|
|
Before entering the system, create the basic directory layout by unpacking
|
|
the baselayout tarball, and running:
|
|
make layout OS=Linux DESTDIR=<ROOT>
|
|
NOTE: In the future this might have to become `layout-usrmerge`
|
|
|
|
To enter the bootstrap system as a chroot, use the following commands to set
|
|
up the filesystems and entering:
|
|
mount -t proc proc proc
|
|
mount -t sysfs sysfs sys
|
|
mount -t devtmpfs devtmpfs dev
|
|
mount -t devpts devpts dev/pts
|
|
mount -t tmpfs tmpfs dev/shm
|
|
touch etc/resolv.conf
|
|
mount --bind /etc/resolv.conf etc/resolv.conf
|
|
./bootstrap/bin/chroot . /bootstrap/bin/env -i PATH=/bin:/sbin:/usr/bin:/usr/sbin:/bootstrap/bin:/bootstrap/sbin HOME=/root /bootstrap/bin/sh -l
|
|
|
|
To install all the prerequisite tools, place the sources (listed in
|
|
gentoo.wget-list) under /sources, then run the gentoo_tools.sh script.
|
|
|
|
Configure portage:
|
|
echo "portage:x:250:250:portage:/var/tmp/portage:/bin/false" > /etc/passwd
|
|
echo "portage::250:portage" > /etc/group
|
|
echo "C UTF-8" > /etc/locale.gen
|
|
cat > /etc/portage/make.conf << 'EOF'
|
|
FEATURES='-pid-sandbox -news'
|
|
ROOTPATH=/bootstrap/bin:/bootstrap/sbin
|
|
EOF
|
|
ln -sf ../../var/db/repos/gentoo/profiles/default/linux/amd64/17.1/ /etc/portage/make.profile
|
|
|
|
NOTE: You can copy the ebuild repository archive, gpgsig and md5sum to
|
|
/var/cache/distfiles to avoid downloading.
|
|
|
|
Install ebuild repository (pick appropriate date, see distfiles.gentoo.org/snapshots):
|
|
emerge-webrsync -k -v --revert=20201101
|
|
|
|
Install baselayout:
|
|
emerge -O1 sys-apps/baselayout
|
|
cp /usr/share/baselayout/{passwd,group} /etc/
|
|
|
|
Install some ebuild prerequisites:
|
|
emerge -O1 sys-apps/gentoo-functions # Used by elt-patches and a ton of other things
|
|
emerge -O1 app-portage/elt-patches # required by elibtoolize(libtool.eclass), used to install any library
|
|
emerge -O1 sys-devel/gnuconfig # required by gnuconfig_update(gnuconfig.eclass), used by toolchain(-glibc).eclass, doesn't hurt to have
|
|
emerge -O1 sys-devel/binutils-config sys-devel/gcc-config
|
|
|
|
First, we will build an updated binutils+gcc combo that targets /usr instead
|
|
of /bootstrap. This makes it easier to bootstrap glibc and everything else. We
|
|
will use portage for this, even though it's a mess.
|
|
|
|
NOTE: Doing this is (probably) *BAAAAD*, since we're linking the compiler
|
|
support libraries with a potentially incompatible version of glibc in
|
|
/bootstrap, and upgrading it afterwards. Glibc should always be installed
|
|
first into a new prefix! However, due to the complex relationship between
|
|
glibc, gcc, libgcc and libstdc++, this is rather hard to do while wrangling
|
|
the change from /bootstrap to /usr, as well as the multilib libdir changes, so
|
|
for simplicity's sake, I won't bother. This just works™.
|
|
|
|
Install temporary libc files for target compiler:
|
|
ln -sf /bootstrap/lib/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
|
|
ln -sf /bootstrap/lib32/ld-linux.so.2 /lib/ld-linux.so.2
|
|
ln -sf /bootstrap/lib/{crti,crtn,Scrt1}.o \
|
|
/bootstrap/lib/{libc,libm,libpthread}.so /usr/lib64/
|
|
ln -sf /bootstrap/lib32/{crti,crtn,Scrt1}.o \
|
|
/bootstrap/lib32/{libc,libm,libpthread}.so /usr/lib/
|
|
mkdir -p /usr/include
|
|
ln -sf /bootstrap/include/limits.h /usr/include/limits.h
|
|
|
|
Install binutils+GCC (linked against /bootstrap):
|
|
USE='-*' emerge -O1 sys-devel/binutils
|
|
USE='-* static-libs' EXTRA_ECONF=--disable-shared \
|
|
CPPFLAGS='-I/usr/include' LDFLAGS='-L/usr/lib64 -L/usr/lib' \
|
|
emerge -O1 dev-libs/gmp dev-libs/mpfr dev-libs/mpc
|
|
USE='-*' EXTRA_ECONF=--disable-bootstrap GCC_MAKE_TARGET=all \
|
|
CPPFLAGS='-I/usr/include' LDFLAGS='-L/usr/lib64 -L/usr/lib' \
|
|
CPATH=/bootstrap/include \
|
|
emerge -O1 sys-devel/gcc
|
|
emerge --rage-clean dev-libs/gmp dev-libs/mpfr dev-libs/mpc
|
|
gcc-config 1 # Not automatic unlike binutils-config...
|
|
|
|
NOTE: The Glibc ebuild downloads a file called gcc-multilib-bootstrap, which
|
|
contains prebuilt binaries to bootstrap multilib gcc. This is _only_ used when
|
|
the command "echo 'int main(){}' | $CC -m32 -xc -" fails, and shouldn't be
|
|
being used in this bootstrap, but you can make sure of that by patching the
|
|
ebuild to `die` instead of running the `sed` command to enable its use.
|
|
|
|
NOTE: BOOTSTRAP_RAP=1 is only used in the Glibc ebuild, to avoid a pre-install
|
|
check that might pick up programs from /bootstrap to test against the
|
|
installed glibc, as well as picking up python from $PATH instead of
|
|
eselect-python. I'm not aware of how the support status is for this variable,
|
|
and as such it might disappear in the future, or be used in more packages.
|
|
|
|
Install initial glibc:
|
|
CC=/bootstrap/bin/gcc emerge -O1 sys-kernel/linux-headers
|
|
USE='-*' BOOTSTRAP_RAP=1 emerge -O1 sys-libs/glibc
|
|
|
|
NOTE: `sandbox` outputs a failure message to stderr for every program still
|
|
built against /bootstrap, which includes the compiler. Some autoconf scripts
|
|
check stderr to determine a failure, so this causes builds to fail. This is
|
|
why it's (partially) disabled for this stage.
|
|
|
|
Bootstrap the rest of the system:
|
|
USE=-seccomp emerge -O1 app-misc/pax-utils
|
|
cd /var/db/repos/gentoo/scripts
|
|
mkdir -p /var/run
|
|
ln -s /bootstrap/bin/python3 /usr/bin/python
|
|
rm -f /etc/profile.env
|
|
USE=-nls FEATURES=-usersandbox BOOTSTRAP_RAP=1 ./bootstrap.sh
|
|
|
|
Reinitialize the environment:
|
|
env-update
|
|
exec bash -l
|
|
export PATH=$PATH:/bootstrap/bin:/bootstrap/sbin
|
|
|
|
In the following stages, you'll get tons of LD_PRELOAD libsandbox.so errors
|
|
from programs still linked against /bootstrap. This is safe to ignore, and
|
|
will gradually disappear as programs are rebuilt.
|
|
|
|
It'd be nice to remove the bootstrap tools now, but among wget/openssl, gawk,
|
|
gzip, grep, and other tools, they're still required for some reason.
|
|
|
|
From this point onward, you're pretty much on your own to beat portage into
|
|
performing an `emerge -e @system` and fixing any unspecified dependencies you
|
|
encounter along the way. This can be done in a whole number of ways, and will
|
|
differ on any given day, since this method of bootstrapping is painfully
|
|
unsupported by gentoo devs. Below I detail my most recent procedure, which, I
|
|
can't stress enough, may or may not work at the time you're reading this.
|
|
|
|
Fix circular dependencies:
|
|
USE=-filecaps emerge -O1 sys-libs/pam
|
|
USE='-acl -xattr' emerge -O1 sys-apps/shadow # required by acct-group/acct-user
|
|
|
|
Build everything:
|
|
emerge -be @system
|
|
|
|
Clean up bootstrap tools/configs:
|
|
rm -rf /bootstrap /sources
|
|
rm -f /etc/portage/make.conf
|
|
|
|
Reinitialize environment:
|
|
env-update
|
|
exec bash -l
|
|
|
|
NOTE: Re-entering chroot after this point:
|
|
chroot . /usr/bin/env -i /bin/su -l
|
|
NOTE: Cleaning up the chroot:
|
|
umount -R proc sys dev etc/resolv.conf
|
|
|
|
(optional) consider rebuilding everything again without /bootstrap, to ensure sanity:
|
|
emerge -be @system
|
|
|
|
To install everything into a clean root:
|
|
USE=build emerge --root /final sys-apps/baselayout
|
|
emerge --root /final -K -j$(nproc) @system
|
|
#emerge --root /final --sysroot /final -K --with-bdeps=y --root-deps -j$(nproc) @system
|
|
TODO: How to forcefully install _everything_
|
|
|
|
Now you're essentially done. You can move /final (as well as /var/db/repos,
|
|
/var/cache/distfiles and /var/cache/binpkgs) to a proper disk and start using
|
|
it, or copy the built binpkgs to an existing install and install them. This
|
|
guide will further go over how to make a stage3 and install CD, in case you're
|
|
installing a new machine, or just want to know how that's done.
|
|
|
|
Prepare files for catalyst:
|
|
mkdir -p /var/tmp/catalyst/builds/default
|
|
cd /var/tmp/catalyst/builds/default
|
|
tar -C /final -cf stage3-amd64-latest.tar .
|
|
rm -rf /final
|
|
|
|
# Adjust to hash relevant for portage tree date, see https://gitweb.gentoo.org/proj/releng.git/log/
|
|
wget https://gitweb.gentoo.org/proj/releng.git/snapshot/releng-0430f1f0ced5a3137f284ec426b7431be7d53085.tar.bz2
|
|
tar xf releng-*.tar.bz2
|
|
cd releng-*/
|
|
sed -i -e 's:@TIMESTAMP@:now:g' -e "s:@REPO_DIR@:$PWD:g" releases/specs/amd64/*.spec
|
|
cd releases/specs/amd64
|
|
|
|
Build the stage3:
|
|
emerge dev-util/catalyst app-arch/pixz
|
|
catalyst -s now
|
|
catalyst -f stage1.spec && catalyst -f stage2.spec && catalyst -f stage3.spec
|
|
rm -f /var/tmp/catalyst/builds/default/stage3-amd64-latest.tar
|
|
|
|
Build the install CD (failed at time of writing, see https://bugs.gentoo.org/713946):
|
|
catalyst -f installcd-stage1.spec && catalyst -f installcd-stage2-minimal.spec
|
|
|