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 を入力して確認してください。
カーネルの設定方法に関する一般的な情報が
https://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt
にあるので参照してください。 BLFS では LFS
が取り扱わない各種パッケージに対して、必要となるカーネル設定項目を説明しています。
https://www.linuxfromscratch.org/blfs/view/11.2/longindex.html#kernel-config-index
を参照してください。 さらに詳しくカーネルの構築や設定を説明している http://www.kroah.com/lkn/ もあります。
注記
カーネル設定を行うにあたって、分かりやすいやり方として make
defconfig を実行する方法があります。
これを実行することで基本的な設定がなされ、現在のシステム構成が考慮された、より良い設定が得られるかもしれません。
以下の機能項目についての有効、無効、設定状況を確認してください。
不適切である場合にはシステムが正常動作しなかったり起動できなかったりするかもしれません。
General setup -->
[ ] Compile the kernel with warnings as errors [CONFIG_WERROR]
< > Enable kernel headers through /sys/kernel/kheaders.tar.xz [CONFIG_IKHEADERS]
Device Drivers --->
Graphics support --->
Frame buffer Devices --->
[*] Support for frame buffer devices ----
Generic Driver Options --->
[ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
[*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]
[*] Automount devtmpfs at /dev, after the kernel mounted the rootfs [CONFIG_DEVTMPFS_MOUNT]
64 ビットシステムの構築時は、追加機能をいくらか有効にしてください。 menuconfig を利用している場合、初めに
CONFIG_PCI_MSI
を有効にして、その後に CONFIG_IRQ_REMAP
、CONFIG_X86_X2APIC
を有効にします。
こうするのは、依存するオプションが選択されていないと、特定のオプションが現れてこないからです。
Processor type and features --->
[*] Support x2apic [CONFIG_X86_X2APIC]
Memory Management options --->
[ ] Enable userfaultfd() system call [CONFIG_USERFAULTFD]
Device Drivers --->
[*] PCI Support ---> [CONFIG_PCI]
[*] Message Signaled Interrupts (MSI and MSI-X) [CONFIG_PCI_MSI]
[*] IOMMU Hardware Support ---> [CONFIG_IOMMU_SUPPORT]
[*] Support for Interrupt Remapping [CONFIG_IRQ_REMAP]
システムに特定の機能性が必要になれば、それだけ多くのオプションが必要となります。 例えば BLFS
パッケージにて必要となるオプションについては
BLFS Index of Kernel Settings
(https://www.linuxfromscratch.org/blfs/view/11.2/longindex.html#kernel-config-index)
を参照してください。
注記
ホストが UEFI を利用していて、これを使って LFS システムのブートを行いたい場合は、
BLFS ページ に従って、カーネル設定を調整する必要があります。
上の設定項目の説明
-
Compile the
kernel with warnings as errors
-
これを設定すると、カーネル開発者が採用するコンパイラーや設定と異なる場合に、カーネルビルドエラーとなる場合があります。
-
Enable kernel
headers through /sys/kernel/kheaders.tar.xz
-
これは、 カーネルビルドにあたって cpio を必要とします。 cpio は LFS ではインストールしません。
-
Support for
uevent helper
-
本項目を有効にすることで、デバイス管理を Udev/Eudev により行ないます。
-
Maintain a
devtmpfs
-
本項目は、カーネルにより事前登録される自動化デバイスノードを生成します。 これは Udev
が動作していなくても行われます。 Udev はその上で起動し、パーミッション管理やシンボリックリンクの追加を行います。
Udev/Eudev を利用する場合には本項目を有効にすることが必要です。
-
Automount
devtmpfs at /dev
-
これは、カーネルから見たデバイス情報を /dev 上にマウントするものです。 init
が起動される直前にルートファイルシステムに切り替えられます。
-
Support
x2apic
-
64 ビット x86 プロセッサーの x2APIC モードでのインタラプトコントローラーの実行をサポートします。 64
ビット x86 システムにおいてはファームウェアが x2APIC を有効にすることがあります。 ファームウェアによって
x2APIC が有効である場合、カーネルにおいてこのオプションが無効であると、起動時にパニックを起こします。
本オプションには効果がありません。 またファームウェアによって x2APIC
が無効であった場合、このオプションは影響を及ぼしません。
-
Enable
userfaultfd() system call
-
このオプションを有効にすると、Linux-5.19.2
において解決されていないセキュリティぜい弱性が悪用される危険があります。
ぜい弱性を避けるために、このオプションは無効にしてください。 このシステムコールは LFS や BLFS
のどこからも利用しません。
上のコマンドではなく、状況によっては make
oldconfig を実行することが適当な場合もあります。 詳細についてはカーネルソース内の
README
ファイルを参照してください。
カーネル設定は行わずに、ホストシステムにあるカーネル設定ファイル .config
をコピーして利用することもできます。 そのファイルが存在すればの話です。
その場合は linux-5.19.2
ディレクトリにそのファイルをコピーしてください。 もっともこのやり方はお勧めしません。
設定項目をメニューから探し出して、カーネル設定を一から行っていくことが望ましいことです。
カーネルイメージとモジュールをコンパイルします。
make
カーネルモジュールを利用する場合 /etc/modprobe.d
ディレクトリ内での設定を必要とします。 モジュールやカーネル設定に関する情報は 「デバイスとモジュールの扱いについて」や linux-5.19.2/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.19.2-lfs-11.2
System.map
はカーネルに対するシンボルファイルです。
このファイルはカーネル API の各関数のエントリポイントをマッピングしています。
同様に実行中のカーネルのデータ構成のアドレスを保持します。
このファイルは、カーネルに問題があった場合にその状況を調べる手段として利用できます。
マップファイルをインストールするには以下を実行します。
cp -iv System.map /boot/System.map-5.19.2
カーネル設定ファイル .config
は、上で実行した
make menuconfig
によって生成されます。 このファイル内には、今コンパイルしたカーネルの設定項目の情報がすべて保持されています。
将来このファイルを参照する必要が出てくるかもしれないため、このファイルを保存しておきます。
cp -iv .config /boot/config-5.19.2
Linux カーネルのドキュメントをインストールします。
install -d /usr/share/doc/linux-5.19.2
cp -r Documentation/* /usr/share/doc/linux-5.19.2
カーネルのソースディレクトリは所有者が root
ユーザーになっていません。 我々は chroot 環境内の root
ユーザーとなってパッケージを展開してきましたが、展開されたファイル類はパッケージ開発者が用いていたユーザー ID、グループ ID
が適用されています。 このことは普通はあまり問題になりません。
というのもパッケージをインストールした後のソースファイルは、たいていは削除するからです。 一方 Linux
のソースファイルは、削除せずに保持しておくことがよく行われます。
このことがあるため開発者の用いたユーザーIDが、インストールしたマシン内の誰かの ID に割り当たった状態となりえます。
その人はカーネルソースを自由に書き換えてしまう権限を持つことになるわけです。
注記
カーネルの設定は、BLFS をインストールしていくにつれて、設定を更新していかなければならないことが多々あります。
一般にパッケージのソースは削除することが通常ですが、カーネルのソースに関しては、カーネルをもう一度新たにインストールするなら、削除しなくて構いません。
カーネルのソースファイルを保持しておくつもりなら linux-5.19.2
ディレクトリにおいて chown -R 0:0 を実行しておいてください。
これによりそのディレクトリの所有者は root
ユーザーとなります。
警告
カーネルを説明する書の中には、カーネルのソースディレクトリに対してシンボリックリンク /usr/src/linux
の生成を勧めているものがあります。 これはカーネル 2.6
系以前におけるものであり LFS システム上では生成してはなりません 。 ベースとなる LFS
システムを構築し、そこに新たなパッケージを追加していこうとした際に、そのことが問題となるからです。
警告
さらに include
ディレクトリ (/usr/include
) にあるヘッダーファイルは、必ず Glibc のコンパイル時のものでなければなりません。 つまり
「Linux-5.19.2 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