10.3.1. カーネル のインストール
カーネルの構築は、カーネルの設定、コンパイル、インストールの順に行っていきます。
本書が行っているカーネル設定の方法以外については、カーネルソースツリー内にある README
ファイルを参照してください。
コンパイルするための準備として以下のコマンドを実行します。
make mrproper
これによりカーネルソースが完全にクリーンなものになります。
カーネル開発チームは、カーネルコンパイルするなら、そのたびにこれを実行することを推奨しています。 tar
コマンドにより伸張しただけのソースではクリーンなものにはなりません。
カーネルオプションの設定方法にはいくつかあります。 通常は以下に示すように、メニュー形式のインターフェースを通じて行います。
make menuconfig
追加する make 環境変数の意味:
-
LANG=<host_LANG_value>
LC_ALL=
-
これはホストのロケール設定を指示するものです。 この設定は UTF-8 での表示設定がされたテキストコンソールにて
menuconfig の ncurses による行表示を適切に行うために必要となります。
<host_LANG_value>
の部分は、ホストの $LANG
変数の値に置き換えてください。
$LC_ALL
あるいは $LC_CTYPE
の値を設定することもできます。
-
make
menuconfig
-
これは ncurses によるメニュー形式のインターフェースを起動します。
これ以外の(グラフィカルな)インターフェースについては make help を入力して確認してください。
カーネルの設定方法に関する一般的な情報が
http://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt
にあるので参照してください。 BLFS では LFS
が取り扱わない各種パッケージに対して、必要となるカーネル設定項目を説明しています。
http://www.linuxfromscratch.org/blfs/view/svn/longindex.html#kernel-config-index
を参照してください。 さらに詳しくカーネルの構築や設定を説明している http://www.kroah.com/lkn/ もあります。
注記
カーネル設定を行うにあたって、分かりやすいやり方として make
defconfig を実行する方法があります。
これを実行することで基本的な設定がなされ、現在のシステム構成が考慮された、より良い設定が得られるかもしれません。
以下の機能項目についての有効、無効、設定状況を確認してください。
不適切である場合にはシステムが正常動作しなかったり起動できなかったりするかもしれません。
General setup -->
[ ] Auditing Support [CONFIG_AUDIT]
[*] Control Group support [CONFIG_CGROUPS]
[ ] Enable deprecated sysfs features to support old userspace tools [CONFIG_SYSFS_DEPRECATED]
[*] Configure standard kernel features (expert users) [CONFIG_EXPERT] --->
[*] open by fhandle syscalls [CONFIG_FHANDLE]
Processor type and features --->
[*] Enable seccomp to safely compute untrusted bytecode [CONFIG_SECCOMP]
Firmware Drivers --->
[*] Export DMI identification via sysfs to userspace [CONFIG_DMIID]
Networking support --->
Networking options --->
<*> The IPv6 protocol [CONFIG_IPV6]
Device Drivers --->
Generic Driver Options --->
[ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
[*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]
Firmware Loader --->
[ ] Enable the firmware sysfs fallback mechanism [CONFIG_FW_LOADER_USER_HELPER]
File systems --->
[*] Inotify support for userspace [CONFIG_INOTIFY_USER]
Pseudo filesystems --->
[*] Tmpfs POSIX Access Control Lists [CONFIG_TMPFS_POSIX_ACL]
注記
"The IPv6 Protocol" については厳密には不要としても良いものですが、システム開発者は強く推奨しているものです。
注記
ホストシステムが UEFI を利用している場合は、上の 'make defconfig' によって EFI
に関連するカーネルオプションが自動的に追加されます。
LFS のカーネルを UEFI を利用したホストシステム環境内からブートする場合は本オプションを指定する必要があります。
Processor type and features --->
[*] EFI stub support [CONFIG_EFI_STUB]
LFS 環境にて UEFI を取り扱う詳細な方法は
http://www.linuxfromscratch.org/hints/downloads/files/lfs-uefi.txt
に示されている lfs-uefi.txt ヒントを参照してください。
上の設定項目の説明
-
Support for
uevent helper
-
本項目を有効にすることで、デバイス管理を Udev/Eudev により行ないます。
-
Maintain a
devtmpfs
-
本項目は、カーネルにより事前登録される自動化デバイスノードを生成します。 これは Udev
が動作していなくても行われます。 Udev はその上で起動し、パーミッション管理やシンボリックリンクの追加を行います。
Udev/Eudev を利用する場合には本項目を有効にすることが必要です。
上のコマンドではなく、状況によっては make
oldconfig を実行することが適当な場合もあります。 詳細についてはカーネルソース内の
README
ファイルを参照してください。
カーネル設定は行わずに、ホストシステムにあるカーネル設定ファイル .config
をコピーして利用することもできます。 そのファイルが存在すればの話です。
その場合は linux-5.11.10
ディレクトリにそのファイルをコピーしてください。 もっともこのやり方はお勧めしません。
設定項目をメニューから探し出して、カーネル設定を一から行っていくことが望ましいことです。
カーネルイメージとモジュールをコンパイルします。
make
カーネルモジュールを利用する場合 /etc/modprobe.d
ディレクトリ内での設定を必要とします。 モジュールやカーネル設定に関する情報は 「デバイスとモジュールの扱いについて」や linux-5.11.10/Documentation
ディレクトリにあるカーネルドキュメントを参照してください。 また modprobe.d(5)
も有用です。
カーネル設定においてモジュールの利用を無効にしているのでなければ、ここでモジュールをインストールします。
make modules_install
カーネルのコンパイルが終わったら、インストールの完了に向けてあと少し作業を行います。 /boot
ディレクトリにいくつかのファイルをコピーします。
注意
ホストシステムが独立した /boot パーティションを用いている場合はファイルをそこにコピーします。
これを簡単に行うために、作業前に(chroot 前の)/boot をホストの /mnt/lfs/boot
にバインドしておく方法があります。 ホストシステム
の root ユーザーとなって以下を実行します。
mount --bind /boot /mnt/lfs/boot
カーネルイメージへのパスは、利用しているプラットフォームによってさまざまです。 そのファイル名は、好みにより自由に変更して構いません。
ただし vmlinuz という語は必ず含めてください。
これにより、次節で説明するブートプロセスを自動的に設定するために必要なことです。 以下のコマンドは x86
アーキテクチャーの場合の例です。
cp -iv arch/x86/boot/bzImage /boot/vmlinuz-5.11.10-lfs-20210326-systemd
System.map
はカーネルに対するシンボルファイルです。
このファイルはカーネル API の各関数のエントリポイントをマッピングしています。
同様に実行中のカーネルのデータ構成のアドレスを保持します。
このファイルは、カーネルに問題があった場合にその状況を調べる手段として利用できます。
マップファイルをインストールするには以下を実行します。
cp -iv System.map /boot/System.map-5.11.10
カーネル設定ファイル .config
は、上で実行した
make menuconfig
によって生成されます。 このファイル内には、今コンパイルしたカーネルの設定項目の情報がすべて保持されています。
将来このファイルを参照する必要が出てくるかもしれないため、このファイルを保存しておきます。
cp -iv .config /boot/config-5.11.10
Linux カーネルのドキュメントをインストールします。
install -d /usr/share/doc/linux-5.11.10
cp -r Documentation/* /usr/share/doc/linux-5.11.10
カーネルのソースディレクトリは所有者が root
ユーザーになっていません。 我々は chroot 環境内の root
ユーザーとなってパッケージを展開してきましたが、展開されたファイル類はパッケージ開発者が用いていたユーザー ID、グループ ID
が適用されています。 このことは普通はあまり問題になりません。
というのもパッケージをインストールした後のソースファイルは、たいていは削除するからです。 一方 Linux
のソースファイルは、削除せずに保持しておくことがよく行われます。
このことがあるため開発者の用いたユーザーIDが、インストールしたマシン内の誰かの ID に割り当たった状態となりえます。
その人はカーネルソースを自由に書き換えてしまう権限を持つことになるわけです。
注記
カーネルの設定は、BLFS をインストールしていくにつれて、設定を更新していかなければならないことが多々あります。
一般にパッケージのソースは削除することが通常ですが、カーネルのソースに関しては、カーネルをもう一度新たにインストールするなら、削除しなくて構いません。
カーネルのソースファイルを保持しておくつもりなら linux-5.11.10
ディレクトリにおいて chown -R 0:0 を実行しておいてください。
これによりそのディレクトリの所有者は root
ユーザーとなります。
警告
カーネルを説明する書の中には、カーネルのソースディレクトリに対してシンボリックリンク /usr/src/linux
の生成を勧めているものがあります。 これはカーネル 2.6
系以前におけるものであり LFS システム上では生成してはなりません 。 ベースとなる LFS
システムを構築し、そこに新たなパッケージを追加していこうとした際に、そのことが問題となるからです。
警告
さらに include
ディレクトリ (/usr/include
) にあるヘッダーファイルは、必ず Glibc のコンパイル時のものでなければなりません。 つまり
「Linux-5.11.10 API ヘッダー」
によってインストールされた、健全化 (sanitizing) したものです。
したがって生のカーネルヘッダーや他のカーネルにて健全化されたヘッダーによって上書きされてしまうのは避けなければなりません。
10.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