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 を入力して確認してください。
注記
カーネル設定を行うにあたって、分かりやすいやり方として make
defconfig を実行する方法があります。
これを実行することで基本的な設定がなされ、現在のシステム構成が考慮された、より良い設定が得られるかもしれません。
以下の機能項目についての有効、無効、設定状況を確認してください。
不適切である場合にはシステムが正常動作しなかったり起動できなかったりするかもしれません。
General setup --->
[ ] Compile the kernel with warnings as errors [WERROR]
CPU/Task time and stats accounting --->
[*] Pressure stall information tracking [PSI]
[ ] Require boot parameter to enable pressure stall information tracking
... [PSI_DEFAULT_DISABLED]
< > Enable kernel headers through /sys/kernel/kheaders.tar.xz [IKHEADERS]
[*] Control Group support ---> [CGROUPS]
[*] Memory controller [MEMCG]
[ ] Configure standard kernel features (expert users) ---> [EXPERT]
Processor type and features --->
[*] Build a relocatable kernel [RELOCATABLE]
[*] Randomize the address of the kernel image (KASLR) [RANDOMIZE_BASE]
General architecture-dependent options --->
[*] Stack Protector buffer overflow detection [STACKPROTECTOR]
[*] Strong Stack Protector [STACKPROTECTOR_STRONG]
Device Drivers --->
Generic Driver Options --->
[ ] Support for uevent helper [UEVENT_HELPER]
[*] Maintain a devtmpfs filesystem to mount at /dev [DEVTMPFS]
[*] Automount devtmpfs at /dev, after the kernel mounted the rootfs
... [DEVTMPFS_MOUNT]
Graphics support --->
< /*/M> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
... [DRM]
# If [DRM] is selected as * or M, this must be selected:
[ /*] Enable legacy fbdev support for your modesetting driver
... [DRM_FBDEV_EMULATION]
Console display driver support --->
# If [DRM] is selected as * or M, this must be selected:
[ /*] Framebuffer Console support [FRAMEBUFFER_CONSOLE]
64 ビットシステムの構築時は、追加機能をいくらか有効にしてください。 menuconfig を利用している場合、初めに
CONFIG_PCI_MSI
を有効にして、その後に CONFIG_IRQ_REMAP
、CONFIG_X86_X2APIC
を有効にします。
こうするのは、依存するオプションが選択されていないと、特定のオプションが現れてこないからです。
Processor type and features --->
[*] Support x2apic [X86_X2APIC]
Device Drivers --->
[*] PCI support ---> [PCI]
[*] Message Signaled Interrupts (MSI and MSI-X) [PCI_MSI]
[*] IOMMU Hardware Support ---> [IOMMU_SUPPORT]
[*] Support for Interrupt Remapping [IRQ_REMAP]
32 ビットシステムの構築中であって、RAM が 4GB 以上ある場合は、64 GB までの物理 RAM
が利用できるようにカーネルを調整してください。
Processor type and features --->
High Memory Support --->
(X) 64GB [HIGHMEM64G]
LFS システムを配置するパーティションが NVME SSD(つまりデバイスノードが /dev/sd*
でなく /dev/nvme*
)である場合は、NVME サポートを有効にしてください。
これを行っていないと、LFS システムが起動しません。
Device Drivers --->
NVME Support --->
<*> NVM Express block device [BLK_DEV_NVME]
システムに特定の機能性が必要になれば、それだけ多くのオプションが必要となります。 例えば BLFS
パッケージにて必要となるオプションについては
BLFS Index of Kernel Settings を参照してください。
注記
ホストが UEFI を利用していて、これを使って LFS システムのブートを行いたい場合は、
BLFS ページ に従って、カーネル設定を調整する必要があります。 これは、ホストディストリビューションにて UEFI
ブートローダーを利用している場合であっても同様です。
上の設定項目の説明
-
Randomize the
address of the kernel image (KASLR)
-
カーネルイメージにおいて ASLR を有効にします。
これによって、カーネル内にある機密コードやデータが、固定的なアドレスに存在することを前提とした攻撃を軽減できます。
-
Compile the
kernel with warnings as errors
-
これを設定すると、カーネル開発者が採用するコンパイラーや設定と異なる場合に、カーネルビルドエラーとなる場合があります。
-
Enable kernel
headers through /sys/kernel/kheaders.tar.xz
-
これは、 カーネルビルドにあたって cpio を必要とします。 cpio は LFS ではインストールしません。
-
Configure
standard kernel features (expert users)
-
これは設定項目上にいくつかのオプションを表示するものですが、そのオプションを変更することは非常に危険なことです。
何を行っているのかがわかっていない場合には、触れないようにしてください。
-
Strong Stack
Protector
-
カーネルにおいて SSP を有効にします。 ユーザー空間全体に対してこれを有効にするには、GCC のコンパイルにあたって
--enable-default-ssp
を指定します。 ただしカーネルは、GCC のデフォルト設定として SSP を利用しません。
したがってここで明示的な指定を行います。
-
Support for
uevent helper
-
本項目を有効にすることで、デバイス管理を Udev により行ないます。
-
Maintain a
devtmpfs
-
本項目は、カーネルにより事前登録される自動化デバイスノードを生成します。 これは Udev
が動作していなくても行われます。 Udev はその上で起動し、パーミッション管理やシンボリックリンクの追加を行います。
Udev を利用する場合には本項目を有効にすることが必要です。
-
Automount
devtmpfs at /dev
-
これは、カーネルから見たデバイス情報を /dev 上にマウントするものです。 init
が起動される直前にルートファイルシステムに切り替えられます。
-
Enable legacy
fbdev support for your modesetting driver
,
Framebuffer Console
support
-
これは DRI (Direct Rendering Infrastructure) ドライバーにより起動される GPU
上に Linux コンソールを表示するために必要となります。 CONFIG_DRM
(Direct Rendering Manager)
を有効にしている場合は、この 2 つのオプションも同じく有効にしておく必要があります。 そうしておかないと、DRI
ドライバーのロードの際に画面がブランクになってしまいます。
-
Support
x2apic
-
64 ビット x86 プロセッサーの x2APIC モードでのインタラプトコントローラーの実行をサポートします。 64
ビット x86 システムにおいてはファームウェアが x2APIC を有効にすることがあります。 ファームウェアによって
x2APIC が有効である場合、カーネルにおいてこのオプションが無効であると、起動時にパニックを起こします。
本オプションには効果がありません。 またファームウェアによって x2APIC
が無効であった場合、このオプションは影響を及ぼしません。
上のコマンドではなく、状況によっては make
oldconfig を実行することが適当な場合もあります。 詳細についてはカーネルソース内の
README
ファイルを参照してください。
カーネル設定は行わずに、ホストシステムにあるカーネル設定ファイル .config
をコピーして利用することもできます。 そのファイルが存在すればの話です。
その場合は linux-6.7.4
ディレクトリにそのファイルをコピーしてください。 もっともこのやり方はお勧めしません。
設定項目をメニューから探し出して、カーネル設定を一から行っていくことが望ましいことです。
カーネルイメージとモジュールをコンパイルします。
make
カーネルモジュールを利用する場合 /etc/modprobe.d
ディレクトリ内での設定を必要とします。 モジュールやカーネル設定に関する情報は 「デバイスとモジュールの扱いについて」や linux-6.7.4/Documentation
ディレクトリにあるカーネルドキュメントを参照してください。 また modprobe.d(5)
も有用です。
カーネル設定においてモジュールの利用を無効にしているのでなければ、ここでモジュールをインストールします。
make modules_install
カーネルのコンパイルが終わったら、インストールの完了に向けてあと少し作業を行います。 /boot
ディレクトリにいくつかのファイルをコピーします。
注意
LFS システムにおいて、/boot
パーティションを切り分けて用意することにした場合(おそらくホストディストロの /boot
パーティションを共用とする場合)、以降でコピーするファイルがそこに入ります。
これを最も簡単に行うには、/etc/fstab
内に
/boot
用のエントリーを生成します(詳細は前節を参照してください)。 そして chroot 環境 内の root
ユーザーになって、以下のコマンドを実行します。
mount /boot
コマンド実行にあたっては、デバイスノードへのパスは省略します。 これは mount コマンドが /etc/fstab
から読み込むからです。
カーネルイメージへのパスは、利用しているプラットフォームによってさまざまです。 そのファイル名は、好みにより自由に変更して構いません。
ただし vmlinuz という語は必ず含めてください。
これにより、次節で説明するブートプロセスを自動的に設定するために必要なことです。 以下のコマンドは x86
アーキテクチャーの場合の例です。
cp -iv arch/x86/boot/bzImage /boot/vmlinuz-6.7.4-lfs-12.1
System.map
はカーネルに対するシンボルファイルです。
このファイルはカーネル API の各関数のエントリポイントをマッピングしています。
同様に実行中のカーネルのデータ構成のアドレスを保持します。
このファイルは、カーネルに問題があった場合にその状況を調べる手段として利用できます。
マップファイルをインストールするには以下を実行します。
cp -iv System.map /boot/System.map-6.7.4
カーネル設定ファイル .config
は、上で実行した
make menuconfig
によって生成されます。 このファイル内には、今コンパイルしたカーネルの設定項目の情報がすべて保持されています。
将来このファイルを参照する必要が出てくるかもしれないため、このファイルを保存しておきます。
cp -iv .config /boot/config-6.7.4
Linux カーネルのドキュメントをインストールします。
cp -r Documentation -T /usr/share/doc/linux-6.7.4
カーネルのソースディレクトリは所有者が root
ユーザーになっていません。 我々は chroot 環境内の root
ユーザーとなってパッケージを展開してきましたが、展開されたファイル類はパッケージ開発者が用いていたユーザー ID、グループ ID
が適用されています。 このことは普通はあまり問題になりません。
というのもパッケージをインストールした後のソースファイルは、たいていは削除するからです。 一方 Linux
のソースファイルは、削除せずに保持しておくことがよく行われます。
このことがあるため開発者の用いたユーザーIDが、インストールしたマシン内の誰かの ID に割り当たった状態となりえます。
その人はカーネルソースを自由に書き換えてしまう権限を持つことになるわけです。
注記
カーネルの設定は、BLFS をインストールしていくにつれて、設定を更新していかなければならないことが多々あります。
一般にパッケージのソースは削除することが通常ですが、カーネルのソースに関しては、カーネルをもう一度新たにインストールするなら、削除しなくて構いません。
カーネルのソースファイルを保持しておくつもりなら linux-6.7.4
ディレクトリにおいて chown -R 0:0 を実行しておいてください。
これによりそのディレクトリの所有者は root
ユーザーとなります。
警告
カーネルを説明する書の中には、カーネルのソースディレクトリに対してシンボリックリンク /usr/src/linux
の生成を勧めているものがあります。 これはカーネル 2.6
系以前におけるものであり LFS システム上では生成してはなりません 。 ベースとなる LFS
システムを構築し、そこに新たなパッケージを追加していこうとした際に、そのことが問題となるからです。
警告
さらに include
ディレクトリ (/usr/include
) にあるヘッダーファイルは、必ず Glibc のコンパイル時のものでなければなりません。 つまり
「Linux-6.7.4 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