LPIC201 Linuxカーネル

カーネルの構成要素
カーネルバージョン
カーネルには、バージョンが存在する。バージョン2.6を境に見分け方が変わっている。
2.6以前は、2.X.YのXが奇数だと、開発版で、偶数だと安定板
2.6以降は、-(ハイフン)の後に続く記号があれば開発版で。なければ安定板
リリースカテゴリ
・prepatch(プレパッチ)
リリース候補(RC:Release Candidate)。テストが必要な新機能が含まれており、カーネルの開発者や最新機能を試したいユーザ向けの開発版リリースされる。
・mainline(メインライン)
prepatchの後にリリースされる正式版。prepatchで導入された新機能が含まれており、Linus Torvalds 氏が数か月毎にリリースする。mainlineはリリースされた時点で安定版の第0版とみなされる。
・stable(ステーブル)
mainlineの後にリリースされる安定版。mainlineに対して発見された不具合の修正が行われ、安定したカーネルとしてリリースされる。stable版のリリースは指定されたカーネルメンテナが行う。
・longterm(ロングターム)
stableの中から選ばれ、新しいカーネルに行われたものと同様のバグフィックスが行われるリリースです。stableは新しいmainlineのリリースからあまり間をおかずにEOL(End Of Life: 「(製品の)寿命」から転じて、サポート期間終了を意味する)になりますが、longterm版は約2年という長い期間バグフィックスが行われます。longterm版のことを「LTS(Long Term Support)」と省略する場合もあります。
unameコマンド
現在稼働しているカーネルのバージョンを知るためのコマンド
オプション | 説明 |
---|---|
-a | 全ての情報を表示する |
-r | カーネルバージョンを表示する |
-m | ハードウェアアーキテクチャを表示する |
-n | ホスト名を表示する |
-p | CPUタイプを表示する |
-s | カーネルの名前を表示する |
$ uname
Linux
$ uname -a
Linux vm 4.18.0-553.16.1.el8_10.cloud.0.1.x86_64 #1 SMP Thu Sep 12 13:56:18 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
$ uname -r
4.18.0-553.16.1.el8_10.cloud.0.1.x86_64
$ uname -m
x86_64
/proc/version
カーネルバージョンが記載されたファイル
$ cat /proc/version
Linux version 4.18.0-553.16.1.el8_10.cloud.0.1.x86_64 (mockbuild@iad1-prod-build001.bld.equ.rockylinux.org) (gcc version 8.5.0 20210514 (Red Hat 8.5.0-22) (GCC)) #1 SMP Thu Sep 12 13:56:18 UTC 2024
カーネルイメージ
Linuxカーネルは、イメージファイルとしてファイルシステム上に格納されており、カーネルイメージという。
$ ll /boot/vmlinuz*
-rwxr-xr-x. 1 root root 10877272 Nov 12 19:06 /boot/vmlinuz-0-rescue-5e49184f645bd792ee83b78255645976
-rwxr-xr-x. 1 root root 10877272 Sep 12 14:07 /boot/vmlinuz-4.18.0-553.16.1.el8_10.cloud.0.1.x86_64
zImage
カーネルイメージ(ファイルとして保存されたカーネル本体のデータ)の形式
512KB以下のイメージしか扱えない
bzImage
カーネルイメージ(ファイルとして保存されたカーネル本体のデータ)の形式
現在の主流である 2.6 系や 3.x 系のカーネルで使用されている。

カーネルモジュールの管理
カーネルモジュールは、カーネルを構成する機能を分離してモジュール化したもの。
カーネルモジュールを走査するコマンドとしては、以下のようなものがある。
lsmodコマンド
現在ロードされているすべてのモジュールを一覧表示する。
/proc/modulesファイルでも確認可能
$ lsmod
Module Size Used by
nft_fib_inet 16384 1
nft_fib_ipv4 16384 1 nft_fib_inet
nft_fib_ipv6 16384 1 nft_fib_inet
nft_fib 16384 3 nft_fib_ipv6,nft_fib_ipv4,nft_fib_inet
modinfoコマンド
モジュールの情報を表示する
オプション | 説明 |
---|---|
-a | モジュールの作者を表示する |
-d | モジュールの説明を表示する |
-l | モジュールのライセンスを表示する |
-n | モジュールファイル名を表示する |
insmodコマンド
ローダブルモジュールをロードする。
オプション | 説明 |
---|---|
-s | 実行結果を標準出力ではなく、syslogに出力する |
-v | 詳細な情報を表示する |
rmmodコマンド
ロードされているモジュールをアンロードする。使用中のモジュールや、依存関係にあるモジュールはアンロードできない。
オプション | 説明 |
---|---|
-a | 未使用モジュールをすべてアンロードする |
-s | 動作結果を標準出力ではなく、syslogに出力する |
modprobeコマンド
モジュールのロードや、アンロードを行う。モジュールの依存関係を調べ、必要があるモジュールも自動的にロードしてくれる。
オプション | 説明 |
---|---|
-a | 全てのモジュールをロードする |
-c | 現在使われている設定を表示する |
-n | 実際には何も行わず、表示するだけ |
-r | モジュールをアンロードする |
-C ファイル | 設定ファイルを指定する |
--show-depends | モジュールの依存関係を表示する |
depmodコマンド
依存関係ファイルmodules.depを更新する
/etc/modprobe.conf
モジュールのロードやアンロードの際に、前処理・後処理が必要な場合や、モジュールをロードする際にパラメータを指定するファイル。
コマンド | 説明 |
---|---|
alias | モジュールのエイリアスを指定する |
options | モジュールのオプションを指定する |
install | 指定されたシェルコマンドを実行する |
remove | modprobe -rが実行されたときにシェルコマンドを実行する |

カーネルの管理と問題解決
/procの確認
/procディレクトリは、カーネル内のデータへのインターフェースとなる特殊なファイルシステム。/procディレクトリ以下のファイルを通して、カーネルが認識しているハードウェア、実行中のプロセス、システムリソースなどの情報が得られる。
lsdevコマンド
/proc以下の情報を効率よく表示できるコマンド。デバイスごとのDMS/IRQ/I/Oアドレスを一覧表示する。
lspciコマンド
システムのすべてのPCIバスと、接続されているPCIデバイスに関する情報を表示する
オプション | 説明 |
---|---|
-v | 詳細な情報を表示する |
-vv | より詳細な情報を表示する |
-t | ツリー上に表示する |
-b | カーネルではなくPCIバスの認識に従って表示する |
-s [[バス][スロット][機能]] | 指定したバス、スロット、機能のデバイスのみを表示する |
-d [ベンダーID]:[デバイスID] | 指定したベンダーIDとデバイスIDを持つデバイスのみを表示する |
$ lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 03)
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:03.0 Non-VGA unclassified device: Red Hat, Inc. Virtio SCSI
00:04.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:05.0 Unclassified device [00ff]: Red Hat, Inc. Virtio memory balloon
00:06.0 Unclassified device [00ff]: Red Hat, Inc. Virtio RNG
lsusbコマンド
USB関連の情報や接続されているUSBデバイスの一覧を表示できる。
デバイスファイル
/devディレクトリ以下には、デバイスを抽象化したデバイスファイルが存在している。デバイスファイルには、ブロックデバイスとキャラクタデバイスがあり、ブロックデバイスは、バッファを持ち、ランダムアクセスが可能なデバイスで、ブロック単位でアクセスできる。ハードディスク等があげられる。
$ ll /dev/sda{,1,2}
brw-rw----. 1 root disk 8, 0 Dec 6 06:03 /dev/sda
brw-rw----. 1 root disk 8, 1 Dec 6 06:03 /dev/sda1
brw-rw----. 1 root disk 8, 2 Dec 6 06:03 /dev/sda2
キャラクタデバイスは、ランダムアクセスが不可能なデバイスであり、キーボード、マウス等があげられる。バイト単位でアクセスでき、バッファはない。
$ ll /dev/{ttyS0,input/mice}
crw-rw----. 1 root input 13, 63 Dec 6 06:03 /dev/input/mice
crw--w----. 1 root tty 4, 64 Dec 6 06:04 /dev/ttyS0
カーネルが認識しているデバイスは、/proc/devicesファイルを参照すれば確認できる。
$ cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
21 sg
29 fb
128 ptm
136 pts
162 raw
180 usb
188 ttyUSB
189 usb_device
202 cpu/msr
203 cpu/cpuid
242 nvme-generic
243 nvme
244 hidraw
245 ttyDBC
246 usbmon
247 bsg
248 watchdog
249 ptp
250 pps
251 rtc
252 dax
253 tpm
254 gpiochip
Block devices:
8 sd
9 md
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
254 mdp
259 blkext
udev
udevはデバイスファイルを動的に管理するための仕組みで、ハードウェアがシステムに接続された際に対応するデバイスファイルを作成する役割を持っている。。
なお、ハードウェアの検出はudevの役割ではなくカーネルが行っており、デバイスが追加・削除される都度、カーネルからイベントが送信され、udevdはカーネルからその情報を受け取ることで動作している。このイベントを「uevent」という。
udevの動きは以下の通り、
①デバイスを接続する。
②カーネルが仮想ファイルシステム sysfs(/sys)にデバイス情報を作成する。
③カーネルがudevdにデバイス情報を通知する。(uevent)
④udevdが/sysのデバイス情報を確認する。
⑤udevが/devにデバイスファイルを作成する。
/etc/udev/udev.conf
udevのメインファイル
/etc/udev/rules.d
デバイスファイルの作成に関する個別の設定ファイル(ルールファイル)が入っている。
udev関連のコマンド
コマンド | 説明 |
---|---|
udevcontrol | udevを操作し、動作・停止を行う |
udevinfo | udevが認識しているデバイス情報を表示 |
udevmonitor | udevの動作状況を監視、コンソールに出力 |
udevadm サブコマンド | 上記の機能を統合したコマンド |

カーネルのコンパイル
カーネルは、必要に応じてソースコードからコンパイルすることができる。次のような場合はカーネルの再構築を検討する必要がある。
- 必要なデバイスドライバがカーネルに含まれていない
- 使用しているハードウェアに最適化したカーネルを利用したい
- カーネルの最新の機能を使いたい
カーネルを再構築するためには、gccコンパイラや、makeユーティリティ、カーネルソース、カーネルヘッダが必要になる。
カーネルのコンパイルとインストール
カーネルのコンパイル手順は以下の通り
- カーネルソースを用意する
- カーネルコンフィギュレーションを設定する
- カーネルをコンパイルする
- カーネルモジュールをコンパイルする
- カーネルとカーネルモジュールを配置する
- ブートローダの設定を変更する
カーネルのソースコードは、/usr/src/linuxディレクトリに格納される。
ディレクトリ名 | 説明 |
---|---|
arch | アーキテクチャに依存したコード |
configs | 目的別の.configファイル |
crypto | 暗号処理関数 |
drivers | 各種デバイスドライバ関連 |
fs | 仮想ファイルシステムと各種ファイルシステム関連 |
include | C言語のインクルードファイル |
init | 初期化コード |
ipc | SystemV互換プロセス間通信関連 |
kernel | 主要なカーネル機能 |
lib | 各種モジュール関連 |
mm | メモリ管理関連 |
net | 各種ネットワークプロトコル関連 |
scripts | カーネル作成支援スクリプト |
Documentation | 各種ドキュメント |
カーネルの設定は、.configファイルに記録されている。現在のカーネルコンフィギュレーションを新しい設定に反映させたい場合は、make oldconfigを実行する。
make install
make installコマンド実行時に起きることは以下の通り。
- ビルドされたカーネルイメージを/bootに移動する
- バージョンがファイル名に付くようカーネルイメージ等をリネームする
- ブートローダに新しいカーネルを使った起動設定を追加する
- 必要に応じて初期 RAM ディスクのイメージを作成する
他makeターゲット
ターゲット | 説明 |
---|---|
clean | .config以外の主要なファイルを削除する |
mrproper | .configやバックアップファイルも含め不要なファイルを削除する |
distclean | 上記に加えてpatchが作成したファイルなども削除する |
defconfig | デフォルト値を設定した.configを作成する |
all | 全てのビルドを実施する |
modules | 動的なモジュールをすべてビルドする |
rpm | カーネルをビルド後にRPMパッケージを作成する |
rpm-pkg | ソースRPMパッケージを作成する |
binrpm-pkg | ビルド済みカーネルとモジュールのRPMパッケージを作成する |
dep-pkg | ビルド済みカーネルとモジュールのdebianパッケージを作成する |