LPIC-2 試験勉強メモ その 2

LPIC-2 試験勉強メモ その 2

Linux カーネル

カーネルソース

Linux カーネルは Linus Torvalds 氏が開発し、1991 年に 0.01 版を公開した。 現在は多くのプログラマが開発に参加し、総人数は 13,500 人を超えている。

公式カーネル (vanilla kernel, mainline kernel) は公式サイトの https://www.kernel.org/ からダウンロードできる。 カーネルソースは Git 上で公開され開発されている。

各ディストリビューションはほとんどの場合公式のカーネルソースをもとにカスタマイズされている。 各ディストリビューションのソースはその開発元のサイトやミラーサイトで公開される。

カーネルは起動時にメモリへロードされ、そのあとはメモリに常駐して CPU やメモリなどのデバイスの制御、プロセススケジューリングなどを行う。 カーネルの基本機能を提供するカーネル本体、コンパイル時に本体に静的リンクされるカーネルモジュールと、本体にリンクされず必要な時に動的に読み込まれるカーネルローダブルモジュールに分かれる。

カーネルバージョン表記

3.X 以降、バージョン番号は 3 桁となっている。 2 桁目の番号が 20 を超えることを好まないので、その次はメジャーバージョンの更新となっている。 カーネルソースは gzip と xz 形式で提供される。

リリースカテゴリ説明
prepatchRC (Release Candidates) とも呼ばれる開発版
mainlineすべての機能を含み 2~3 ヶ月間隔でリリースされ、Linus Torvalds 氏によってリリースされる
stablemainline リリースをベースにした安定板でメンテナーによってメンテナンスされる
longtermLTS (Long Term Support) とも呼ばれる長期メンテナンス版は約 2 年間メンテナンスされる

カーネルソースのディレクトリ

カーネルモジュールのソースは /usr/src/linux 配下にあり、次のような項目が配置されている。

サブディレクトリ説明
DocumentationLinux カーネルソースの関連の技術文書
archアーキテクチャ依存のソースコード
driversデバイスドライバー
fsファイルシステムモジュール
includeヘッダファイル
initカーネル初期化関連のソースコード
ipcプロセス間通信関連のソースコード
kernelカーネル本体 (core) のソースコード
libカーネルのライブラリ
mmメモリ関連のソースコード
netネットワークのプロトコルスタックやインタフェースドライバー
scriptsカーネルコンフィグレーションで使用されるスクリプト
soundサウンドドライバー

カーネルコンフィグレーション

カーネルのソースコードからカーネルのバイナリを生成することをカーネルコンフィグレーションという。 カーネル本体とカーネルローダブルモジュールからなるソースをコンパイルしてバイナリを生成する。コンパイルには make コマンドを使用する。

カーネルコンフィグレーションの手順

  1. make mrproper: 以前のカーネルコンフィグレーションで生成されたファイルを削除して初期状態に戻す
  2. make menuconfig: 新しいカーネルの構成を記述したコンフィグレーションファイルを生成する
  3. make: コンフィグレーションファイルに従い、カーネルとカーネルローダブルモジュールを生成する
  4. make modules_install: カーネルモジュールを /lib/modules の下にインストールする
  5. make install: カーネルを /boot の下にインストールする

生成されたカーネルはカーネルソースのルート配下にある arch/x86/boot/bzImage である。 bzImage は vmlinux を展開し初期化する Setup と gzip で圧縮された自己解凍型のカーネル vmlinux である System の 2 つが連結されたファイルである。

既存のコンフィグレーションファイルを用いてカーネルを生成

  1. make clean: 以前のカーネルコンフィグレーションで生成されたファイルのうちカーネルコンフィグレーション以外を削除する
  2. make oldconfig: 既存のカーネルコンフィグファイルを使用して、新しく定義が必要な項目がある場合のみ確認する
  3. make
  4. make modules_install
  5. make install

主なターゲット

ターゲット説明
allvmlinux、modules、bzImage を生成する。引数を指定しなかった場合のデフォルトターゲット
mrproper以前のカーネルコンフィグレーションで生成されたファイルを削除して初期状態に戻す
zImage圧縮されたカーネルイメージ zImage を生成 (カーネルバージョン 2.6.29 まで)
bzImage圧縮されたカーネルイメージ bzImage を生成 (カーネルバージョン 2.6.30 以降)
modules生成されたカーネルモジュールを生成
modules_install生成したすべてのカーネルモジュールをインストール
rpm-pkgカーネルのソースとバイナリの RPM パッケージを生成
binrpm-pkgカーネルのバイナリのみを RPM パッケージとして生成
deb-pkgカーネルを deb パッケージとして生成

コンフィグレーションファイル生成のためのターゲット

カーネルのコンフィグレーションファイルは /boot/config-xxx (xxx はカーネルバージョン) に格納される。

ターゲット説明
config設定項目 1 つ 1 つについて、順番に対話的に尋ねる形式
menuconfigcurses ベースのターミナル上でメニュー形式インターフェイスを提供
xconfigQt ベースの GUI ツール
gconfigGtk ベースの GUI ツール
oldconfig既存のコンフィグレーションファイルをデフォルトとして、新しい定義項目がある場合は設定を追加
defconfigarch/$ARCH/defconfing をデフォルトとして、コンフィグレーションファイルを生成

curses ベースのコンフィグレーションファイル生成ツールを起動する。

DMKS (Dynamic Kernel Module Support)

特定のカーネルモジュールをソースからビルドするためのユーティリティである。 カーネルアップグレード時、新カーネルように自動的にモジュールをビルド、インストールする。 ビルドのためにはモジュールのソースとカーネルのソース (Makefile, ヘッダファイルを含むモジュールビルド用パッケージ) が必要となる。

モジュールは /lib/modules/カーネルバージョン/kernel/drivers/net ディレクトリ配下にインストールされる。また、カーネルアップグレード後に新しいカーネルを立ち上げると自動で新しいカーネルバージョン用のモジュールがビルドされ、/lib/modules/新カーネルバージョン/kernel/drivers/net ディレクトリ配下にインストールされる。

DMKS のインストール手順
  1. カーネルソースコード、あるいはモジュールビルド用パッケージをインストール
  2. dmks パッケージをインストール
  3. モジュールのソースを /usr/src/<モジュール名>-<バージョン> ディレクトリ配下に配置
  4. モジュール用の dkms.conf を作成
  5. モジュールを dmks に登録
  6. モジュールをビルド
  7. モジュールをインストール

zImage/bzImage

zImage は対応できる圧縮カーネルサイズが 512 KB まで、bzImage は 512 KB 以上の圧縮カーネルにも対応可能。 zImage はカーネル 2.0 から 2.6.29 まで提供され、2.6.30 からは bzImage のみ提供されている。

カーネルパッチ

patch コマンド

diff コマンドで作成した差分ファイルを読み込んでパッチを当てる。

patch [オリジナルファイル] [パッチファイル]
patch -p[数値] < [パッチファイル]

複数のファイルにパッチを当てる場合は -p オプションで除外するプレフィックスの数を指定する。

  • -R, –reverse: パッチを取り外してもとに戻す。
カーネル 2.X 系の適用方法

unified 形式で作成した差分ファイルをソースのルートディレクトリ配下にある Makefile に当てて更新する。

カーネル 3.X, 4.X 系の適用方法

xz 形式のファイルを -d オプションで解凍し、差分ファイルを当てて更新する。カーネルパッチは patch-3.x.y の場合 3.x と 3.x.y の差分が記載されているため、3.x のソースファイルに対してパッチを適用する。

patch-kernel コマンド

カーネルソースに 1 回の実行で複数のパッチを当てることができる。

patch-kernel [ソースディレクトリ [パッチディレクトリ [停止バージョン]]]
  • ソースディレクトリ: /usr/src/linux
  • パッチディレクトリ: カレントディレクトリ
  • 停止バージョン: パッチディレクトリにあるすべてのパッチを当てる

カーネルの設定

カーネルメモリ内のパラメータ値を変更には次のいずれかの方法を用いる。

  • /proc/sys/kernel/<カーネルパラメータ名> に値を書き込む
  • sysctl コマンド

sysctl コマンド

sysctl kernel.<カーネルパラメータ名>
sysctl kernel.<カーネルパラメータ名>=<値>
  • -a: すべてのカーネルパラメータとその値を表示

恒常的にカーネルパラメーターの値を変更するには、/etc/sysctl.conf ファイルに設定する。

起動時のルートファイルシステム

initramfs.img はシステムの起動時にメモリに読み込まれる小さなルートファイルシステムである。 ディスクに構築されている本来のルートファイルシステムをマウントするためにシステム起動時のみ使われる。 Linux の新しいバージョンのカーネルをインストールした時や、カーネルのバイナリパッケージをインストールしたときに生成される。

cpio でアーカイブされ、gzip で圧縮されている。読み込むには次の順番で展開する。

  1. gz 形式に変換する
  2. gunzip コマンドで解凍する
  3. cpio コマンドで展開する
  • ソースコードからカーネルをインストールしたとき
  • カーネルのバイナリパッケージをインストールしたとき
  • mkinitrd を実行したとき
  • dracut コマンドを実行したとき

従来は initrd を使用していたが、次のような利点があるので initramfs が主流である。

  • ファイルシステムではないのでファイルシステムドライバーを必要としない
  • ファイルシステムではないのでブロックデバイスとしてキャッシュを使用せず、メモリを効率よく使用できる

dracut コマンド

汎用的な initramfs を生成する。 mkinitrd を改善したシェルスクリプト。 実行ログは /var/log/dracut.log に記録する。

dracut [オプション] initramfs イメージ名 [カーネルバージョン]
  • –hostonly: 現行システムにカスタマイズされた小さな initramfs を生成する

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

depmod コマンド

モジュールの遺存情報を modules.dep に作成する。

depmod [-a]
  • -a: /lib/modules/<カーネルバージョン> 配下にあるすべての依存情報を作成

insmod コマンド

指定したモジュールをロードする。

insmod モジュールパス

modprobe コマンド

指定したモジュールをロードする。modules.dep ファイルを参照し、依存するモジュールもすべてロードする。

modprobe [-r] モジュール名
  • -r: アンロードする
modules.dep の書式
モジュールのパス:このモジュールが依存するモジュールのパス

modinfo コマンド

モジュール情報を表示する。

modinfo [オプション] モジュール名
  • -a, –author: 作者の表示
  • -d, –description: 説明の表示
  • -l, –license: ライセンスの表示
  • -n, –filename: ファイル名を絶対パスで表示

rmmod コマンド

モジュールをアンロードする。

rmmod モジュール名