webmaster: 2006年12月アーカイブ

LFS Book: 5.33.Stripping

暫定環境構築作業もあと少しで終りです。最後に今までの作業で生成された不要なデバッグ情報等を削除します。この作業は必須ではありませんが、ディスク容量がちょっとだけ空きができるので、やっておいて損はないでしょう。以下のコマンドを実行します。

$ strip --strip-debug /tools/lib/*
$ strip --strip-unneeded /tools/{,s}bin/*
$ rm -rf /tools/{info,man}

LFS Book: 5.13.Gawk-3.1.4〜5.32.Perl-5.8.7

次なるステップは暫定環境に必要な残り20種類ものパッケージをひたすらインストールしていきます。
実行コマンドは以下の通りです。

Gawk-3.1.4
$ cd $LFS/sources/gawk-3.1.4
$ ./configure --prefix=/tools
$ make
$ make install

Coreutils-5.2.1
$ cd $LFS/sources/coreutils-5.2.1
$ DEFAULT_POSIX2_VERSION=199209 \
>./configure --prefix=/tools
$ make
$ make install

Bzip2-1.0.3
$ cd $LFS/sources/bzip2-1.0.3
$ make
$ make PREFIX=/tools install

Gzip-1.3.5
$ cd $LFS/sources/gzip-1.3.5
$ ./configure --prefix=/tools
$ make
$ make install

Diffutils-2.8.1
$ cd $LFS/sources/diffutils-2.8.1
$ ./configure --prefix=/tools
$ make
$ make install

Findutils-4.2.23
$ cd $LFS/sources/findutils-4.2.23
$ ./configure --prefix=/tools
$ make
$ make install

Make-3.80
$ cd $LFS/sources/make-3.80
$ ./configure --prefix=/tools
$ make
$ make install

Grep-2.5.1a
$ cd $LFS/sources/grep-2.5.1a
$ ./configure --prefix=/tools --disable-perl-regexp
$ make
$ make install

Sed-4.1.4
$ cd $LFS/sources/sed-4.1.4
$ ./configure --prefix=/tools
$ make
$ make install

Gettext-0.14.3
$ cd $LFS/sources/gettext-0.14.3
$ ./configure --prefix=/tools \
>--disable-libasprintf \
>--without-csharp
$ make
$ make install

Ncurses-5.4
$ cd $LFS/sources/ncurses-5.4
$ ./configure \
>--prefix=/tools \
>--with-shared \
>--without-debug \
>--without-ada \
>--enable-overwrite
$ make
$ make install

Patch-2.5.4
$ cd $LFS/sources/patch-2.5.4
$ CPPFLAGS=-D_GNU_SOURCE ./configure --prefix=/tools
$ make
$ make install

Tar-1.15.1
$ cd $LFS/sources/tar-1.15.1
$ ./configure --prefix=/tools
$ mkae
$ make install

Texinfo-4.8
$ cd $LFS/sources/texinfo-4.8
$ ./configure --prefix=/tools
$ make
$ make install

Bash-3.0
$ cd $LFS/sources/bash-3.0
$ patch -Np1 -i ../bash-3.0-avoid_WCONTINUED-1.patch
$ ./configure --prefix=/tools --without-bash-malloc
$ make
$ make install
$ ln -vs bash /tools/bin/sh

M4-1.4.3
$ cd $LFS/sources/m4-1.4.3
$ ./configure --prefix=/tools
$ make
$ make install

Bison-2.0
$ cd $LFS/sources/bison-2.0
$ ./configure --prefix=/tools
$ make
$ make install

Flex-2.5.31
$ cd $LFS/sources/flex-2.5.31
$ patch -Np1 -i ../flex-2.5.31-debian_fixes-3.patch
$ touch doc/flex.1
$ ./configure --prefix=/tools
$ make
$ make install

Util-linux-2.12q
$ cd $LFS/sources/util-linux-2.12q
$ sed -i 's@/usr/include@/tools/include@g' configure
$ ./configure
$ make -C lib
$ make -C mount mount umount
$ make -C text-utils more
$ cp mount/{,u}mount text-utils/more /tools/bin

Perl-5.8.7
$ cd $LFS/sources/perl-5.8.7
$ patch -Np1 -i ../perl-5.8.7-libc-1.patch
$ ./configure.gnu \
>--prefix=/tools \
>-Dstatic_ext='IO Fcntl POSIX'
$ make perl utilities
$ cp -v perl pod/pod2man /tools/bin
$ mkdir -pv /tools/lib/perl5/5.8.7
$ cp -Rv lib/* /tools/lib/perl5/5.8.7

難しいことはありません。パッケージによっては若干違いがありますが、基本的にはただひたすら、
./configure → make → make installを実行していくだけです。

LFS Book: 5.12.Binutils-2.15.94.0.2.2-Pass2

GCCのインストールが終り、この時点で新しいライブラリ、GCCを利用して再度Binutilsをコンパイルしてインストールします。実行コマンドは以下の通りです。

$ cd $LFS/sources
$ tar jxvf binutils-2.15.94.0.2.2.tar.bz2
$ mkdir -v ../binutils-build
$ cd ../binutils-build
$ ../binutils-2.15.94.0.2.2/configure \
>--prefix=/tools \
>--disable-nls \
>--enable-shared \
>--with-lib-path=/tools/lib
$ make
$ make check
$ make install
$ make -C ld clean
$ make -C ld LIB_PATH=/usr/lib:/lib

binutilsのインストール(一発目)同様にこの時点のソースディレクトリ、ビルドディレクトリは次章でも使用するので残しておきます。

LFS Book: 5.11.GCC-3.4.3-Pass2

新しいライブラリを使用してGCCを再コンパイルします。その前に、ここまでの環境を確認するため、簡単なテストコマンドを実行します。

$ expect -c "spawn ls"
spawn ls

上記の通り、「spawn ls」と表示されれば問題ありません。次の作業に進んでOKです。

GCCの再コンパイルでは、ソースを再度展開し、必要なパッチも当てるので、一発目にコンパイルした時のソースディレクトリとビルド用ディレクトリが残っている場合は、削除します。以上を前提として、実行コマンドは下記の通りです。

$ cd $LFS/sources/
$ tar jxvf gcc-3.4.3.tar.bz2
$ cd gcc-3.4.3
$ patch -Np1 -i ../gcc-3.4.3-no_fixincludes-1.patch
$ patch -Np1 -i ../gcc-3.4.3-specs-2.patch
$ mkdir -v ../gcc-build
$ cd ../gcc-build
$ ../gcc-3.4.3/configure \
>--prefix=/tools \
>--libexecdir=/tools/lib \
>--with-local-prefix=/tools \
>--enable-clocale=gnu \
>--enable-shared \
>--enable-threads=posix \
>--enable-__cxa_atexit \
>--enable-languages=c,c++ \
>--disable-libstdcxx-pch
$ make
$ make -k check
$ ../gcc-3.4.3/contrib/test_summary | grep -A7 Summ
$ make install

なお、makeとmake- k checkはかなりの時間がかかります。make -k checkが終ったら、一応テスト結果を確認します。LFS Bookによると、テスト結果として避けることができない、いくつかの予期していない失敗もあり、下記のリンク先と比較してそれほど乖離が無ければ次に進んで構わないとあります。
http://www.linuxfromscratch.org/lfs/build-logs/6.1.1/chapter5/gcc-3.4.3

小生の場合、gccのSummaryでunexpected failuresが39個もあったのが気になりましたが、どうすることもできないので、そのまんまインストールまで強行しました。

なお、gccのビルドディレクトリ、ソースディレクトリはこの時点で削除しておきます。

LFS Book: 5.8.Tcl-8.4.9〜5.10.DejaGNU1.4.4

引き続いてその他パッケージをインストールして生きます。

先ずはTcl(Tool Command Language;スクリプト言語の一種)をインストールします。実行コマンドは以下の通りです。

$ cd $LFS/sources/tcl8.4.9
$ cd unix
$ cp configure configure.org
$ vi configure → configure のバグを以下の通り修正
$ diff configure.org configure
2134c2134
< system=MP-RAS-`awk '{print}' /etc/.relid'`
---
> system=MP-RAS-`awk '{print}' /etc/.relid`
7325c7325
< system=MP-RAS-`awk '{print}' /etc/.relid'`
---
> system=MP-RAS-`awk '{print}' /etc/.relid`
$ ./configure --prefix=/tools
$ make
$ make install
$ cd ..
$ export TCLPATH=`pwd`
$ ln -sv tclsh8.4 /tools/bin/tclsh

configureの修正内容はちょっと分かりにくいですが、最後の"/etc/.relid"の後にシングルクォーテーション「'」が混入しているので、それを削除します。また、tclのソースディレクトリは次のパッケージで必要とするため、未だ削除してはなりません。

次に、expect(コンパイルの確認時などに使用するTcl拡張ツール)をインストールします。実行コマンドは以下の通りです。

$ cd $LFS/sources/expect-5.43
$ patch -Np1 -i ../expect-5.43.0-spawn-1.patch
$ ./configure \
>--prefix=/tools \
>--with-tcl=/tools/lib \
>--with-tclinclude=$TCLPATH \
>--with-x=no
$ make
$ make SCRIPTS="" install
$ unset TCLPATH

もう一つ、DejaGNU(プログラムをテストするためのフレームワークを含むパッケージ)をインストールします。インストール方法は下記の通りです。

$ cd $LFS/sources/dejagnu-1.4.4
$ ./configure --prefix=/tools
$ make install

LFS Book: 5.7.Adjusting the Toolchain

大晦日の本日はLFS構築記4日目として暫定環境の調整から作業を開始します。
前回Glibcのインストールが終ったので、以降の作業でインストールするパッケージはこの暫定環境用にインストールしたGlibcにリンクするように調整します。また、GCCについてもスペックファイルを編集します。

先ず、以前残しておいたBinutilsのビルド用ディレクトリに移動し、リンカのみをインストールします。実行コマンドは以下の通りです。

$ cd $LFS/sources/binutils-build
$ make -C ld install

この時点でBinutilsのソースディレクトリとビルド用ディレクトリは削除して構いません。Binutilsはこの後のLFSの本システム構築時にもビルドするので、後々の混乱を避けるためにも削除しておくことをお奨めします。

次に、スペックファイルを編集します。実行コマンドは以下の通りです。最後のコマンドはホスト側のインクルードファイルがGCC固有のインクルードファイルへのパスを見つけてしまう可能性があるため、余計なヘッダファイルを削除しています。

$ SPECFILE=`gcc --print-file specs` &&
>sed 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \
>$SPECFILE > tempspecfile &&
>mv -f tempspecfile $SPECFILE &&
>unset SPECFILE
$ rm -vf /tools/lib/gcc/*/*/include/{pthread.h,bits/sigthread.h}

最後に簡単なダミープログラムを使用してここまでの暫定環境が正しく動作しているか確認します。テスト方法は以下の通りです。

$ echo 'main(){}' > dummy.c
$ cc dummy.c
$ readelf -l a.out | grep ': /tools'
[Requesting program interpreter: /tools/lib/ld-linux.so.2]

上記の例の様に、ダイナミックリンカld-linux.so.2のパスが/tools/libであることを確認します。

LFS Book: 5.5.Linux-Libc-Headers-2.6.11.2〜5.6.Glibc-2.3.4

3日目の夜勤明けの今日は、引続き暫定環境の構築作業を行います。

先ず、カーネルヘッダファイルのインストールですが、単にコピーするだけで終りです。

$ cd $LFS/sources/linux-libc-headers-2.6.11.2
$ cp -Rv include/asm-i386 /tools/include/asm
$ cp -Rv include/linux /tools/include

続いて、Glibc(主要なCライブラリ)のインストールです。以下のコマンドを実行します。
LFS Bookによると、処理時間11.8SBUとのことなので、それなりに時間がかかります。なお、ホスト側のカーネルが2.6.11以降の場合はパッチを当てる必要があります。

$ cd $LFS/sources/glibc-2.3.4
$ patch -Np1 -i ../glibc-2.3.4-fix_test-1.patch
$ mkdir -v ../glibc-build
$ cd ../glibc-build
$ ../glibc-2.3.4/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
$ make check
$ mkdir -v /tools/etc
$ touch /tools/etc/ld.so.conf
$ make instal
$ mkdir -pv /tools/lib/locale
$ localedef -i en_US -f ISO-8859-1 en_US
$ localedef -i ja_JP -f EUC-JP ja_JP

最後にロケールのインストールをしていますが、必要な物だけをインストールすれば良いでしょう。上記の例では、米国と日本のロケールだけをインストールしています。

インストールまで正常に完了すれば、展開したソース、ビルド用ディレクトリは削除して構いません。

LFS Book: 5.4.GCC-3.4.3-Pass1

次はGCC(C、C++などのコンパイラツールを含むパッケージ)をビルドします。実行コマンドは以下の通りです。

$ cd $LFS/sources/gcc-3.4.3
$ mkdir -v ../gcc-build
$ cd ../gcc-build
$ ../gcc-3.4.3/configure \
>--prefix=/tools \
>--libexecdir=/tools/lib \
>--with-local-prefix=/tools \
>--disable-nls \
>--enable-shared \
>--enable-languages=c
$ make bootstrap
$ make install
$ ln -vs gcc /tools/bin/cc

LFS Bookによると bootstrapというターゲットを指定すると、コンパイルを数回行うとあります。したがって、1回のビルドに4.4SBUかかるとすると、小生の場合1.0SBUが約6分なので、1回のビルドにかかる時間は約25分。25分×数回となると、1時間以上はかかりそうです。今夜はこれくらいにして、後は明日起きてからやります。なお、gccの場合は特にbinutilsの様に警告が無いので、展開したソースディレクトリ、ビルドディレクトリ(gcc-build)ともにインストール後であれば削除しても問題ありません。

ところで、世の中は今日が仕事納めの様ですが、小生は明日は夜勤です...はぁ。

LFS Book: 5.3.Binutils-2.15.94.0.2.2-Pass1

いよいよ、ここから膨大な数のパッケージのビルド作業が始まります。まずは、LFS Bookに従い、Binutils(オブジェクトファイルを操作するために必要となるリンカー、アセンブラ等のツールを含むパッケージ)のインストールからです。実行コマンドは以下の通りです。
なお、パッチについては、ホスト側OSのgccバージョンが4以降の場合のみ適用します。

$ cd $LFS/sources/binutils-2.15.94.0.2.2
$ patch -Np1 -i ../binutils-2.15.94.0.2.2-gcc4-1.patch
$ mkdir -v ../binutils-build
$ cd ../binutils-build
$ time { ../binutils-2.15.94.0.2.2/configure --prefix=/tools --disable-nls && make && make install; }
$ make -C ld clean
$ make -C ld LIB_PATH=/tools/lib

普通のソースのビルド方法とあまり変わりはありませんが、timeコマンドで処理時間を計測しているのは、今後各種パッケージのビルド時にどれくらい時間がかかるか?の目安となる時間を知るために計測しています。LFS Bookでは、Binutilsのビルドにかかる処理時間を1.0SBU(Standard Build Unit)として定義しています。この後すぐに、GCCをビルドしますがGCCの場合、目安となる処理時間は4.4SBUですので、Binutilsのビルド時間の4.4倍かかることになります。

ちなみに、小生の環境では、以下の結果が得られました。

real 6m1.591s
user 3m45.490s
sys 1m7.310s

最後にld(リンカ)についてはライブラリパスを/tools/libに変更して再コンパイルをしていますが、実際のインストールは後になってから実施します。この関係で、LFS Bookにも警告がありますが、ここでビルドしたディレクトリ(binutils-build)は削除してはなりません(基本的に警告が無ければインストール後に削除しても問題ありません)。

LFS Book: Chapter4.Final Preparations

LFS Bookでは、次章からLFS構築の為の開発環境(以下、暫定環境と呼びます)の構築へと作業が移ります。ここでは、その最終準備として、$LFS/toolsディレクトリ、lfsユーザーの作成等を行います。

先ず、既に設定済だとは思いますが、環境変数LFSの設定値が/mnt/lfsであることを確認します。

# echo $LFS
/mnt/lfs

設定されていなければ、以下のコマンドで設定します。

# export LFS=/mnt/lfs

次にLFS Book5章で構築する暫定環境のインストール先であるディレクトリ$LFS/toolsを作成し、ルートディレクトリにシンボリックリンクを作成します。

# mkdir -v $LFS/tools
# ln -sv $LFS/tools /

次はlfsユーザーの作成です。以降の作業の中心となるソースのコンパイル作業はこのユーザーで実施します。

# groupadd lfs
# useradd -s /bin/bash -g lfs -m -k /dev/null lfs
# passwd lfs

現時点で$LFS/tools、$LFS/sourcesディレクトリはrootが所有者となっているので、これをlfsユーザーに変更し、lfsユーザーにsuします。なお、$LFS/sourcesディレクトリについては、その配下にあるサブディレクトリについても再帰的に所有者を変更しますのでオプション(-R)を付与します。

# chown -v lfs $LFS/tools
# chown -vR lfs $LFS/sources
# su - lfs

最終準備の最後として、lfsユーザーの環境設定を行います。

$ cat > ~/.bash_profile << "EOF"
>exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
>EOF

上記の設定は、ホストOS(ここでは、LFS LiveCD)の余計な環境変数を引き継がないための設定です。次に、~/.bashrcの設定も行っておきます。

$ cat > ~/.bashrc << "EOF"
>set +h
>umask 022
>LFS=/mnt/lfs
>LC_ALL=POSIX
>PATH=/tools/bin:/bin:/usr/bin
>export LFS LC_ALL PATH
>EOF

あとは、~/.bash_profileを読み込んで、環境変数をLFS用に設定しておきます。envコマンドで確認して下記の通りになっていれば、ホストOS側の環境は引き継いでいないと言えるでしょう(プロンプトの表示も場合によっては変わるはずです)。

$ source ~/.bash_profile
lfs:~$ env
TERM=xterm
LC_ALL=POSIX
LFS=/mnt/lfs
PATH=/tools/bin:/bin:/usr/bin
PWD=/home/lfs
PS1=\u:\w\$
SHLVL=1
HOME=/home/lfs
_=/usr/bin/env

LFS Book: Chapter3.Packages and Pathces

LFS構築記2日目の今日は、先ずLFSパッケージのダウンロードから始めます。
そのためには、以下のコマンドでパッケージのソースを格納するディレクトリを作成しておきます。

# mkdir -v $LFS/sources

このディレクトリに対しては、全ユーザーに書き込み権限を与え、更にスティッキービットを設定しておきます。

# chmod -v a+wt $LFS/sources

次に、作成したディレクトリに移動し、パッケージをダウンロードします。

# cd $LFS/sources
# wget ftp://ftp.ca.lfs-matrix.net/pub/lfs/lfs-packages/lfs-packages-6.1.1.tar

容量は148MBほどありますので、落すまでにそれなりに時間がかかります。

ダウンロードが終ったら、パッケージを展開します。

# tar xvf lfs-packages-6.1.1.tar

パッケージを展開すると、LFS構築に必要となる各種ソフトウェアがbz2圧縮されたtarアーカイブ(各種パッチ類も含む)が大量にできますので、以下のコマンドで解凍・展開しておきます。

# for i in * tar.bz2: do tar jxvf $i; done

LFS Book: 2.2.Creating a New Partition 〜 2.4.Mounting the new Partition

ここでは、fdiskを使用して、LFS用のパーティションとswap用パーティションを作成します。
以下のコマンドを実行すると、IDEドライブ(プライマリのマスタ:/dev/hda)に対して、fdiskの対話コマンドが実行可能なCUI画面が表示されます。

# fdisk /dev/hda

fdiskのサブコマンドについては「m」でヘルプが表示されるので、そちらを参照すれば、あまり悩む事は無いかと思いますが、ここでは、以下の通りパーティションを設定しました。

hda1 → swap用(Id:82、容量:512MB)
hda2 → LFS用 (Id:83、容量:10GB)

パーティション作成したら、次にファイルシステムを作成します。LFS Bookではext2で作成しているので、それに従います。

# mke2fs -v /dev/hda2

次にswap領域を初期化しておきます。

# mkswap -v /dev/hda1

次の作業はファイルシステムを作成したので、マウントします。その前に、LFS構築作業の中で重要な環境変数「LFS」を設定し、当該ディレクトリを作成し、ここにLFS用パーティションをマウントします。実行コマンドは以下の通りです。

# export LFS=/mnt/lfs
# mkdir -v $LFS
# mount -v /dev/hda2 $LFS

長らく書き込んでいなかったブログをLFSの構築記として使用することにしました。

LFSの構築環境として使用するLFS LiveCDのisoなイメージは下記のリンクから取得できます。
ftp://ftp.osuosl.org/pub/lfs-livecd/
上記リンクからバージョンx86-6.2-3を選んでダウンロードした後、適当なCDに焼けばLiveCDのできあがりです。

LiveCDを起動すると、「configure system clock」メニューが表示されるので、"Japan"を選択し、続いてシステム日付をLocalTimeにするか、GMTにするかの選択画面が表示されるので、"LocalTime"を選択します。次の「Region settings」メニューでは、"Japanese(EUC-JP)"を選択すると、設定内容の確認画面が表示されるので、"OK"の所にカーソルを合わせ、Enterキーを押下します。

LiveCDの起動が終ると、プロンプトが表示されるので、以下のコマンドでXを起動します。

# startx

しばらくすると、XFceのウインドウマネージャが起動します。

ターミナル画面を起動して適当にキー入力すると気付くかと思われますが、日本語キーボードの場合、一部入力できない文字があることがわかります(パイプとか)。

理由は/etc/X11/xorg.confのキーボード設定がUSキーボードになっているからです。
当該ファイルのキーボード設定セクションの中にある設定を以下の用に修正すれば、問題ありません。

<修正前>
Option "XkbModel" "pc105"
Option "XkbLayout" "us"

<修正後>
Option "XkbModel" "jp106"
Option "XkbLayout" "jp"

ついでに、ホイールマウスを使っている場合は、マウスの設定セクションで以下の設定を追加しておくと、ホイールボタンでターミナル画面をスクロールできます。

Option "ZAxisMapping" "4 5"

以上の修正が終ったら、上書き保存して、Xを再起動します。なお、ファイルの編集にあたっては日本語キーボードなのにUSキーボードとして認識されているので、思ったとおりの文字が入力できない場合もあるでしょう(二重引用符「"」、コロン「:」とか)。そんな時はググッて調べてください(無責任)。

このアーカイブについて

このページには、webmaster2006年12月に書いたブログ記事が含まれています。

次のアーカイブはwebmaster: 2007年1月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。