「Mkinitcpio/Initramfs の最小化」の版間の差分
(→必要なモジュールの確認: 翻訳を修正) |
(Lowercase title) |
||
(2人の利用者による、間の4版が非表示) | |||
1行目: | 1行目: | ||
+ | {{Lowercase title}} |
||
− | [[Category:ブートプロセス]] |
||
+ | [[Category:Initramfs]] |
||
− | [[en:Minimal initramfs]] |
||
+ | [[en:mkinitcpio/Minimal initramfs]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|mkinitcpio}} |
{{Related|mkinitcpio}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
+ | この記事では、特定の既知で静的なハードウェア構成のシステムにおいて initramfs を最小化する方法について説明します。手順は、Falconindy (Dave Reisner) による [http://blog.falconindy.com/articles/optmizing-bootup-with-mkinitcpio.html Optimizing Bootup With mkinitcpio] から引用しています。 |
||
+ | == Udev の要件 == |
||
− | この記事ではハードウェア構成が変わることがない環境で、initramfs をスリムにする方法を説明します。Falconindy (Dave Reisner) による [http://blog.falconindy.com/articles/optmizing-bootup-with-mkinitcpio.html チュートリアル] も見てください。 |
||
+ | initramfs イメージを自分で作成する最大のメリットは {{ic|udev}} を排除できるということです。udev フックが initramfs イメージの大部分を占めています (LZ4 や LZOP で圧縮した場合で約 700 から 800 KiB、他の圧縮アルゴリズムの場合はより小さい)。起動時間が長くなる理由として、イメージのサイズが大きい (ので、解凍に時間がかかる) からというのもありますが、{{ic|udev}} 自体の初期化に時間がかかるからというのもあります。'''しかし、{{ic|udev}} が必須である場合があります。''' 例えば、UUID、LABEL、PARTUUID、PARTLABEL 識別子の解決 ([https://unix.stackexchange.com/questions/352381/how-to-boot-into-root-btrfs-file-system-with-minimal-initramfs-without-udev-hook/352932#answer-352932 回避策 without-udev フック]) や、{{ic|root}} パーティションを含む LVM と mdadm のデバイスのアセンブリなどです。{{ic|udev}} が必要なのかどうかわからない場合は、[[#初期テスト]]まで読み進めてください。{{ic|udev}} がないとうまく行かない場合は、フックを再度有効にしてください。 |
||
− | ==Udev== |
||
+ | また、大抵のキーボード (AT, PS/2, USB) は {{ic|udev}} フックを必要としませんが、[[Logitech Unifying Receiver]] を使用する Logitech の USB デバイスは {{ic|udev}} フックを必要とします。この時点で全てのイメージに {{ic|udev}} を含めるか {{ic|fallback}} イメージを使用するか選択できます。 |
||
− | initramfs イメージを自分で作成する最大のメリットは {{ic|udev}} を排除できるということです。udev フックが initramfs イメージの大部分を占めています (LZ4 や LZOP で圧縮した場合で ~700-800 KiB、他の圧縮アルゴリズムを使用した場合はもう少しだけ少ない)。起動時間が遅くなる理由として、initramfs の容量が大きくなることで解凍に時間がかかるようになるのもそうですが、{{ic|udev}} の初期化にもある程度時間がかかります。ただし、システムによっては {{ic|udev}} は必要不可欠な存在です。例えば LVM と mdadm で構成されたデバイスに {{ic|root}} パーティションを保存している場合などです。{{ic|udev}} が必要なのかどうかわからない場合は、[[#テスト]]まで読み進めてください。{{ic|udev}} がないとシステムが起動しない場合、フックを再度有効にしてください。 |
||
+ | {{ic|udev}} が必要な場合、initramfs を最小化しようといくら努力してもおそらく無駄です。約 600 KiB までイメージの容量を小さくできるかもしれませんが、起動時間はほとんど変わらないでしょう。それでも学習経験としては価値があるかもしれません。 |
||
− | また、大抵のキーボード (AT, PS/2, USB) は {{ic|udev}} フックを必要としませんが、[[Logitech Unifying Receiver]] を使用する Logitech の USB デバイスは udev フックを必要とします。この時点で全てのイメージに {{ic|udev}} を含めるか {{ic|fallback}} イメージを使用するか選択できます。 |
||
− | |||
− | {{ic|udev}} が必要な場合、initramfs を最小化しようといくら努力してもおそらく無駄です。~600 KiB までイメージの容量を小さくできるかもしれませんが、起動時間はほとんど変わらないでしょう。それでも学習経験としては価値があるかもしれません。 |
||
− | ==.preset ファイルの編集== |
+ | == .preset ファイルの編集 == |
Falconidy のチュートリアルでは {{ic|/etc/mkinitcpio.conf}} を編集してから {{ic|mkinitcpio -g}} を実行してテスト用の initramfs イメージを作成して、システム上の initramfs イメージには手を触れないようにしています。しかしながら、その後になって何も考えずに {{ic|mkinitcpio -P}} を実行すると、{{ic|fallback}} イメージも縮小化されてしまいます。 |
Falconidy のチュートリアルでは {{ic|/etc/mkinitcpio.conf}} を編集してから {{ic|mkinitcpio -g}} を実行してテスト用の initramfs イメージを作成して、システム上の initramfs イメージには手を触れないようにしています。しかしながら、その後になって何も考えずに {{ic|mkinitcpio -P}} を実行すると、{{ic|fallback}} イメージも縮小化されてしまいます。 |
||
− | initramfs ファイルを自分で作成するときの安全 |
+ | initramfs ファイルを自分で作成するときのより安全な方法として {{ic|/etc/mkinitcpio.d}} の {{ic|.preset}} ファイルを編集するというものがあります。以下の設定例では {{ic|default}} を最小限の initramfs イメージとして扱い、新しい {{ic|normal}} イメージは Arch のデフォルトと同じように作成します。何か問題が起こっても、{{ic|normal}} や {{ic|fallback}} イメージを使うことができます。問題がないようだったら、設定から {{ic|normal_*}} 行を削除して {{ic|initramfs-linux*-normal.img}} ファイルは消してかまいません。 |
+ | {{bc|1= |
||
− | ... |
||
+ | ... |
||
− | |||
+ | |||
− | PRESETS=('default' 'normal' 'fallback') |
||
+ | PRESETS=('default' 'normal' 'fallback') |
||
− | ... |
||
+ | ... |
||
− | |||
+ | |||
− | default_options="-S udev,block,mdadm_udev,filesystems,keyboard,fsck,consolefont" |
||
+ | default_options="-S udev,block,mdadm_udev,filesystems,keyboard,fsck,consolefont" |
||
− | ... |
||
+ | ... |
||
− | |||
+ | |||
− | #normal_config="/etc/mkinitcpio.conf" |
||
+ | #normal_config="/etc/mkinitcpio.conf" |
||
− | normal_image="/boot/initramfs-linux-normal.img" |
||
+ | normal_image="/boot/initramfs-linux-normal.img" |
||
− | #normal_options="" |
||
+ | #normal_options="" |
||
− | ... |
||
+ | ... |
||
+ | }} |
||
{{Note|{{ic|mdadm_udev}} と {{ic|consolefont}} フックはデフォルトの Arch の設定には存在しません。{{ic|*_options}} 行に {{ic|-S}} パラメータを付けることでエラーが発生しなくなります。}} |
{{Note|{{ic|mdadm_udev}} と {{ic|consolefont}} フックはデフォルトの Arch の設定には存在しません。{{ic|*_options}} 行に {{ic|-S}} パラメータを付けることでエラーが発生しなくなります。}} |
||
− | ==必要なモジュールの確認== |
+ | == 必要なモジュールの確認 == |
どのモジュールが必要なのか確認する手っ取り早い方法は {{ic|fallback}} initramfs イメージでシステムを再起動してブートローダーのカーネルパラメータに {{ic|1=break=postmount}} を追加することです。これでルートファイルシステムがマウントされたときにコマンドラインが開かれるようになります。 |
どのモジュールが必要なのか確認する手っ取り早い方法は {{ic|fallback}} initramfs イメージでシステムを再起動してブートローダーのカーネルパラメータに {{ic|1=break=postmount}} を追加することです。これでルートファイルシステムがマウントされたときにコマンドラインが開かれるようになります。 |
||
44行目: | 46行目: | ||
lsmod | awk 'NF==3{print $1}' |
lsmod | awk 'NF==3{print $1}' |
||
− | {{Note|{{ic|awk}} コマンドは、 {{ic|{print$1}}} を使用して、 {{ic|1=NF==3}} によって強制され、3つの各行の最初のフィールドのみを返します。モジュールの依存関係には、依存関係に取り込まれたモジュールを示す4番目の行が含まれ、その4番目の行によってフィルタリングされます。 Arch の {{ic|mkinitcpio}} は、配列 {{ic|1=MODULES=()}}, {{ic|1=FILES=()}}, and {{ic|1=BINARIES=()}} に含まれる正当な値の依存関係を処理します}} |
+ | {{Note|{{ic|awk}} コマンドは、 {{ic|{print $1} }} を使用して、 {{ic|1=NF==3}} によって強制され、3つの各行の最初のフィールドのみを返します。モジュールの依存関係には、依存関係に取り込まれたモジュールを示す4番目の行が含まれ、その4番目の行によってフィルタリングされます。 Arch の {{ic|mkinitcpio}} は、配列 {{ic|1=MODULES=()}}, {{ic|1=FILES=()}}, and {{ic|1=BINARIES=()}} に含まれる正当な値の依存関係を処理します。}} |
− | ロードされたモジュールを書き留め、 |
+ | ロードされたモジュールを書き留め、{{ic|exit}} と入力してブートを続行します。 |
− | または、 [[インストール]] |
+ | または、パッケージ {{pkg|hwdetect}} を[[インストール]]して、このパッケージを使って必要なモジュールを特定します。メンテナンスされていませんが、貴重な情報を提供できます。また、ネイティブツールの使用方法については、[[カーネルモジュール]] を参照してください。 |
− | ==mkinitcpio.conf の編集== |
+ | == mkinitcpio.conf の初期編集 == |
− | {{ic|/etc/mkinitcpio.conf}} を編集して {{ic|1=MODULES=}} 行を変更してください。{{ic|/etc/mkinitcpio.conf}} は source されるので、MODULES 行は Bash スクリプトの変数のように書くことができます |
+ | {{ic|/etc/mkinitcpio.conf}} を編集して {{ic|1=MODULES=}} 行を変更してください。{{ic|/etc/mkinitcpio.conf}} は source されるので、MODULES 行は Bash スクリプトの変数のように書くことができます。 |
MODULES="" # filesystems |
MODULES="" # filesystems |
||
59行目: | 61行目: | ||
MODULES+="" # miscellaneous |
MODULES+="" # miscellaneous |
||
− | 最後の {{ic|miscellaneous}} 行に全てのモジュールを追加してください。モジュールを分類したら、適切な行に配置してください。 |
+ | 最後の {{ic|miscellaneous}} 行に必要な全てのモジュールを追加してください。モジュールを分類したら、適切な行に配置してください。 |
− | {{ic|root}} デバイスや {{ic|/etc/fstab}} に設定されている他のマウントポイントのファイルシステムをチェックするバイナリも必要です。 |
+ | {{ic|root}} デバイスや {{ic|/etc/fstab}} に設定されている'''他のマウントポイント'''のファイルシステムをチェックするバイナリも必要です。 |
* ext[2|3|4] デバイスの場合: |
* ext[2|3|4] デバイスの場合: |
||
76行目: | 78行目: | ||
{{Note| |
{{Note| |
||
* 上記の例における3番目のオプションは任意のオプションですが、外すと損傷したファイルシステムを修復することができなくなり、他の initramfs から起動しなければならなくなります。 |
* 上記の例における3番目のオプションは任意のオプションですが、外すと損傷したファイルシステムを修復することができなくなり、他の initramfs から起動しなければならなくなります。 |
||
− | * 他のファイルシステムに関するエントリを追加することを推奨します。 |
+ | * 他のファイルシステムに関するエントリを追加することを推奨します。 |
+ | }} |
||
− | ==テスト== |
+ | == 初期テスト == |
{{ic|/etc/mkinitcpio.conf}} を編集したら {{ic|mkinitcpio -P}} を実行して全ての initramfs イメージを再生成してください。それから再起動を行ってください。 |
{{ic|/etc/mkinitcpio.conf}} を編集したら {{ic|mkinitcpio -P}} を実行して全ての initramfs イメージを再生成してください。それから再起動を行ってください。 |
||
− | {{ic|udev}} が必須になっていなければ問題なく起動するはずです。(Arch からルートパーティションが認識されなかったりキーボードが機能しないなど) 何かが問題が発生した場合、前に戻って {{ic|default_options}} 行の {{ic|-S}} パラメータから {{ic|udev}} を削除してください。{{ic|udev}} が必要だとわかった場合、起動時間を大幅に短縮することはできません。ここから先はあくまで学習になります。 |
+ | {{ic|udev}} が'''必須になっていなければ'''問題なく起動するはずです。(Arch からルートパーティションが認識されなかったりキーボードが機能しないなど) 何かが問題が発生した場合、前に戻って {{ic|default_options}} 行の {{ic|-S}} パラメータから {{ic|udev}} を削除してください。{{ic|udev}} が必要だとわかった場合、起動時間を大幅に短縮することはできません。ここから先はあくまで学習になります。 |
− | ==モジュールの選別== |
+ | == モジュールの選別 == |
問題なく起動できる initramfs ができたら、さらに initramfs を縮小してみましょう。少しずつモジュールを減らして、initramfs イメージを再生成、再起動して問題がないか確認してください。何か問題があったら、{{ic|fallback}} initramfs イメージで再起動して削除したモジュールを戻してみて、ちゃんと起動できることを確認してください。モジュールが必要最低限のものだけになるまで試行錯誤してください。それが退屈な場合、以下のリストをみることで検討をつけることができるはずです。 |
問題なく起動できる initramfs ができたら、さらに initramfs を縮小してみましょう。少しずつモジュールを減らして、initramfs イメージを再生成、再起動して問題がないか確認してください。何か問題があったら、{{ic|fallback}} initramfs イメージで再起動して削除したモジュールを戻してみて、ちゃんと起動できることを確認してください。モジュールが必要最低限のものだけになるまで試行錯誤してください。それが退屈な場合、以下のリストをみることで検討をつけることができるはずです。 |
||
90行目: | 93行目: | ||
{{Note|以下はあくまで一例であり、決定的な情報ではありません。}} |
{{Note|以下はあくまで一例であり、決定的な情報ではありません。}} |
||
− | ===ファイルシステムモジュール=== |
+ | === ファイルシステムモジュール === |
− | {{Note|{{ic|root}} デバイスや {{ic|/etc/fstab}} に記述 |
+ | {{Note|{{ic|root}} デバイスや {{ic|/etc/fstab}} に記述されている、起動時にファイルシステムのチェックが必要なデバイスのファイルシステムモジュールは必要です。}} |
*{{ic|ext[2,3,4]}} |
*{{ic|ext[2,3,4]}} |
||
99行目: | 102行目: | ||
*{{ic|reiserfs}} |
*{{ic|reiserfs}} |
||
− | ===ストレージデバイスモジュール=== |
+ | === ストレージデバイスモジュール === |
*{{ic|sd_mod}} - SCSI, SATA, PATA (IDE) デバイス |
*{{ic|sd_mod}} - SCSI, SATA, PATA (IDE) デバイス |
||
*{{ic|ahci}} - 近代的な AHCI コントローラを使用する SATA デバイス |
*{{ic|ahci}} - 近代的な AHCI コントローラを使用する SATA デバイス |
||
+ | *{{ic|nvme}} と {{ic|nvme_core}} - NVMe (M.2, PCI-E) デバイス |
||
*{{ic|sata_*}} - IDE モードのコントローラを使用する SATA デバイス |
*{{ic|sata_*}} - IDE モードのコントローラを使用する SATA デバイス |
||
*{{ic|pata_*}} - PATA (IDE) デバイス |
*{{ic|pata_*}} - PATA (IDE) デバイス |
||
108行目: | 112行目: | ||
*{{ic|virtio_blk}} と {{ic|virtio_pci}} - ストレージに VirtIO を使用する QEMU/KVM の仮想マシン |
*{{ic|virtio_blk}} と {{ic|virtio_pci}} - ストレージに VirtIO を使用する QEMU/KVM の仮想マシン |
||
− | ===キーボードモジュール=== |
+ | === キーボードモジュール === |
*{{ic|atkbd}} - AT や PS/2 キーボード、QEMU/KVM でエミュレートされるキーボード |
*{{ic|atkbd}} - AT や PS/2 キーボード、QEMU/KVM でエミュレートされるキーボード |
||
114行目: | 118行目: | ||
*{{ic|hid_logitech_dj}}, {{ic|uhci_hcd}}, {{ic|usbhid}} - Logitech Unified Receiver を使用する Logitech USB キーボード '''({{ic|udev}} フックが必要)'''。 |
*{{ic|hid_logitech_dj}}, {{ic|uhci_hcd}}, {{ic|usbhid}} - Logitech Unified Receiver を使用する Logitech USB キーボード '''({{ic|udev}} フックが必要)'''。 |
||
− | == |
+ | == 仕上げ == |
initramfs をスリム化できたら、{{ic|.preset}} ファイルから {{ic|normal_*}} 行は削除 (またはコメントアウト) して {{ic|/boot}} から {{ic|initramfs-linux*-normal.img}} ファイルを削除してください。 |
initramfs をスリム化できたら、{{ic|.preset}} ファイルから {{ic|normal_*}} 行は削除 (またはコメントアウト) して {{ic|/boot}} から {{ic|initramfs-linux*-normal.img}} ファイルを削除してください。 |
||
+ | |||
+ | {{TranslationStatus|mkinitcpio/Minimal initramfs|2022-09-16|741036}} |
2023年6月27日 (火) 08:37時点における最新版
関連記事
この記事では、特定の既知で静的なハードウェア構成のシステムにおいて 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 のデフォルトと同じように作成します。何か問題が起こっても、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 | awk 'NF==3{print $1}'
ロードされたモジュールを書き留め、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"
初期テスト
/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 デバイスnvme
とnvme_core
- NVMe (M.2, PCI-E) デバイス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
ファイルを削除してください。