initrd/initramfsとは?Linuxを起動する「仮の足場」を徹底解説

Linux

Linuxパソコンの電源を入れると、数秒でログイン画面が表示されますよね。でも実は、その裏側では複雑なプロセスが進行しているんです。

特に重要なのが、OSの本体が動き出す前に行われる「準備作業」。この準備を担当するのが、initrdinitramfsと呼ばれる仕組みです。

「建物を建てる時の仮設足場」のようなイメージで、本格的なOSが起動するまでの間、一時的に必要最小限の環境を用意する役割を果たしています。

この記事では、initrdとinitramfsの基本から、トラブル時の対処法まで、初心者の方にも分かりやすく解説していきます。


スポンサーリンク

initrdとinitramfsって何?基本をおさらい

initrd(initial ramdisk)initramfs(initial RAM file system)は、Linuxが起動する際に、一時的にメモリ上に展開される小さなファイルシステムのことです。

なぜ必要なの?

Linuxカーネル(OSの中核部分)は、起動時に「どのディスクにルートファイルシステムがあるか」を知る必要があります。

でも、ここで問題が発生するんです。

ジレンマ:

  • ディスクにアクセスするには、デバイスドライバが必要
  • デバイスドライバは、ディスク上のファイルシステムに保存されている
  • ファイルシステムにアクセスできないと、ドライバが読み込めない

解決策:
initrd/initramfsという「一時的な足場」を用意して、そこに必要最小限のドライバやツールを入れておく。これで、本格的なファイルシステムをマウントできるようになるんです。

料理のたとえ

分かりやすく例えると、こんな感じです。

本格的なキッチン(ルートファイルシステム)で料理したい。

でも:

  • キッチンは別の部屋にある
  • 部屋の鍵はキッチンの中にある

どうする?

仮の調理スペース(initramfs)を用意!

  • 最小限の道具だけ持ち込む
  • そこで鍵を作る
  • キッチンのドアを開ける
  • 本格的な料理を始める

initrd/initramfsは、このような「仮の作業場」なんですね。


initrdとinitramfsの違い

名前が似ていますが、実は異なる技術です。

initrd(初代)

登場時期:
Linux 2.4カーネル時代から

特徴:

  • ブロックデバイスとして扱われる
  • ext2などの実際のファイルシステムでフォーマット
  • 固定サイズ
  • 使用後は明示的にアンマウントが必要

欠点:

  • サイズが固定されているため、無駄が多い
  • ファイルシステムのオーバーヘッドがある
  • 柔軟性に欠ける

initramfs(現代)

登場時期:
Linux 2.6カーネル以降(2004年頃)

特徴:

  • cpioアーカイブをメモリ上に展開
  • tmpfs(一時的なメモリファイルシステム)を使用
  • 必要な分だけメモリを使う
  • 使用後は自動的に解放される

利点:

  • メモリ効率が良い
  • シンプルで高速
  • 柔軟性が高い

現状:
現在のLinuxディストリビューションは、ほぼすべてがinitramfsを使用しています。initrdは歴史的な存在になりつつあります。


Linuxの起動プロセスとinitramfs

initramfsが登場するタイミングを見てみましょう。

起動の流れ

1. ファームウェア起動
BIOS/UEFIがハードウェアを初期化します。

2. ブートローダー起動
GRUB、systemd-bootなどが起動します。

3. カーネル読み込み
ブートローダーがLinuxカーネルをメモリに読み込みます。

4. initramfs読み込み
カーネルと一緒に、initramfsもメモリに読み込まれます。

5. カーネル起動
Linuxカーネルが起動し、initramfsを展開します。

6. 初期化スクリプト実行
initramfs内の/initスクリプトが実行されます。

7. ルートファイルシステムのマウント
本物のルートファイルシステム(例:/dev/sda1)がマウントされます。

8. pivot_root
ルートファイルシステムを切り替えます。

9. システムの起動
systemd(または他のinitシステム)が起動し、通常のサービスが開始されます。

initramfsの役割

6〜8のステップがinitramfsの担当範囲です。

具体的には:

  • 必要なカーネルモジュール(ドライバ)を読み込む
  • ディスク暗号化(LUKS)のパスワード入力を受け付ける
  • LVM、RAID、NFSルートなどの設定
  • ルートファイルシステムの検証とマウント

initramfsの中身

実際に何が入っているのか見てみましょう。

基本的な構造

/
├── bin/           # 基本コマンド(sh、mount、insmodなど)
├── sbin/          # システム管理コマンド
├── etc/           # 設定ファイル
├── lib/           # 共有ライブラリ
├── lib/modules/   # カーネルモジュール(ドライバ)
├── dev/           # デバイスファイル
├── proc/          # procファイルシステム(マウントポイント)
├── sys/           # sysファイルシステム(マウントポイント)
├── run/           # ランタイムデータ
├── usr/           # 追加のユーティリティ
└── init           # 初期化スクリプト(重要!)

重要なファイル

/init
最初に実行されるスクリプト。initramfsの「司令塔」です。

/lib/modules/
起動に必要なカーネルモジュール(ドライバ)が入っています。

例:

  • ディスクコントローラのドライバ
  • ファイルシステムドライバ(ext4、XFSなど)
  • デバイスマッパー(LVM、暗号化用)

/etc/fstab
マウントするファイルシステムの情報。

どんなプログラムが入っている?

基本的なシェル
busyboxという軽量シェルがよく使われます。

マウントツール
mount、umountコマンド。

モジュールローダー
insmod、modprobeコマンド。

ユーティリティ

  • udev(デバイス管理)
  • cryptsetup(ディスク暗号化)
  • lvm(論理ボリューム管理)

必要最小限のツールだけが含まれているんです。


initramfsの確認方法

実際にinitramfsを見てみましょう。

ファイルの場所

Debian/Ubuntu系:

/boot/initrd.img-$(uname -r)

Red Hat系(RHEL、CentOS、Fedora):

/boot/initramfs-$(uname -r).img

Arch Linux:

/boot/initramfs-linux.img

中身を展開する

initramfsは圧縮されているので、展開してみます。

作業ディレクトリを作成:

mkdir /tmp/initramfs
cd /tmp/initramfs

展開(最近のinitramfs):

# gzip圧縮の場合
zcat /boot/initrd.img-$(uname -r) | cpio -idmv

# xz圧縮の場合
xzcat /boot/initramfs-$(uname -r).img | cpio -idmv

展開(複数の圧縮層がある場合):
最近のinitramfsは、複数のcpioアーカイブが連結されていることがあります。

unmkinitramfs /boot/initrd.img-$(uname -r) /tmp/initramfs

内容を確認:

ls -lR
cat init

initスクリプトの中身や、含まれているモジュールを確認できます。


initramfsの作成と更新

initramfsは、どうやって作られるのでしょうか。

自動生成

通常、initramfsは以下のタイミングで自動的に生成されます。

カーネルのインストール時
新しいカーネルをインストールすると、そのカーネル用のinitramfsが作られます。

カーネルモジュールの更新時
ドライバなどを追加・更新すると、再生成されます。

手動での再生成

必要に応じて、手動で再生成することもできます。

Debian/Ubuntu:

sudo update-initramfs -u

全てのカーネルを対象にする場合:

sudo update-initramfs -u -k all

Red Hat系:

sudo dracut --force

特定のカーネル用:

sudo dracut --force /boot/initramfs-$(uname -r).img $(uname -r)

Arch Linux:

sudo mkinitcpio -P

生成ツール

update-initramfs(Debian/Ubuntu)
initramfs-toolsパッケージが提供。

dracut(Red Hat系、一部のDebian系)
柔軟で強力なツール。

mkinitcpio(Arch Linux)
シンプルで高速。


設定のカスタマイズ

initramfsに含める内容をカスタマイズできます。

Debian/Ubuntu(initramfs-tools)

設定ファイル:

/etc/initramfs-tools/initramfs.conf

よく使う設定:

# 圧縮方式
COMPRESS=xz

# 含めるモジュール
MODULES=most  # またはdep、most、list

# busyboxの使用
BUSYBOX=y

モジュールを追加:

/etc/initramfs-tools/modules

このファイルに、起動時に読み込みたいモジュール名を書きます。

Red Hat系(dracut)

設定ファイル:

/etc/dracut.conf
/etc/dracut.conf.d/*.conf

モジュールを追加:

add_drivers+=" dm-crypt "

特定のファイルを含める:

install_items+=" /etc/my-custom-file "

設定後の再生成

設定を変更したら、必ず再生成が必要です。

sudo update-initramfs -u  # Debian/Ubuntu
sudo dracut --force       # Red Hat系

よくある使用例

initramfsが活躍する具体的な場面を紹介します。

ディスク暗号化(LUKS)

シナリオ:
ルートファイルシステムが暗号化されている。

initramfsの役割:

  1. 起動時にパスワード入力画面を表示
  2. 入力されたパスワードで暗号化ディスクを解錠
  3. 解錠されたディスクをマウント

必要なモジュール:

  • cryptsetup
  • dm-crypt
  • キーボードドライバ

LVM(論理ボリューム管理)

シナリオ:
ルートファイルシステムがLVM上にある。

initramfsの役割:

  1. LVMのメタデータをスキャン
  2. ボリュームグループをアクティブ化
  3. 論理ボリュームをマウント

必要なモジュール:

  • lvm2
  • dm-mod

ソフトウェアRAID

シナリオ:
複数のディスクでRAIDを構成している。

initramfsの役割:

  1. RAIDメンバーディスクを検出
  2. RAIDアレイをアセンブル
  3. マウント可能な状態にする

必要なモジュール:

  • md-mod
  • mdadm

NFSルート

シナリオ:
ルートファイルシステムがネットワーク上のNFSサーバーにある。

initramfsの役割:

  1. ネットワークを初期化
  2. DHCPでIPアドレスを取得
  3. NFSサーバーに接続
  4. ルートファイルシステムをマウント

必要なモジュール:

  • ネットワークカードのドライバ
  • NFSクライアント

トラブルシューティング

initramfs関連のトラブルと対処法です。

起動時に「initramfs」プロンプトが表示される

症状:
起動途中で止まり、(initramfs)というプロンプトが表示される。

原因:

  • ルートファイルシステムが見つからない
  • ファイルシステムが破損している
  • 必要なドライバが含まれていない

対処法:

ディスクを確認:

ls /dev/disk/by-uuid/
blkid

手動マウントを試みる:

mount /dev/sda1 /root

成功したら:

exit

で起動を続けられることがあります。

ファイルシステムチェック:

fsck /dev/sda1

カーネルパニック

症状:
「Kernel panic – not syncing: VFS: Unable to mount root fs」

原因:

  • initramfsが破損している
  • ルートパーティションのUUIDが変更された
  • 必要なモジュールが含まれていない

対処法:

別のカーネルで起動:
GRUBメニューで古いカーネルを選択してみます。

LiveUSBから修復:

  1. LiveUSBで起動
  2. ルートパーティションをマウント
  3. chrootで環境に入る
  4. initramfsを再生成
sudo mount /dev/sda1 /mnt
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo chroot /mnt
update-initramfs -u -k all
exit
sudo reboot

ディスク暗号化のパスワードが受け付けられない

原因:
キーボードレイアウトが正しくない。

対処法:
initramfsにキーボードレイアウトを含める。

/etc/initramfs-tools/initramfs.confに追加:

KEYMAP=y

そして再生成:

sudo update-initramfs -u

デバッグ方法

initramfsのトラブルを調査する方法です。

デバッグモードの有効化

カーネルパラメータにデバッグオプションを追加:

GRUBの起動時にeキーを押して編集モードに入り、linux行に追加:

break=premount

これで、指定したポイントでinitramfsが一時停止し、シェルが起動します。

その他のブレークポイント:

  • break=modules:モジュール読み込み前
  • break=bottom:ルートマウント直前
  • break=init:init実行前

ログの確認

起動後、initramfsのログを確認できます。

dmesg | less
journalctl -b

初期起動のメッセージを探します。

詳細モード

/etc/default/grubに追加:

GRUB_CMDLINE_LINUX_DEFAULT="debug verbose"

そして:

sudo update-grub

詳細なログが出力されるようになります。


initramfsのセキュリティ

セキュリティ上の考慮点です。

機密情報の扱い

注意:
initramfs内に機密情報(パスワード、秘密鍵など)を平文で入れないでください。

理由:
initramfsは、適切な権限があれば誰でも展開して中身を見られます。

セキュアブート

UEFI セキュアブートを有効にしている場合、initramfsにも署名が必要な場合があります。

最小限の原則

セキュリティのため、initramfsには必要最小限のコンポーネントだけを含めるべきです。


まとめ:initramfsは起動の「仮設足場」

initrd/initramfsは、Linuxシステムの起動に欠かせない仕組みです。

この記事のポイント:

  • initramfsはメモリ上に展開される一時的なファイルシステム
  • ルートファイルシステムをマウントするまでの「橋渡し」役
  • 必要最小限のドライバとツールを含む
  • initrd(旧)からinitramfs(新)に進化
  • cpioアーカイブとして圧縮保存されている
  • カーネルインストール時に自動生成される
  • ディスク暗号化、LVM、RAIDなどの複雑な構成に不可欠
  • トラブル時はLiveUSBから修復可能
  • デバッグオプションで詳細な調査ができる

initramfsの役割:

  • カーネルモジュールの読み込み
  • ディスクデバイスの認識
  • ファイルシステムの検証とマウント
  • 暗号化解除やRAID構成
  • ルートへの切り替え(pivot_root)

普段は意識することのない「縁の下の力持ち」ですが、Linuxが起動するたびに、重要な初期化作業を担当してくれているんですね。

トラブルが起きた時のために、基本を理解しておくと安心です!

コメント

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