bitmuncher
Senior-Nerd
Da architect seine Toolchain schon fertig hat, hier schonmal der erste Teil des Basis-Builds. Ich möchte aber darauf hinweisen, dass es evtl. noch Änderungen bezüglich der Patches, Configure- und Compiler-Parameter usw. geben kann, wenn sich im weiteren Build noch Fehler aufzeigen oder das System nach dem Build nicht wie erwartet funktioniert.
Die Fortsetzung gibt es dann am WE.
Nachdem man wie unter Nach dem Server-Crash... beschrieben die Toolchain gebaut und in diese chrootet hat, wird zuerstmal die Standard-Ordnerstruktur eines Linux-Systems erzeugt. In der Chroot-Umgebung werden dafür folgende Befehle verwendet:
Ausserdem sollten wir ein paar notwendige Tools und Libs im Zielsystem verfügbar machen. Später werden sie ersetzt.
Dann brauchen wir noch eine password- und eine group-Datei und die mtab, damit grundlegende Rechte-Verteilung funktioniert:
Damit die Auflösung von User- und Gruppennamen korrekt funktioniert, wird eine neue Shell gestartet:
login, agetty und init brauchen ein paar Standard-Logs:
Nun kann das eigentliche Kompilieren beginnen. Ich habe die folgenden Anweisungen für die Pakete auf das eigentliche Kompilieren beschränkt. Das Runterladen und Entpacken der Sources, die unter http://www.habolinux.de/sources/ zu finden sind, sollte bis zur Installation von tar und wget im Host-System gemacht werden. Danach kann es auch innerhalb der chroot-Umgebung geschehen. Runtergeladen werden Pakete mittels
Entpackt wird dann mit
wodurch ein Ordner '<paketname>' entsteht, der die Sources enthält.
Bevor man mit dem Build beginnt, sollte der Inhalt des sources-Ordner gelöscht werden, in dem sich ja die kompilierten Sources der Toolchain befinden.
Bei den hier aufgeführten Befehlen gehe ich also davon aus, dass man sich im entpackten Source-Ordner in der chroot-Umgebung befindet und dass diese im sources-Ordner abgelegt sind, der im Host-System unter /hl/sources und in der chroot-Umgebung unter /sources verfügbar ist.
Linux API Headers (Paket: kernel.tar.gz)
Man-Pages (Paket: man-pages.tar.gz)
GlibC (Paket: glibc.tar.gz)
Toolchain "aufräumen"
Binutils (Paket: binutils.tar.gz)
GMP (Paket: gmp.tar.gz)
MPFR (Paket: mpfr.tar.gz)
Tar (Paket: tar.tar.gz)
GCC (Paket: gcc.tar.gz)
Wie der korrekte Output für die grep-Befehle auszusehen hat, kann man im LFS-Handbuch nachlesen.
DB4 (Paket: db4.tar.gz)
Sed (Paket: sed.tar.gz)
e2fsprogs (Paket: e2fsprogs.tar.gz)
Coreutils (coreutils.tar.gz)
M4 (Paket: m4.tar.gz)
Bison (Paket: bison.tar.gz)
Ncurses (Paket: ncurses.tar.gz)
ProcPS (Paket: procps.tar.gz
Libtool (Paket: libtool.tar.gz)
Zlib (Paket: zlib.tar.gz)
Perl (Paket: perl.tar.gz)
Readline (Paket: readline.tar.gz)
Autoconf (Paket: autoconf.tar.gz)
Automake (Paket: automake.tar.gz)
Bash (Paket: bash-3.2.48.tar.gz)
Bzip2 (Paket: bzip2.tar.gz)
Diffutils (Paket: diffutils.tar.gz)
File (Paket: file.tar.gz)
Gawk
Findutils
Flex (Paket: flex.tar.gz)
Grub (Paket: grub.tar.gz)
Gettext (Paket: gettext.tar.gz)
Die Fortsetzung gibt es dann am WE.
Nachdem man wie unter Nach dem Server-Crash... beschrieben die Toolchain gebaut und in diese chrootet hat, wird zuerstmal die Standard-Ordnerstruktur eines Linux-Systems erzeugt. In der Chroot-Umgebung werden dafür folgende Befehle verwendet:
Code:
mkdir -p /{bin,boot,etc/opt,home,lib,mnt,opt}
mkdir -p /{media/{floppy,cdrom},sbin,srv,var}
install -d -m 0750 /root
install -d -m 1777 /tmp /var/tmp
mkdir -p /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -p /usr/{,local/}share/{doc,info,locale,man}
mkdir /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -p /usr/{,local/}share/man/man{1..8}
for dir in /usr /usr/local; do
ln -s share/{man,doc,info} $dir
done
mkdir /var/{lock,log,mail,run,spool}
mkdir -p /var/{opt,cache,lib/{misc,locate},local}
Ausserdem sollten wir ein paar notwendige Tools und Libs im Zielsystem verfügbar machen. Später werden sie ersetzt.
Code:
ln -sv /tools/bin/{bash,cat,echo,grep,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
ln -sv bash /bin/sh
Dann brauchen wir noch eine password- und eine group-Datei und die mtab, damit grundlegende Rechte-Verteilung funktioniert:
Code:
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF
cat > /etc/group << "EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:4:
tape:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
uucp:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
mail:x:34:
nogroup:x:99:
EOF
touch /etc/mtab
Damit die Auflösung von User- und Gruppennamen korrekt funktioniert, wird eine neue Shell gestartet:
Code:
exec /tools/bin/bash --login +h
login, agetty und init brauchen ein paar Standard-Logs:
Code:
touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
chgrp utmp /var/run/utmp /var/log/lastlog
chmod 664 /var/run/utmp /var/log/lastlog
Nun kann das eigentliche Kompilieren beginnen. Ich habe die folgenden Anweisungen für die Pakete auf das eigentliche Kompilieren beschränkt. Das Runterladen und Entpacken der Sources, die unter http://www.habolinux.de/sources/ zu finden sind, sollte bis zur Installation von tar und wget im Host-System gemacht werden. Danach kann es auch innerhalb der chroot-Umgebung geschehen. Runtergeladen werden Pakete mittels
Code:
wget http://www.habolinux.de/sources/<paketname>.tar.gz
Entpackt wird dann mit
Code:
tar -xzf <paketname>.tar.gz
wodurch ein Ordner '<paketname>' entsteht, der die Sources enthält.
Bevor man mit dem Build beginnt, sollte der Inhalt des sources-Ordner gelöscht werden, in dem sich ja die kompilierten Sources der Toolchain befinden.
Bei den hier aufgeführten Befehlen gehe ich also davon aus, dass man sich im entpackten Source-Ordner in der chroot-Umgebung befindet und dass diese im sources-Ordner abgelegt sind, der im Host-System unter /hl/sources und in der chroot-Umgebung unter /sources verfügbar ist.
Linux API Headers (Paket: kernel.tar.gz)
Code:
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -r dest/include/* /usr/include
Man-Pages (Paket: man-pages.tar.gz)
Code:
make install
GlibC (Paket: glibc.tar.gz)
Code:
sed -i '/vi_VN.TCVN/d' localedata/SUPPORTED
sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in
cd /sources
mkdir glibc-build
cd glibc-build
echo "CFLAGS += -march=i486 -mtune=native" > configparms
../glibc/configure --prefix=/usr --disable-profile --enable-add-ons --enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc
make
cp ../glibc/iconvdata/gconv-modules iconvdata
touch /etc/ld.so.conf
make install
mkdir -p /usr/lib/locale
make localedata/install-locales
cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /etc/nsswitch.conf
EOF
tzselect
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
# End /etc/ld.so.conf
EOF
Toolchain "aufräumen"
Code:
mv -v /tools/bin/{ld,ld-old}
mv /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv /tools/bin/{ld-new,ld}
ln -s /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
gcc -dumpspecs | sed -e 's@/tools/lib/ld-linux.so.2@/lib/ld-linux.so.2@g' -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > `dirname $(gcc --print-libgcc-file-name)`/specs
Binutils (Paket: binutils.tar.gz)
Code:
mkdir ../binutils-build
cd ../binutils-build
../binutils/configure --prefix=/usr --enable-shared
make tooldir=/usr
make tooldir=/usr install
cp ../binutils/include/libiberty.h /usr/include
GMP (Paket: gmp.tar.gz)
Code:
./configure --prefix=/usr --enable-cxx --enable-mpbsd
make
make install
mkdir /usr/share/doc/gmp-4.3.0
cp doc/{isa_abi_headache,configuration} doc/*.html /usr/share/doc/gmp-4.3.0
MPFR (Paket: mpfr.tar.gz)
Code:
./configure --prefix=/usr --enable-thread-safe
make
make install
Tar (Paket: tar.tar.gz)
Code:
./configure --prefix=/usr --bindir=/bin --libexecdir=/usr/sbin
make
make install
GCC (Paket: gcc.tar.gz)
Code:
sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
mkdir ../gcc-build
cd ../gcc-build
../gcc/configure --prefix=/usr --libexecdir=/usr/lib --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-languages=c,c++ --disable-bootstrap
make
make -k check
../gcc/contrib/test_summary
make install
ln -s ../usr/bin/cpp /lib
ln -s gcc /usr/bin/cc
echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
grep -B4 '^ /usr/include' dummy.log
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
grep "/lib/libc.so.6 " dummy.log
grep found dummy.log
rm dummy.c a.out dummy.log
DB4 (Paket: db4.tar.gz)
Code:
patch -Np1 -i patches/db-4.7.25-upstream_fixes-1.patch
cd build_unix
../dist/configure --prefix=/usr --enable-compat185 --enable-cxx
make
make docdir=/usr/share/doc/db-4.7.25 install
chown -Rv root:root /usr/share/doc/db-4.7.25
Sed (Paket: sed.tar.gz)
Code:
./configure --prefix=/usr --bindir=/bin --enable-html
make
make install
e2fsprogs (Paket: e2fsprogs.tar.gz)
Code:
sed -i 's@/bin/rm@/tools&@' lib/blkid/test_probe.in
mkdir build
cd build
../configure --prefix=/usr --with-root-prefix="" --enable-elf-shlibs
make
make install
make install-libs
chmod -v u+w /usr/lib/{libblkid,libcom_err,libe2p,libext2fs,libss,libuuid}.a
gunzip -v /usr/share/info/libext2fs.info.gz
install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo
install -v -m644 doc/com_err.info /usr/share/info
install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info
install -v -m644 -D ../doc/libblkid.txt /usr/share/doc/e2fsprogs-1.41.5/libblkid.txt
Coreutils (coreutils.tar.gz)
Code:
./configure --prefix=/usr --enable-install-program=hostname --enable-no-install-program=kill,uptime
make
make NON_ROOT_USERNAME=nobody check-root
echo "dummy:x:1000:nobody" >> /etc/group
chown -Rv nobody config.log {gnulib-tests,lib,src}/.deps
sed -i '/dummy/d' /etc/group
make install
mv /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
mv /usr/bin/{false,hostname,ln,ls,mkdir,mknod,mv,pwd,readlink,rm} /bin
mv /usr/bin/{rmdir,stty,sync,true,uname} /bin
mv /usr/bin/chroot /usr/sbin
mv /usr/bin/{head,sleep,nice} /bin
M4 (Paket: m4.tar.gz)
Code:
./configure --prefix=/usr --enable-threads
make
make check
make install
Bison (Paket: bison.tar.gz)
Code:
./configure --prefix=/usr
echo '#define YYENABLE_NLS 1' >> config.h
make
make check
make install
Ncurses (Paket: ncurses.tar.gz)
Code:
./configure --prefix=/usr --with-shared --without-debug --enable-widec
make
make install
chmod 644 /usr/lib/libncurses++w.a
mv /usr/lib/libncursesw.so.5* /lib
ln -sf ../../lib/libncursesw.so.5 /usr/lib/libncursesw.so
for lib in curses ncurses form panel menu ; do \
rm -vf /usr/lib/lib${lib}.so ; \
echo "INPUT(-l${lib}w)" >/usr/lib/lib${lib}.so ; \
ln -sfv lib${lib}w.a /usr/lib/lib${lib}.a ; \
done
ln -sf libncurses++w.a /usr/lib/libncurses++.a
rm -f /usr/lib/libcursesw.so
echo "INPUT(-lncursesw)" >/usr/lib/libcursesw.so
ln -sf libncurses.so /usr/lib/libcurses.so
ln -sf libncursesw.a /usr/lib/libcursesw.a
ln -sf libncurses.a /usr/lib/libcurses.a
mkdir /usr/share/doc/ncurses-5.7
cp -R doc/* /usr/share/doc/ncurses-5.7
make distclean
./configure --prefix=/usr --with-shared --without-normal --without-debug --without-cxx-binding
make sources libs
cp -av lib/lib*.so.5* /usr/lib
ProcPS (Paket: procps.tar.gz
Code:
make
make install
Libtool (Paket: libtool.tar.gz)
Code:
./configure --prefix=/usr
make
make install
Zlib (Paket: zlib.tar.gz)
Code:
./configure --prefix=/usr --shared --libdir=/lib
make
make install
rm /lib/libz.so
ln -sf ../../lib/libz.so.1.2.3 /usr/lib/libz.so
make clean
./configure --prefix=/usr
make
make install
chmod -v 644 /usr/lib/libz.a
Perl (Paket: perl.tar.gz)
Code:
echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
patch -Np1 -i patches/perl-5.10.0-consolidated-1.patch
sed -i -e "s|BUILD_ZLIB\s*= True|BUILD_ZLIB = False|" \
-e "s|INCLUDE\s*= ./zlib-src|INCLUDE = /usr/include|" \
-e "s|LIB\s*= ./zlib-src|LIB = /usr/lib|" \
ext/Compress/Raw/Zlib/config.in
sh Configure -des -Dprefix=/usr -Dvendorprefix=/usr -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dpager="/usr/bin/less -isR"
make
make test
make install
Readline (Paket: readline.tar.gz)
Code:
sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install
./configure --prefix=/usr --libdir=/lib
make SHLIB_LIBS=-lncurses
make install
mv -v /lib/lib{readline,history}.a /usr/lib
rm -v /lib/lib{readline,history}.so
ln -sfv ../../lib/libreadline.so.6 /usr/lib/libreadline.so
ln -sfv ../../lib/libhistory.so.6 /usr/lib/libhistory.so
mkdir /usr/share/doc/readline-6.0
install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-6.0
Autoconf (Paket: autoconf.tar.gz)
Code:
./configure --prefix=/usr
make
make install
Automake (Paket: automake.tar.gz)
Code:
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.10.2
make
make install
Bash (Paket: bash-3.2.48.tar.gz)
Code:
./configure --prefix=/usr --bindir=/bin --without-bash-malloc --with-installed-readline ac_cv_func_working_mktime=yes
make
sed -i 's/LANG/LC_ALL/' tests/intl.tests
sed -i 's@tests@& </dev/tty@' tests/run-test
chown -Rv nobody ./
su-tools nobody -s /bin/bash -c "make tests"
make install
exec /bin/bash --login +h
Bzip2 (Paket: bzip2.tar.gz)
Code:
patch -Np1 -i patches/bzip2-1.0.5-install_docs-1.patch
make -f Makefile-libbz2_so
make clean
make PREFIX=/usr install
cp -v bzip2-shared /bin/bzip2
cp -av libbz2.so* /lib
ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so
rm -v /usr/bin/{bunzip2,bzcat,bzip2}
ln -sv bzip2 /bin/bunzip2
ln -sv bzip2 /bin/bzcat
Diffutils (Paket: diffutils.tar.gz)
Code:
patch -Np1 -i patches/diffutils-2.8.1-i18n-1.patch
touch man/diff.1
./configure --prefix=/usr
make
make install
File (Paket: file.tar.gz)
Code:
./configure --prefix=/usr
make
make install
Gawk
Code:
./configure --prefix=/usr --libexecdir=/usr/lib ac_cv_func_working_mktime=yes
make
make install
mkdir /usr/share/doc/gawk-3.1.6
cp doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-3.1.6
Findutils
Code:
./configure --prefix=/usr --libexecdir=/usr/lib/findutils --localstatedir=/var/lib/locate
make
make check
make install
mv /usr/bin/find /bin
sed -i -e 's/find:=${BINDIR}/find:=\/bin/' /usr/bin/updatedb
Flex (Paket: flex.tar.gz)
Code:
./configure --prefix=/usr
make
make check
make install
ln -sv libfl.a /usr/lib/libl.a
cat > /usr/bin/lex << "EOF"
#!/bin/sh
# Begin /usr/bin/lex
exec /usr/bin/flex -l "$@"
# End /usr/bin/lex
EOF
chmod 755 /usr/bin/lex
mkdir /usr/share/doc/flex-2.5.35
cp doc/flex.pdf /usr/share/doc/flex-2.5.35
Grub (Paket: grub.tar.gz)
Code:
patch -Np1 -i patches/grub-0.97-disk_geometry-1.patch
patch -Np1 -i patches/grub-0.97-256byte_inode-1.patch
./configure --prefix=/usr
make
make install
mkdir /boot/grub
cp /usr/lib/grub/i386-pc/stage{1,2} /boot/grub
Gettext (Paket: gettext.tar.gz)
Code:
./configure --prefix=/usr --docdir=/usr/share/doc/gettext-0.17
make
make check
make install