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/7.6/longindex.html#kernel-config-index
を参照してください。 さらに詳しくカーネルの構築や設定を説明している http://www.kroah.com/lkn/ もあります。
注記
カーネル設定を行うにあたって、分かりやすいやり方として make
defconfig を実行する方法があります。
これを実行することで基本的な設定がなされ、現在のシステム構成が考慮された、より良い設定が得られるかもしれません。
以下のカーネル項目を設定してください。
Device Drivers --->
Generic Driver Options --->
[ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
[*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]
システムに特定の機能性が必要になれば、それだけ多くのオプションが必要となります。 例えば BLFS
パッケージにて必要となるオプションについては
BLFS Index of Kernel Settings
(http://www.linuxfromscratch.org/blfs/view/7.6/longindex.html#kernel-config-index)
を参照してください。
上の設定項目の説明
-
Support for
uevent helper
-
本項目を有効にすることで、デバイス管理を Udev/Eudev により行ないます。
-
Maintain a
devtmpfs
-
本項目は、カーネルにより事前登録される自動化デバイスノードを生成します。 これは Udev
が動作していなくても行われます。 Udev はその上で起動し、パーミッション管理やシンボリックリンクの追加を行います。
Udev/Eudev を利用する場合には本項目を有効にすることが必要です。
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-3.16.2
ディレクトリにそのファイルをコピーしてください。 もっともこのやり方はお勧めしません。
設定項目をメニューから探し出して、カーネル設定を一から行っていくことが望ましいことです。
カーネルイメージとモジュールをコンパイルします。
make
カーネルモジュールを利用する場合 /etc/modprobe.d
ディレクトリ内での設定を必要とします。 モジュールやカーネル設定に関する情報は 7.3.「デバイスとモジュールの扱いについて」や linux-3.16.2/Documentation
ディレクトリにあるカーネルドキュメントを参照してください。 また modprobe.d(5)
も有用です。
カーネル設定においてモジュールを利用することにした場合、モジュールをインストールします。
make modules_install
カーネルのコンパイルが終わったら、インストールの完了に向けてあと少し作業を行います。 /boot
ディレクトリにいくつかのファイルをコピーします。
カーネルイメージへのパスは、利用しているプラットフォームによってさまざまです。 そのファイル名は、好みにより自由に変更して構いません。
ただし vmlinuz という語は必ず含めてください。
これにより、次節で説明するブートプロセスを自動的に設定するために必要なことです。 以下のコマンドは x86
アーキテクチャーの場合の例です。
cp -v arch/x86/boot/bzImage /boot/vmlinuz-3.16.2-lfs-7.6
System.map
はカーネルに対するシンボルファイルです。
このファイルはカーネル API の各関数のエントリポイントをマッピングしています。
同様に実行中のカーネルのデータ構成のアドレスを保持します。
このファイルは、カーネルに問題があった場合にその状況を調べる手段として利用できます。
マップファイルをインストールするには以下を実行します。
cp -v System.map /boot/System.map-3.16.2
カーネル設定ファイル .config
は、上で実行した
make menuconfig
によって生成されます。 このファイル内には、今コンパイルしたカーネルの設定項目の情報がすべて保持されています。
将来このファイルを参照する必要が出てくるかもしれないため、このファイルを保存しておきます。
cp -v .config /boot/config-3.16.2
Linux カーネルのドキュメントをインストールします。
install -d /usr/share/doc/linux-3.16.2
cp -r Documentation/* /usr/share/doc/linux-3.16.2
カーネルのソースディレクトリは所有者が root
ユーザーになっていません。 我々は chroot 環境内の root
ユーザーとなってパッケージを展開してきましたが、展開されたファイル類はパッケージ開発者が用いていたユーザー ID、グループ ID
が適用されています。 このことは普通はあまり問題になりません。
というのもパッケージをインストールした後のソースファイルは、たいていは削除するからです。 一方 Linux
のソースファイルは、削除せずに保持しておくことがよく行われます。
このことがあるため開発者の用いたユーザーIDが、インストールしたマシン内の誰かの ID に割り当たった状態となりえます。
その人はカーネルソースを自由に書き換えてしまう権限を持つことになるわけです。
カーネルのソースファイルを保持しておくつもりなら linux-3.16.2
ディレクトリにおいて chown -R
0:0 を実行しておいてください。 これによりそのディレクトリの所有者は root ユーザーとなります。
警告
カーネルを説明する書の中には、カーネルのソースディレクトリに対してシンボリックリンク /usr/src/linux
の生成を勧めているものがあります。 これはカーネル 2.6
系以前におけるものであり LFS システム上では生成してはなりません 。 ベースとなる LFS
システムを構築し、そこに新たなパッケージを追加していこうとした際に、そのことが問題となるからです。
警告
さらに include
ディレクトリ (/usr/include
) にあるヘッダーファイルは、必ず Glibc のコンパイルによって得られるものでなければなりません。
つまり 6.7.「Linux-3.16.2 API ヘッダー」
によってインストールされた、健全化 (sanitizing) したものです。
したがって生のカーネルヘッダーや他のカーネルにて健全化されたヘッダーによって上書きされてしまうのは避けなければなりません。
8.3.2. Linux
モジュールのロード順の設定
たいていの場合 Linux モジュールは自動的にロードされます。 しかし中には特定の指示を必要とするものもあります。
モジュールをロードするプログラム、modprobe または insmod は、そのような指示を行う目的で
/etc/modprobe.d/usb.conf
を利用します。 USB
ドライバー (ehci_hcd, ohci_hcd, uhci_hcd)
がモジュールとしてビルドされていた場合には、それらを正しい順でロードしなければならず、そのために /etc/modprobe.d/usb.conf
ファイルが必要となります。 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