LinuCレベル2 201試験の出題範囲「2.01.3 Linux カーネルの構成要素」の技術的内容についての解説をまとめました。
重要度 2 概要 特定のハードウェア、ハードウェアドライバ、システムリソース、およびさまざまな要求に必要となるカーネルの構成要素を利用する。これには、異なる種類のカーネルイメージを実装すること、安定版および開発版のカーネルとパッチを区別すること、カーネルモジュールを利用することなども含まれる。 詳細 Kernel の配布形式。bzImage , xz データ圧縮Kernelのモジュールとドキュメント。
・/usr/src/linux/
・/usr/src/linux/Documentation/

カーネルとは
カーネル(Kernel)は、Linuxの中核となるプログラムのことを指します。
Linux kernelという言葉はよく耳にすると思います。しかし、「じゃあkernelって何?」と聞かれると、意外と答えられないと思います。では、kernelとは何か?「kernel」とは「中核」という訳語が当てはまりますが、簡単に言えばその通り「Linuxの中核となるプログラムがLinux kernelです」となります。そして、これはよく言われることですが、厳密には「Linux」と言った場合、このLinux kernelのことを指します(最近では、後述する「Linuxディストリビューション」をLinuxと呼ぶケースも増えてきています)。

カーネルは具体的には「ハードウェアの動作の管理、メモリ管理、ファイルの管理、プロセスの管理」などを行っています。
さて、そのLinux kernel、「OSの中核となるプログラムです」と説明してもいまひとつピンと来ないかもしれません。具体的に何をやっているのか?というと、「ハードウェアを稼動させる指示を出す、もっと具体的には、メモリー管理、ファイルの管理、デバイスドライバとしての役割、プロセスの管理」などを担っています。例えて言えば、「ユーザからの指示に従ってハードウェアを稼動させる”頭脳”の役割を担っている」、という言い方ができるでしょうか。

企業向けのLinuxとして使われるRed Hat Enterprise Linuxの公式サイトではカーネルの動作について以下のように説明されています。
カーネルには 4 つの仕事があります。
- メモリー管理:どの程度のメモリーが、何をどこに保存するために使用されたか、追跡します。
- プロセス管理:どのプロセスがいつ、どれだけの期間、中央処理装置 (CPU) を使用できるかを決めます。
- デバイスドライバー:ハードウェアとプロセスの間の仲介者/通訳として機能します。
- システムコールとセキュリティ:プロセスからサービス要求を受け取ります。

カーネルモジュールとは
カーネルモジュールはカーネルが扱う部品のようなもので、カーネルに対して部分的にカーネルモジュールを読み込ませることでカーネルに対して機能を追加していくものです。
カーネルモジュールによるカーネルのカスタマイズ
カーネルモジュールは、カーネルから部分的に機能を切り離せるので、カーネルをカスタマイズしやすいメリットがあります。
不要な機能をカーネルから切り離してカーネルを軽くすることもできます。
「/lib/modules/<カーネルバージョン>/modules.dep」ファイルの概要
modules.depファイルは、カーネルモジュールそれぞれが別のどのカーネルモジュールに依存しているかという依存関係情報が書かれているファイルです。.depは「dependency(依存関係を意味する英単語)」の頭文字だと思われます。
以下はRed Hat Enterprise Linux 9.6で確認したmodules.depファイルの中身です。

このファイルを利用して依存関係を解決しているコマンドの一つに modprobe があります。
unameコマンドとそのオプションの説明
unameコマンドはLinuxの現在の環境に関する様々な情報を取得・表示することができるコマンドです。unameコマンドに指定するオプションによって取得する情報を指定することができます。
| オプション | 説明 |
|---|---|
| -s | カーネルの名前を表示 |
| -r | カーネルのバージョンを表示 |
| -n | ホスト名を表示 |
| -m | ハードウェア名を表示 |
| -p | CPUタイプを表示 |
| -a | 以上すべての情報を表示 |
カーネルのバージョンを表示する(uname -r)
カーネルのバージョン情報を表示するにはuname -rを実行します。
以下はRed Hat Enterprise Linux 9.6でのuname -rコマンドの実行例です。

カーネルのバージョン情報を含めた複数の情報を表示する(uname -a)
カーネルのバージョン情報を含めた複数の情報を表示するにはuname -aを実行します。
以下はRed Hat Enterprise Linux 9.6でのuname -aコマンドの実行例です。

カーネルのバージョンのカテゴリ
リリースされるLinuxカーネルは主に以下の4つのカテゴリに分類されます。
・prepatch(プレパッチ)
リリース候補(RC:Release Candidate)です。テストが必要な新機能が含まれており、カーネルの開発者や最新機能を試したいユーザ向けの開発版リリースです。
プレパッチカーネル、または「RC」カーネルは、主に他のカーネル開発者やLinux愛好家を対象とした、メインラインカーネルのプレリリース版です。ソースからコンパイルする必要があり、通常、安定版リリースに組み込む前にテストが必要な新機能が含まれています。プレパッチカーネルは、Linus Torvalds氏によってメンテナンスおよびリリースされています。
・mainline(メインライン)
prepatchの後にリリースされる正式版です。prepatchで導入された新機能が含まれており、Linus Torvalds 氏が数か月毎にリリースします。mainlineはリリースされた時点で安定版の第0版とみなされます。
メインラインツリーはLinus Torvaldsによってメンテナンスされています。すべての新機能が導入され、エキサイティングな開発が行われるツリーです。新しいメインラインカーネルは9~10週間ごとにリリースされます。
・stable(ステーブル)
mainlineの後にリリースされる安定版です。mainlineに対して発見された不具合の修正が行われ、安定したカーネルとしてリリースされます。stable版のリリースは指定されたカーネルメンテナが行います。
各メインラインカーネルはリリース後、「安定」とみなされます。安定カーネルのバグ修正はメインラインツリーからバックポートされ、指定された安定カーネルメンテナーによって適用されます。次のメインラインカーネルがリリースされるまで、バグ修正カーネルのリリースは通常数回のみです(ただし、「長期メンテナンスカーネル」に指定されている場合は除きます)。安定カーネルのアップデートは必要に応じて、通常は週に1回リリースされます。
・longterm(ロングターム)
stableの中から選ばれ、新しいカーネルに行われたものと同様のバグフィックスが行われるリリースです。stableは新しいmainlineのリリースからあまり間をおかずにEOL(End Of Life: 「(製品の)寿命」から転じて、サポート期間終了を意味する)になりますが、longterm版は約2年という長い期間バグフィックスが行われます。longterm版のことを「LTS(Long Term Support)」と省略する場合もあります。
通常、古いカーネルツリーのバグ修正をバックポートする目的で、「長期メンテナンス」カーネルリリースが複数提供されます。このようなカーネルには重要なバグ修正のみが適用され、特に古いカーネルツリーでは、それほど頻繁にリリースされることはありません。
カーネルのバージョン番号はドットで区切られており、「X.Y.Z」あるいは「X.Y.Z.R」の形式になっています。
zImage と bzImageの概要
zImage(古い)とbzImage(新しい形式)の概要を紹介します。
bzImageの概要
bzImageはLinuxカーネルのvmlinuxを圧縮した形式のファイルです。/boot/ディレクトリ配下にvmlinuz-xxxとして置かれているファイルがこのbzImageになります。
RHEL10.0で/boot/ディレクトリの中身を確認すると以下のようにファイルを確認できます。
[root@RHEL100 ~]# ls -1 /boot
System.map-6.12.0-55.17.1.el10_0.x86_64
config-6.12.0-55.17.1.el10_0.x86_64
efi
grub2
initramfs-0-rescue-f772f8d5fe8e4ccf932e194721961ac6.img
initramfs-6.12.0-55.17.1.el10_0.x86_64.img
initramfs-6.12.0-55.17.1.el10_0.x86_64kdump.img
loader
symvers-6.12.0-55.17.1.el10_0.x86_64.xz
vmlinuz-0-rescue-f772f8d5fe8e4ccf932e194721961ac6
vmlinuz-6.12.0-55.17.1.el10_0.x86_64
zImageの概要
zImageは、bzImageより古く、サイズ制限のある形式です。現在ではbzImageが使われます。
参考資料
本記事の作成に使用した参考資料を掲載します。
https://linuc.org/docs/seminar/20201004_linuc2.pdf
