手を取って自分のLinuxシステムを構築する方法を教えます(二)


Patch-2.5.4
tar xvf /lfs-sources/patch-2.5.4.tar.gz
cd patch-2.5.4
./configure --prefix=/tools
make
make install
cd ..
rm -rf patch-2.5.4

Perl-5.8.8
tar xvf /lfs-sources/perl-5.8.8.tar.bz2
cd perl-5.8.8
patch -Np1 -i /lfs-sources/perl-5.8.8-libc-2.patch
./configure.gnu --prefix=/tools -Dstatic_ext='Data/Dumper Fcntl IO POSIX'
make perl utilities
cp -v perl pod/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.8.8
cp -Rv lib/* /tools/lib/perl5/5.8.8
cd ..
rm -rf perl-5.8.8

Sed-4.1.5
tar xvf /lfs-sources/sed-4.1.5.tar.gz
cd sed-4.1.5
./configure --prefix=/tools
make
make install
cd ..
rm -rf sed-4.1.5

Tar-1.18
tar xvf /lfs-sources/tar-1.18.tar.bz2
cd tar-1.18
./configure --prefix=/tools
make
make install
cd ..
rm -rf tar-1.18

Texinfo-4.9
tar xvf /lfs-sources/texinfo-4.9.tar.bz2
cd texinfo-4.9
./configure --prefix=/tools
make
make install
cd ..
rm -rf texinfo-4.9

Util-linux-2.12r
tar xvf /lfs-sources/util-linux-2.12r.tar.bz2
cd util-linux-2.12r
sed -i 's@/usr/include@/tools/include@g' configure
./configure
make -C lib
make -C mount mount umount
make -C text-utils more
cp -v mount/{,u}mount text-utils/more /tools/bin
cd ..
rm -rf util-linux-2.12r

Stripping
このステップはあってもなくてもいいです.これからも/toolsの中のものを使うつもりなら、stripで占有するディスクのスペースを減らすことができますが、ターゲットシステムが終わったら削除します.Stripでなくてもいいです.どうせ最後に削除します.
strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*

infoとmanの中の内容は制作過程で何の役にも立たないので、削除しても大丈夫です.
rm -rf /tools/{info,man}

lfsユーザーを終了します(このステップは少なくありません)
exit

これまでに、ツールチェーンの作成が完了し、本格的なターゲットシステムの作成が開始されます。


もしあなたが今まで何の問題もなかったら、おめでとうございます.合格しましたが、まだかなり長い道のりがあります.
rootユーザーの状態にあるはずです.コマンドラインプロンプトが#に戻ったかどうかを見てみましょう.
これからはlfsユーザーがシステムを作成する必要はありませんので、
chown -R root:root $LFS/tools

ディレクトリ権限を再設定し、後で作業しやすいようにします.
3つの重要ディレクトリの作成
mkdir -pv $LFS/{dev,proc,sys}

2つのターゲットシステムを作成するために必要なデバイスファイル
mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3

この時、あなたは寝て電源を切りたいかもしれませんが、電源を入れ直してから仕事の状態に戻る手順は:
1.コンピュータを再起動し、LiveCDから起動する
2.パーティションのロード
export LFS=/mnt/lfs
mkdir -pv $LFS
mount /dev/hda2 $LFS

3.スワップ・パーティションをロードします(スワップ・パーティションを使用したくない場合、またはスワップ・パーティションがない場合は、この手順をスキップします).
swapon /dev/hda1

関連知識点:
この時点でツールチェーンが作成されているので、ルートディレクトリのtoolsリンクを作成する必要はありません.
プライマリ・システムを使用していくつかの重要なファイル・システムをロードするには、この手順が後の作業にとって極めて重要であることに注意してください.
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts
mount -vt tmpfs shm $LFS/dev/shm
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys

関連知識点:
mountコマンドでロードされたパーティションは、再起動後に失効するため、再起動には再ロードが必要です.
ここではソースパッケージを使いやすいように、ディスクをターゲットシステムにロードします.
mkdir $LFS/cdrom
mount /dev/cdrom $LFS/cdrom

この手順は必須ではありません.使用したい場合は、再起動後に作業状態に入る手順に、対応する場所に追加します.
ここでは、lfs-sourcesのすべてのソースパッケージを$LFS/sourcesディレクトリにコピーするより簡単な方法があります.このステップは、6章でソースコードを使用するのに便利です.
cp -a /lfs-sources/* $LFS/sources/

Chrootはターゲットシステムのディレクトリの下にあり、メインシステムの影響を受けずにターゲットシステムを作成します.
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

注意:このときあなたのプロンプトは「I have no name!」です.大丈夫です.私たちの仕事を続けるとすぐに正常になります.
このとき、電源を切ったり、再起動したりすると、再起動してから作業状態に戻るには、次の手順に従います.
1.コンピュータを再起動し、LiveCDから起動する
2.パーティションのロード
export LFS=/mnt/lfs
mkdir -pv $LFS
mount /dev/hda2 $LFS

3.スワップ・パーティションをロードします(スワップ・パーティションを使用したくない場合、またはスワップ・パーティションがない場合は、この手順をスキップします).
swapon /dev/hda1

4.必要なファイルシステムのロード
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts
mount -vt tmpfs shm $LFS/dev/shm
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys

5.Chrootからターゲットシステムへ
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

ターゲットシステムのディレクトリ構造の構築
mkdir -pv /{bin,boot,etc/opt,home,lib,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
for dir in /usr /usr/local; do
ln -sv share/{man,doc,info} $dir
done
mkdir -pv /var/{lock,log,mail,run,spool}
mkdir -pv /var/{opt,cache,lib/{misc,locate},local}

ターゲットシステムのコンパイル中に、一部のコンパイラが絶対パスでコマンドまたはファイルを探すため、いくつかの必要なリンクを作成します.
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
touch /etc/mtab

rootおよびnobodyユーザーと必要なグループの作成
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:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
mail:x:34:
nogroup:x:99:
EOF

bashを再ロードしてrootユーザーを有効にすると、前のプロンプトは「I have no name!」ではありません.
exec /tools/bin/bash --login +h

いくつかの一時ファイルとログファイルを作成して設定します.
touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
chgrp -v utmp /var/run/utmp /var/log/lastlog
chmod -v 664 /var/run/utmp /var/log/lastlog

これまで、ターゲットシステムの作成準備はほぼ完了しており、ターゲットシステムのインフラストラクチャパッケージのインストールを開始します。


まずソースディレクトリの下に入ります.
cd /sources

(以前はLFSに必要なソースパケットが/cdromにロードされていたため、後のコマンドは/cdrom/lfs-sourcesディレクトリから解かれ、ソースパケットをsourcesディレクトリまたは他のディレクトリに直接コピーした場合は、次のコマンドを変更します)
export LFS=/cdrom/lfs-sources

以前にすべてのソースパケットをsourcesの下にコピーした場合、実行
export LFS=/sources

今から6章のStripping Againまで、この段階で電源を切ったり再起動したりすると、再起動してから作業状態に戻る手順は次のとおりです.
1.コンピュータを再起動し、LiveCDから起動する
2.パーティションのロード
export LFS=/mnt/lfs
mkdir -pv $LFS
mount /dev/hda2 $LFS

3.スワップ・パーティションをロードします(スワップ・パーティションを使用したくない場合、またはスワップ・パーティションがない場合は、この手順をスキップします).
swapon /dev/hda1

4.必要なファイルシステムのロード
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts
mount -vt tmpfs shm $LFS/dev/shm
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys

5.Chrootからターゲットシステムへ
chroot "$LFS" /tools/bin/env -i \
HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/bin/bash --login +h

6.コンパイルディレクトリへ
cd /sources
export LFS=/sources

Linux-2.6.22.5
tar xvf $LFS/linux-2.6.22.5.tar.bz2
cd linux-2.6.22.5
sed -i '/scsi/d' include/Kbuild
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /usr/include
cd ..
rm -rf linux-2.6.22.5

Man-pages-2.63
tar xvf $LFS/man-pages-2.63.tar.bz2
cd man-pages-2.63
make install
cd ..
rm -rf man-pages-2.63

man-pagesのバージョンでは、更新されたバージョンを使用できます.
Glibc-2.5.1
行う前にglibc-2.5.1とglibc-buildの2つのディレクトリが削除されているかどうかを確認してください.削除されていない場合は削除してから続行してください.
tar xvf $LFS/glibc-2.5.1.tar.bz2
cd glibc-2.5.1
tar -xvf $LFS/glibc-libidn-2.5.1.tar.gz
mv glibc-libidn-2.5.1 libidn
sed -i '/vi_VN.TCVN/d' localedata/SUPPORTED
sed -i \
's|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=/lib/ld-linux.so.2 -o|' \
   scripts/test-installation.pl
sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in
mkdir -v ../glibc-build
cd ../glibc-build
../glibc-2.5.1/configure --prefix=/usr \
--disable-profile --enable-add-ons \
--enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc
make
make -k check 2>&1 | tee glibc-check-log
grep Error glibc-check-log
touch /etc/ld.so.conf
make install
make localedata/install-locales

make localedata/install-localesはすべてのlocaleをインストールします.これだけのlocaleをインストールしたくない場合はlocaledefコマンドでインストールします.LFSマニュアルに例があります.中国語のlocaleだけを追加したい場合は、
mkdir -pv /usr/lib/locale
localedef -i zh_CN -f GB18030 zh_CN
localedef -i zh_CN -f GBK zh_CN
localedef -i zh_CN -f UTF-8 zh_CN
localedef -i zh_CN -f GB2312 zh_CN
localedef -i zh_HK -f UTF-8 zh_CN
localedef -i zh_HK -f BIG5-HKSCS zh_CN
localedef -i zh_TW -f EUC-TW zh_CN
localedef -i zh_TW -f UTF-8 zh_CN
localedef -i zh_TW -f BIG5 zh_CN

重要なファイルをいくつか作成します.
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
cp -v --remove-destination /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
cat > /etc/ld.so.conf << "EOF"
/usr/local/lib
/opt/lib
EOF

コンパイルディレクトリの削除
cd ..
rm -rf glibc-build
rm -rf glibc-2.5.1

関連知識:
glibcのテストはエラーが発生しやすいです.例えば、機械が遅いとタイムアウトする可能性があるエラーや、エラーを引き起こすLFSマニュアルに言及されているものもあります.タイムアウトのようなエラーは避けられない場合があります.飛び越えましょう.
ツールチェーンの調整
mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld

specsファイルを調整するには:
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

ツールチェーンが正常に調整されたかどうかをテスト
echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep '/lib'

[Requesting program interpreter:/lib/ld-linux.so.2]が調整に成功したことを示す場合、ダイナミックライブラリはターゲットシステムの/libに接続されています.
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

表示すべき
/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded
grep -B1 '^ /usr/include' dummy.log

表示すべき
#include <...> search starts here:
/usr/include
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |
|g'

表示すべき
SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");
grep "/lib/libc.so.6 " dummy.log

表示すべき
attempt to open /lib/libc.so.6 succeeded
grep found dummy.log

表示すべき
found ld-linux.so.2 at /lib/ld-linux.so.2

正常に表示されている場合は、ツールチェーンの調整に成功したことを示し、テストファイルを削除できます.
rm -v dummy.c a.out dummy.log

テキストアドレスhttp://www.linuxsir.org/bbs/thread322894.html