Nach dem Server-Crash...

bitmuncher

Senior-Nerd
Der ein oder andere hat ja mitbekommen, dass es auf dem alten Server einen Hardware-Schaden gab. Leider liess sich der Hoster nicht überreden mir die alten Festplatten zu verkaufen, da für diesen Server kein Backup-Space zur Verfügung stand. Konsequenz daraus ist, dass der Inhalt des SVN und des Wiki sowie die Mailingliste verloren gegangen sind. Da ich aber das Projekt nicht ganz aufgeben will, habe ich angefangen die Versionsverwaltungsinhalte wieder aufzubauen. Die Sources für die Toolchain stehen bereits wieder zur Verfügung. Da aber die Login-Daten für die alte Versionsverwaltung auch weg sind, habe ich die Quelltexte zu Tarballs zusammengepackt und sie unter http://www.habolinux.de/sources/ eingespielt. Es handelt sich dabei um die aktuellsten Versionen, die von den entsprechenden Projekten derzeit zur Verfügung stehen. Das hat zur Folge, dass die Toolchain neu gebaut werden muss. Zukünftig steht ein Backup-Space in einem anderen Rechenzentrum zur Verfügung. Eine Automatisierung des Backups wird nächste Woche eingerichtet. An dieser Stelle meinen Dank an Marinka nach .ru, die den neuen Backup-Space zur Verfügung stellt und bei der Serververwaltung behilflich sein wird, wenn ich Zeitmangel habe.

Wer sich also noch am Projekt beteiligen und beim Bau mitmachen will, der kann die folgende Anleitung nutzen um eine Toolchain zu erstellen...

Grossteils kann man sich beim Bau an die Anleitung von LinuxFromScratch halten. Da aber teilweise neuere Programmversionen eingesetzt werden, sind einige Abweichungen notwendig. Ausserdem habe ich auf einige der Patches verzichtet. Einerseits, weil neuere Versionen verwendet werden, die diese bereits enthalten, andererseits weil ich sehen will wie sich das System verhält, wenn bestimmte Patches nicht enthalten sind. Sollten sie sich als notwendig erweisen, kann man sie immernoch einbauen.

Ich empfehle den Bau in einer virtuelle Maschine wie VirtualBox o.ä. Je mehr RAM man zur Verfügung stellen kann, umso schneller geht der Build. Als virtuelle Festplatte sollten ca. 10GB zur Verfügung stehen. Als Host-System wird eine LFS-LiveCD eingesetzt, die man unter http://www.habolinux.de/lfslivecd-x86-6.3-r2145.iso downloaden kann. Der Build ist damit natürlich auch auf einem "echten" PC möglich. Der Ablauf ist dann im einzelnen wie folgt:

Zuerstmal die LFS-Live-CD booten und die root-Konsole durch Druck auf "Enter" aktivieren.

Danach die Disk mit 'fdisk' partitionieren:
Code:
fdisk /dev/hda # ggf. das Device anpassen, wenn keine VirtualBox verwendet wird
Für den Build brauchen wir 2 Partitionen für / und swap, wobei wir die erste als primäre Partition mit 1GB als swap einrichten (Partitionstyp festlegen nicht vergessen!) und der Rest wird als primäre Linux-Partition angelegt. Das Ganze dann abspeichern ('w') und Formatieren:
Code:
mkswap /dev/hda1 # ggf. das Device anpassen, wenn anders partitioniert wurde
mkfs.ext3 /dev/hda2 # ggf. das Device anpassen, wenn anders partitioniert wurde
Die Swap wird erstmal nicht benötigt, daher wird nur die ext3-Partition gemountet:
Code:
mkdir /hl
mount -t ext3 /dev/hda2 /hl

Der Build der Toolchain muss (und sollte) nicht als root durchgeführt werden. Daher wird dafür ein extra Benutzer angelegt, den wir 'hl' nennen.
Code:
groupadd hl
useradd -g hl -s /bin/bash -m -k /dev/null hl
passwd hl

Die Toolchain wird in /hl/tools landen, während die Sources temporär in /hl/sources abgelegt werden, wo dann auch kompiliert wird. Also sollten diese beiden Ordner angelegt und dem Benutzer 'hl' zugeordnet werden. Damit die Toolchain im Host-System später auch unter /tools verfügbar ist, wird /hl/tools nach / verlinkt:
Code:
mkdir /hl/tools /hl/sources
chown -R hl:hl /hl
ln -s /hl/tools /

Dann wechselt man den Benutzer:
Code:
su - hl
Alternativ kann man sich auch via SSH einloggen, was das Copy&Paste erleichtert. ;) Wie man ein Portforwarding für VirtualBox einrichtet, kann man unter http://mydebian.blogdns.org/?p=148 nachlesen. Der SSH-Server kann bei der LFS-LiveCD mittels '/etc/rc.d/init.d/sshd start' gestartet werden.

Um nicht ständig Umgebungsvariablen ändern zu müssen, werden einige festgelegt. Solange die VM nicht neugestartet wird, bleiben diese auch erhalten. Bei VirtualBox kann man eine VM anhalten und dabei ihren Status speichern, so dass man den Build jederzeit fortsetzen kann, indem man sich einfach wieder als Benutzer 'hl' anmeldet.
Code:
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
cat > ~/.bashrc << "EOF"
set +h
umask 022
HL=/hl
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/bin
export HL LC_ALL PATH
EOF
source ~/.bash_profile

Nun kann das eigentliche Kompilieren beginnen. Wer einen der folgenden Befehle nicht versteht, sollte im LFS-Handbuch nachschlagen oder die Manpages dazu lesen.

Binutils bauen:
Code:
cd /hl/sources
wget http://www.habolinux.de/sources/binutils.tar.gz
tar -xzf binutils.tar.gz
mkdir binutils-build && cd binutils-build
CC="gcc -B/usr/bin/" ../binutils/configure --prefix=/tools --disable-nls --disable-werror
make
make install
make -C ld clean
make -C ld LIB_PATH=/tools/lib
cp ld/ld-new /tools/bin

GCC bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/gcc.tar.gz
wget http://www.habolinux.de/sources/gmp.tar.gz
wget http://www.habolinux.de/sources/mpfr.tar.gz
tar -xzf gcc.tar.gz
tar -xzf gmp.tar.gz
tar -xzf mpfr.tar.gz
mv mpfr gcc
mv gmp gcc
mkdir gcc-build
cd gcc-build
CC="gcc -B/usr/bin/" ../gcc/configure --prefix=/tools --with-local-prefix=/tools --disable-nls --disable-shared --disable-libssp --enable-languages=c
make
make install
ln -s libgcc.a `gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`
ln -vs gcc /tools/bin/cc

Linux API Headers installieren:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/kernel.tar.gz
tar -xzf kernel.tar.gz
cd kernel
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -r dest/include/* /tools/include

Glibc bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/glibc.tar.gz
tar -xzf glibc.tar.gz
cd glibc
sed -i 's@/etc/ld.so.preload@/tools/etc/ld.so.preload@' elf/rtld.c
cd ..
mkdir glibc-build
cd glibc-build
echo "CFLAGS += -march=i486 -mtune=native" > configparms
../glibc/configure --prefix=/tools --disable-profile --enable-add-ons --enable-kernel=2.6.0 --with-binutils=/tools/bin --without-gd --with-headers=/tools/include --without-selinux
make
mkdir /tools/etc
touch /tools/etc/ld.so.conf
make install

Linker einstellen:
Code:
mv /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 's@/lib/ld-linux.so.2@/tools&@g' > `dirname $(gcc -print-libgcc-file-name)`/specs
GCC_FIXED=`dirname $(gcc -print-libgcc-file-name)`/include-fixed &&
find ${GCC_FIXED}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; &&
rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_FIXED}/*` &&
unset GCC_FIXED

TCL bauen:
Code:
cd $HL/sources
http://www.habolinux.de/sources/tcl.tar.gz
tar -xzf tcl.tar.gz
cd tcl/unix
./configure --prefix=/tools
make
TZ=UTC make test
make install
chmod u+w /tools/lib/libtcl8.5.so
make install-private-headers
ln -s tclsh8.5 /tools/bin/tclsh

Expect bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/expect.tar.gz
tar -xzf expect.tar.gz
cd expect
patch -Np1 -i patches/expect-5.43.0-spawn-2.patch
patch -Np1 -i patches/expect-5.43.0-tcl_8.5.5_fix-1.patch
cp configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure
./configure --prefix=/tools --with-tcl=/tools/lib --with-tclinclude=/tools/include --with-x=no
make
make test
make SCRIPTS="" install

Dejagnu bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/dejagnu.tar.gz
tar -xzf dejagnu.tar.gz
cd dejagnu
./configure --prefix=/tools
make install

2. Durchlauf für GCC:
Code:
cd $HL/sources
rm -rf gcc*
wget http://www.habolinux.de/sources/gcc.tar.gz
tar -xzf gcc.tar.gz
cd gcc
cp gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in
cp gcc/Makefile.in{,.tmp}
sed 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp > gcc/Makefile.in
for file in $(find gcc/config -name linux64.h -o -name linux.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' -e 's@/usr@/tools@g' $file.orig > $file
  echo "
#undef STANDARD_INCLUDE_DIR
#define STANDARD_INCLUDE_DIR 0" >> $file
  touch $file.orig
done
cd ..
tar -xzf gmp.tar.gz
tar -xzf mpfr.tar.gz
mv gmp gcc
mv mpfr gcc
mkdir gcc-build
cd gcc-build
../gcc/configure --prefix=/tools --with-local-prefix=/tools --enable-clocale=gnu --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-languages=c,c++ --disable-libstdcxx-pch --disable-bootstrap
make
make -k check
make install

2. Durchlauf für Binutils:
Code:
cd $HL/sources
rm -rf binutils*
wget http://www.habolinux.de/sources/binutils.tar.gz
tar -xzf binutils.tar.gz
mkdir binutils-build
cd binutils-build
../binutils/configure --prefix=/tools --disable-nls --with-lib-path=/tools/lib
make
make install
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp ld/ld-new /tools/bin

Ncurses bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/ncurses.tar.gz
tar -xzf ncurses.tar.gz
cd ncurses
./configure --prefix=/tools --with-shared --without-debug --without-ada --enable-overwrite
make
make install

Bash bauen (sollten diese Sources nicht fehlerfrei bauen, dann http://www.habolinux.de/sources/bash-3.2.48.tar.gz verwenden):
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/bash.tar.gz
tar -xzf bash.tar.gz
cd bash
./configure --prefix=/tools --without-bash-malloc ac_cv_func_working_mktime=yes
make
make install
ln -s bash /tools/bin/sh

Bzip2 bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/bzip2.tar.gz
tar -xzf bzip2.tar.gz
cd bzip2
make
make PREFIX=/tools install

GPerf bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/gperf.tar.gz
tar -xzf gperf.tar.gz
cd gperf
./configure --prefix=/tools
make
make install

Coreutils bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/coreutils.tar.gz
tar -xzf coreutils.tar.gz
cd coreutils
./configure --prefix=/tools --enable-install-program=hostname
make
make install
cp src/su /tools/bin/su-tools

Diffutils bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/diffutils.tar.gz
tar -xzf diffutils.tar.gz
cd diffutils
./configure --prefix=/tools
make
make install

e2fsprogs bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/e2fsprogs.tar.gz
tar -xzf e2fsprogs.tar.gz
cd e2fsprogs
mkdir build
cd build
../configure --prefix=/tools
make
make install-libs
chmod u+w /tools/lib/{libblkid,libcom_err,libe2p,libext2fs,libss,libuuid}.a

Findutils bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/findutils.tar.gz
tar -xzf findutils.tar.gz
cd findutils
./configure --prefix=/tools
make
make install

GAwk bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/gawk.tar.gz
tar -xzf gawk.tar.gz
cd gawk
./configure --prefix=/tools ac_cv_func_working_mktime=yes
make
make install

Gettext bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/gettext.tar.gz
tar -xzf gettext.tar.gz
cd gettext/gettext-tools
./configure --prefix=/tools --disable-shared
make -C gnulib-lib
make -C src msgfmt
cp src/msgfmt /tools/bin

Grep bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/grep.tar.gz
tar -xzf grep.tar.gz
cd grep
./configure --prefix=/tools --disable-perl-regexp --without-included-regex
make
make install

GZip bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/gzip.tar.gz
tar -xzf gzip.tar.gz
cd gzip
for file in gzip.c lib/utimens.{c,h} ; do \
  cp -v $file{,.orig}
  sed 's/futimens/gl_&/' $file.orig > $file
done
./configure --prefix=/tools
make
make install

M4 bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/m4.tar.gz
tar -xzf m4.tar.gz
cd m4
./configure --prefix=/tools
make
make install

Make bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/make.tar.gz
tar -xzf make.tar.gz
cd make
./configure --prefix=/tools
make
make install

Patch bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/patch.tar.gz
tar -xzf patch.tar.gz
cd patch
./configure --prefix=/tools
make
make install

Perl bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/perl.tar.gz
tar -xzf perl.tar.gz
cd perl
patch -Np1 -i patches/perl-5.10.0-consolidated-1.patch
sh Configure -des -Dprefix=/tools -Dstatic_ext='Data/Dumper Fcntl IO POSIX'
make perl utilities ext/Errno/pm_to_blib
cp -v perl pod/pod2man /tools/bin
mkdir -p /tools/lib/perl5/5.10.0
cp -R lib/* /tools/lib/perl5/5.10.0

Sed bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/sed.tar.gz
tar -xzf sed.tar.gz
cd sed
./configure --prefix=/tools
make
make install

Tar bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources.tar.gz
tar -xzf tar.tar.gz
cd tar
./configure --prefix=/tools
make
make install

help2man - Sollte dieses Programm nicht korrekt bauen, muss noch das Perl-Module Locale::gettext installiert werden. Dies kann man tun, indem man 'cpan' als root im Host-System aufruft und 'install Locale::gettext' verwendet.
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/help2man.tar.gz
tar -xzf help2man.tar.gz
cd help2man
PATH=/usr/bin:/bin:/tools/bin ./configure --prefix=/tools
make
make install

Texinfo bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/texinfo.tar.gz
tar -xzf texinfo.tar.gz
cd texinfo
./configure --prefix=/tools
make
make install

Util-Linux-NG bauen:
Code:
cd $HL/sources
wget http://www.habolinux.de/sources/util-linux-ng.tar.gz
tar -xzf util-linux-ng.tar.gz
cd util-linux-ng
./configure --prefix=/tools --with-fsprobe=builtin
make 
cp mount/{,u}mount text-utils/more /tools/bin

Zum Schluss müssen noch einige "Nacharbeiten" gemacht werden.
Code:
strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*
rm -rf /tools/{info,man}

Und nun noch als root im Hostsystem den Eigentümer für die Toolchain auf root setzen:
Code:
chown -R root:root /hl/tools

Jetzt kann das chrooten vorbereitet werden, indem Pseudo-Dateisysteme gemountet werden u.ä.:
Code:
mkdir -p /hl/{dev,proc,sys}
mknod -m 600 /hl/dev/console c 5 1
mknod -m 666 /hl/dev/null c 1 3
mount --bind /dev /hl/dev
mount -t devpts devpts /hl/dev/pts
mount -t tmpfs shm /hl/dev/shm
mount -t proc proc /hl/proc
mount -t sysfs sysfs /hl/sys

Um den eigentlichen Bau des Systems zu beginnen, kann man nun in die Umgebung der Toolchain chrooten:
Code:
chroot "/hl" /tools/bin/env -i HOME=/root TERM="$TERM" PS1='\u:\w\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin /tools/bin/bash --login +h

An dieser Stelle beginnt nun der Bau des eigentlichen Systems. Die dafür notwendigen Pakete packe ich im Laufe der kommenden Woche auf den Server. Genug Zeit um eine Toolchain zu kompilieren. ;) Eine Anleitung zum Bau werde ich dann wieder hier in's Board stellen. Da die Mailingliste nicht sonderlich angenommen wurde, werde ich die Kommunikation zum Projekt in's Habo verlagern. Fragen zu HaboLinux also bitte zukünftig in diesem Unterforum stellen. Bitte keine PN an mich! Vielleicht regt das ja den ein oder anderen an den Bau mal zu versuchen und später beim Paketieren für apt mitzumachen.

Die für die Toolchain verwendeten Programmversionen sind derzeit im Einzelnen:
- bash 3.2.48
- binutils 2.19.1
- bzip2 1.0.5
- coreutils 7.4
- Berkeley DB 4.7.25
- dejagnu 1.4.4
- diffutils 2.8.1
- e2fsprogs 1.41.5
- expect 5.43.0
- findutils 4.4.1
- gawk 3.1.6
- gcc 4.3.3
- gettext 0.17
- glibc 2.9
- gmp 4.3.0
- gperf 3.0.4
- grep 2.5.4
- gzip 1.3.12
- help2man 1.36.4
- kernel 2.6.29
- m4 1.4.13
- make 3.81
- man-pages 3.21
- mpfr 2.4.1
- ncurses 5.7
- patch 2.5.9
- perl 5.10.0
- sed 4.2
- tar 1.22
- tcl 8.5.7
- texinfo 4.13a
- util-linux-ng 2.15

Nebenher werde ich noch eine Webserver-optimierte Version bauen. Da dies in der Vergangenheit ja bemängelt wurde, tue ich dies aber zukünftig unabhängig von HaboLinux. Insofern ist meine Zeit für HaboLinux auch weiterhin beschränkt. Sollten sich nach Fertigstellung der Basis-Pakete und des Installer-Skripts nicht ein paar Leute mehr finden, die HaboLinux weiterführen und ausbauen, bin auch ich nicht mehr bereit mich weiterhin dafür zu engagieren.
 
Hi,

da sich vielleicht durch die einfache Anleitung doch ein paar mehr Leute dafür interessieren, wollte ich darauf hinweisen, dass es noch den IRC-Channel #habolinux auf irc.german-freakz.net gibt. Wenn's also was gibt, kann man ja ruhig dort oder in #hackerboard seinen Senf zum Thema geben.

mfg,

Athelstan
 
Ich wollte mich eigentlich nicht wirklich beteiligen, allerdings durch meinen
derzeitigen Zeitüberschuss ist das Gegenteil eingetreten.
Ich weiß, dass ich mich nicht für das habolinux-team gemeldet hatte, aber ich denke ich werde dies hiermit tun. Lange Rede, recht kurzer Sinn: Ich habe die beschriebene Toolchain bei mir in einer virtuellen Machine vorliegen.

mfg
 
Die Toolchain steht bei mir auch

-------------------------------------------------------------------------------------------------

Wer mit der alternativen Bash Version baut kann folgendes nutzen:

Code:
cd $HL/sources
wget http://www.habolinux.de/sources/bash-3.2.48.tar.gz
tar -xzf bash-3.2.48.tar.gz
cd bash-3.2
./configure --prefix=/tools --without-bash-malloc ac_cv_func_working_mktime=yes
make
make install
ln -s bash /tools/bin/sh


Ist nun nicht wirklich ein Bug aber falls einer dran hängen bleibt:

Code:
cd $HL/sources
wget http://www.habolinux.de/sources/tcl.tar.gz
tar -xzf tcl.tar.gz
cd tcl/unix
./configure --prefix=/tools
make
TZ=UTC make test
make install
chmod u+w /tools/lib/libtcl8.5.so
make install-private-headers
ln -s tclsh8.5 /tools/bin/tclsh

Code:
cd $HL/sources
wget http://www.habolinux.de/sources/tar.tar.gz
tar -xzf tar.tar.gz
cd tar
./configure --prefix=/tools
make
make install

Lose Ansammlung zu dem Thema:

"Warum werden gcc und binutils zweimal kompiliert"

Was ist Bootstrapping? Bootstrapping ist ein mehrstufiger Prozess zum Kompilieren eines Compilers. In der ersten Stufe wird der Compiler mit dem bisher auf dem System installierten Compiler kompiliert. In der zweiten Stufe kompiliert der neu kompilierte Compiler sich selbst. In der dritten Stufe kompiliert sich dieser neu kompilierte Compiler nochmals, und das Ergebnis wird mit dem vorher kompilierten Compiler verglichen. Die dritte Stufe ist also als Stresstest für den neuen Compiler zu verstehen: Wenn es hier keine Probleme gibt, ist der neue Compiler wohl in Ordnung.

Quelle: http://www.floriankirsch.de/gcc/install.html

Lass ich erstmal so stehen, so ganz verstanden habe ich es noch nicht, ist aber schonmal einleuchtend.
 
Soeben fertig geworden, bin dabei.
Danke an bitmuncher für die gute Erklärung und an die Nachposter für ihre Korrekturen/Erläuterungen.
 
Zurück
Oben