ここから先は root で実行します。
exit su - LFS=/mnt/lfs
mkdir -p $LFS/{proc,dev/pts} mount proc $LFS/proc -t proc mount devpts $LFS/dev/pts -t devpts
chroot "$LFS" /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 cd /sources
chown -R 0:0 /tools
mkdir -p /{bin,boot,dev/{pts,shm},etc/opt,home,lib,mnt,proc} mkdir -p /{root,sbin,srv,tmp,usr/local,var,opt} mkdir -p /media/{floppy,cdrom} mkdir /usr/{bin,include,lib,sbin,share,src} ln -s share/{man,doc,info} /usr mkdir /usr/share/{doc,info,locale,man} mkdir /usr/share/{misc,terminfo,zoneinfo} mkdir /usr/share/man/man{1,2,3,4,5,6,7,8} mkdir /usr/local/{bin,etc,include,lib,sbin,share,src} ln -s share/{man,doc,info} /usr/local mkdir /usr/local/share/{doc,info,locale,man} mkdir /usr/local/share/{misc,terminfo,zoneinfo} mkdir /usr/local/share/man/man{1,2,3,4,5,6,7,8} mkdir /var/{lock,log,mail,run,spool} mkdir -p /var/{tmp,opt,cache,lib/misc,local} mkdir /opt/{bin,doc,include,info} mkdir -p /opt/{lib,man/man{1,2,3,4,5,6,7,8}} chmod 0750 /root chmod 1777 /tmp /var/tmp
ln -s /tools/bin/{bash,cat,pwd,stty} /bin ln -s /tools/bin/perl /usr/bin ln -s /tools/lib/libgcc_s.so.1 /usr/lib ln -s bash /bin/sh
/etc/passwd ファイルを作る
cat > /etc/passwd << "EOF" root:x:0:0:root:/root:/bin/bash EOF
/etc/group ファイルを作る
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: dialout:x:10: audio:x:11: EOF
exec /tools/bin/bash --login +h touch /var/run/utmp /var/log/{btmp,lastlog,wtmp} chmod 644 /var/run/utmp /var/log/{btmp,lastlog,wtmp}
cd /sources bzcat make_devices-1.2.bz2 > /dev/make_devices chmod 754 /dev/make_devices cd /dev ./make_devices
cp -a /tools/include/{asm,asm-generic,linux} /usr/include touch /usr/include/linux/autoconf.h
tar jxvf man-pages-1.66.tar.bz2 cd man-pages-1.66 make install cd /sources rm -rf man-pages-1.66
tar jxvf glibc-2.3.3-lfs-5.1.tar.bz2 touch /etc/ld.so.conf mkdir glibc-build cd glibc-build ../glibc-2.3.3-lfs-5.1/configure --prefix=/usr \ --disable-profile --enable-add-ons=linuxthreads \ --libexecdir=/usr/lib --with-headers=/usr/include \ --without-cvs make touch /etc/ld.so.conf make install make localedata/install-locales make -C ../glibc-2.3.3-lfs-5.1/linuxthreads/man make -C ../glibc-2.3.3-lfs-5.1/linuxthreads/man install
Glibc を設定する(/etc/nsswitch.conf)
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
/etc/localtime ファイルを作る
cp --remove-destination /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
cat > /etc/ld.so.conf << "EOF" # Begin /etc/ld.so.conf /usr/local/lib /opt/lib # End /etc/ld.so.conf EOF cd /sources rm -rf glibc-build rm -rf glibc-2.3.3-lfs-5.1
cd binutils-build make -C ld INSTALL=/tools/bin/install install cd /sources SPECFILE=/tools/lib/gcc-lib/*/*/specs && sed -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g' \ $SPECFILE > newspecfile && mv -f newspecfile $SPECFILE && unset SPECFILE
cd /sources/binutils-build rm -rf * ../binutils-2.14/configure \ --prefix=/usr --enable-shared make tooldir=/usr make tooldir=/usr install cp ../binutils-2.14/include/libiberty.h /usr/include cd /sources rm -rf binutils-build rm -rf binutils-2.14
この段階で、調整された toolchain の基本的な機能(コンパイルとリンク)が期待通り動いていることを確認するのは必須事項です。このための簡単な完成度チェックを行ないます。
echo 'main(){}' > dummy.c gcc dummy.c readelf -l a.out | grep ': /lib'
すべてがうまく行っているのなら、エラーはないはずで、結果の出力は以下のようになるはずです。
[Requesting program interpreter: /lib/ld-linux.so.2]
上に示したような出力結果がでない、あるいは出力結果がない場合、何か重大な間違いがあります。どこに問題があるかを見つけだし、修正するために、これまでやったことを振り返ってみなければいけません。これが完了するまでは続けても意味がありません。特に、今や /lib がお使いの動的リンカのプリフィックスとなっていることに注意しましょう。もちろん、ld-linux.so.2 とは何か別の名前の動的リンカを使ったプラットフォーム上で作業しているなら、結果の出力は少し異なったものになるでしょう。
すべてが問題ないとわかったなら、テストファイルを削除します。
rm dummy.c a.out
tar jxvf gcc-core-3.3.3.tar.bz2 tar jxvf gcc-g++-3.3.3.tar.bz2 tar jxvf gcc-testsuite-3.3.3.tar.bz2 cd gcc-3.3.3 patch -Np1 -i ../gcc-3.3.3-no_fixincludes-1.patch sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in mkdir ../gcc-build cd ../gcc-build ../gcc-3.3.3/configure --prefix=/usr \ --enable-shared --enable-threads=posix \ --enable-__cxa_atexit --enable-clocale=gnu \ --enable-languages=c,c++ make;make install ln -s ../usr/bin/cpp /lib ln -s gcc /usr/bin/cc cd /sources rm -rf gcc-build rm -rf gcc-3.3.3
tar jxvf coreutils-5.2.1.tar.bz2 cd coreutils-5.2.1 patch -Np1 -i ../coreutils-5.2.1-uname-1.patch patch -Np1 -i ../coreutils-5.2.1-hostname-1.patch DEFAULT_POSIX2_VERSION=199209 ./configure --prefix=/usr make;make install-root touch /etc/mtab
テスト
echo "dummy1:x:1000" >> /etc/group echo "dummy2:x:1001:dummy" >> /etc/group echo "dummy:x:1000:1000:::/bin/bash" >> /etc/passwd export NON_ROOT_USERNAME=dummy; make check-root su dummy -c "make RUN_EXPENSIVE_TESTS=yes check" sed -i.bak '/dummy/d' /etc/passwd /etc/group
make install mv /usr/bin/{basename,cat,chgrp,chmod,chown,cp,dd,df} /bin mv /usr/bin/{date,echo,false,head,install,ln,ls} /bin mv /usr/bin/{mkdir,mknod,mv,pwd,rm,rmdir,sync} /bin mv /usr/bin/{sleep,stty,su,test,touch,true,uname} /bin mv /usr/bin/chroot /usr/sbin rm /usr/bin/kill ln -s test /bin/[ ln -s ../../bin/install /usr/bin cd /sources rm -rf coreutils-5.2.1
tar jxvf zlib-1.2.1.tar.bz2 cd zlib-1.2.1 ./configure --prefix=/usr --shared make;make install make clean ./configure --prefix=/usr make;make install chmod 644 /usr/lib/libz.a mv /usr/lib/libz.so.* /lib ln -sf ../../lib/libz.so.1 /usr/lib/libz.so cd /sources rm -rf zlib-1.2.1
tar jxvf mktemp-1.5.tar.bz2 cd mktemp-1.5 patch -Np1 -i ../mktemp-1.5-add-tempfile.patch ./configure --prefix=/usr --with-libc make;make install make install-tempfile cd /sources rm -rf mktemp-1.5
tar jxvf iana-etc-1.00.tar.bz2 cd iana-etc-1.00 make;make install cd /sources rm -rf iana-etc-1.00
tar jxvf findutils-4.1.20.tar.bz2 cd findutils-4.1.20 ./configure --prefix=/usr --libexecdir=/usr/lib/locate \ --localstatedir=/var/lib/misc make;make install cd /sources rm -rf findutils-4.1.20
tar jxvf gawk-3.1.3.tar.bz2 cd gawk-3.1.3 ./configure --prefix=/usr --libexecdir=/usr/lib make;make install cd /sources rm -rf gawk-3.1.3
tar jxvf ncurses-5.4.tar.bz2 cd ncurses-5.4 ./configure --prefix=/usr --with-shared \ --without-debug make;make install chmod 755 /usr/lib/*.5.4 chmod 644 /usr/lib/libncurses++.a mv /usr/lib/libncurses.so.5* /lib ln -sf ../../lib/libncurses.so.5 /usr/lib/libncurses.so ln -sf libncurses.so /usr/lib/libcurses.so cd /sources rm -rf ncurses-5.4
tar jxvf vim-6.2.tar.bz2 cd vim62 echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h echo '#define SYS_GVIMRC_FILE "/etc/gvimrc"' >> src/feature.h ./configure --prefix=/usr make;make install ln -s vim /usr/bin/vi cat > /etc/vimrc << "EOF" " Begin /etc/vimrc set nocompatible set backspace=2 syntax on " End /etc/vimrc EOF cd /sources rm -rf vim62
tar jxvf m4-1.4.tar.bz2 cd m4-1.4 ./configure --prefix=/usr make;make install cd /sources rm -rf m4-1.4
tar jxvf bison-1.875.tar.bz2 cd bison-1.875 patch -Np1 -i ../bison-1.875-attribute.patch ./configure --prefix=/usr make;make install cd /sources rm -rf bison-1.875
tar jxvf less-382.tar.bz2 cd less-382 ./configure --prefix=/usr --bindir=/bin --sysconfdir=/etc make;make install cd /sources rm -rf less-382
tar jxvf groff-1.19.tar.bz2 cd groff-1.19 PAGE=letter ./configure --prefix=/usr make;make install ln -s soelim /usr/bin/zsoelim ln -s eqn /usr/bin/geqn ln -s tbl /usr/bin/gtbl cd /sources rm -rf groff-1.19
tar jxvf sed-4.0.9.tar.bz2 cd sed-4.0.9 ./configure --prefix=/usr --bindir=/bin make;make install cd /sources rm -rf sed-4.0.9
tar jxvf flex-2.5.4a.tar.bz2 cd flex-2.5.4 ./configure --prefix=/usr make;make install ln -s 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 cd /sources rm -rf flex-2.5.4
tar jxvf gettext-0.14.1.tar.bz2 cd gettext-0.14.1 ./configure --prefix=/usr make;make install cd /sources rm -rf gettext-0.14.1
tar jxvf net-tools-1.60.tar.bz2 cd net-tools-1.60 patch -Np1 -i ../net-tools-1.60-miitool-gcc33-1.patch yes "" | make config make;make update cd /sources rm -rf net-tools-1.60
tar jxvf inetutils-1.4.2.tar.bz2 cd inetutils-1.4.2 patch -Np1 -i ../inetutils-1.4.2-no_server_man_pages-1.patch ./configure --prefix=/usr --libexecdir=/usr/sbin \ --sysconfdir=/etc --localstatedir=/var \ --disable-logger --disable-syslogd \ --disable-whois --disable-servers make;make install mv /usr/bin/ping /bin cd /sources rm -rf inetutils-1.4.2
tar jxvf perl-5.8.4.tar.bz2 cd perl-5.8.4 ./configure.gnu --prefix=/usr -Dpager="/bin/less -isR" make echo "127.0.0.1 localhost $(hostname)" > /etc/hosts make test make install cd /sources rm -rf perl-5.8.4
tar jxvf texinfo-4.7.tar.bz2 cd texinfo-4.7 ./configure --prefix=/usr make;make install make TEXMF=/usr/share/texmf install-tex cd /usr/share/info rm dir for f in * do install-info $f dir 2>/dev/null done cd /sources rm -rf texinfo-4.7
tar jxvf autoconf-2.59.tar.bz2 cd autoconf-2.59 ./configure --prefix=/usr make;make install cd /sources rm -rf autoconf-2.59
tar jxvf automake-1.8.4.tar.bz2 cd automake-1.8.4 ./configure --prefix=/usr make;make install cd /sources rm -rf automake-1.8.4
tar jxvf bash-2.05b.tar.bz2 cd bash-2.05b patch -Np1 -i ../bash-2.05b-2.patch ./configure --prefix=/usr --bindir=/bin make;make install
exec /bin/bash --login +h cd /sources rm -rf bash-2.05b
tar jxvf file-4.09.tar.bz2 cd file-4.09 ./configure --prefix=/usr make;make install cd /sources rm -rf file-4.09
tar jxvf libtool-1.5.6.tar.bz2 cd libtool-1.5.6 ./configure --prefix=/usr make;make install cd /sources rm -rf libtool-1.5.6
tar jxvf bzip2-1.0.2.tar.bz2 cd bzip2-1.0.2 make -f Makefile-libbz2_so make clean make;make install cp bzip2-shared /bin/bzip2 cp -a libbz2.so* /lib ln -s ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so rm /usr/bin/{bunzip2,bzcat,bzip2} mv /usr/bin/{bzip2recover,bzless,bzmore} /bin ln -s bzip2 /bin/bunzip2 ln -s bzip2 /bin/bzcat cd /sources rm -rf bzip2-1.0.2
tar jxvf diffutils-2.8.1.tar.bz2 cd diffutils-2.8.1 ./configure --prefix=/usr make;make install cd /sources rm -rf diffutils-2.8.1
tar jxvf ed-0.2.tar.bz2 cd ed-0.2 patch -Np1 -i ../ed-0.2-mkstemp.patch ./configure --prefix=/usr --exec-prefix="" make;make install cd /sources rm -rf ed-0.2
path/to/keymap を使用しているキーボードマップに変更する。
日本語106キーボードを使っているなら i386/qwerty/jp106.map.gz にする。
ln -s path/to/keymap /usr/share/kbd/keymaps/defkeymap.map.gz の行を
ln -s &color():Invalid color: #f00; /usr/share/kbd/keymaps/defkeymap.map.gz に書き換える
tar jxvf kbd-1.12.tar.bz2 cd kbd-1.12 patch -Np1 -i ../kbd-1.12-more-programs-1.patch ./configure make;make install ln -s path/to/keymap /usr/share/kbd/keymaps/defkeymap.map.gz loadkeys -m /usr/share/kbd/keymaps/defkeymap.map.gz > \ [unpacked sources dir]/linux-2.4.26/drivers/char/defkeymap.c cd /sources rm -rf kbd-1.12
tar jxvf e2fsprogs-1.35.tar.bz2 mkdir e2fsprogs-build cd e2fsprogs-build ../e2fsprogs-1.35/configure --prefix=/usr --with-root-prefix="" \ --enable-elf-shlibs make;make install make install-libs cd /sources rm -rf e2fsprogs-build rm -rf e2fsprogs-1.35
tar jxvf grep-2.5.1.tar.bz2 cd grep-2.5.1 ./configure --prefix=/usr --bindir=/bin \ --with-included-regex make;make install cd /sources rm -rf grep-2.5.1
tar jxvf grub-0.94.tar.bz2 cd grub-0.94 ./configure --prefix=/usr make;make install mkdir /boot/grub cp /usr/share/grub/i386-pc/stage{1,2} /boot/grub cd /sources rm -rf grub-0.94
tar jxvf gzip-1.3.5.tar.bz2 cd gzip-1.3.5 ./configure --prefix=/usr cp gzexe.in{,.backup} sed 's%"BINDIR"%/bin%' gzexe.in.backup > gzexe.in make;make install mv /usr/bin/gzip /bin rm /usr/bin/{gunzip,zcat} ln -s gzip /bin/gunzip ln -s gzip /bin/zcat ln -s gunzip /bin/uncompress cd /sources rm -rf gzip-1.3.5
tar jxvf man-1.5m2.tar.bz2 cd man-1.5m2 patch -Np1 -i ../man-1.5m2-80cols.patch sed -i 's/-is/&R/' configure sed -i 's%MANPATH./usr/man%#&%' src/man.conf.in ./configure -default -confdir=/etc make;make install cd /sources rm -rf man-1.5m2
tar jxvf make-3.80.tar.bz2 cd make-3.80 ./configure --prefix=/usr make;make install cd /sources rm -rf make-3.80
tar jxvf modutils-2.4.27.tar.bz2 cd modutils-2.4.27 ./configure make;make install cd /sources rm -rf modutils-2.4.27
tar jxvf patch-2.5.4.tar.bz2 cd patch-2.5.4 CPPFLAGS=-D_GNU_SOURCE ./configure --prefix=/usr make;make install cd /sources rm -rf patch-2.5.4
tar jxvf procinfo-18.tar.bz2 cd procinfo-18 make LDLIBS=-lncurses make install cd /sources rm -rf procinfo-18
tar jxvf procps-3.2.1.tar.bz2 cd procps-3.2.1 make;make install rm /lib/libproc.so cd /sources rm -rf procps-3.2.1
tar jxvf psmisc-21.4.tar.bz2 cd psmisc-21.4 ./configure --prefix=/usr --exec-prefix=/ make;make install mv /bin/pstree* /usr/bin ln -sf pstree /usr/bin/pstree.x11 ln -s killall /bin/pidof cd /sources rm -rf psmisc-21.4
tar jxvf shadow-4.0.4.1.tar.bz2 cd shadow-4.0.4.1 touch /usr/bin/passwd ./configure --libdir=/usr/lib --enable-shared echo '#define HAVE_SETLOCALE 1' >> config.h make;make install cp etc/{limits,login.access} /etc sed -e 's%#MD5_CRYPT_ENAB.no%MD5_CRYPT_ENAB yes%' \ -e 's%/var/spool/mail%/var/mail%' \ etc/login.defs.linux > /etc/login.defs mv /bin/sg /usr/bin mv /bin/vigr /usr/sbin mv /usr/lib/lib{shadow,misc}.so.0* /lib ln -sf ../../lib/libshadow.so.0 /usr/lib/libshadow.so ln -sf ../../lib/libmisc.so.0 /usr/lib/libmisc.so mkdir /etc/default rm /bin/groups pwconv grpconv passwd root cd /sources rm -rf shadow-4.0.4.1
rootのパスワードを聞かれるので指示に従って入力する。
tar jxvf sysklogd-1.4.1.tar.bz2 cd sysklogd-1.4.1 make;make install cat > /etc/syslog.conf << "EOF" # Begin /etc/syslog.conf auth,authpriv.* -/var/log/auth.log *.*;auth,authpriv.none -/var/log/sys.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log mail.* -/var/log/mail.log user.* -/var/log/user.log *.emerg * # End /etc/syslog.conf EOF cd /sources rm -rf sysklogd-1.4.1
tar jxvf sysvinit-2.85.tar.bz2 cd sysvinit-2.85 cp src/init.c{,.backup} sed 's/Sending processes/& started by init/g' \ src/init.c.backup > src/init.c make -C src make -C src install cat > /etc/inittab << "EOF" # Begin /etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/init.d/rc sysinit l0:0:wait:/etc/rc.d/init.d/rc 0 l1:S1:wait:/etc/rc.d/init.d/rc 1 l2:2:wait:/etc/rc.d/init.d/rc 2 l3:3:wait:/etc/rc.d/init.d/rc 3 l4:4:wait:/etc/rc.d/init.d/rc 4 l5:5:wait:/etc/rc.d/init.d/rc 5 l6:6:wait:/etc/rc.d/init.d/rc 6 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now su:S016:once:/sbin/sulogin 1:2345:respawn:/sbin/agetty tty1 9600 2:2345:respawn:/sbin/agetty tty2 9600 3:2345:respawn:/sbin/agetty tty3 9600 4:2345:respawn:/sbin/agetty tty4 9600 5:2345:respawn:/sbin/agetty tty5 9600 6:2345:respawn:/sbin/agetty tty6 9600 # End /etc/inittab EOF cd /sources rm -rf sysvinit-2.85
tar jxvf tar-1.13.94.tar.bz2 cd tar-1.13.94 ./configure --prefix=/usr --bindir=/bin \ --libexecdir=/usr/sbin make;make install cd /sources rm -rf tar-1.13.94
tar jxvf util-linux-2.12a.tar.bz2 cd util-linux-2.12a cp hwclock/hwclock.c{,.backup} sed 's%etc/adjtime%var/lib/hwclock/adjtime%' \ hwclock/hwclock.c.backup > hwclock/hwclock.c mkdir -p /var/lib/hwclock ./configure make HAVE_KILL=yes HAVE_SLN=yes make HAVE_KILL=yes HAVE_SLN=yes install cd /sources rm -rf util-linux-2.12a
tar jxvf gcc-2.95.3.tar.bz2 cd gcc-2.95.3 patch -Np1 -i ../gcc-2.95.3-2.patch patch -Np1 -i ../gcc-2.95.3-no-fixinc.patch patch -Np1 -i ../gcc-2.95.3-returntype-fix.patch echo timestamp > gcc/cstamp-h.in mkdir ../gcc-2-build cd ../gcc-2-build ../gcc-2.95.3/configure --prefix=/opt/gcc-2.95.3 \ --enable-shared --enable-languages=c \ --enable-threads=posix make bootstrap make install cd /sources rm -rf gcc-2-build rm -rf gcc-2.95.3
logout logout
chroot $LFS /tools/bin/env -i \ HOME=/root TERM=$TERM PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin \ /tools/bin/bash --login
/tools/bin/find /{,usr/}{bin,lib,sbin} -type f \ -exec /tools/bin/strip --strip-debug '{}' ';'
これからは、chroot 環境を抜けて、再度入りたい時は、次に示す修正された chroot コマンドを実行しなければいけません。
chroot "$LFS" /usr/bin/env -i \ HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin \ /bin/bash --login