Linux initramfsのマスター:カスタムドライバとブートスクリプトの作成

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

ブートストラップ・パラドックス:ハードウェアとOSの架け橋

BIOSまたはUEFIがブートローダー(GRUB)にバトンを渡し、そこからカーネルが起動する場面を想像してください。しかし、突然プロセスが停止します。ここでカーネルはパラドックスに直面します。ドライバにアクセスするためにルートファイルシステムをマウントする必要がありますが、そのファイルシステムが存在するディスクと通信するためには、まさにそのドライバが必要なのです。これが **initramfs**(initial RAM filesystem)を使用する理由です。

技術的に言えば、initramfsは圧縮されたCPIOアーカイブであり、通常20MBから60MB程度のサイズです。これは RAM上のテンポラリ(一時的)なルートファイルシステムとして機能し、実際の物理ディスクを見つけてマウントするために必要な主要なカーネルモジュール、スクリプト、バイナリを格納する架け橋となります。多くの管理者はこれを「ブラックボックス」のように扱いますが、複雑なハードウェアRAIDやLUKS暗号化を扱う際、これをマスターしているかどうかが、迅速な修復かシステム全体の再インストールかの分かれ目となります。

経験は残酷な教師です。100台以上の本番ノードを管理してきた経験から、initramfsの変更はミスが許されない操作であることを学びました。スクリプト内のたった一つのタイポ(入力ミス)で、サーバーが (initramfs) BusyBoxシェルに取り残されてしまうこともあります。必ず、重要度の低いステージング環境の仮想マシンで先にテストしてください。

ツーリング:ディストリビューションごとのルール

ほとんどのLinuxディストリビューションには、独自の専用ジェネレーターが付属しています。サードパーティのソフトウェアをダウンロードする必要はありませんが、自分のエコシステムに合ったツールを使用する必要があります。主に次の2つが主流です。

  • initramfs-tools: Debian、Ubuntu、Mintの標準。
  • Dracut: RHEL、Fedora、CentOS、AlmaLinuxを支える強力なツール。

Debianベースの環境を準備するには、コアユーティリティがインストールされていることを確認してください。

sudo apt update
sudo apt install initramfs-tools binutils

RHEL系のシステムでは、Dracutが重役を担います:

sudo dnf install dracut dracut-network

cpio をインストールしておくことをお勧めします。これにより、標準ツールがエラーを報告しなかった場合に、手動でイメージを展開して検査することができます。

設定:モジュールとスクリプトの注入

最も一般的な2つのタスク、すなわち「不足しているドライバをブートシーケンスに強制的に組み込むこと」と、「OSが制御を引き継ぐ前にカスタムスクリプトを実行すること」に取り組んでみましょう。

1. カーネルモジュール(ドライバ)の追加

megaraid_sas コントローラやハイエンドのNVMeドライブを使用している新しいサーバーに、物理ディスクを移行したとします。初期のハンドオフ中にカーネルがこれらをロードしないと、ブートは失敗します。これらを強制的に含める必要があります。

Debian/Ubuntuの場合:

/etc/initramfs-tools/modules を開きます。nvmemegaraid_sas など、モジュール名を1行に1つずつ追加するだけです。

# /etc/initramfs-tools/modules
nvme
virtio_pci

現在のカーネルのイメージを再生成して変更を適用します:

sudo update-initramfs -u

RHEL/AlmaLinux(Dracut)の場合:

Dracutはモジュール式です。/etc/dracut.conf.d/ に設定ファイル(例:drivers.conf)を作成します:

add_drivers+=" nvme megaraid_sas "

強制フラグを使用してイメージを再構築します:

sudo dracut -f

2. 起動初期スクリプトのデプロイ

実際のルートファイルシステムがマウントされる前に、ハードウェアチェックを実行したり、カスタムのセキュリティバナーを表示したりする必要があるかもしれません。Debianでは、これらのスクリプトは実行タイミングによって分類されます:

  • init-top: モジュールがロードされる前に実行。
  • local-top: ローカルディスクがマウントされる前に実行。
  • panic: ブートが失敗した時のみ実行、デバッグに有用。

/etc/initramfs-tools/scripts/init-top/startup-msg にスクリプトを作成します:

#!/bin/sh
PREREQ=""
prereqs() { echo "$PREREQ"; }

case $1 in
  prereqs) prereqs; exit 0 ;;
esac

. /scripts/functions
echo "カスタムブートスクリプト:セキュアな環境を初期化中..."
sleep 1

実行権限を付与し、イメージを更新します:

sudo chmod +x /etc/initramfs-tools/scripts/init-top/startup-msg
sudo update-initramfs -u

検証:信頼せよ、されど確認せよ

午前2時の凍えるようなデータセンターで過ごした経験がある者から言わせてもらえば、決してすぐに再起動してはいけません。まずイメージの内容を確認する必要があります。依存関係が不足していると、サーバーがネットワークに戻ってくることはありません。

アーカイブの検査

Debianでは、lsinitramfs を使用して中身を覗き見ます。<a href="https://itnotes.dev/ja/grep%e3%82%92%e5%be%85%e3%81%a4%e3%81%ae%e3%81%af%e3%82%82%e3%81%86%e3%82%84%e3%82%81%e3%82%88%e3%81%86%ef%bc%9afzf%e3%81%a8ripgrep%e3%81%ab%e3%82%88%e3%82%8b%e5%ae%9f%e8%b7%b5%e7%9a%84%e3%81%aa/">grep</a> を使って、特定のスクリプトやモジュールが存在することを確認してください:

lsinitramfs /boot/initrd.img-$(uname -r) | grep "startup-msg"

RHELでは、同じ目的で lsinitrd を使用します:

lsinitrd | grep "megaraid_sas"

安全対策

リモートのVPSで作業している場合は、VNCまたはシリアルコンソールを開いたままにしておいてください。事態が悪化した場合、カーネルはBusyBoxにドロップします。多くの場合、原因は /run/initramfs/initrd.log で見つけることができます。

プロのヒント:常にバックアップを保持してください。update-initramfs は通常、/boot.bak ファイルを保存します。新しいイメージでハングアップした場合は、GRUBメニューで「e」を押し、initrd の行をバックアップファイルを指すように書き換えてください。この単純な習慣により、私は何十時間もの復旧作業から救われました。

initramfsをマスターすることで、基本的なトラブルシューティングを超越できます。電源ボタンが押された瞬間から、Linuxのライフサイクルを完全に制御できるようになります。

Share: