8.3. Linux-2.6.32.8

Linux パッケージは Linux カーネルを提供します。

概算ビルド時間: 1.5 - 5.0 SBU
必要ディスク容量: 450 - 500 MB

8.3.1. カーネルのインストール

カーネルの構築は、カーネルの設定・コンパイル・インストールの順に行っていきます。 本書が行っているカーネル設定の方法以外については、カーネルソースツリー内にある README ファイルを参照してください。

コンパイルするための準備として以下のコマンドを実行します。

make mrproper

これによりカーネルソースが完全にクリーンなものになります。 カーネル開発チームは、カーネルコンパイルするなら、そのたびにこれを実行することを推奨しています。 tar コマンドにより伸張しただけのソースではクリーンなものにはなりません。

メニュー形式のインターフェースによりカーネルを設定します。 カーネルの設定方法に関する一般的な情報が http://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt にあるので参照してください。 BLFS では LFS が取り扱わない各種パッケージに対して、必要となるカーネル設定項目を説明しています。 http://www.linuxfromscratch.org/blfs/view/svn/longindex.html#kernel-config-index を参照してください。

make LANG=<host_LANG_value> LC_ALL= menuconfig

make パラメータの意味:

LANG=<host_LANG_value> LC_ALL=

これはホストのロケール設定を指示するものです。 この設定は UTF-8 での表示設定がされたテキストコンソールにて、 menuconfig の ncurses による行表示を適切に行うために必要となります。

<host_LANG_value> の部分は、ホストの $LANG 変数の値に置き換えてください。 ホストにてその値が設定されていない場合は $LC_ALL あるいは $LC_CTYPE の値を設定してください。

上のコマンドではなく、状況によっては make oldconfig を実行することが適当な場合もあります。 詳細についてはカーネルソース内の README ファイルを参照してください。

カーネル設定は行わずに、ホストシステムにあるカーネル設定ファイル .config をコピーして利用することもできます。 そのファイルが存在すればの話です。 その場合は linux-2.6.32.8 ディレクトリにそのファイルをコピーしてください。 もっともこのやり方はお勧めしません。 設定項目をメニューから探し出して、カーネル設定を一から行っていくことが望ましいことです。

カーネルイメージとモジュールをコンパイルします。

make

カーネルモジュールを利用する場合 /etc/modprobe.d ディレクトリ内での設定を必要とします。 モジュールやカーネル設定に関する情報は 7.9. 「LFS システムにおけるデバイスとモジュールの扱い」linux-2.6.32.8/Documentation ディレクトリにあるカーネルドキュメントを参照してください。 また modprobe.conf(5) も有用です。

カーネル設定においてモジュールを利用することにした場合、モジュールをインストールします。

make modules_install

カーネルのコンパイルが終わったら、インストールの完了に向けてあと少し作業を行います。 /boot ディレクトリにいくつかのファイルをコピーします。

カーネルイメージへのパスは、利用しているプラットフォームによってさまざまです。 そのファイル名は、好みにより自由に変更して構いません。 ただし vmlinux という語は必ず含めてください。 これにより、次節で説明するブートプロセスを自動的に設定するために必要なことです。 以下のコマンドは x86 アーキテクチャの場合の例です。

cp -v arch/x86/boot/bzImage /boot/vmlinux-2.6.32.8-lfs-6.6

System.map はカーネルに対するシンボルファイルです。 このファイルはカーネル API の各関数のエントリポイントをマッピングしています。 同様に実行中のカーネルのデータ構成のアドレスを保持します。 このファイルは、カーネルに問題があった場合にその状況を調べる手段として利用できます。 マップファイルをインストールするには以下を実行します。

cp -v System.map /boot/System.map-2.6.32.8

カーネル設定ファイル .config は、上で実行した make menuconfig によって生成されます。 このファイル内には、今コンパイルしたカーネルの設定項目の情報がすべて保持されています。 将来このファイルを参照する必要が出てくるかもしれないため、このファイルを保存しておきます。

cp -v .config /boot/config-2.6.32.8

Linux カーネルのドキュメントをインストールします。

install -d /usr/share/doc/linux-2.6.32.8
cp -r Documentation/* /usr/share/doc/linux-2.6.32.8

カーネルのソースディレクトリは所有者が root ユーザーになっていません。 我々は chroot 環境内の root ユーザーとなってパッケージを展開してきましたが、展開されたファイル類はパッケージ開発者が用いていたユーザー ID、グループ ID が適用されています。 このことは普通はあまり問題になりません。 というのもパッケージをインストールした後のソースファイルは、たいていは削除するからです。 一方 Linux のソースファイルは、削除せずに保持しておくことがよく行われます。 このことがあるため開発者の用いたユーザーIDが、インストールしたマシン内の誰かの ID に割り当たった状態となりえます。 その人はカーネルソースを自由に書き換えてしまう権限を持つことになるわけです。

カーネルのソース・ファイルを保持しておくつもりなら linux-2.6.32.8 ディレクトリにおいて chown -R 0:0 を実行しておいてください。 これによりそのディレクトリの所有者は root ユーザーとなります。

[警告]

警告

カーネルを説明する書の中には、カーネルのソースディレクトリに対してシンボリックリンク /usr/src/linux の生成を勧めているものがあります。 これはカーネル 2.6 系以前におけるものであり LFS システム上では生成してはなりません 。 ベースとなる LFS システムを構築し、そこに新たなパッケージを追加していこうとした際に、そのことが問題となるからです。

[警告]

警告

さらに include ディレクトリにあるヘッダファイルは、必ず Glibc のコンパイルによって得られるものでなければならず、つまりは Linux カーネルの tarball によって提供されるものでなければなりません。 したがってカーネルヘッダによって上書きされてしまうのは避けなければなりません。

8.3.2. Linux モジュールのロード順の設定

USB ドライバをモジュールとして構築した場合は /etc/modprobe.d/usb.conf ファイルを生成する必要があります。 USB ドライバには ehci_hcd、ohci_hcd、uhci_hcd があります。 これらのロード順は正しく行う必要があります。 ehci_hcd は ohci_hcd や uhci_hcd よりも先にロードしなければなりません。 これを行わないとブート時に警告メッセージが出力されます。

以下のコマンドを実行して /etc/modprobe.d/usb.conf ファイルを生成します。

install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Begin /etc/modprobe.d/usb.conf

install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true

# End /etc/modprobe.d/usb.conf
EOF

8.3.3. Linux の構成

インストールファイル: config-2.6.32.8, lfskernel-2.6.32.8, System.map-2.6.32.8

概略説明

config-2.6.32.8

カーネルの設定をすべて含みます。

vmlinux-2.6.32.8-lfs-6.6

Linux システムのエンジンです。 コンピュータを起動した際には、オペレーティングシステム内にて最初にロードされるものです。 カーネルはコンピュータのハードウェアを構成するあらゆるコンポーネントを検知して初期化します。 そしてそれらのコンポーネントをツリー階層のファイルとして、ソフトウェアが利用できるようにします。 ただひとつの CPU からマルチタスクを処理するマシンとして、あたかも多数のプログラムが同時稼動しているように仕向けます。

System.map-2.6.32.8

アドレスとシンボルのリストです。 カーネル内のすべての関数とデータ構成のエントリポイントおよびアドレスを示します。