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