10.3. Linux-6.10.5

Linux パッケージは Linux カーネルを提供します。

概算ビルド時間: 0.4 - 32 SBU (一般的には 2.5 SBU 程度)
必要ディスク容量: 1.7 - 14 GB (一般的には 2.3 GB 程度)

10.3.1. カーネル のインストール

カーネルの構築は、カーネルの設定、コンパイル、インストールの順に行っていきます。 本書が行っているカーネル設定の方法以外については、カーネルソースツリー内にある README ファイルを参照してください。

[重要]

重要

Linux カーネルの構築を初めて行うなら、LFS の中でも、かなりハードルの高い作業になります。 これをうまく成功させることができるかどうかは、対象システム向けの特定ハードウェアの存在や、どのように作り上げたいかの要求に依存します。 カーネルに設定できる項目は、ほぼ 12,000 項目もあります。 ただしたいていのコンピューターにおいて、必要となる項目はその 3 分の 1 程度です。 LFS 編集者としては、この作業手順に不慣れなユーザーであれば、以降に示す手順をほぼそっくり従って頂くことをお勧めしています。 ここでの目的は、後に 「システムの再起動」 を経てシステムを再起動した際に、この新システムに向けて、コマンドラインからログインできるようにすることです。 この段階では、最適化やカスタマイズを目指すものではありあせん。

カーネルの設定方法に関する一般的な情報が https://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt にあるので参照してください。 さらに詳しくカーネルの構築や設定を説明している https://anduin.linuxfromscratch.org/LFS/kernel-nutshell/ もあります。 この情報を少々古いものですが、理にかなった作業過程をおおまかに示しています。

それでもうまくいかなかった場合は、lfs-support メーリングリストに問い合わせる方法があります。 スパムメールを避ける目的から、このメーリングリストは登録が必要です。

コンパイルするための準備として以下のコマンドを実行します。

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]
    [ /*] CPU controller --->                                     [CGROUP_SCHED]
      # This may cause some systemd features malfunction:
      [ ] Group scheduling for SCHED_RR/FIFO                    [RT_GROUP_SCHED]
  [ ] 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]

[*] Networking support --->                                                [NET]
  Networking options --->
    [*] TCP/IP networking                                                 [INET]
    <*>   The IPv6 protocol --->                                          [IPV6]

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]
    Firmware loader --->
      < /*> Firmware loading facility                                [FW_LOADER]
      [ ]     Enable the firmware sysfs fallback mechanism
                                                    ...  [FW_LOADER_USER_HELPER]
  Firmware Drivers --->
    [*] Export DMI identification via sysfs to userspace                 [DMIID]
  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]

File systems --->
  [*] Inotify support for userspace                               [INOTIFY_USER]
  Pseudo filesystems --->
    [*] Tmpfs virtual memory file system support (former shm fs)         [TMPFS]
    [*]   Tmpfs POSIX Access Control Lists                     [TMPFS_POSIX_ACL]

64 ビットシステムの構築時は、追加機能をいくらか有効にしてください。 menuconfig を利用している場合、初めに CONFIG_PCI_MSI を有効にして、その後に CONFIG_IRQ_REMAPCONFIG_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]
[注記]

注記

"The IPv6 Protocol" については厳密には不要としても良いものですが、システム開発者は強く推奨しているものです。

システムに特定の機能性が必要になれば、それだけ多くのオプションが必要となります。 例えば 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.10.5 ディレクトリにそのファイルをコピーしてください。 もっともこのやり方はお勧めしません。 設定項目をメニューから探し出して、カーネル設定を一から行っていくことが望ましいことです。

カーネルイメージとモジュールをコンパイルします。

make

カーネルモジュールを利用する場合 /etc/modprobe.d ディレクトリ内での設定を必要とします。 モジュールやカーネル設定に関する情報は 「デバイスとモジュールの扱いについて」linux-6.10.5/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.10.5-lfs-12.2-systemd

System.map はカーネルに対するシンボルファイルです。 このファイルはカーネル API の各関数のエントリポイントをマッピングしています。 同様に実行中のカーネルのデータ構成のアドレスを保持します。 このファイルは、カーネルに問題があった場合にその状況を調べる手段として利用できます。 マップファイルをインストールするには以下を実行します。

cp -iv System.map /boot/System.map-6.10.5

カーネル設定ファイル .config は、上で実行した make menuconfig によって生成されます。 このファイル内には、今コンパイルしたカーネルの設定項目の情報がすべて保持されています。 将来このファイルを参照する必要が出てくるかもしれないため、このファイルを保存しておきます。

cp -iv .config /boot/config-6.10.5

Linux カーネルのドキュメントをインストールします。

cp -r Documentation -T /usr/share/doc/linux-6.10.5

カーネルのソースディレクトリは所有者が root ユーザーになっていません。 我々は chroot 環境内の root ユーザーとなってパッケージを展開してきましたが、展開されたファイル類はパッケージ開発者が用いていたユーザー ID、グループ ID が適用されています。 このことは普通はあまり問題になりません。 というのもパッケージをインストールした後のソースファイルは、たいていは削除するからです。 一方 Linux のソースファイルは、削除せずに保持しておくことがよく行われます。 このことがあるため開発者の用いたユーザーIDが、インストールしたマシン内の誰かの ID に割り当たった状態となりえます。 その人はカーネルソースを自由に書き換えてしまう権限を持つことになるわけです。

[注記]

注記

カーネルの設定は、BLFS をインストールしていくにつれて、設定を更新していかなければならないことが多々あります。 一般にパッケージのソースは削除することが通常ですが、カーネルのソースに関しては、カーネルをもう一度新たにインストールするなら、削除しなくて構いません。

カーネルのソースファイルを保持しておくつもりなら linux-6.10.5 ディレクトリにおいて chown -R 0:0 を実行しておいてください。 これによりそのディレクトリの所有者は root ユーザーとなります。

[警告]

警告

カーネルを説明する書の中には、カーネルのソースディレクトリに対してシンボリックリンク /usr/src/linux の生成を勧めているものがあります。 これはカーネル 2.6 系以前におけるものであり LFS システム上では生成してはなりません 。 ベースとなる LFS システムを構築し、そこに新たなパッケージを追加していこうとした際に、そのことが問題となるからです。

[警告]

警告

さらに include ディレクトリ (/usr/include) にあるヘッダーファイルは、必ず Glibc のコンパイル時のものでなければなりません。 つまり 「Linux-6.10.5 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

10.3.3. Linux の構成

インストールファイル: config-6.10.5, vmlinuz-6.10.5-lfs-12.2-systemd, and System.map-6.10.5
インストールディレクトリ: /lib/modules, /usr/share/doc/linux-6.10.5

概略説明

config-6.10.5

カーネルの設定をすべて含みます。

vmlinuz-6.10.5-lfs-12.2-systemd

Linux システムのエンジンです。 コンピューターを起動した際には、オペレーティングシステム内にて最初にロードされるものです。 カーネルはコンピューターのハードウェアを構成するあらゆるコンポーネントを検知して初期化します。 そしてそれらのコンポーネントをツリー階層のファイルとして、ソフトウェアが利用できるようにします。 ただひとつの CPU からマルチタスクを処理するマシンとして、あたかも多数のプログラムが同時稼動しているように仕向けます。

System.map-6.10.5

アドレスとシンボルのリストです。 カーネル内のすべての関数とデータ構成のエントリポイントおよびアドレスを示します。