Mkinitcpio/Initramfs の最小化
関連記事
この記事ではハードウェア構成が変わることがない環境で、initramfs をスリムにする方法を説明します。Falconindy (Dave Reisner) による チュートリアル も見てください。
目次
Udev
initramfs イメージを自分で作成する最大のメリットは udev
を排除できるということです。udev フックが initramfs イメージの大部分を占めています (LZ4 や LZOP で圧縮した場合で ~700-800 KiB、他の圧縮アルゴリズムを使用した場合はもう少しだけ少ない)。起動時間が遅くなる理由として、initramfs の容量が大きくなることで解凍に時間がかかるようになるのもそうですが、udev
の初期化にもある程度時間がかかります。ただし、システムによっては udev
は必要不可欠な存在です。例えば LVM と mdadm で構成されたデバイスに root
パーティションを保存している場合などです。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 のデフォルトと同じように作成します。何か問題が起こっても、normal
や fallback
イメージを使うことができます。問題がないようだったら、設定から 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="" ...
必要なモジュールの確認
どのモジュールが必要なのか確認する手っ取り早い方法は fallback
initramfs イメージでシステムを再起動してブートローダーのカーネルパラメータに break=postmount
を追加することです。これでルートファイルシステムがマウントされたときにコマンドラインが開かれるようになります。
システムを再起動できたら、以下のコマンドを実行して必要なモジュールを確認できます:
lsmod | grep -v ' [a-z]'
ロードされたモジュールをメモしたら exit
と入力して起動を続行してください。
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"
- xfs デバイスの場合:
BINARIES="fsck fsck.xfs xfs_repair"
テスト
/etc/mkinitcpio.conf
を編集したら mkinitcpio -P
を実行して全ての initramfs イメージを再生成してください。それから再起動を行ってください。
udev
が必須になっていなければ問題なく起動するはずです。(Arch からルートパーティションが認識されなかったりキーボードが機能しないなど) 何かが問題が発生した場合、前に戻って default_options
行の -S
パラメータから udev
を削除してください。udev
が必要だとわかった場合、起動時間を大幅に短縮することはできません。ここから先はあくまで学習になります。
モジュールの選別
問題なく起動できる initramfs ができたら、さらに initramfs を縮小してみましょう。少しずつモジュールを減らして、initramfs イメージを再生成、再起動して問題がないか確認してください。何か問題があったら、fallback
initramfs イメージで再起動して削除したモジュールを戻してみて、ちゃんと起動できることを確認してください。モジュールが必要最低限のものだけになるまで試行錯誤してください。それが退屈な場合、以下のリストをみることで検討をつけることができるはずです。
ファイルシステムモジュール
ext[2,3,4]
xfs
jfs
reiserfs
ストレージデバイスモジュール
sd_mod
- SCSI, SATA, PATA (IDE) デバイスahci
- 近代的な AHCI コントローラを使用する SATA デバイスsata_*
- IDE モードのコントローラを使用する SATA デバイスpata_*
- PATA (IDE) デバイスehci_pci
とusb_storage
- USB ストレージデバイスvirtio_blk
とvirtio_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
ファイルを削除してください。