セルフコンパイル環境の整備:LFSで作って学ぶLinuxの仕組み(2)(2/2 ページ)
前回はLFSをインストールする受け皿となるパーティションを準備した。今回から、いよいよパッケージのコンパイルを始める。まずは自分(LFS)をコンパイルするためのプログラムをLFS用パーティションに用意する。(編集局)
コンパイルの開始
それでは今回行うべき作業に入ろう。作業は/mnt/lfs/usr/srcに展開したパッケージ(lfs-packages-3.3)を使って行う。/mnt/lfs/usr/src/lfs-packages-3.3には、見てのとおり拡張子がtar.bz2というファイルが多数存在する。これらの圧縮されたファイルを展開して、取り出したソースコードをコンパイルする。ここでコンパイルするプログラムは必要最小限のもので、なおかつスタティック・リンクで行う。
今回コンパイルするプログラムは、表1のとおりだ。
プログラム | ファイルサイズ | 内容 |
---|---|---|
bash-2.05a | 20Mbytes | bash |
binutils-2.12 | 96Mbytes | addr2line、ar、as、gasp、ldなど |
bzip2-1.0.2 | 3Mbytes | bzip2(bunzip2、bzcat)、bzip2recover |
diffutils-2.8 | 4Mbytes | cmp、diff、diff3、sdiff |
fileutils-4.1 | 25Mbytes | chmod、chown、cp、dd、df、du、install、ln、ls、mkdir、rmなど |
gawk-3.1.0 | 12Mbytes | gawk |
gcc-2.95.3 | 168Mbytes | GCC(c++、cc、g++、gccなど) |
grep-2.5 | 4Mbytes | grep(egrep、fgrep、grep) |
gzip-1.2.4 | 2Mbytes | gzip(gunzip、zcat)、gzexeなど |
Linux Kernel-2.4.18 | 132Mbytes | カーネル |
make-3.79.1 | 6Mbytes | make |
patch-2.5.4 | 2Mbytes | patch |
sed-3.0.2 | 2Mbytes | sed |
sh-utils-2.0 | 23Mbytes | chroot、date、dirname、echo、env、hostname、nice、pwd、sleep、su、uptime、whoなど |
tar-1.13 | 7Mbytes | rmt、tar |
texinfo-4.1 | 11Mbytes | info、install-info、makeinfo、texi2dvi、texindex |
textutils-2.0 | 24Mbytes | cat、cut、expand、head、join、od、sort、tail、wcなど |
表1 今回インストールするパッケージ。ファイルサイズはおおよその数値 |
ファイルの展開方法だが、次のようなコマンドで行うと一度で済むので便利だ。
bzcat ファイル名 | tar xv
大抵の(おそらくすべての)ファイルは、そのファイル名と一致するディレクトリを作成して、そこに圧縮されていたファイルを展開する。
展開されたファイルのコンパイル方法はそれぞれ違うため、ここでは特別な処理あるいは注意が必要なものについてのみ解説する。これら以外のコマンドについては、以下に用意したコンパイル用スクリプトを参照してほしい。このスクリプトを実行すると、今回コンパイルすべきコマンドを一気にコンパイルできる。
コンパイル用スクリプト:lfs-compile.sh
注:EUCで保存すること。
スクリプトを見れば、何がインストールされるのか、どうインストールするのかが分かるだろう。また、最後にLFS用のpasswdとgroupファイルを作成していることも分かる。これを作っておかないと、LFSを独立させて起動するときに「ユーザーがない」という事態になるからだ。
bash-2.05a
/usr/lib/libncurses.aと/usr/lib/libcurses.aを必要とする。既存のLinux上にこれらのファイルが存在するかどうかを確認し、存在しなければncurses-devパッケージをインストールする。また、libcurses.aがない場合は以下のようにしてlibcurses.aのシンボリックリンクを作成することで代用してもよい。
# cd /usr/lib && # ln -s libncurses.a libcurses.a
diffutils-2.8
glibcのバージョンによって対処が必要になる。
$ rpm -qa | grep glibc
とすれば、glibcのバージョンが分かる。その結果が2.2以降であればスクリプトどおりで構わないが、2.1以前だった場合はスクリプトの
./configure --prefix=$LFS/usr --disable-nls && make LDFLAGS=-static && make install &&
の個所を
./configure --prefix=$LFS/usr --disable-nls unset CPPFLAGS && make LDFLAGS=-static && make install &&
に書き換える。
fileutils-4.1
glibc-2.2.3以上やAMD CPU、たまにはIntel CPUでも、生成したプログラムがセグメンテーション・フォルトで動作しない可能性がある。コンパイル後に、
$ $LFS/bin/ls
を実行し、ファイルリストが表示されるかどうかを確認する。もし「Segmentation Fault」が発生するようなら、次のコマンドを実行してパッチを当て、再度コンパイルを行う。
$ cp lib/Makefile.in lib/Makefile.in.backup $ sed -e 's/\(.*\)\(fopen-safer\.c \)\\/\1\2atexit.c \\/' \ -e 's/\(.*\)\(idcache\$U\.\$.*\)\\/\1\2atexit$U.$(OBJEXT) \\/' \ lib/Makefile.in.backup > lib/Makefile.in
パッチはMakefileを書き換える。パッチを適用する前に、ファイルを展開したディレクトリ(fileutils-4.1)を削除して、再展開しておくこと。なお、インストールしたプログラム($LFS/bin/ls)などを消す必要はない(上書きされるため)。
gawk-3.1.0
既存Linuxのglibcが2.1以下の場合は、スクリプトの
cp awklib/Makefile.in awklib/Makefile.in.backup sed -e '/^datadir/s/awk/gawk/' \ -e '/^libexecdir/s%/awk%%' awklib/Makefile.in.backup \ > awklib/Makefile.in && ./configure --prefix=$LFS/usr --disable-nls --libexecdir=$LFS/usr/bin && make LDFLAGS=-static && make install &&
の部分を以下のように書き換える。
cp awklib/Makefile.in awklib/Makefile.in.backup sed -e '/^datadir/s/awk/gawk/' \ -e '/^libexecdir/s%/awk%%' awklib/Makefile.in.backup \ > awklib/Makefile.in export CPPFLAGS=-Dre_max_failures=re_max_failure2 ./configure --prefix=$LFS/usr --disable-nls --libexecdir=$LFS/usr/bin unset CPPFLAGS make LDFLAGS=-static make install
以上で、chrootした状態でもLFSに必要なプログラムを自力でコンパイルできる環境が整った。次回は、chrootでパーティションを独立させ、OSとしての体裁を整える。
Copyright © ITmedia, Inc. All Rights Reserved.