コンテンツにスキップ

2. Linuxカーネル

2.1. カーネルの構成要素

2.1.1. カーネルバージョン

カーネルにはバージョン番号が付けられており、「3.X.Y」の形のようにあらわされる。

  • 2.6より前の場合
    • Xの部分が偶数で安定版、奇数で開発版を示す
    • Yの部分が開発版の修正版を表す場合がある
  • 2.6以降の場合
    • 正式版かどうかの判断に番号の偶奇は関係ない
    • -の後に続く記号によって判断する

なおカーネルバージョンを知るにはuname -rコマンド、もしくは/proc/versionの確認で可能となる。 またusr/src/kernel/hogehogemakefileを確認することでも可能。

Linuxカーネルのカテゴリ

リリースされるLinuxカーネルは主に以下の4つのカテゴリに分類される。

  • prepatch(プレパッチ) ... リリース候補
  • mainline(メインライン)... prepatchの後にリリースされる正式版
  • stable(ステーブル)... mainlineの後にリリースされる安定版
  • longterm(ロングターム) ... stableから選ばれ新しいカーネルに行われたものと同様のバグフィックスが行われるリリース

Linuxカーネルのアーカイブの内容

Linuxカーネルはtar.gz形式、またはtar.xz形式でアーカイブして配布され以下内容が含まれる。

  • カーネルソース
  • カーネルモジュールのソース
  • ドキュメント
  • Makefile

2.1.2. カーネルイメージ

カーネルイメージはイメージファイルとして格納されたLinuxカーネルのこと。 カーネルイメージは/boot/vmlinuz*という名称で保存されている。

カーネルイメージの形式

カーネルイメージにはzImagebzImageがある。 なおこれらはgzipで圧縮されている。

  • zImage
    • 512KB以下のイメージのみ扱える
    • ローメモリを使用
  • bzImage
    • ハイメモリを使用

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

2.2.1. カーネルモジュール

Linuxカーネルはローダブルモジュールのサポートを有効化するとカーネル機能の一部をモジュール化して、必要なときのみ読み込むことができる。 この機能でカーネル起動時間の短縮、多様なハードウェアへの対応が可能。

具体的には頻繁に利用するデバイスのドライバはLinuxカーネルに組み込み、利用頻度の低いドライバはモジュール化するのが良い。 なおカーネルモジュールの拡張子は.koとなる。

2.2.2. カーネルモジュールの操作コマンド

lsmodコマンド

現在ロードされているすべてのモジュールを一覧表示するコマンド。 モジュール名とそのサイズ、参照回数、モジュールの参照しているモジュール名などが表示される。

なお/proc/modulesからも参照が可能。

lsmod

modinfoコマンド

モジュール情報を表示するコマンド。

modinfo [オプション] [モジュール名]
オプション 意味
-a モジュール作者情報の表示
-d モジュール説明の表示
-l モジュールライセンス表示
-n モジュールファイル名表示

insmodコマンド

ローダブルモジュールをロードするコマンド。 読み込む再依存関係がある場合、依存元のモジュールからロードする必要がある。

insmod [オプション] [モジュールパス]
オプション 意味
-s 結果を標準出力ではなくsyslogに出力する
-v 詳細情報の表示

rmmodコマンド

ロードされているモジュールをアンロードするコマンド。 使用中、依存関係のあるモジュールはアンロードできない。

rmmod [オプション] [モジュール名]
オプション 意味
-a 未使用のモジュールをすべてアンロードする
-s 動作結果を標準出力ではなくsyslogに出力する

modprobeコマンド

モジュールのロード/アンロードを行うコマンド。 このコマンドでは依存関係を調べ、インストールする必要のあるモジュールも自動ロードする特徴がある。

modprobe [オプション] [モジュール名]
オプション 意味
-a すべてのモジュールのロード
-c 現在使われている設定の表示
-r モジュールのアンロード
-C ファイル名 設定ファイルの指定
-show-depends モジュールの依存関係を表示

なおmodprobeが参照するモジュールの依存関係はmodules.depに記載。 このファイルは/lib/modules/カーネルバージョン以下にある。 記載方法は以下の通り。

モジュール名: 依存しているモジュール 依存しているモジュール

またモジュールのロード/アンロードの際に何かしら処理を行う場合は/etc/modprobe.confで設定を行う。

depmodコマンド

modules.depを作成するコマンド。 カーネルモジュールの依存関係情報を更新する

modprobeがにより参照される。

2.3. カーネルのコンパイル

カーネルは必要な場合はソースコードからコンパイルが可能。 これはカーネルの再構築と呼ばれる。 カーネルの再構築するケースは以下の通り。

  • 必要なデバイスドライバがカーネルに含まれていない
  • 使用しているハードウェアに最適したカーネルを利用したい
  • カーネルの最新機能を使いたい

2.3.1. カーネルコンパイルとインストール

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

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

カーネルソースの準備

カーネルソースコードは/usr/src/linux*に保存される。 カーネルソースコードのディレクトリには以下ディレクトリがある。

ディレクトリ名 説明
arch アーキテクチャ(i368, x86_64)に依存したコード
configs それぞれの.config
crypto 暗号処理関数
drivers デバイスドライバ関連
fs 仮想ファイルシステム/システムファイル関連
include C言語のincludeファイル
init 初期化用コード
ipc SystemV互換プロセス間通信関連ファイル
kernel 各種カーネル機能
lib 各種モジュール関連
mm メモリ管理関連
net 各種ネットワークプロトコル関連
scripts カーネル作成支援コマンド
Documentations 各種ドキュメント
ファイル 説明
.config カーネルのビルド設定ファイル
Makefile makeの設定やカーネルバージョンの記載

なおxzファイルで圧縮されたカーネルソースの展開例は以下の通り。

xz -dc ファイル名.xz | tar xvf -

カーネルコンフィギュレーションの設定

カーネルの設定ファイルは.configに記載される。 カーネルの設定を新しい設定に反映させる場合は以下コマンドを実施する。

make oldconfig

このコマンドでは新しいカーネルで付け加えられた機能のみに対して問い合わせを行い、既存設定はそのままとなる。

カーネルの設定

カーネルの設定ではカーネルの機能を直接カーネルに埋め込むか、埋め込まずにローダブルモジュールにするか、組み込まないか設定が可能。

make config # カーネルオプションごとに答える形で設定
make menuconfig # メニュー形式で表示されているオプション項目を選択して設定
make oldconfig # 現在のカーネルの設定を引き継ぐ
make xconfig # KDE上で設定
make gconfig # GNOME上で設定

なおmake configmake menuconfigで行った設定は/usr/src/linux/.configに保存される。

カーネルとカーネルモジュールのコンパイル

makeコマンドを引数なしで実行するとカーネル、カーネルモジュール共にコンパイルされる。

make

カーネルとカーネルモジュールのインストール

カーネルモジュール(.ko)を適切なディレクトリに保存するにはmake modules_installコマンドを実行する。 なお保存先は/lib/modules/カーネル以下に保存される。

またカーネルのインストールはmake installコマンドで行える。 このコマンドは以下処理を行う。

  1. /boot以下にビルドされたカーネルをバージョンをファイル名にしてコピー
  2. 初期RAMディスクが必要な場合は作成
  3. ブートローダの設定ファイルに新しいカーネル用の起動設定を追加

makeコマンド

makeコマンドはソースコマンドをコンパイル、ビルドなどを行うコマンド。

make [ターゲット] 対象
ターゲット 説明
clean .config以外のファイルを削除する
all すべてのビルドを実施
modules カーネルモジュールをすべてビルドする
modules_install カーネルモジュールをインストール
rpm カーネルをビルド後にRPMパッケージを作成
rpm-pkg ソースRPMパッケージの作成
defconfig デフォルト状態の設定ファイルを作る
mrproper カーネルツリーの初期化(設定ファイルもクリア可能)

なおカーネルのビルドと再構築はソールから以下のような手順で行う。

  1. 設定の初期化(make mrproper)
  2. 設定を行う(make oldconfig)
  3. ビルドを行う(make all)
  4. モジュールをインストール(make modules_install)
  5. カーネル本体をインストール(make install)

DKMS(Dynamic Kernel Module Support)

カーネルのソースツリー外にあるカーネルモジュールを自動的に生成する仕組み。

DKMSはカーネルアップデートの際に、カーネルとは独立して自動的にカーネルモジュールをコンパイルしインストールする。 現在、多くのディストリビューションがDKMSをパッケージに含んでいる。

2.4. カーネルのパラメータ変更

2.4.1. カーネルパラメータの設定

カーネルパラメータは以下目的で使用される。

  • 機能の有効化/無効化
  • システムパフォーマンスチューニング
  • システム情報の参照

設定はproc/sys/kernel以下のファイルで設定可能。

2.4.2. カーネルパラメータに関するコマンド

sysctlコマンド

カーネルパラメータを設定/表示できるコマンド。 なお再起動後もカーネルパラメータを永続変更したい場合は/etc/sysctl.confへの設定記述で可能。

sysctl [オプション] [パラメータ]
オプション 意味
-a 現在利用できるすべてのパラメータを表示する
-p 指定したファイルから設定を読み込む(DFで/etc/sysctl.conf)
-w パラメータを更新する

2.4.3. 初期RAMディスク

RAMディスクはメモリ上にファイルシステムを作成する機能のことで、ループバックマウントはファイルをファイルシステムとしてマウントできる機能をいう。 この仕組みを利用してファイルとして用意されたファイルシステムをRAMディスクとしてメモリ上に展開し、そのうえで暫定的にカーネルを起動しその後に本来利用するルートファイルシステムをマウントする起動方法は初期RAMディスクと呼ばれる。

初期RAMディスクのイメージファイルの形式には以下2種類がある。

  • initrd
    • 素のファイルシステムを圧縮したもの
    • gunzipmount -o loopでイメージの確認が可能
  • initramfs
    • cpioアーカイブをgzip圧縮したもの
    • gunzipcpioでイメージの確認が可能

initramfsはinitrdと比べてファイルシステムをドライバが不要、メモリ効率が優れているという特徴がある。 近年ではinitramfsが利用されている。またCentOSなどではDracutユーティリティ(dracut)を初期RAMディスク作成で使用する場合がある。

初期RAMディスクの作成はmkinitrdコマンド、mkinitramsコマンドが利用される。

mkinitrdコマンド

初期RAMディスクの作成コマンド。

mkinitrd RAMディスクイメージ カーネルバージョン

mkinitramsコマンド

初期RAMディスクの作成コマンド。 cpio アーカイブを利用した形式の場合はこちらを使う。

mkinitrams -o RAMディスクイメージ カーネルバージョン

dracutコマンド

初期RAMディスクの作成コマンド。

dracut 出力ファイル名 カーネルバージョン

2.5. カーネル管理と課題解決

2.5.1. /procの確認

/procカーネル内のデータへのインターフェイスとなるファイルシステムのこと。

lsdevコマンド

デバイスごとのDMA(/proc/dma),IRQ(/proc/interrupts),I/Oアドレス(/proc/ioports)を表示するコマンド。

lsdev

lspciコマンド

すべてのPCIバスと接続されているPCIデバイスに関する情報を表示するコマンド。

lspci [オプション]
オプション 意味
-v 詳細に情報表示
-vv さらに詳細に情報表示
-t ツリー上に表示
-b カーネルではなくPCIバス認識に沿って表示

lsusbコマンド

接続されているUSBデバイスに関する情報の表示をするコマンド。

lsusb [オプション]
オプション 意味
-v 詳細に情報表示
-t ツリー上に表示

2.5.2. デバイスファイル

デバイスファイルはデバイスを抽象化したファイル/dev以下に存在する。 デバイスファイルにはブロックデバイスキャラクタデバイスの2種類がある。 それぞれファイルタイプはbcとなる。

  • ブロックデバイス
    • バッファを持ちランダムアクセスが可能
    • ブロック単位でアクセス可能
    • ハードディスク、フロッピーディスク、RAMディスク、RAIDボリュームなど
  • キャラクタデバイス
    • ランダムアクセスが不可能なデバイス
    • キーボード、マウス、プリンタなど

なおカーネルが認識しているデバイスは/proc/devicesファイルで確認可能。

2.5.3. udev

udevはデバイスファイルを管理するための仕組み。 実際にはudevとsysfsが連携して管理するようになっている。 udevの仕組みは以下の通り。

  1. ハードウェアの接続をカーネルが検知
  2. udevデーモンが必要なデバイスファイルを作成する

このため認識している分のデバイスファイルしか作成されないということになる。 またデバイスファイル作成の際に参照される設定ファイルは/etc/udev/rules.dとなる。

/etc/udev/rules.dの書式

この設定ファイルの書式は以下の通り。

認識キー==値, 代入キー==

またsysfsがどのデバイスを扱うかはudevadm infoコマンドで確認可能

udevadm infoコマンド

sysfsがデバイスをどのように扱っている確認できるコマンド。

udevadm info [オプション]
オプション 意味
-a 指定したデバイスの上位デバイスについても表示する
-p デバイス sysfsより上のデバイスを指定
-n デバイス /dev以下のデバイスファイルを指定
-q 種類 表示する情報の種類を指定(name, symlink, path, env, all)

udevadm monitorコマンド

デバイスの検知をモニタリングするコマンド。 カーネルのイベントを監視して、udevのルールやイベントの表示を行える。

udevmonitorコマンドでも可能。

udevadm monitor