Open4

LPIC201 Linuxカーネル

HikaruHikaru

カーネルの構成要素

カーネルバージョン

カーネルには、バージョンが存在する。バージョン2.6を境に見分け方が変わっている。
2.6以前は、2.X.YXが奇数だと、開発版で、偶数だと安定板
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 系のカーネルで使用されている。

HikaruHikaru

カーネルモジュールの管理

カーネルモジュールは、カーネルを構成する機能を分離してモジュール化したもの。
カーネルモジュールを走査するコマンドとしては、以下のようなものがある。

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が実行されたときにシェルコマンドを実行する
HikaruHikaru

カーネルの管理と問題解決

/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 サブコマンド 上記の機能を統合したコマンド
HikaruHikaru

カーネルのコンパイル

カーネルは、必要に応じてソースコードからコンパイルすることができる。次のような場合はカーネルの再構築を検討する必要がある。

  • 必要なデバイスドライバがカーネルに含まれていない
  • 使用しているハードウェアに最適化したカーネルを利用したい
  • カーネルの最新の機能を使いたい
    カーネルを再構築するためには、gccコンパイラや、makeユーティリティ、カーネルソース、カーネルヘッダが必要になる。

カーネルのコンパイルとインストール

カーネルのコンパイル手順は以下の通り

  1. カーネルソースを用意する
  2. カーネルコンフィギュレーションを設定する
  3. カーネルをコンパイルする
  4. カーネルモジュールをコンパイルする
  5. カーネルとカーネルモジュールを配置する
  6. ブートローダの設定を変更する

カーネルのソースコードは、/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パッケージを作成する