Linux カーネル
Linux 概要
Linux カーネルは Linux Torvalds 氏が開発し、1991 年に 0.01 版を公開した。 現在は多くのプログラマが開発に参加し、総人数は 13,500 人を超えている。
公式カーネル (vanilla kernel, mainline kernel) は公式サイトの https://www.kernel.org/ からダウンロードできる。 カーネルソースは Git 上で公開され開発されている。
各ディストリビューションはほとんどの場合公式のカーネルソースをもとにカスタマイズされている。 各ディストリビューションのソースはその開発元のサイトやミラーサイトで公開される。
カーネルは起動時にメモリへロードされ、そのあとはメモリに常駐して CPU やメモリなどのデバイスの制御、プロセススケジューリングなどを行う。 カーネルの基本機能を提供するカーネル本体、コンパイル時に本体にせい的リンクされるカーネルモジュールと、本体にリンクされず必要な時に動的に読み込まれるカーネルローダブルモジュールに分かれる。
カーネルバージョン表記
3.X 以降、バージョン番号は 3 桁となっている。 2 桁目の番号が 20 を超えることを好まないので、その次はメジャーバージョンの更新となっている。 カーネルソースは gzip と xz 形式で提供される。
リリースカテゴリ | 説明 |
---|---|
prepatch | RC (Release Candidates) とも呼ばれる開発版 |
mainline | すべての機能を含み 2~3 ヶ月感覚でリリースされる |
stable | mainline リリースをベースにした安定板 |
longterm | LTS (Long Term Support) とも呼ばれる長期メンテナンス版は約 2 年間メンテナンスされる |
カーネルソースのディレクトリ
カーネルソースは /usr/src/linux
配下にあり、次のような項目が配置されている。
サブディレクトリ | 説明 |
---|---|
Documentation | Linux カーネルソースの関連の技術文書 |
arch | アーキテクチャ遺存のソースコード |
drivers | デバイスドライバー |
fs | ファイルシステムモジュール |
include | ヘッダファイル |
init | カーネル初期化関連のソースコード |
ipc | プロセス間通信関連のソースコード |
kernel | カーネル本体 (core) のソースコード |
lib | カーネルのライブラリ |
mm | メモリ関連のソースコード |
net | ネットワークのプロトコルスタックやインターフェイスドライバー |
scripts | カーネルコンフィグレーションで使用されるスクリプト |
sound | サウンドドライバー |
カーネルコンフィグレーション
カーネルのソースコードからカーネルのバイナリを生成することをカーネルコンフィグレーションという。 カーネル本体とカーネルローダブルモジュールからなるソースをコンパイルしてバイナリを生成する。
- make mrproper: 以前のカーネルコンフィグレーションで生成されたファイルを削除して初期状態に戻す
- make menuconfig: 新しいカーネルの構成を記述したコンフィグレーションファイルを生成する
- make: コンフィグレーションファイルに従い、カーネルとカーネルローダブルモジュールを生成する
- make modules_install: カーネルモジュールを
/lib/modules
の下にインストールする - make install: カーネルを
/boot
の下にインストールする
生成されたカーネルはカーネルソースのルート配下にある arch/x86/boot/bzImage
である。 bzImage は vmlinux を展開し初期化する Setup と gzip で圧縮された自己解凍型のカーネル vmlinux である System の 2 つが連結されたファイルである。
コンフィグレーションファイル生成のためのターゲット
コマンド | 説明 |
---|---|
make config | 設定項目 1 つ 1 つについて、順番に対話的に尋ねる形式 |
make menuconfig | curses ベースのターミナル上でメニュー形式インターフェイスを提供 |
make xconfig | Qt ベースの GUI ツール |
make gconfig | Gtk ベースの GUI ツール |
make oldconfig | 既存のコンフィグレーションファイルをデフォルトとして、新しい定義項目がある場合は設定を追加 |
make defconfig | arch/$ARCH/defconfing をデフォルトとして、コンフィグレーションファイルを生成 |
curses ベースのコンフィグレーションファイル生成ツールを起動する。
既存のコンフィグレーションファイルを用いてカーネルを生成
- make clean: 以前のカーネルコンフィグレーションで生成されたファイルのうちカーネルコンフィグレーション以外を削除する
- make oldconfig
- make
- make modules_install
- make install
DMKS (Dynamic Kernel Module Support)
特定のカーネルモジュールをソースからビルドするためのユーティリティである。 カーネルアップグレード時、新カーネルように自動的にモジュールをビルド、インストールする。 ビルドのためにはモジュールのソースとカーネルのソース (Makefile, ヘッダファイルを含むモジュールビルド用パッケージ) が必要となる。
DMKS のインストール手順
- カーネルソースコード、あるいはモジュールビルドようパッケージをインストール
- dmks パッケージをインストール
- モジュールのソースを
/usr/src/<モジュール名>-<バージョン>
ディレクトリ配下に配置 - モジュール用の dkms.conf を作成
- モジュールを dmks に登録
- モジュールをビルド
- モジュールをインストール
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-kernel コマンド
カーネルソースに 1 回の実行で複数のパッチを当てることができる。
patch-kernel [ソースディレクトリ [パッチディレクトリ [停止バージョン]]]
- ソースディレクトリ:
/usr/src/linux
- パッチディレクトリ: カレントディレクトリ
- 停止バージョン: パッチディレクトリにあるすべてのパッチを当てる
カーネルメモリないのパラメータ値変更
/proc/sys/kernel/<カーネルパラメータ名>
に値を書き込む- sysctl コマンド
sysctl コマンド
sysctl kernel.<カーネルパラメータ名>
sysctl kernel.<カーネルパラメータ名>=<値>
- -a: すべてのカーネルパラメータとその値を表示
起動時のルートファイルシステム
initramfs.img
はシステムの起動時にメモリに読み込まれる小さなルートファイルシステムである。 ディスクに構築されている本来のルートファイルシステムをマウントするためにシステム起動時のみ使われる。 cpio でアーカイブされ、gzip で圧縮されている。
- ソースコードからカーネルをインストールしたとき
- カーネルのバイナリパッケージをインストールしたとき
- 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 コマンド
指定したモジュールをロードする。
modprobe [-r] モジュール名
- -r: アンロードする
modinfo コマンド
モジュール情報を表示する。
modinfo [オプション] モジュール名
- -a, –author: 作者の表示
- -d, –description: 説明の表示
- -l, –license: ライセンスの表示
- -n, –filename: ファイル名を絶対パスで表示
rmmod コマンド
モジュールをアンロードする。
rmmod モジュール名
modules.dep の書式
モジュールのパス:このモジュールが依存するモジュールのパス
コメント