LinuCレベル2 201試験の出題範囲「2.01.4 Linuxカーネルのコンパイル」の技術的内容についての解説をまとめました。
重要度 2 概要 Linuxカーネルの特定の機能を必要に応じて取り込んだり無効化するために、カーネルを適切に構成できる。また、必要に応じてLinuxカーネルをコンパイルし、新しいカーネルに変更点を書き込み、initrdイメージを作成し、新しいカーネルをインストールできる。 詳細 /usr/src/linux//usr/src/linux/.configカーネルの MakefileKernel 2.6.x、3.x、4.x、5.x のmakeのターゲット。all, config, xconfig, menuconfig, gconfig, oldconfig, mrproper, bzImage, modules, modules_install, rpm-pkg, binrpm-pkg, deb-pkgカーネル構成をカスタマイズする。新しいカーネルおよび適切なカーネルモジュールを構築する。/lib/modules/kernel-version/, gzip, bzip2新しいカーネルおよび必要なモジュールをインストールする。module tools, depmodブートマネージャが新しいカーネルおよび関連付けられたファイルを探せるようにする。モジュールの構成ファイルDKMS を使用してカーネルのモジュールをコンパイルする。dkmsinitrd を構成する。Dracut,mkinitrd, mkinitramfs

- ソースコードからのカーネルのビルドとインストール
- makeコマンドの概要
- /usr/src/linux/.configファイル
- /usr/src/linux/(カーネルのバージョン)/ディレクトリ配下のファイル
- /lib/modules/ディレクトリ
- /boot/config-xxxx(バージョン)はカーネルコンフィギュレーション
- /boot/initrd.img-xxxx(バージョン)は初期 RAM ディスクイメージ
- /boot/System.map-xxxx(バージョン)はアドレスマップ
- FHS(FileSystem Hierarchy Standard)の概要
- /usr/src の概要
- 初期RAMディスク
- 初期 RAM ディスクイメージの作成方法
- DKMS(Dynamic Kernel Module Support)の概要
- 参考資料
ソースコードからのカーネルのビルドとインストール
ソースコードからカーネルをビルドしてカーネルをインストールすることができます。
以下のカーネルの公式サイトからカーネルをダウンロードできます。

browseをクリックすることで、ダウンロードするカーネル関連のファイルの情報を確認できます。
今回は試しに6.17.9の中身を確認します。
上記リンクから確認するとMakefileが含まれていることがわかります。以下はMakefileの中身です。

次の見出しで紹介する、makeコマンドはLinuxのソフトウェア等をインストールするのに使用するコマンドです。
makeコマンドを実行するにはMakefileが必要ですが、上記のカーネル公式サイトからカーネルのソースコードをダウンロードした場合は、Makefileがあらかじめ用意されている状態です。
前述した以下サイトから対象のカーネルのバージョンのtarballをクリックしてカーネルを.tar.xz形式でダウンロードします。

ダウンロードしたカーネルはscpコマンドや、TeraTermのSSH SCP…機能を利用して対象のLinuxへ送信します。
送信したtar.xzファイルはtar xvfコマンドで解凍します。
makeコマンドの概要
makeコマンドを利用して、カーネルのインストールや設定を行います。
| makeコマンド | 意味 |
|---|---|
| make config | 対話的に(質問形式で)設定を行う |
| make menuconfig | ターミナル上のGUIで設定を行う |
| make xconfig | X上のGUIで設定を行う |
| make defconfig | デフォルト状態の設定ファイルを作る |
| make oldconfig | 現在のカーネルの設定を引き継ぐ |
| make cloneconfig | (oldconfigと同じ) |
| make allyesconfig | すべての設定項目にyesを設定する |
| make allnoconfig | ほとんどの設定項目にnoを設定する |
| make randconfig | 設定項目にランダムな値を設定する |
| make clean | 設定ファイルを除いて一時ファイル等を削除 |
| make mrproper | 設定ファイルを含めて一時ファイル等を削除 |
| makeコマンド | 意味 |
|---|---|
| make all | カーネルとモジュールをビルド |
| make install | ビルドしたカーネルをインストール |
| make modules | カーネルモジュールをビルド |
| make modules_install | カーネルモジュールをインストール |
| make rpm | ビルド後にrpmパッケージ化 |
| make rpm-pkg | ソースを含むrpmパッケージを作る |
| make binrpm-pkg | バイナリrpmパッケージを作る |
| make deb-pkg | Debianパッケージを作る |
/usr/src/linux/.configファイル
make config や make menuconfig で行った設定は以下のファイルに保存されます。
/usr/src/linux/.config
Red Hat Enterprise Linux系のLinuxでは以下のディレクトリになります。
/usr/src/kernels
/usr/src/linux/(カーネルのバージョン)/ディレクトリ配下のファイル
/usr/src/linux/(カーネルのバージョン)/ディレクトリ配下の主なファイル・ディレクトリは以下です。
※Red Hat Enterprise Linux系では/usr/src/kernels/(カーネルのバージョン)/ディレクトリ配下に保存されます。CentOSはRed Hat Enterprise Linuxのクローンとなるディストリビューションです。
| ファイル | 説明 |
|---|---|
| .config | カーネルのビルド設定ファイル |
| Makefile | make の設定やカーネルバージョンが書いてある |
| ディレクトリ | 説明 |
|---|---|
| ディレクトリ | ソースコードの種類 |
| kernel/ | カーネル本体 |
| Documentation/ | ドキュメントの類 |
| arch/ | アーキテクチャ(i386、x86_64など)固有のコード |
| drivers/ | デバイスドライバ |
| fs/ | ファイルシステム(file system) |
| include/ | インクルードファイル(他のファイルから呼び出すコードのまとめ) |
| mm/ | メモリ管理(memory management) |
| net/ | ネットワーク |
/lib/modules/ディレクトリ
カーネルモジュールは /lib/modules/(VERSION)/ にインストールされます。VERSION の部分は、uname -rを実行して確認できるカーネルのバージョンです。
/boot/config-xxxx(バージョン)はカーネルコンフィギュレーション
/boot/ディレクトリ配下のconfigから始まるファイルはカーネルコンフィギュレーションです。/usr/src/linux/.configのバックアップに当たるファイルになります。
make oldconfig として読み込むことができる「現在動いているカーネルのカーネルコンフィギュレーション」です。
/boot/initrd.img-xxxx(バージョン)は初期 RAM ディスクイメージ
/boot/initrd.img-xxxx(バージョン) は段階的ブートを行う際に仮のファイルシステムの内容をまとめたイメージファイル(初期 RAM ディスクイメージ)です。
make installコマンドを使った場合は必要に応じて自動で生成されます。
手動で本ファイルのインストールを行うには、mkinitrd(RHEL6以前)、dracut(RHEL7以降)、 mkinitramfs(Ubuntu等)コマンドで作成します。
/boot/System.map-xxxx(バージョン)はアドレスマップ
/boot/System.map-xxxx(バージョン)はカーネルがメモリ上に展開される際にシンボルとアドレスのマッピングを記述したファイル(アドレスマップ)です。
カーネルのビルド時に /usr/src/linux/System.map と同時に作成されます。
RHEL10.0で中身を確認してみます。かなり長文の中身になっています。
[root@RHEL100 boot]# more System.map-6.12.0-55.17.1.el10_0.x86_64
0000000000000000 D __per_cpu_start
0000000000000000 D fixed_percpu_data
0000000000001000 D cpu_debug_store
0000000000002000 D irq_stack_backing_store
0000000000006000 D cpu_tss_rw
000000000000b000 D gdt_page
000000000000c000 d exception_stacks
0000000000018000 d entry_stack_storage
0000000000019000 D espfix_waddr
0000000000019008 D espfix_stack
0000000000019010 D cpu_l2c_shared_map
0000000000019018 D cpu_llc_shared_map
0000000000019020 D cpu_info
0000000000019168 D x86_cpu_to_acpiid
000000000001916c D x86_cpu_to_apicid
0000000000019180 d amd_dr_addr_mask
00000000000191a0 D mce_banks_array
00000000000195a0 D mce_num_banks
00000000000195c0 d smca_bank_counts
0000000000019600 d smca_banks
0000000000019a00 D cpu_die_map
0000000000019a08 D cpu_core_map
0000000000019a10 D cpu_sibling_map
--More--(0%)
[root@RHEL100 boot]# ls -la
(中略)
-rw-r--r--. 1 root root 8933043 6月 8 09:00 System.map-6.12.0-55.17.1.el10_0.x86_64
FHS(FileSystem Hierarchy Standard)の概要
FHS(FileSystem Hierarchy Standard)は、Linuxのディレクトリ構成を定めた基準仕様のことです。例えば、/etcディレクトリに対して設定ファイルを保存しておくことにするなど、Linuxのディレクトリをどのように使うかという基準がFHSです。FHSの Hierarchy は階層を意味します。
「FHS」は、Linux(などのUNIX系OS)の標準的なディレクトリ構成を定めた標準仕様です。たとえば「/etcディレクトリには設定ファイルを置きましょう」など、ディレクトリの名前や構成、ファイルの名前などについての「標準」です。

/usr/src の概要
/usr/src/ は、カーネルのソースやビルドに必要なファイル・ディレクトリが保存されているディレクトリです。
「/usr/src」ディレクトリには、「プログラムのソースコード」が置かれます。カーネルのコンパイルを行う際に、ダウンロードしたカーネルのソースコードをこのディレクトリの下に配置したことがある、という経験のある方も多いのではないでしょうか。もちろん、Linuxカーネルだけでなく、インターネットなどから入手したソフトウェアをソースコードからコンパイルする場合、このディレクトリに配置することが慣例になっています。

初期RAMディスク
初期 RAM ディスクは、システム起動時に仮の環境としてまずメモリ上にファイルシステムを展開し、そこでカーネルを動作させてから本来のファイルシステムをルートにマウントし直す、といった段階的なブートを実現する機能のことです。
初期RAMディスクは、Linux起動時に以下のような順番で動作します。
- 電源投入
- BIOS/UEFIの起動
- ブートローダ(GRUB,GRUB2..)
- カーネル(vmlinuz)とinitramfs(初期RAMディスク)の読み込み
- カーネルの実行
- initramfs(初期RAMディスク)の実行
- initの実行(SysVinit,Systemd..)
初期RAMディスクのイメージファイル形式は2種類あります。initrd 形式と initramfs 形式です。
初期 RAM ディスクイメージの作成方法
初期 RAM ディスクイメージの作成方法を解説します。
mkinitrdコマンド、dracutコマンド と mkinitramfsコマンド
initrd 形式はマウント可能なファイルシステムイメージを gzip 圧縮したものです。
なので、gzip -d や gunzip コマンドで gzip を解凍した後、mount でマウントを行えば、イメージ内のディレクトリ・ファイルを参照することができます。
ただし、イメージファイルをマウントするためには、マウントオプションでループバック形式であることを伝える必要があります。これを行うためには mount -o loop のようにオプションを指定します。
initramfs 形式のイメージは cpio アーカイブを gzip 圧縮したものです。
initramfs 形式の初期 RAM ディスクイメージをgunzip コマンドで解凍した後、cpio コマンドでアーカイブからファイルへの書き出しを行えば、イメージ内のディレクトリ・ファイルを参照することができます。
mkinitrdコマンドは主に RHEL系(RHEL / CentOS / Fedora の旧世代) で使われていたツール
mkinitrdコマンドは、RHEL6以前のRed Hat系のディストリビューションで使われていたコマンドです。
RHEL7以降はdracut が主流
RHEL7以降はmkintrdは使われず、dracutが主流になっています。mkinitrdコマンド、dracutコマンドもどちらも初期RAMディスクを作成するコマンドです。
mkinitramfsコマンドはDebian / Ubuntu 系で使われるツール
mkinitramfsコマンドはDebian / Ubuntu 系で使われる初期RAMディスクを作成するコマンドです。
mkinitrdコマンド、dracutコマンド と mkinitramfsコマンドの演習問題例
以下は出題の例題です。
初期 RAM ディスクを作成することが出来るコマンドはどれか。(全て選択してください)
- mkramdisk
- mkinitrd
- makeramdisk
- mkinitramfs
- dracut
答えは以下です。
- mkinitrd
- mkinitramfs
- dracut
DKMS(Dynamic Kernel Module Support)の概要
DKMS(Dynamic Kernel Module Support)は、カーネルと独立して自動的にカーネルモジュールを更新するための機能です。
参考資料
本記事を作成するために使用した参考資料を掲載します。

