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

Linux
スポンサーリンク

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 形式で提供される。

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

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

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

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

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

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

  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 つが連結されたファイルである。

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

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

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

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

  1. make clean: 以前のカーネルコンフィグレーションで生成されたファイルのうちカーネルコンフィグレーション以外を削除する
  2. make oldconfig
  3. make
  4. make modules_install
  5. make install

DMKS (Dynamic Kernel Module Support)

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

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-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 の書式

モジュールのパス:このモジュールが依存するモジュールのパス

コメント

タイトルとURLをコピーしました