2. Linuxカーネル
2.1. カーネルの構成要素
2.1.1. カーネルバージョン
カーネルにはバージョン番号が付けられており、「3.X.Y」の形のようにあらわされる。
- 2.6より前の場合
- Xの部分が偶数で安定版、奇数で開発版を示す
- Yの部分が開発版の修正版を表す場合がある
- 2.6以降の場合
- 正式版かどうかの判断に番号の偶奇は関係ない
- -の後に続く記号によって判断する
なおカーネルバージョンを知るにはuname -r
コマンド、もしくは/proc/version
の確認で可能となる。
またusr/src/kernel/hogehoge
のmakefileを確認することでも可能。
Linuxカーネルのカテゴリ
リリースされるLinuxカーネルは主に以下の4つのカテゴリに分類される。
- prepatch(プレパッチ) ... リリース候補
- mainline(メインライン)... prepatchの後にリリースされる正式版
- stable(ステーブル)... mainlineの後にリリースされる安定版
- longterm(ロングターム) ... stableから選ばれ新しいカーネルに行われたものと同様のバグフィックスが行われるリリース
Linuxカーネルのアーカイブの内容
Linuxカーネルはtar.gz
形式、またはtar.xz
形式でアーカイブして配布され以下内容が含まれる。
- カーネルソース
- カーネルモジュールのソース
- ドキュメント
- Makefile
2.1.2. カーネルイメージ
カーネルイメージはイメージファイルとして格納されたLinuxカーネルのこと。
カーネルイメージは/boot/vmlinuz*
という名称で保存されている。
カーネルイメージの形式
カーネルイメージにはzImageとbzImageがある。
なおこれらはgzip
で圧縮されている。
- zImage
- 512KB以下のイメージのみ扱える
- ローメモリを使用
- bzImage
- ハイメモリを使用
2.2. カーネルモジュールの管理
2.2.1. カーネルモジュール
Linuxカーネルはローダブルモジュールのサポートを有効化するとカーネル機能の一部をモジュール化して、必要なときのみ読み込むことができる。 この機能でカーネル起動時間の短縮、多様なハードウェアへの対応が可能。
具体的には頻繁に利用するデバイスのドライバはLinuxカーネルに組み込み、利用頻度の低いドライバはモジュール化するのが良い。
なおカーネルモジュールの拡張子は.ko
となる。
2.2.2. カーネルモジュールの操作コマンド
lsmodコマンド
現在ロードされているすべてのモジュールを一覧表示するコマンド。 モジュール名とそのサイズ、参照回数、モジュールの参照しているモジュール名などが表示される。
なお/proc/modules
からも参照が可能。
modinfoコマンド
モジュール情報を表示するコマンド。
オプション | 意味 |
---|---|
-a | モジュール作者情報の表示 |
-d | モジュール説明の表示 |
-l | モジュールライセンス表示 |
-n | モジュールファイル名表示 |
insmodコマンド
ローダブルモジュールをロードするコマンド。 読み込む再依存関係がある場合、依存元のモジュールからロードする必要がある。
オプション | 意味 |
---|---|
-s | 結果を標準出力ではなくsyslogに出力する |
-v | 詳細情報の表示 |
rmmodコマンド
ロードされているモジュールをアンロードするコマンド。 使用中、依存関係のあるモジュールはアンロードできない。
オプション | 意味 |
---|---|
-a | 未使用のモジュールをすべてアンロードする |
-s | 動作結果を標準出力ではなくsyslogに出力する |
modprobeコマンド
モジュールのロード/アンロードを行うコマンド。 このコマンドでは依存関係を調べ、インストールする必要のあるモジュールも自動ロードする特徴がある。
オプション | 意味 |
---|---|
-a | すべてのモジュールのロード |
-c | 現在使われている設定の表示 |
-r | モジュールのアンロード |
-C ファイル名 | 設定ファイルの指定 |
-show-depends | モジュールの依存関係を表示 |
なおmodprobeが参照するモジュールの依存関係はmodules.dep
に記載。
このファイルは/lib/modules/カーネルバージョン
以下にある。
記載方法は以下の通り。
またモジュールのロード/アンロードの際に何かしら処理を行う場合は/etc/modprobe.conf
で設定を行う。
depmodコマンド
modules.depを作成するコマンド。 カーネルモジュールの依存関係情報を更新する。
modprobeがにより参照される。
2.3. カーネルのコンパイル
カーネルは必要な場合はソースコードからコンパイルが可能。 これはカーネルの再構築と呼ばれる。 カーネルの再構築するケースは以下の通り。
- 必要なデバイスドライバがカーネルに含まれていない
- 使用しているハードウェアに最適したカーネルを利用したい
- カーネルの最新機能を使いたい
2.3.1. カーネルコンパイルとインストール
カーネルのコンパイル手順は以下の通り。
- カーネルソースを用意する
- カーネルコンフィギュレーションの設定
- カーネルをコンパイル
- カーネルモジュールをコンパイル
- カーネルとカーネルモジュールを配置
- ブートローダの設定
カーネルソースの準備
カーネルソースコードは/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ファイルで圧縮されたカーネルソースの展開例は以下の通り。
カーネルコンフィギュレーションの設定
カーネルの設定ファイルは.config
に記載される。
カーネルの設定を新しい設定に反映させる場合は以下コマンドを実施する。
このコマンドでは新しいカーネルで付け加えられた機能のみに対して問い合わせを行い、既存設定はそのままとなる。
カーネルの設定
カーネルの設定ではカーネルの機能を直接カーネルに埋め込むか、埋め込まずにローダブルモジュールにするか、組み込まないか設定が可能。
make config # カーネルオプションごとに答える形で設定
make menuconfig # メニュー形式で表示されているオプション項目を選択して設定
make oldconfig # 現在のカーネルの設定を引き継ぐ
make xconfig # KDE上で設定
make gconfig # GNOME上で設定
なおmake config
やmake menuconfig
で行った設定は/usr/src/linux/.config
に保存される。
カーネルとカーネルモジュールのコンパイル
make
コマンドを引数なしで実行するとカーネル、カーネルモジュール共にコンパイルされる。
カーネルとカーネルモジュールのインストール
カーネルモジュール(.ko
)を適切なディレクトリに保存するにはmake modules_install
コマンドを実行する。
なお保存先は/lib/modules/カーネル
以下に保存される。
またカーネルのインストールはmake install
コマンドで行える。
このコマンドは以下処理を行う。
- /boot以下にビルドされたカーネルをバージョンをファイル名にしてコピー
- 初期RAMディスクが必要な場合は作成
- ブートローダの設定ファイルに新しいカーネル用の起動設定を追加
makeコマンド
make
コマンドはソースコマンドをコンパイル、ビルドなどを行うコマンド。
ターゲット | 説明 |
---|---|
clean | .config以外のファイルを削除する |
all | すべてのビルドを実施 |
modules | カーネルモジュールをすべてビルドする |
modules_install | カーネルモジュールをインストール |
rpm | カーネルをビルド後にRPMパッケージを作成 |
rpm-pkg | ソースRPMパッケージの作成 |
defconfig | デフォルト状態の設定ファイルを作る |
mrproper | カーネルツリーの初期化(設定ファイルもクリア可能) |
なおカーネルのビルドと再構築はソールから以下のような手順で行う。
- 設定の初期化(
make mrproper
) - 設定を行う(
make oldconfig
) - ビルドを行う(
make all
) - モジュールをインストール(
make modules_install
) - カーネル本体をインストール(
make install
)
DKMS(Dynamic Kernel Module Support)
カーネルのソースツリー外にあるカーネルモジュールを自動的に生成する仕組み。
DKMSはカーネルアップデートの際に、カーネルとは独立して自動的にカーネルモジュールをコンパイルしインストールする。 現在、多くのディストリビューションがDKMSをパッケージに含んでいる。
2.4. カーネルのパラメータ変更
2.4.1. カーネルパラメータの設定
カーネルパラメータは以下目的で使用される。
- 機能の有効化/無効化
- システムパフォーマンスチューニング
- システム情報の参照
設定はproc/sys/kernel
以下のファイルで設定可能。
2.4.2. カーネルパラメータに関するコマンド
sysctlコマンド
カーネルパラメータを設定/表示できるコマンド。
なお再起動後もカーネルパラメータを永続変更したい場合は/etc/sysctl.conf
への設定記述で可能。
オプション | 意味 |
---|---|
-a | 現在利用できるすべてのパラメータを表示する |
-p | 指定したファイルから設定を読み込む(DFで/etc/sysctl.conf) |
-w | パラメータを更新する |
2.4.3. 初期RAMディスク
RAMディスクはメモリ上にファイルシステムを作成する機能のことで、ループバックマウントはファイルをファイルシステムとしてマウントできる機能をいう。 この仕組みを利用してファイルとして用意されたファイルシステムをRAMディスクとしてメモリ上に展開し、そのうえで暫定的にカーネルを起動しその後に本来利用するルートファイルシステムをマウントする起動方法は初期RAMディスクと呼ばれる。
初期RAMディスクのイメージファイルの形式には以下2種類がある。
- initrd
- 素のファイルシステムを圧縮したもの
gunzip
、mount -o loop
でイメージの確認が可能
- initramfs
- cpioアーカイブをgzip圧縮したもの
gunzip
、cpio
でイメージの確認が可能
initramfsはinitrdと比べてファイルシステムをドライバが不要、メモリ効率が優れているという特徴がある。
近年ではinitramfsが利用されている。またCentOSなどではDracutユーティリティ(dracut
)を初期RAMディスク作成で使用する場合がある。
初期RAMディスクの作成はmkinitrd
コマンド、mkinitrams
コマンドが利用される。
mkinitrdコマンド
初期RAMディスクの作成コマンド。
mkinitramsコマンド
初期RAMディスクの作成コマンド。 cpio アーカイブを利用した形式の場合はこちらを使う。
dracutコマンド
初期RAMディスクの作成コマンド。
2.5. カーネル管理と課題解決
2.5.1. /procの確認
/proc
はカーネル内のデータへのインターフェイスとなるファイルシステムのこと。
lsdevコマンド
デバイスごとのDMA(/proc/dma
),IRQ(/proc/interrupts
),I/Oアドレス(/proc/ioports
)を表示するコマンド。
lspciコマンド
すべてのPCIバスと接続されているPCIデバイスに関する情報を表示するコマンド。
オプション | 意味 |
---|---|
-v | 詳細に情報表示 |
-vv | さらに詳細に情報表示 |
-t | ツリー上に表示 |
-b | カーネルではなくPCIバス認識に沿って表示 |
lsusbコマンド
接続されているUSBデバイスに関する情報の表示をするコマンド。
オプション | 意味 |
---|---|
-v | 詳細に情報表示 |
-t | ツリー上に表示 |
2.5.2. デバイスファイル
デバイスファイルはデバイスを抽象化したファイルで/dev
以下に存在する。
デバイスファイルにはブロックデバイスとキャラクタデバイスの2種類がある。
それぞれファイルタイプはbとcとなる。
- ブロックデバイス
- バッファを持ちランダムアクセスが可能
- ブロック単位でアクセス可能
- ハードディスク、フロッピーディスク、RAMディスク、RAIDボリュームなど
- キャラクタデバイス
- ランダムアクセスが不可能なデバイス
- キーボード、マウス、プリンタなど
なおカーネルが認識しているデバイスは/proc/devices
ファイルで確認可能。
2.5.3. udev
udevはデバイスファイルを管理するための仕組み。 実際にはudevとsysfsが連携して管理するようになっている。 udevの仕組みは以下の通り。
- ハードウェアの接続をカーネルが検知
- udevデーモンが必要なデバイスファイルを作成する
このため認識している分のデバイスファイルしか作成されないということになる。
またデバイスファイル作成の際に参照される設定ファイルは/etc/udev/rules.d
となる。
/etc/udev/rules.dの書式
この設定ファイルの書式は以下の通り。
またsysfsがどのデバイスを扱うかはudevadm info
コマンドで確認可能
udevadm infoコマンド
sysfsがデバイスをどのように扱っている確認できるコマンド。
オプション | 意味 |
---|---|
-a | 指定したデバイスの上位デバイスについても表示する |
-p デバイス | sysfsより上のデバイスを指定 |
-n デバイス | /dev以下のデバイスファイルを指定 |
-q 種類 | 表示する情報の種類を指定(name, symlink, path, env, all) |
udevadm monitorコマンド
デバイスの検知をモニタリングするコマンド。 カーネルのイベントを監視して、udevのルールやイベントの表示を行える。
udevmonitor
コマンドでも可能。