mkinitcpio/Initramfs の最小化

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

この記事では、特定の既知で静的なハードウェア構成のシステムにおいて initramfs を最小化する方法について説明します。手順は、Falconindy (Dave Reisner) による Optimizing Bootup With mkinitcpio から引用しています。

Udev の要件

initramfs イメージを自分で作成する最大のメリットは udev を排除できるということです。udev フックが initramfs イメージの大部分を占めています (LZ4 や LZOP で圧縮した場合で約 700 から 800 KiB、他の圧縮アルゴリズムの場合はより小さい)。起動時間が長くなる理由として、イメージのサイズが大きい (ので、解凍に時間がかかる) からというのもありますが、udev 自体の初期化に時間がかかるからというのもあります。しかし、udev が必須である場合があります。 例えば、UUID、LABEL、PARTUUID、PARTLABEL 識別子の解決 (回避策 without-udev フック) や、root パーティションを含む LVM と mdadm のデバイスのアセンブリなどです。udev が必要なのかどうかわからない場合は、#初期テストまで読み進めてください。udev がないとうまく行かない場合は、フックを再度有効にしてください。

また、大抵のキーボード (AT, PS/2, USB) は udev フックを必要としませんが、Logitech Unifying Receiver を使用する Logitech の USB デバイスは udev フックを必要とします。この時点で全てのイメージに udev を含めるか fallback イメージを使用するか選択できます。

udev が必要な場合、initramfs を最小化しようといくら努力してもおそらく無駄です。約 600 KiB までイメージの容量を小さくできるかもしれませんが、起動時間はほとんど変わらないでしょう。それでも学習経験としては価値があるかもしれません。

.preset ファイルの編集

Falconidy のチュートリアルでは /etc/mkinitcpio.conf を編集してから mkinitcpio -g を実行してテスト用の initramfs イメージを作成して、システム上の initramfs イメージには手を触れないようにしています。しかしながら、その後になって何も考えずに mkinitcpio -P を実行すると、fallback イメージも縮小化されてしまいます。

initramfs ファイルを自分で作成するときのより安全な方法として /etc/mkinitcpio.d.preset ファイルを編集するというものがあります。以下の設定例では default を最小限の initramfs イメージとして扱い、新しい normal イメージは Arch のデフォルトと同じように作成します。何か問題が起こっても、normalfallback イメージを使うことができます。問題がないようだったら、設定から normal_* 行を削除して initramfs-linux*-normal.img ファイルは消してかまいません。

...

PRESETS=('default' 'normal' 'fallback')
...

default_options="-S udev,block,mdadm_udev,filesystems,keyboard,fsck,consolefont"
...

#normal_config="/etc/mkinitcpio.conf"
normal_image="/boot/initramfs-linux-normal.img"
#normal_options=""
...
ノート: mdadm_udevconsolefont フックはデフォルトの Arch の設定には存在しません。*_options 行に -S パラメータを付けることでエラーが発生しなくなります。

必要なモジュールの確認

どのモジュールが必要なのか確認する手っ取り早い方法は fallback initramfs イメージでシステムを再起動してブートローダーのカーネルパラメータに break=postmount を追加することです。これでルートファイルシステムがマウントされたときにコマンドラインが開かれるようになります。

システムを再起動できたら、以下のコマンドを実行して必要なモジュールを確認できます:

lsmod | awk 'NF==3{print $1}'
ノート: awk コマンドは、 {print $1} を使用して、 NF==3 によって強制され、3つの各行の最初のフィールドのみを返します。モジュールの依存関係には、依存関係に取り込まれたモジュールを示す4番目の行が含まれ、その4番目の行によってフィルタリングされます。 Arch の mkinitcpio は、配列 MODULES=(), FILES=(), and BINARIES=() に含まれる正当な値の依存関係を処理します。

ロードされたモジュールを書き留め、exit と入力してブートを続行します。

または、パッケージ hwdetectインストールして、このパッケージを使って必要なモジュールを特定します。メンテナンスされていませんが、貴重な情報を提供できます。また、ネイティブツールの使用方法については、カーネルモジュール を参照してください。

mkinitcpio.conf の初期編集

/etc/mkinitcpio.conf を編集して MODULES= 行を変更してください。/etc/mkinitcpio.conf は source されるので、MODULES 行は Bash スクリプトの変数のように書くことができます。

MODULES=""   # filesystems
MODULES+=""  # storage
MODULES+=""  # keyboard
MODULES+=""  # miscellaneous

最後の miscellaneous 行に必要な全てのモジュールを追加してください。モジュールを分類したら、適切な行に配置してください。

root デバイスや /etc/fstab に設定されている他のマウントポイントのファイルシステムをチェックするバイナリも必要です。

  • ext[2|3|4] デバイスの場合:
BINARIES="fsck fsck.ext[2|3|4] e2fsck"
  • vfat (UEFI ブート) パーティションの場合:
BINARIES="fsck fsck.vfat dosfsck"
  • btrfs シングルディスクデバイスの場合:
BINARIES="fsck fsck.btrfs btrfsck"
  • btrfs マルチディスクデバイスの場合:
BINARIES="fsck fsck.btrfs btrfs btrfsck"
  • xfs デバイスの場合:
BINARIES="fsck fsck.xfs xfs_repair"
ノート:
  • 上記の例における3番目のオプションは任意のオプションですが、外すと損傷したファイルシステムを修復することができなくなり、他の initramfs から起動しなければならなくなります。
  • 他のファイルシステムに関するエントリを追加することを推奨します。

初期テスト

/etc/mkinitcpio.conf を編集したら mkinitcpio -P を実行して全ての initramfs イメージを再生成してください。それから再起動を行ってください。

udev必須になっていなければ問題なく起動するはずです。(Arch からルートパーティションが認識されなかったりキーボードが機能しないなど) 何かが問題が発生した場合、前に戻って default_options 行の -S パラメータから udev を削除してください。udev が必要だとわかった場合、起動時間を大幅に短縮することはできません。ここから先はあくまで学習になります。

モジュールの選別

問題なく起動できる initramfs ができたら、さらに initramfs を縮小してみましょう。少しずつモジュールを減らして、initramfs イメージを再生成、再起動して問題がないか確認してください。何か問題があったら、fallback initramfs イメージで再起動して削除したモジュールを戻してみて、ちゃんと起動できることを確認してください。モジュールが必要最低限のものだけになるまで試行錯誤してください。それが退屈な場合、以下のリストをみることで検討をつけることができるはずです。

ノート: 以下はあくまで一例であり、決定的な情報ではありません。

ファイルシステムモジュール

ノート: root デバイスや /etc/fstab に記述されている、起動時にファイルシステムのチェックが必要なデバイスのファイルシステムモジュールは必要です。
  • ext[2,3,4]
  • xfs
  • jfs
  • reiserfs

ストレージデバイスモジュール

  • sd_mod - SCSI, SATA, PATA (IDE) デバイス
  • ahci - 近代的な AHCI コントローラを使用する SATA デバイス
  • nvmenvme_core - NVMe (M.2, PCI-E) デバイス
  • sata_* - IDE モードのコントローラを使用する SATA デバイス
  • pata_* - PATA (IDE) デバイス
  • ehci_pciusb_storage - USB ストレージデバイス
  • virtio_blkvirtio_pci - ストレージに VirtIO を使用する QEMU/KVM の仮想マシン

キーボードモジュール

  • atkbd - AT や PS/2 キーボード、QEMU/KVM でエミュレートされるキーボード
  • hid_generic, ohci_pci, usbhid - 通常の USB キーボード
  • hid_logitech_dj, uhci_hcd, usbhid - Logitech Unified Receiver を使用する Logitech USB キーボード (udev フックが必要)

仕上げ

initramfs をスリム化できたら、.preset ファイルから normal_* 行は削除 (またはコメントアウト) して /boot から initramfs-linux*-normal.img ファイルを削除してください。

翻訳ステータス: このページは en:mkinitcpio/Minimal initramfs の翻訳バージョンです。最後の翻訳日は 2022-09-16 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。