第8章 メンテナスクリプトとフック

目次

8.1. Kernel フック
8.2. ブートローダに必要なカーネルフック
8.3. Initramfs フック
8.4. initramfs ビルダーは Kernel フックに依存します。
8.5. ブートローダの更新を最適化する
8.6. 非推奨の機能
8.7. インストーラによる初期設定

以下のポリシーが Debian GNU/Linux に適用されます。これらのなかには、 Linux 以外のカーネルに対して適用可能なものもありますが、このポリシーにはそれらのための要件を設定していません。

8.1. Kernel フック

Linux カーネルパッケージ内のメンテナスクリプトは、 /etc/kernel の対応したサブディレクトリに配置されたフックスクリプトを起動する際に run-parts を使用しなければなりません。例えば、postinst スクリプトは /etc/kernel/postinst.d 内のスクリプトを起動します。

全てのカーネルフックスクリプトには、カーネルの ABI バージョン (uname -r コマンドが応答する文字列) と、 必要であれば、カーネルイメージへの絶対パスを引数として渡します。2 つ目の引数が無い場合アーキテクチャの慣例に従い、パスは/boot/vmlinuz-version/boot/vmlinux-version になります。カーネルのメンテナスクリプトに与えられる引数は、環境変数 DEB_MAINT_PARAMS に格納されます。これは、単一引用符で囲まれている場合があります。シェルスクリプト内では、この変数は次のようにパースできます:

eval set -- "$DEB_MAINT_PARAMS"

カーネルフックスクリプトは debconf の下で実行することもできます。その場合、stdin と stdout は使用せず、全て stderr (fd 2) に出力しなければなりません。シェルスクリプトで確実にそうするには、次のように書きます:

exec </dev/null >&2

8.2. ブートローダに必要なカーネルフック

ブートローダがロードするファイルが変更された場合、必ず更新しなければならないブートローダ用のパッケージ (ブロックリストを保存しているものなど) は /etc/kernel/postinst.d/etc/kernel/postrm.d にフックスクリプトをインストールしなければなりません。

これらのブートローダはインストール/アップグレード/削除の最終段階で更新されるべきものです。したがって、ブートローダのフックスクリプトに zz- のプレフィックスを持たせて他のパッケージはこのプレフィックスを使わないようにするか、後で run-parts で使用されるルールを使用して並び替えなければなりません。ブートローダの設定ファイルが、削除されたカーネルイメージを参照している場合、postrm フックスクリプトは警告すべきですが、終了コードは 0 を返さなければなりません。

これらのブートローダパッケージは、ブートセクタや特殊なストレージに書き込まないように、無効化された状態でファイルシステムにインストール可能でなければなりません。ブートローダが無効になっている間、カーネルフックは (任意で) ブートローダが無効になっているという警告を出力する以外は何もせず、成功裏に終了しなければなりません。

カーネルバージョンのメニューを提供することができるブートローダ用のパッケージは、メニューを更新するためにカーネルフックスクリプトをインストールするべきです。

8.3. Initramfs フック

ブートローダがロードするファイルが変更された場合、必ず更新しなければならないブートローダ用のパッケージは、/etc/initramfs/post-update.d にフックスクリプトをインストールしなければなりません。initramfs ビルダーは initramfs を作成、更新、または削除した後にこのスクリプトを run-parts から呼び出します。これらのフックスクリプトに与えられる引数は、カーネルの ABI バージョンと、initramfs イメージへの絶対パスです。

ブートローダが無効になっている間、initramfs フックは (任意で) ブートローダが無効になっているという警告を出力する以外は何もせず、成功裏に終了しなければなりません。

8.4. initramfs ビルダーは Kernel フックに依存します。

Initramfs ビルダーは、対応する initramfs イメージを作成/更新/削除するために、/etc/kernel/postinst.d/etc/kernel/postrm.d にフックスクリプトをインストールしなければなりません。postinst フックスクリプトは return する前にその処理を終えている必要があります。

8.5. ブートローダの更新を最適化する

カーネルパッケージのインストール、更新、または削除中に、様々なブートローダ hook が (次の順で) 起動します:

  1. postinst_hook または postrm_hook ユーザかインストーラによる /etc/kernel-img.conf 内のコマンドセット

  2. /etc/initramfs/post-update.d内のフックスクリプト

  3. /etc/kernel/postinst.d または /postrm.d 内のフックスクリプト

不要な更新を避けるには、ステップ 1 と ステップ 2 で呼び出されるフックは、$DPKG_MAINTSCRIPT_PACKAGElinux-image- で始まるかどうかをチェックし、その場合は何もしないようにすると良いでしょう。

8.6. 非推奨の機能

カーネルパッケージはブートローダまたはinitramfsをフックを経由する以外の方法で起動してはいけません。もし、/etc/kernel-img.confdo_bootloader = yes または同等のオプションが設定されている場合、以前これに作用したメンテナスクリプトはこのオプションを無視することを警告しなければなりません。linux-base もまた、アップデート時にデフォルトが変更されたことを警告しなければなりません。

8.7. インストーラによる初期設定

インストーラは /etc/kernel-img.conf 内のdo_bootloaderpostinst_hook または postrm_hook オプションを設定してはいけません。