「Mkinitcpio」の版間の差分
(→COMPRESSION: ヒントの情報を更新) |
Kusanaginoturugi (トーク | 投稿記録) (校正(でき・出来)) |
||
(6人の利用者による、間の47版が非表示) | |||
1行目: | 1行目: | ||
{{Lowercase title}} |
{{Lowercase title}} |
||
− | [[Category: |
+ | [[Category:initramfs]] |
[[Category:カーネル]] |
[[Category:カーネル]] |
||
[[Category:Arch プロジェクト]] |
[[Category:Arch プロジェクト]] |
||
+ | [[Category:コマンド]] |
||
− | [[da:Mkinitcpio]] |
||
[[de:Mkinitcpio]] |
[[de:Mkinitcpio]] |
||
[[en:Mkinitcpio]] |
[[en:Mkinitcpio]] |
||
− | [[ |
+ | [[fr:Mkinitcpio]] |
− | [[ |
+ | [[pt:Mkinitcpio]] |
− | [[id:Mkinitcpio]] |
||
− | [[it:Mkinitcpio]] |
||
[[ru:Mkinitcpio]] |
[[ru:Mkinitcpio]] |
||
[[zh-hans:Mkinitcpio]] |
[[zh-hans:Mkinitcpio]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
− | {{Related| |
+ | {{Related|Booster}} |
− | {{Related|カーネルモジュール}} |
||
− | {{Related|initramfs の最小化}} |
||
{{Related|ブートデバッグ}} |
{{Related|ブートデバッグ}} |
||
{{Related|dracut}} |
{{Related|dracut}} |
||
+ | {{Related|カーネルモジュール}} |
||
+ | {{Related|mkinitcpio/Initramfs の最小化}} |
||
+ | {{Related|systemd}} |
||
+ | {{Related|ユニファイドカーネルイメージ}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
+ | [https://gitlab.archlinux.org/archlinux/mkinitcpio/mkinitcpio mkinitcpio] は[[Wikipedia:Initial ramdisk|初期 RAM ディスク]]環境を作成するために使われる Bash スクリプトです。{{man|8|mkinitcpio}} man ページより: |
||
+ | :初期 ram ディスクは非常に小さい環境(初期ユーザー空間)であり、様々なカーネルモジュールをロードして {{ic|init}} にコントロールを移す前に必要なことをセットアップします。これにより、root ファイルシステムを暗号化したりソフトウェア RAID アレイに root を載せたりすることが可能になります。''mkinitcpio'' はカスタムフックによって簡単に拡張することができ、実行時の自動検知など様々な機能を持っています。 |
||
− | [https://projects.archlinux.org/mkinitcpio.git/ mkinitcpio] は [[Wikipedia:Initial ramdisk|initial ramdisk]] 環境を作成するために使われる Bash スクリプトです。{{man|8|mkinitcpio}} より: |
||
− | |||
− | :''initial ramdisk は非常に小さい環境(初期ユーザー空間)であり、様々なカーネルモジュールをロードして [[init]] にコントロールを移す前に必要なことをセットアップします。これにより、root ファイルシステムを暗号化したりソフトウェア RAID アレイに root を載せることが可能になります。mkinitcpio はカスタムフックによって簡単に拡張することができ、自動時の自動検知など様々な機能を持っています。'' |
||
伝統的には、[[Arch ブートプロセス|ブートプロセス]]の初めにハードウェアを検知したりタスクの初期化を行うのはカーネルで、それから root ファイルシステムがマウントされ {{ic|init}} にコントロールが移されます。しかしながら、先端技術が生まれるにつれ、こういった作業は複雑になりつつあります。 |
伝統的には、[[Arch ブートプロセス|ブートプロセス]]の初めにハードウェアを検知したりタスクの初期化を行うのはカーネルで、それから root ファイルシステムがマウントされ {{ic|init}} にコントロールが移されます。しかしながら、先端技術が生まれるにつれ、こういった作業は複雑になりつつあります。 |
||
− | 今日、root ファイルシステムが載るハードウェアは SCSI から SATA、USB ドライブまで様々にわたり、それらハードウェアはそれぞれの |
+ | 今日、root ファイルシステムが載るハードウェアは SCSI から SATA、USB ドライブまで様々にわたり、それらハードウェアはそれぞれのメーカーによって作られたいろんなドライブコントローラによってコントロールされています。しかも、root ファイルシステムは暗号化されたり圧縮されたりする可能性もあります; ソフトウェア RAID アレイや論理ボリュームグループに含まれるかもしれません。複雑になったものをシンプルに扱う方法はユーザースペース (初期RAMディスク) へ管理を譲渡することです。参照: [https://web.archive.org/web/20150430223035/http://archlinux.me/brain0/2010/02/13/early-userspace-in-arch-linux/ /dev/brain0 » Blog Archive » Early Userspace in Arch Linux]。 |
− | 参照: [https://web.archive.org/web/20150430223035/http://archlinux.me/brain0/2010/02/13/early-userspace-in-arch-linux/ /dev/brain0 » Blog Archive » Early Userspace in Arch Linux]。 |
||
− | mkinitcpio は Arch Linux デベロッパーとコミュニティの貢献によって開発されています。[https:// |
+ | ''mkinitcpio'' は Arch Linux デベロッパーとコミュニティの貢献によって開発されています。[https://gitlab.archlinux.org/archlinux/mkinitcpio/mkinitcpio public Git リポジトリ]を見て下さい。 |
+ | 初期 ramdisk フェーズ中に行われる様々なタスクがどのように実行されるかには、2つの異なるアプローチがあることに注意が必要です。 |
||
− | == インストール == |
||
+ | ; Busybox ベースの初期 ramdisk: 初期 ramdisk のファイルシステムをスキャンし、実行されるスクリプト(この文脈ではランタイムフックと呼ばれる)を開始する init スクリプトが起動されます。 |
||
− | {{Pkg|mkinitcpio}} パッケージは[[公式リポジトリ]]で利用可能で {{Pkg|linux}} パッケージの依存パッケージになっています。 |
||
+ | ; systemd ベースの初期 ramdisk: 初期 ramdisk フェーズの開始時にすでに systemd が起動されています。実行されるタスクは、通常の systemd ユニットファイルによって決定されます。参照:[https://www.freedesktop.org/software/systemd/man/latest/bootup.html systemd bootup process]。 |
||
+ | |||
+ | 具体的なバリアントは、{{ic|/etc/mkinitcpio.conf}} 内の {{ic|HOOKS}} 配列に {{ic|systemd}} フックが存在するかどうかによって決まります。より詳細については、[[#通常のフック]] を参照してください。 |
||
+ | |||
+ | == インストール == |
||
− | + | {{Pkg|mkinitcpio}} パッケージを[[インストール]]してください。このパッケージは {{Pkg|linux}} の依存パッケージとなっているので、大抵すでにインストールされているでしょう。 |
|
+ | 上級者は {{AUR|mkinitcpio-git}} パッケージで ''mkinitcpio'' の最新開発バージョンをインストールできます。 |
||
− | {{Note|Git から mkinitcpio を使う時は [https://lists.archlinux.org/listinfo/arch-projects arch-projects メーリングリスト]を購読することが''強く''推奨されます!}} |
||
== イメージ作成とアクティベーション == |
== イメージ作成とアクティベーション == |
||
43行目: | 46行目: | ||
=== 自動生成 === |
=== 自動生成 === |
||
− | カーネルがインストールまたはアップグレードされるたびに、[ |
+ | カーネルがインストールまたはアップグレードされるたびに、[[pacman フック]]は {{ic|/etc/mkinitcpio.d/}} 内に保存される ''.preset'' ファイルを自動的に生成します。例えば、公式の安定版 {{Pkg|linux}} カーネルパッケージの場合は {{ic|linux.preset}} です。プリセットは、様々なパラメーターや出力ファイルの場所を手動で指定する手間を省き、初期 RAM ディスクイメージを作成するために必要な情報のリストです。 |
− | デフォルトでは、2つのイメージを |
+ | デフォルトでは、2つのイメージを生成するための命令が含まれています: |
− | # |
+ | # ''default'' RAM ディスクイメージ。このイメージの内容は、mkinicpio の [[#設定]] で指定されたディレクティブに従って生成されます。 |
− | # '' |
+ | # ''fallback'' RAM ディスクイメージ。作成時に ''autodetect'' フックがスキップされることを除いて上記と同じであるため、ほとんどのシステムをサポートするすべてのモジュールが含まれます。 |
プリセットを作成した後、pacman フックは、プリセットで提供された情報を使用して2つのイメージを生成する ''mkinitcpio'' スクリプトを呼び出します。 |
プリセットを作成した後、pacman フックは、プリセットで提供された情報を使用して2つのイメージを生成する ''mkinitcpio'' スクリプトを呼び出します。 |
||
55行目: | 58行目: | ||
=== 手動生成 === |
=== 手動生成 === |
||
− | スクリプトを手動で実行するには、 |
+ | スクリプトを手動で実行するには、マニュアルページ {{man|8|mkinitcpio}} で手順を確認してください。特に、カーネルパッケージによって提供されるプリセットを(再)生成するには、使用するプリセットを {{ic|-p}}/{{ic|--preset}} オプションで指定してください。例えば、{{Pkg|linux}} パッケージの場合、次のコマンドを使用してください: |
# mkinitcpio -p linux |
# mkinitcpio -p linux |
||
− | 既存のすべてのプリセットを(再)生成するには、 |
+ | 既存のすべてのプリセットを(再)生成するには、{{ic|-P}}/{{ic|--allpresets}} スイッチを使用してください。これは通常、グローバルな [[#設定]] の変更後にすべての initramfs イメージを再生成するために使用されます: |
# mkinitcpio -P |
# mkinitcpio -P |
||
− | ユーザーは、さまざまな構成で initramfs イメージをいくつでも作成できます。 |
+ | ユーザーは、さまざまな構成で initramfs イメージをいくつでも作成できます。生成したいイメージは、それぞれの[[ブートローダー]]の設定ファイルで指定する必要があります。 |
− | === カスタマイズ |
+ | === 生成のカスタマイズ === |
− | ユーザーは、代替の |
+ | ユーザーは、代替の設定ファイルを使用してイメージを生成できます。次の例では、{{ic|/etc/mkinitcpio-custom.conf}} に記述されている指示に従って初期 RAM ディスクイメージを生成し、{{ic|/boot/initramfs-custom.img}} として保存します。 |
# mkinitcpio --config /etc/mkinitcpio-custom.conf --generate /boot/initramfs-custom.img |
# mkinitcpio --config /etc/mkinitcpio-custom.conf --generate /boot/initramfs-custom.img |
||
− | 現在実行中のカーネル以外のカーネルのイメージを生成する場合は、カーネルリリースバージョンをコマンドラインに追加し |
+ | 現在実行中のカーネル以外のカーネルのイメージを生成する場合は、カーネルリリースバージョンをコマンドラインに追加してください。インストールされているカーネルリリースは {{ic|/usr/lib/modules/}} にあり、構文は各カーネルのコマンド {{ic|uname -r}} の出力と一致しています。 |
# mkinitcpio --generate /boot/initramfs-custom2.img --kernel 5.7.12-arch1-1 |
# mkinitcpio --generate /boot/initramfs-custom2.img --kernel 5.7.12-arch1-1 |
||
+ | === ユニファイドカーネルイメージ === |
||
− | == 設定 == |
||
+ | ''mkinitcpio'' は[[ユニファイドカーネルイメージ]] (UKI) を作成することができます。{{Pkg|systemd-ukify}} がインストールされている場合、''mkinitcpio'' は UKI の生成を systemd-ukify に委託します。このパッケージがインストールされていない場合、''mkinitcpio'' は自身の実装を使用します。 |
||
− | ''mkinitcpio'' の基本の設定ファイルは {{ic|/etc/mkinitcpio.conf}} です。さらに、カーネルパッケージによって提供されるプリセット定義が {{ic|/etc/mkinitcpio.d}} ディレクトリにあります (例: {{ic|/etc/mkinitcpio.d/linux.preset}})。 |
||
+ | == 設定 == |
||
− | {{Warning|デフォルトでは ''lvm2'', ''mdadm'', ''encrypt'' は有効化されていません。これらのフックが必要なときは注意してこのセクションを読んで下さい。}} |
||
+ | ''mkinitcpio'' のプライマリ設定ファイルは、{{ic|/etc/mkinitcpio.conf}} です。ドロップインの設定ファイル (例: {{ic|/etc/mkinitcpio.conf.d/myhooks.conf}}) もサポートされています (ドロップインファイルは、mkinitcpio が {{ic|-c}} オプションと共に実行された場合や、{{ic|ALL_config}} を含んでいるプリセットを使用した場合には使用されません)。さらに、カーネルパッケージによって提供されるプリセット定義が {{ic|/etc/mkinitcpio.d}} ディレクトリにあります (例: {{ic|/etc/mkinitcpio.d/linux.preset}})。 |
||
− | {{Note|ノード名が同一でカーネルモジュールが異なる複数のディスクコントローラを使っている場合 (例: 2つの SCSI/SATA または2つの IDE コントローラ)、{{ic|/etc/mkinitcpio.conf}} で指定するモジュールの順番が正しいことを確認して下さい。再起動で root デバイスの場所が変わってしまって、カーネルパニックが発生する可能性があります。また、[[永続的なブロックデバイスの命名]]を使えば正しいデバイスを確実にマウントすることができます。}} |
||
+ | ユーザーは、設定ファイルの中にある7つの変数を変更できます (詳細は {{man|5|mkinitcpio.conf}} を見てください): |
||
− | {{Note|PS/2 キーボードを使っている場合: init でキーボード入力を使えるようにするには、{{ic|HOOKS}} に ''keyboard'' フックを追加してください。マザーボードによっては (特に旧世代のマザーボード)、i8042 コントローラが自動で検出されないことがあります。稀ですが、キーボードがないということもありえます。事前にこの状態を検出することができます。PS/2 端子があって {{ic|i8042: PNP: No PS/2 controller found. Probing ports directly}} メッセージが表示される場合、''atkbd'' を {{ic|MODULES}} に追加してください。}} |
||
+ | ; {{ic|MODULES}}: ブートフックが実行される前にロードされるカーネルモジュール。 |
||
− | ユーザーは設定ファイルの中にある6つの変数を修正することが可能です: |
||
− | |||
− | ; {{ic|MODULES}}: boot フックが実行される前にロードするべきカーネルモジュール。 |
||
; {{ic|BINARIES}}: initramfs イメージに含める追加のバイナリ。 |
; {{ic|BINARIES}}: initramfs イメージに含める追加のバイナリ。 |
||
; {{ic|FILES}}: initramfs イメージに含める追加のファイル。 |
; {{ic|FILES}}: initramfs イメージに含める追加のファイル。 |
||
− | ; {{ic|HOOKS}}: フックは |
+ | ; {{ic|HOOKS}}: フックは初期 RAM ディスクで実行するスクリプトです。 |
− | ; {{ic|COMPRESSION}}: initramfs イメージを圧縮する |
+ | ; {{ic|COMPRESSION}}: initramfs イメージを圧縮する際に使用されます。 |
− | ; {{ic|COMPRESSION_OPTIONS}}: {{ic|COMPRESSION}} プログラムに渡す |
+ | ; {{ic|COMPRESSION_OPTIONS}}: {{ic|COMPRESSION}} のプログラムに渡す追加の引数。この設定の使用は推奨されません。''mkinitcpio'' は圧縮プログラムに対する特殊な要件を処理するため (例: xz には {{ic|1=--check=crc32}} を指定します)、誤って利用するとシステムが起動できなくなる可能性があります。 |
+ | ; {{ic|MODULES_DECOMPRESS}}: ロード可能なカーネルモジュールとファームウェアのファイルを解凍しておくか、もとの圧縮した状態のままにしておくかを設定します。 |
||
+ | |||
+ | {{Note| |
||
+ | * システムが必要とする場合があるフックのいくつか ('''lvm2'''、'''mdadm_udev'''、'''encrypt''' など) は、デフォルトで有効化されて'''いません'''。これに関する指示は [[#HOOKS]] セクションを注意深く読んでください。 |
||
+ | * バージョン 36 より前の ''mkinitcpio'' によって作成されたプリセットファイルでは、{{ic|ALL_config}} 変数が定義されており、この変数が存在しているとドロップインの設定ファイルが読み込まれません。ドロップインファイルを有効化するには、古いプリセットファイルにある {{ic|1=ALL_config="/etc/mkinitcpio.conf"}} 行をコメントアウトしてください。 |
||
+ | }} |
||
=== MODULES === |
=== MODULES === |
||
− | MODULES |
+ | {{ic|MODULES}} 配列では、何か他のことが行われる前にロードするモジュールを指定します。 |
モジュールの後ろに {{ic|?}} を付けると、モジュールが見つからなかったときでもエラーを投げません。これは、フックや設定ファイルにリストアップされたモジュールを含んでコンパイルするカスタムカーネルで有益かもしれません。 |
モジュールの後ろに {{ic|?}} を付けると、モジュールが見つからなかったときでもエラーを投げません。これは、フックや設定ファイルにリストアップされたモジュールを含んでコンパイルするカスタムカーネルで有益かもしれません。 |
||
{{Note| |
{{Note| |
||
+ | * Out-of-tree のファイルシステムを初期ユーザー空間でマウントするつもりであるならば (例えば、そのようなファイルシステムをルートファイルシステムとしてを使用する場合)、そのファイルシステムのモジュール ({{ic|reiser4}} など) を {{ic|MODULES}} 配列に'''追加しておかなければなりません'''。 |
||
− | * ''reiser4'' を使う場合、モジュールのリストに必ず追加するようにしてください。 |
||
− | * mkinitcpio |
+ | * '''encrypt''' や '''sd-encrypt''' を使用し、かつ ''mkinitcpio'' が実行されるシステムと生成されたイメージが使用されるシステムが異なる場合、システムの起動中に LUKS デバイスをアンロックするために必要なキーボードモジュールやファイルシステムを {{ic|MODULES}} 配列に追加する必要があります。例えば、使用するキーファイルが ext2 ファイルシステム上にあるが、''mkinitcpio'' が実行されたときには ext2 ファイルシステムがマウントされていなかった場合、{{ic|ext2}} を追加してください。詳細は [[Dm-crypt/システム設定#cryptkey]] を見てください。 |
+ | * LUKS デバイスをアンロックするために USB 3 ハブのキーボードを使いたい場合、{{ic|usbhid xhci_hcd}} を追加してください。 |
||
+ | * ドッキングステーションに接続されているディスプレイを使用する場合、initrd の出力を見えるようにするためにあなたのグラフィックカードのモジュールを追加する必要があるかもしれません (例: ほとんどの Intel カードでは {{ic|i915}})。 |
||
+ | }} |
||
=== BINARIES と FILES === |
=== BINARIES と FILES === |
||
− | + | 以下のオプションを使ってイメージにファイルを追加することができます。{{ic|BINARIES}} と {{ic|FILES}} はフックが実行される前に追加され、フックによって使用/提供されるファイルを上書きすることがあります。{{ic|BINARIES}} は標準の {{ic|PATH}} に自動で配置され、依存関係がパースされます。つまり必要なライブラリも全て追加されます。{{ic|FILES}} は''そのままの状態で''追加されます。例: |
|
FILES=(/etc/modprobe.d/modprobe.conf) |
FILES=(/etc/modprobe.d/modprobe.conf) |
||
112行目: | 122行目: | ||
BINARIES=(kexec) |
BINARIES=(kexec) |
||
− | {{ic|BINARIES}} と {{ic|FILES}} の |
+ | {{ic|BINARIES}} と {{ic|FILES}} は両方とも [[Bash]] 配列です。なので、スペースで区切ることで複数のエントリを追加することができます。 |
=== HOOKS === |
=== HOOKS === |
||
− | {{ic|HOOKS}} |
+ | {{ic|HOOKS}} 配列は設定ファイルの中で一番重要な設定です。フックはイメージに追加されるものを記述する小さなスクリプトです。フックによっては、デーモンを起動したりスタックしたブロックデバイスを集めたりするためのランタイムコンポーネントを含んでいるものもあります。フックは名前によって参照され、設定ファイルの {{ic|HOOKS}} にある順番通りに実行されます。 |
− | ほとんどのシンプルな |
+ | ほとんどのシンプルな単一ディスク環境では、デフォルトの {{ic|HOOKS}} 設定で十分なはずです。[[LVM]]、[[RAID]]、[[dm-crypt]] などのスタックルートデバイスやマルチブロックデバイスを使う時は、関連する wiki ページを見て必要な設定を調べて下さい。 |
==== ビルドフック ==== |
==== ビルドフック ==== |
||
− | ビルドフックは {{ic|/usr/lib/initcpio/install/}} にあります。カスタムビルドフックは {{ic|/etc/initcpio/install/}} に配置します。これらのファイルは mkinitcpio の実行時に bash シェルによって実行されます。ビルドフックには2つの関数が含まれています: {{ic|build}} と {{ic|help}}。{{ic|build}} 関数にはイメージに追加するモジュール |
+ | ビルドフックは {{ic|/usr/lib/initcpio/install/}} にあります。カスタムビルドフックは {{ic|/etc/initcpio/install/}} に配置します。これらのファイルは ''mkinitcpio'' の実行時に bash シェルによって実行されます。ビルドフックには2つの関数が含まれています: {{ic|build}} と {{ic|help}}。{{ic|build}} 関数にはイメージに追加するモジュール、ファイル、バイナリを記述します。これらのアイテムの追加を容易にする {{man|8|mkinitcpio}} による API が用意されています。{{ic|help}} 関数はフックの役割を出力します。 |
すべてのフックを一覧するには: |
すべてのフックを一覧するには: |
||
128行目: | 138行目: | ||
$ mkinitcpio -L |
$ mkinitcpio -L |
||
− | 特定のフックのヘルプを出力するには mkinitcpio の {{ic|-H}}/{{ic|--hookhelp}} オプションを使って下さい、例えば: |
+ | 特定のフックのヘルプを出力するには ''mkinitcpio'' の {{ic|-H}}/{{ic|--hookhelp}} オプションを使って下さい、例えば: |
$ mkinitcpio -H udev |
$ mkinitcpio -H udev |
||
138行目: | 148行目: | ||
{{ic|run_earlyhook}}: API ファイルシステムがマウントされカーネルコマンドラインがパースされたときに、この名前の関数が実行されます。一般的に udev など初期ユーザ空間が始まったときに必要になる追加のデーモンはこの関数に置きます。 |
{{ic|run_earlyhook}}: API ファイルシステムがマウントされカーネルコマンドラインがパースされたときに、この名前の関数が実行されます。一般的に udev など初期ユーザ空間が始まったときに必要になる追加のデーモンはこの関数に置きます。 |
||
− | {{ic|run_hook}}: 初期のフックの後すぐに、この名前の関数が実行されます。一番 |
+ | {{ic|run_hook}}: 初期のフックの後すぐに、この名前の関数が実行されます。一番一般的なフックポイントで、スタックブロックデバイスのアセンブリなどのオペレーションはここで行なって下さい。 |
{{ic|run_latehook}}: root デバイスがマウントされた後、この名前の関数が実行されます。root デバイスの後のセットアップや {{ic|/usr}} など他のファイルシステムのマウントなどに控えめに使われます。 |
{{ic|run_latehook}}: root デバイスがマウントされた後、この名前の関数が実行されます。root デバイスの後のセットアップや {{ic|/usr}} など他のファイルシステムのマウントなどに控えめに使われます。 |
||
− | {{ic|run_cleanuphook}}: |
+ | {{ic|run_cleanuphook}}: できる限り最後に、この名前の関数が実行されます。設定ファイルの {{ic|HOOKS}} の順番とは逆に実行されます。これらのフックは初期のフックによって起動したデーモンのシャットダウンなど、最後のクリーンアップに使われます。 |
− | {{Note|ランタイムフックは |
+ | {{Note|ランタイムフックは busybox init でのみ使用されます。 '''systemd''' フックは systemd ベースの init をトリガーします。これはランタイムフックを実行せず、代わりに systemd ユニットを使用します。}} |
==== 通常のフック ==== |
==== 通常のフック ==== |
||
− | 通常のフックとイメージ生成への影響と関連するランタイムを示した表です。パッケージにカスタムフックを入れることができるので、この表は完全ではないことに注意してください。 |
+ | 以下は、通常のフックとイメージ生成への影響と関連するランタイムを示した表です。パッケージにカスタムフックを入れることができるので、この表は完全ではないことに注意してください。 |
{| class="wikitable" |
{| class="wikitable" |
||
− | |+ '''現行のフック''' |
||
− | |- |
||
! busybox init !! systemd init !! [[#ビルドフック|ビルドフック]] !! [[#ランタイムフック|ランタイムフック]] (busybox init のみ) |
! busybox init !! systemd init !! [[#ビルドフック|ビルドフック]] !! [[#ランタイムフック|ランタイムフック]] (busybox init のみ) |
||
|- |
|- |
||
− | | |
+ | | {{C|'''base'''}} || {{Grey|''任意''}} || 全ての初期ディレクトリをセットアップし、基本のユーティリティとライブラリをインストールします。'''systemd''' フックを使用していない場合、このフックは重要な busybox init を提供するので、何をしようとしているか理解していない限りはこのフックを常に1番最初に置いてください。<br/>'''systemd''' フックを使用する場合、'''base''' フックは busybox のリカバリシェルを提供するだけなので、'''base''' の追加は任意となります。{{Note|initramfs の root アカウントが[https://gitlab.archlinux.org/archlinux/packaging/packages/systemd/-/commit/292cdf8a2f7dd7c6c7d91d2b59617391935c837c ロックされている]ため、リカバリシェルは使用できません。{{Bug|70408}} <!-- TODO: {{Bug|70408}} を {{Issue|archlinux/mkinitcpio/mkinitcpio|205}} に置き換える --> を見てください。}} |
− | | - |
+ | | {{-}} |
|- |
|- |
||
− | | |
+ | | {{C|'''udev'''}} ||rowspan="3" {{C|'''systemd'''}} || イメージに udevd, udevadm, そして udev ルールの小さなサブセットを追加します。 || udev デーモンを起動して、カーネルからの uevent を処理します; デバイスノードを作成します。ブートプロセスの単純化として、必要なモジュールを明示的に指定する必要をなくすため、udev フックの使用が推奨されています。 |
|- |
|- |
||
− | | |
+ | | {{C|'''usr'''}} || {{ic|/usr}} の分割パーティションのサポートを追加します。詳細は [[#/usr を別のパーティションに分割する]] を見てください。 || 本物のルートファイルシステムがマウントされた後に {{ic|/usr}} パーティションをマウントします。 |
|- |
|- |
||
|- |
|- |
||
− | | |
+ | | {{C|'''resume'''}} || ハイバネートイメージにカーネルのコンパイル時デフォルト以外の圧縮アルゴリズムを使用する際に復帰できるようにするために、{{ic|lzo}} と {{ic|lz4}} カーネルモジュールを (initramfs に) 追加します。{{ic|HibernateLocation}} UEFI 変数で指定されたハイバネートイメージから復帰できるようにするために {{man|8|systemd-hibernate-resume}} バイナリを追加します。|| "ハイバネート" (suspend to disk) 状態からの復帰を試みます。詳しい設定方法は [[ハイバネート]] を見てください。 |
|- |
|- |
||
− | | |
+ | | {{C|'''btrfs'''}} || {{Grey|–}} || [[Btrfs]] を有効にして、Btrfs でフォーマットされた複数のデバイスを使用するために必要なモジュールを設定します。このフックを使うには、{{Pkg|btrfs-progs}} をインストールする必要があります。単一のデバイスで Btrfs を使うだけならこのフックは不要であり、{{ic|filesystems}} フックで十分です。 || udev フックが存在しないときに {{ic|btrfs device scan}} を実行してマルチデバイスの Btrfs root ファイルシステムを構築します。このフックを使うには {{Pkg|btrfs-progs}} パッケージが必要です。 |
|- |
|- |
||
− | |colspan="2" |
+ | |colspan="2" {{C|'''autodetect'''}} || sysfs のスキャンによってモジュールのホワイトリストを作成して initramfs を小さくします。含まれているモジュールが正しく、欠けているものがないか確認してください。自動検知の利点を活かすためにこのフックは他の subsystem フックより前に実行してください。'autodetect' より前に置かれたフックは完全にインストールされます。 || {{-}} |
|- |
|- |
||
+ | |colspan="2" {{C|'''microcode'''}} || Intel 及び AMD プロセッサ向けの[[マイクロコード]]早期アップデートファイルを未圧縮 initramfs イメージの先頭に埋め込みます。これは、利用可能であれば {{ic|/usr/lib/firmware/amd-ucode/}} と {{ic|/usr/lib/firmware/intel-ucode/}} にあるマイクロコードファイルを使用します。これらのファイルが利用できない場合は、{{ic|/boot/amd-ucode.img}} と {{ic|/boot/intel-ucode.img}} を展開して使用します。<br/> '''autodetect''' フックがこのフックより前に実行される場合、イメージをビルドする際に使用したシステムに搭載されているプロセッサ向けのマイクロコードの早期アップデートファイルのみが追加されます。<br/> このフックは、非推奨となっている {{ic|--microcode}} フラグと、プリセットファイルの {{ic|microcode}} オプションの機能を置き換えるものです。また、このフックによって、メインの initramfs イメージにマイクロコードのアップデートが埋め込まれるようになるため、マイクロコードを読み込む {{ic|initrd}} 行をブートローダーの設定に追加する必要が無くなります。 || {{-}} |
||
− | |colspan="2" style="text-align: center;"| '''modconf''' || {{ic|/etc/modprobe.d}} と {{ic|/usr/lib/modprobe.d/}} から modprobe 設定ファイルをロードします。 || -- |
||
|- |
|- |
||
+ | |colspan="2" {{C|'''modconf'''}} || {{ic|/etc/modprobe.d/}} と {{ic|/usr/lib/modprobe.d/}} から modprobe 設定ファイルをロードします。 || {{-}} |
||
− | |colspan="2" style="text-align: center;"| '''block''' || 全てのブロックデバイスモジュールを追加します。昔は ''fw'', ''mmc'', ''pata'', ''sata'', ''scsi'' , ''usb'', ''virtio'' フックに分かれていました。 || -- |
||
|- |
|- |
||
− | | |
+ | |colspan="2" {{C|'''kms'''}} || [[カーネルモード設定#設定|KMS の早期開始]] を提供する GPU モジュールを追加します。加えて、一部のノート PC の LCD パネルに組み込まれているプライバシースクリーンに必要なモジュールも追加します。|| {{-}} |
|- |
|- |
||
+ | |colspan="2" {{C|'''keyboard'''}} || キーボードデバイスに必要なモジュールを追加します。あなたが USB キーボードを使っていて、それを初期ユーザ空間で使う必要があるとき (暗号化のパスフレーズを入力したりインタラクティブシェルを使う場合) はこのフックを使って下さい。副作用としてキーボード以外の入力デバイス用のモジュールが追加されることがありますが、困ることはないはずです。 |
||
− | | style="text-align: center;"| '''dmraid''' || style="text-align: center;"| ''?'' || fakeRAID root デバイスのサポートを提供します。これを使うには {{Pkg|dmraid}} をインストールする必要があります。コントローラがサポートしている場合、fakeRAID では ''mdadm_udev'' フックと一緒に {{ic|mdadm}} を使うことが推奨されます。 || {{ic|dmraid}} を使用して fakeRAID ブロックデバイスを構築します。 |
||
+ | |||
+ | {{Note|異なるハードウェア構成で起動されるシステム(たとえば、外部キーボードと内部キーボードを備えたラップトップまたは [[Wikipedia:Headless computer|ヘッドレスシステム]]) の場合、起動時にキーボードを利用できるようにするために (例えば、{{ic|encrypt}} フックが使用されている場合に暗号化済みデバイスをアンロックするために)、このフックを '''autodetect''' の前に配置する必要があります。}} |
||
+ | |||
+ | | {{-}} |
||
|- |
|- |
||
+ | | {{C|'''keymap'''}} ||rowspan="2" {{C|'''sd-vconsole'''}} || {{ic|/etc/vconsole.conf}} から initramfs に、指定した[[コンソールでのキーボード設定#永続的な設定|コンソールキーマップ]]を追加します。[[Dm-crypt/システム全体の暗号化|システム暗号化]]を使用する場合 (特にフルディスク暗号化) 、{{ic|1=encrypt}} フックよりも前に追加するようにしてください。 || 初期ユーザ空間で {{ic|/etc/vconsole.conf}} から指定されたキーマップをロードします。 |
||
− | | style="text-align: center;"| '''mdadm''' || {{Grey|--}} || {{ic|/etc/mdadm.conf}} からの RAID アレイの構築や、起動中の自動検出のサポートを提供します。これを使うには {{Pkg|mdadm}} のインストールが必須です。このフックよりも ''mdadm_udev'' フックが推奨されています。 || {{ic|mdassemble}} を使ってソフトウェア RAID ブロックデバイスを構築します。 |
||
|- |
|- |
||
+ | | {{C|'''consolefont'''}} || {{ic|/etc/vconsole.conf}} から initramfs に、指定した[[コンソールでのキーボード設定#永続的な設定|コンソールフォント]]を追加します。 || 初期ユーザ空間で {{ic|/etc/vconsole.conf}} から指定されたコンソールフォントをロードします。 |
||
− | |colspan="2" style="text-align: center;"| '''mdadm_udev''' || udev による RAID アレイの構築のサポートを提供します。これを使うには {{Pkg|mdadm}} のインストールが必要です。[[FakeRAID]] アレイでこのフックを使う場合、binaries セクションに {{ic|mdmon}} を含めて ''shutdown'' フックを追加することが推奨されます。再起動時に不必要な RAID を再ビルドしないためです。 || {{ic|udev}} と {{ic|mdadm}} を使ってソフトウェア RAID ブロックデバイスを動的に構築します。mdadm アセンブリの推奨方法です (上記の ''mdadm'' フックを使うよりも)。 |
||
|- |
|- |
||
− | |colspan="2" |
+ | |colspan="2" {{C|'''block'''}} || ブロックデバイスのモジュールを追加します。'''autodetect''' フックがこのフックより前に実行される場合、このフックはシステム上で使用されているブロックデバイスのモジュールのみを追加します。例外は {{ic|ahci}}、{{ic|sd_mod}}、{{ic|usb_storage}}、{{ic|uas}}、{{ic|mmc_block}}、{{ic|nvme}}、{{ic|virtio_scsi}}、{{ic|virtio_blk}} モジュールで、これらは無条件に必ず追加されます。 || {{-}} |
− | |||
− | {{Tip|異なるハードウェア構成で起動されるシステム(たとえば、外部キーボードと内部キーボードを備えたラップトップまたは [[Wikipedia:Headless computer|headless systems]]) の場合、このフックを '''自動検出''' の前に配置すると便利です。 常にすべてのキーボードドライバを含めるため。 それ以外の場合、外部キーボードは、イメージの作成時に接続されている場合にのみ、初期のユーザースペースで機能します。}} |
||
− | || -- |
||
|- |
|- |
||
+ | | {{C|'''net'''}} || {{Grey|''未実装''}} || ネットワークデバイスに必要なモジュールを追加します。このフックを使うには {{Pkg|mkinitcpio-nfs-utils}} をインストールしなければなりません。詳細は [[#net を使う]] を見てください。 || NFS の root ファイルシステムの管理を提供します。 |
||
− | | style="text-align: center;"| '''keymap''' ||rowspan="2" style="text-align: center;"| '''sd-vconsole''' || {{ic|/etc/vconsole.conf}} から initramfs に指定したキーマップを追加します。システム暗号化 (特に[[Dm-crypt/システム全体の暗号化|完全なシステム暗号化]]) を使用する場合、{{ic|1=encrypt}} フックよりも前に追加するようにしてください。 || 初期ユーザ空間で {{ic|/etc/vconsole.conf}} から指定されたキーマップをロードします。 |
||
|- |
|- |
||
+ | | {{C|'''dmraid'''}} || {{Grey|''?''}} || fakeRAID root デバイスのサポートを提供します。これを使うには {{Pkg|dmraid}} をインストールする必要があります。コントローラがサポートしている場合、fakeRAID では ''mdadm_udev'' フックと一緒に [[mdadm]] を使うことが推奨されます。詳細は [[#RAID を使う]] を見てください。 || {{ic|dmraid}} を使用して fakeRAID ブロックデバイスを検索・構築します。 |
||
− | | style="text-align: center;"| '''consolefont''' || {{ic|/etc/vconsole.conf}} から initramfs に指定したコンソールフォントを追加します。 || 初期ユーザ空間で {{ic|/etc/vconsole.conf}} から指定されたコンソールフォントをロードします。 |
||
|- |
|- |
||
− | | |
+ | |colspan="2" {{C|'''mdadm_udev'''}} || udev を使って RAID アレイの構築をサポートします。このフックを使うには {{Pkg|mdadm}} をインストールする必要があります。詳細は [[RAID#mkinitcpio を設定する]] を見てください。 || {{-}} |
|- |
|- |
||
− | | |
+ | | {{C|'''encrypt'''}} || {{C|'''sd-encrypt'''}} || {{ic|dm_crypt}} カーネルモジュールと {{ic|cryptsetup}} ツールをイメージに追加します。これを使うには {{Pkg|cryptsetup}} をインストールする必要があります。{{Note|暗号化されたデバイスを起動時にアンロックするための ''keyboard'' フックの注意書きや、ファイルをアンロックする際はファイルシステムについての [[#MODULES]] にある注意書きを見てください。}} || 暗号化された root パーティションを検知してアンロックします。設定については [[#ランタイムのカスタマイズ]] を見て下さい。 |
+ | '''sd-encrypt''' については [[Dm-crypt/システム設定#sd-encrypt フックを使う]]を見てください。 |
||
|- |
|- |
||
+ | |colspan="2" {{C|'''lvm2'''}} || device mapper カーネルモジュールと {{ic|lvm}} ツールをイメージに追加します。これを使うには {{Pkg|lvm2}} をインストールする必要があります。ルートファイルシステムを [[LVM]] 上に置いている場合、このフックは必須です。 || {{-}} |
||
− | |colspan="2" style="text-align: center;"| '''fsck''' || fsck バイナリとファイルシステム特有のヘルパーを追加します。''autodetect'' フックの後ろに追加した場合、root ファイルシステムのヘルパーだけが追加されます。このフックの使用は強く推奨されており、{{ic|/usr}} パーティションを分割する場合は必須です。 || root デバイス (と分割している場合は {{ic|/usr}}) に対してマウントする前に fsck を実行します。ブートローダーのデフォルト設定で問題ありませんが、疑問がある場合は [https://bbs.archlinux.org/viewtopic.php?pid=1307895#p1307895 こちらの設定] を読んで下さい。 |
||
|- |
|- |
||
− | |colspan="2" |
+ | |colspan="2" {{C|'''filesystems'''}} || イメージに必要なファイルシステムモジュールを含めます。ファイルシステムモジュールを {{ic|MODULES}} で指定していない限りこのフックが'''必要'''になります。 || {{-}} |
|- |
|- |
||
+ | |colspan="2" {{C|'''fsck'''}} || fsck バイナリとファイルシステム固有のヘルパーを追加し、マウント前にルードデバイスに対して fsck を実行できるようにします。'''autodetect''' フックの後ろにこのフックを追加した場合、root ファイルシステムのヘルパーだけが追加されます。このフックの使用は'''強く'''推奨されており、{{ic|/usr}} パーティションを分割する場合は必須です。このフックを含める場合、初期ユーザ空間でキーボードが動作することを保証するために必要なモジュールも追加することを強く推奨します。<br/>このフックを使用するには、[[カーネルコマンドライン]]にパラメータ {{ic|rw}} を設定する必要があります ([https://bbs.archlinux.org/viewtopic.php?pid=1307895#p1307895 議論])。詳細は [[fsck#ブート時のチェック]] を見てください。 || {{-}} |
||
+ | |- |
||
+ | |colspan="2" {{C|'''acpi_override'''}} || {{ic|/usr/initcpio/acpi_override/}} と {{ic|/etc/initcpio/acpi_override/}} ディレクトリ内にある ACPI Machine Language (''.aml'') ファイルを未圧縮早期 initramfs イメージに追加します。そうすることで、カーネルがブートの非常に早い段階で ACPI テーブル (例えば [[DSDT]]) をオーバーライドできるようにします。[https://docs.kernel.org/admin-guide/acpi/initrd_table_override.html] || {{-}} |
||
|} |
|} |
||
− | ==== |
+ | ==== ポストフック ==== |
− | {{Pkg|mkinitcpio}} 0.13.0 では、{{ic|usbinput}} フックは廃止され {{ic|keyboard}} フックを使うようになりました。 |
||
+ | ポストフックは {{ic|/usr/lib/initcpio/post/}} (パッケージによって提供されているフック) と {{ic|/etc/initcpio/post/}} (カスタムのフック) に配置されている実行ファイルまたはシェルスクリプトです。これらのファイルは、署名などの追加のタスクを実行するために、イメージが生成された後に実行されます。 |
||
− | {{Pkg|mkinitcpio}} 0.12.0 では、以下のフックが廃止されました。以下のフックのどれかを使っているときは、{{ic|block}} フックに置き換える必要があります。 |
||
+ | 各実行ファイルに対して以下の引数が以下の順番で渡されます: |
||
− | *{{ic|fw}} |
||
− | *{{ic|mmc}} |
||
− | *{{ic|pata}} |
||
− | *{{ic|sata}} |
||
− | *{{ic|scsi}} |
||
− | *{{ic|usb}} |
||
− | *{{ic|virtio}} |
||
+ | # (イメージに) 使用されている'''カーネル''' (状況によってはこの引数が空になる場合があります) |
||
− | 詳しくは、Git コミット [https://projects.archlinux.org/mkinitcpio.git/commit/?id=97368c0e78f3a4fe4d62f7aedde88d4be13bfdba 97368c0e78] や [https://mailman.archlinux.org/pipermail/arch-projects/2012-November/003426.html arch-projects メーリングリスト]を見て下さい。 |
||
+ | # 生成された '''initramfs イメージ''' |
||
+ | # (オプション) 生成された'''ユニファイドカーネルイメージ''' |
||
+ | |||
+ | さらに、次の環境変数が設定されます: カーネルの完全なバージョン {{ic|KERNELVERSION}}、起動するためにカーネルを配置する必要のある場所のデフォルト {{ic|KERNELDESTINATION}}。 |
||
=== COMPRESSION === |
=== COMPRESSION === |
||
− | カーネルは、 |
+ | カーネルは、initramfs の圧縮にいくつかの形式をサポートしています: {{Pkg|gzip}}、{{Pkg|bzip2}}、lzma ({{Pkg|xz}})、{{Pkg|xz}}、lzo ({{Pkg|lzop}})、{{Pkg|lz4}}、{{Pkg|zstd}}。mkinitcpio はデフォルトで zstd 圧縮イメージを使用します。mkinitcpio は デフォルトで、カーネル 5.9 及びそれ以降に対しては zstd 圧縮を、5.9 より前のカーネルバージョンに対しては gzip を使用します。 |
− | {{ic|COMPRESSION}} を |
+ | 提供されている {{ic|mkinitcpio.conf}} には、さまざまな {{ic|COMPRESSION}} オプションがコメントアウトされています。別の圧縮方法に切り替える場合は、コメントを解除し、対応する圧縮ユーティリティがインストールされていることを確認してください。何も指定しない場合は、デフォルトのメソッドが使用されます。非圧縮イメージを作成する場合は、設定ファイルで {{ic|1=COMPRESSION='''cat'''}} を指定するか、コマンドラインで {{ic|-z cat}} を使用します。 |
+ | {{Tip| |
||
− | 使用する方法に適したファイル圧縮ユーティリティがインストールされていることを確認してください。 |
||
+ | * zstd と xz 圧縮アルゴリズムはマルチスレッドモードで実行されます ({{ic|-T0}} オプションが使用され、検出されたコアと同じ数のスレッドを作成しようと試みます)。 |
||
− | |||
+ | * lz4 は、高圧縮モード ({{ic|-9}}) のイメージの圧縮率は通常約2.5で、シングルスレッド圧縮の遅さを犠牲にして最速の解凍速度を達成しています。zstd は、マルチスレッド圧縮と、オプションによる幅広い圧縮レベルにより、多用途のソリューションを提供します - {{man|1|zstd|Operation modifiers}} を参照。xz は、その高圧縮プリセット ({{ic|-9}}) で約5の縮小率により最小サイズを実現しますが、その代償として展開速度がかなり遅くなります。 |
||
− | {{Warning|zstd で圧縮された initramfs は、Linux5.9 以降でのみサポートされています。}} |
||
+ | }} |
||
− | |||
− | {{Tip|高圧縮モード (-9) のイメージの圧縮比は通常の約 2.5 で、解凍速度が非常に速いため、 '''lz4''' はより遅いシングルスレッド圧縮を犠牲にして最も速い解凍速度を実現します。わずかに優れた圧縮の、lzo も解凍が速いです。zstd は、マルチスレッド圧縮と、そのオプションを使用した幅広い圧縮レベルを備えた汎用的なソリューションを提供します。 {{man|1|zstd|Operation modifiers}} を参照してください。 xz は、解凍速度がはるかに遅くなりますが、高圧縮プリセット (-9) で約5の縮小係数で最小サイズを実現します。}} |
||
=== COMPRESSION_OPTIONS === |
=== COMPRESSION_OPTIONS === |
||
233行目: | 242行目: | ||
COMPRESSION_OPTIONS=(-9) |
COMPRESSION_OPTIONS=(-9) |
||
+ | このオプションは空のままにしておくことができます。''mkinitcpio'' は、サポートされている圧縮メソッドに、機能するイメージを生成するために必須なフラグを渡すことを保証しています。 |
||
− | mkinitcpio はイメージを作成するときサポートされている圧縮方法に必要なフラグを渡すので、通常はこのオプションは必要ありません。なお、カーネルが作成された圧縮ファイルを解凍できないとき、このオプションを使っていないとシステムをブートできなくなる可能性があります。 |
||
+ | {{Warning|このオプションを間違って使用すると、カーネルが生成されたイメージを解凍できない場合、''システムが起動不能になる''場合があります。}} |
||
− | == ランタイムのカスタマイズ == |
||
+ | デフォルトの zstd 圧縮では、カスタムカーネルのスペースを節約するために (特に[[デュアルブート]]環境で、EFI システムパーティションを {{ic|/boot}} として使用する場合)、{{ic|--long}} オプションは非常に効果的です。ただし、RAM の限られたシステムは、このオプションをした場合に initramfs を解凍できない場合があります。また、{{ic|-v}} オプションは、initramfs の生成中に詳細を見たい場合に必要になるかもしれません。例: |
||
− | ランタイム設定オプションはカーネルコマンドラインを通して {{ic|init}} や特定のフックに渡すことができます。カーネルコマンドラインパラメータはブートローダによって与えられることがほとんどです。下で書かれているオプションをカーネルコマンドラインに追加することでデフォルトの挙動を変えることができます。詳しくは[[カーネルパラメータ]]や [[Arch ブートプロセス]]を見て下さい。 |
||
+ | COMPRESSION="zstd" |
||
− | === init === |
||
+ | COMPRESSION_OPTIONS=(-v -5 --long) |
||
+ | xz で圧縮レベル {{ic|-9e}} を使用し、ローダブルなカーネルモジュールとファームウェアを解凍しておくことで、圧縮速度が最も遅くなりますが、圧縮率を最大に高めることができます: |
||
− | ; {{ic|root}}: カーネルコマンドラインで指定する一番重要なパラメータであり、どのデバイスを root デバイスとしてマウントするかを決めます。mkinitcpio は柔軟に様々な形式を使うことができるようになっています、例: |
||
− | root=/dev/sda1 # /dev node |
||
− | root=LABEL=CorsairF80 # label |
||
− | root=UUID=ea1c4959-406c-45d0-a144-912f4e86b207 # UUID |
||
− | root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 # GPT partition UUID |
||
+ | COMPRESSION="xz" |
||
− | {{Note|以下のブートパラメーターは initramfs 環境における {{ic|init}} のデフォルトの挙動を変更します。詳しくは {{ic|/usr/lib/initcpio/init}} を参照。{{ic|systemd}} フックが使われている場合 {{ic|base}} フックの {{ic|init}} は置き換わるため機能しません。}} |
||
+ | COMPRESSION_OPTIONS=(-9e) |
||
+ | MODULES_DECOMPRESS="yes" |
||
+ | === MODULES_DECOMPRESS === |
||
− | ; {{ic|break}}: {{ic|<nowiki>break</nowiki>}} や {{ic|<nowiki>break=premount</nowiki>}} が指定された場合、(フックをロードした後、root ファイルシステムをマウントする前に) {{ic|init}} はブートプロセスを停止してトラブルシューティングに使うことができるインタラクティブシェルを起動します。{{ic|<nowiki>break=postmount</nowiki>}} と指定することで root がマウントされた後にこのシェルを起動することもできます。シェルを終了すると通常通りに起動が行われます。 |
||
+ | {{ic|MODULES_DECOMPRESS}} は、initramfs の作成時にカーネルモジュールとファームウェアのファイルを解凍しておくかを決めます。デフォルトは {{ic|no}} です。 |
||
− | ; {{ic|disablehooks}}: {{ic|<nowiki>disablehooks=hook1{,hook2,...}</nowiki>}} を追加すると実行時にフックを無効化します。例: {{bc|1=disablehooks=resume}} |
||
+ | Arch では[[カーネルモジュール]]と {{Pkg|linux-firmware}} を zstd でレベル 19 で圧縮しています。Initramfs でより高い圧縮率を使用する場合、{{ic|1=MODULES_DECOMPRESS="yes"}} を設定することで、initramfs のサイズをさらに小さくすることができます。しかし、カーネルが個々のモジュールとファームウェアをロード時に解凍する場合よりも、initramfs イメージ全体を解凍するのにより多くの時間が掛かるようになるため、ブートの初期段階で RAM と CPU の使用率を増加させ、RAM 容量が限られていて CPU の性能が低いシステムで悪影響を及ぼします。 |
||
− | ; {{ic|earlymodules}}: {{ic|<nowiki>earlymodules=mod1{,mod2,...}</nowiki>}} という風に先にロードするモジュールを指定することでモジュールがロードされる順番を変更することができます (例えば、複数のネットワークインターフェイスの順番を適切に確定したいときなどに使います)。 |
||
+ | {{Tip|Initramfs の生成プロセスの終わりあたりになると、二重圧縮を防ぐために、残りの ''.bz2''、''.gz''、''.lz4''、''.lzma''、''.lzo''、''.xz''、''.zst'' ファイルは全て未圧縮早期 initramfs イメージに移動されます。}} |
||
− | ; {{ic|rootdelay=N}}: {{ic|rootdelay}} を追加すると root ファイルシステムをマウントする前に {{ic|N}} 秒間だけ停止します (例えば、初期化に時間がかかる USB ハードドライブから起動するときなどに使います)。 |
||
+ | == ランタイムのカスタマイズ == |
||
− | 他のパラメータについては[[ブートデバッグ]]や {{man|8|mkinitcpio}} を見て下さい。 |
||
+ | ランタイム設定オプションはカーネルコマンドラインを通して {{ic|init}} や特定のフックに渡すことができます。カーネルコマンドラインパラメータはブートローダによって与えられることがほとんどです。下で書かれているオプションをカーネルコマンドラインに追加することでデフォルトの挙動を変えることができます。詳しくは [[カーネルパラメータ]] や [[Arch ブートプロセス]] を見て下さい。 |
||
− | === RAID を使う === |
||
+ | === base フックの init === |
||
− | {{Note|{{ic|mdadm}} は推奨されません。更新時に {{ic|1===> WARNING: Hook 'mdadm' is deprecated. Replace it with 'mdadm_udev' in your config}} が表示されます。}} |
||
+ | ; {{ic|1=root=}}: カーネルコマンドラインで指定する一番重要なパラメータであり、どのデバイスを root デバイスとしてマウントするかを決めます。''mkinitcpio'' は柔軟に様々な形式を使うことができるようになっています。形式の例は [[永続的なブロックデバイスの命名#カーネルパラメータ]] を見てください。 |
||
− | まず、{{ic|/etc/mkinitcpio.conf}} 内の {{ic|HOOKS}} に {{ic|mdadm_udev}} または {{ic|mdadm}} フックを追加し、必要な RAID モジュール全て (例: raid456, ext4) を {{ic|MODULES}} に追加して下さい。 |
||
+ | {{Note|以下のブートパラメーターは initramfs 環境における {{ic|init}} のデフォルトの挙動を変更します。詳しくは {{ic|/usr/lib/initcpio/init}} を参照。{{ic|systemd}} フックが使われている場合 {{ic|base}} フックの {{ic|init}} は置き換わるため機能しません。}} |
||
− | {{ic|mdadm}} フックを使う場合、[[カーネルパラメータ]]で RAID アレイを設定する必要はありません。{{ic|mdadm}} フックは {{ic|/etc/mdadm.conf}} ファイルを使うか、またはブート時の init 段階でアレイを自動で検出します。 |
||
+ | ; {{ic|break}}: {{ic|break}} や {{ic|1=break=premount}} が指定された場合、(フックをロードした後、root ファイルシステムをマウントする前に) {{ic|init}} はブートプロセスを停止してトラブルシューティングに使うことができるインタラクティブシェルを起動します。{{ic|1=break=postmount}} と指定することで root がマウントされた後にこのシェルを起動することもできます。シェルを終了すると通常通りに起動が行われます。 |
||
− | {{ic|mdadm_udev}} フックを使うことで udev による構築も可能です。上流ではこの方法が推奨されています。{{ic|/etc/mdadm.conf}} は構築されたデバイスに名前を付けるために読み込まれます。 |
||
+ | ; {{ic|1=disablehooks=}}: {{ic|1=disablehooks=hook1[,hook2,...]}} を追加すると実行時にフックを無効化します。例: {{bc|1=disablehooks=resume}} |
||
− | === net を使う === |
||
+ | ; {{ic|1=earlymodules=}}: {{ic|1=earlymodules=mod1[,mod2,...]}} という風に先にロードするモジュールを指定することでモジュールがロードされる順番を変更することができます (例えば、複数のネットワークインターフェイスの順番を適切に確定したいときなどに使います)。 |
||
− | {{Warning|NFSv4 はまだサポートされていません ({{Bug|28287}})。}} |
||
+ | 他のパラメータについては [[ブートデバッグ]] や {{man|8|mkinitcpio}} を見て下さい。 |
||
− | '''必要なパッケージ:''' |
||
+ | |||
+ | === RAID を使う === |
||
+ | |||
+ | [[RAID#mdadm フックを mkinitcpio.conf に追加する]] を見てください。 |
||
+ | |||
+ | === net を使う === |
||
+ | |||
+ | {{Note|NFSv4 はまだサポートされていません {{Bug|28287}}。}} |
||
+ | |||
+ | '''必要なパッケージ''' |
||
{{ic|net}} は {{Pkg|mkinitcpio-nfs-utils}} パッケージを必要とします。 |
{{ic|net}} は {{Pkg|mkinitcpio-nfs-utils}} パッケージを必要とします。 |
||
− | '''カーネルパラメータ |
+ | '''カーネルパラメータ''' |
+ | |||
+ | 公式の[https://docs.kernel.org/admin-guide/nfs/nfsroot.html カーネルドキュメント]に包括的で最新の情報が載っています。 |
||
+ | |||
+ | '''ip=''' |
||
+ | このパラメータはカーネルに、デバイスの IP アドレスの設定方法と、IP ルーティングテーブルの設定方法を指定します。コロンで区切った9つまでの引数を指定できます: {{ic|1=ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>:<ntp0-ip>}}。 |
||
− | 公式の[https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt カーネルドキュメント]に最新の情報が載っています。 |
||
+ | カーネルコマンドラインにこのパラメータが存在しなかった場合、全てのフィールドが空とされて、[https://docs.kernel.org/admin-guide/nfs/nfsroot.html カーネルドキュメント]に書かれているデフォルト設定が適用されます。一般的にはカーネルは自動設定を使って全てを設定しようとします。 |
||
− | '''ip=''' |
||
+ | {{ic|<autoconf>}} パラメータは {{ic|ip}} パラメータの唯一の値として指定できます (前の全ての {{ic|:}} 文字を排除)。値が {{ic|1=ip=off}} や {{ic|1=ip=none}} の場合、自動設定は行われません。そうでないなら、自動的に設定されます。最も一般的な使い方は {{ic|1=ip=dhcp}} です。 |
||
− | このパラメータはカーネルに、デバイスの IP アドレスの設定方法と、IP ルーティングテーブルの設定方法を指定します。コロンで区切った9つの引数を指定できます: {{ic|1=ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>}}。 |
||
− | + | パラメータの説明は、[https://docs.kernel.org/admin-guide/nfs/nfsroot.html カーネルドキュメント]を参照してください。 |
|
+ | 例: |
||
− | {{ic|<autoconf>}} パラメータは 'ip' パラメータの唯一の値として指定できます (前の全ての ':' 文字を排除)。値が {{ic|1=ip=off}} や {{ic|1=ip=none}} の場合、自動設定は行われません。そうでないなら、自動的に設定されます。最も一般的な使い方は {{ic|1=ip=dhcp}} です。 |
||
+ | ip=127.0.0.1:::::lo:none --> ループバックインターフェイスを有効化。 |
||
− | パラメータの説明は、[https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt カーネルドキュメント]を参照してください。 |
||
+ | ip=192.168.1.1:::::eth2:none --> 静的 eth2 インターフェイスを有効化。 |
||
− | |||
+ | ip=:::::eth0:dhcp --> eth0 構成に対して dhcp プロトコルを有効化。 |
||
− | ; 例 |
||
− | ip=127.0.0.1:::::lo:none --> Enable the loopback interface. |
||
− | ip=192.168.1.1:::::eth2:none --> Enable static eth2 interface. |
||
− | ip=:::::eth0:dhcp --> Enable dhcp protocol for eth0 configuration. |
||
− | {{Note|{{ic|<device>}} パラメータにはカーネルのデバイス名を使用してください (例: |
+ | {{Note|{{ic|<device>}} パラメータにはカーネルのデバイス名を使用してください (例: {{ic|eth0}})、永続的な名前のデバイス名 (例: {{ic|enp2s0}}) では動作しません。詳細は [[ネットワーク設定#ネットワークインターフェイス]] を見てください。}} |
'''BOOTIF=''' |
'''BOOTIF=''' |
||
− | 複数のネットワークカードを使っているときは、このパラメータに起動するインターフェイスの MAC アドレスを含めることができます。インターフェイスの数字が変わってしまったり、pxelinux の IPAPPEND 2 や IPAPPEND 3 オプションを使うときに便利です。指定しなかった場合、eth0 が使われます。 |
+ | 複数のネットワークカードを使っているときは、このパラメータに起動するインターフェイスの MAC アドレスを含めることができます。インターフェイスの数字が変わってしまったり、pxelinux の IPAPPEND 2 や IPAPPEND 3 オプションを使うときに便利です。指定しなかった場合、{{ic|eth0}} が使われます。 |
− | + | 例: |
|
+ | |||
− | BOOTIF=01-A1-B2-C3-D4-E5-F6 # Note the prepended "01-" and capital letters. |
||
+ | BOOTIF=01-A1-B2-C3-D4-E5-F6 # 先頭の "01-" と大文字に注意 |
||
'''nfsroot=''' |
'''nfsroot=''' |
||
312行目: | 332行目: | ||
パラメータの説明を見るには {{ic|mkinitcpio -H net}} を実行してください。 |
パラメータの説明を見るには {{ic|mkinitcpio -H net}} を実行してください。 |
||
− | |||
− | '''root=/dev/nfs''' |
||
− | |||
− | {{ic|nfsroot}} パラメータを使わない場合、{{ic|1=root=/dev/nfs}} を設定して自動設定により NFS root から起動するようにする必要があります。 |
||
=== LVM を使う === |
=== LVM を使う === |
||
− | root デバイスを [[LVM]] 上に置く場合は、[[LVM#mkinitcpio |
+ | root デバイスを [[LVM]] 上に置く場合は、[[LVM に Arch Linux をインストールする#mkinitcpio フックを追加する]] を見てください。 |
− | === 暗号化された |
+ | === 暗号化されたルートを使う === |
− | [[Dm-crypt/システム全体の暗号化|root を暗号化]]している場合、 |
+ | [[Dm-crypt/システム全体の暗号化|root を暗号化]]している場合、どのフックを含めるべきかに関する詳細な情報は [[Dm-crypt/システム設定#mkinitcpio]] を見て下さい。 |
− | === /usr パーティション |
+ | === /usr を別のパーティションに分割する === |
{{ic|/usr}} のパーティションを別にする場合、以下を行う必要があります: |
{{ic|/usr}} のパーティションを別にする場合、以下を行う必要があります: |
||
− | * {{ic|fsck}} フックを追加して、{{ic|/etc/fstab}} で {{ic|/usr}} の {{ic|passno}} を {{ic| |
+ | * 起動時にこのパーティションのチェックを実行するために、{{ic|fsck}} フックを追加して、{{ic|/etc/fstab}} で {{ic|/usr}} の {{ic|passno}} を {{ic|2}} にする。起動時に {{ic|/usr}} を fsck したい場合は必須です (これはすべてのユーザに推奨されます)。このフックが存在しないと、{{ic|/usr}} は永遠に fsck されません。 |
− | * systemd フックを使っていない場合、{{ic|usr}} フックを追加。ルートがマウントされた後に {{ic|/usr}} パーティションがマウントされるようになります |
+ | * systemd フックを使っていない場合、{{ic|usr}} フックを追加する。ルートがマウントされた後に {{ic|/usr}} パーティションがマウントされるようになります。 |
== トラブルシューティング == |
== トラブルシューティング == |
||
338行目: | 354行目: | ||
initramfs イメージの中に何が入っているか気になるときは、イメージを展開して中に入っているファイルを調べることができます。 |
initramfs イメージの中に何が入っているか気になるときは、イメージを展開して中に入っているファイルを調べることができます。 |
||
− | initramfs イメージは SVR4 CPIO アーカイブであり、{{ic|find}} と {{ic|bsdcpio}} コマンドによって生成されています。また、任意でカーネルが対応した圧縮方法によって圧縮されています。圧縮方法について詳しくは [[#COMPRESSION]] を見て下さい。 |
+ | initramfs イメージは SVR4 CPIO アーカイブであり、{{ic|find}} と {{ic|bsdcpio}} コマンドによって生成されています。また、任意で、カーネルが対応した圧縮方法によって圧縮されています。圧縮方法について詳しくは [[#COMPRESSION]] を見て下さい。 |
− | mkinitcpio には {{ |
+ | ''mkinitcpio'' には {{man|1|lsinitcpio}} というユーティリティが含まれており initramfs イメージの中身を一覧・展開することができます。 |
イメージ内のファイルを一覧するには: |
イメージ内のファイルを一覧するには: |
||
− | $ lsinitcpio /boot/initramfs-linux.img |
||
+ | # lsinitcpio /boot/initramfs-linux.img |
||
− | 作業ディレクトリにファイルを全て展開するには: |
||
+ | |||
− | $ lsinitcpio -x /boot/initramfs-linux.img |
||
+ | カレントディレクトリにファイルを全て展開するには: |
||
+ | |||
+ | # lsinitcpio -x /boot/initramfs-linux.img |
||
イメージの重要なパーツについて読みやすいリストを取得することもできます: |
イメージの重要なパーツについて読みやすいリストを取得することもできます: |
||
+ | |||
− | $ lsinitcpio -a /boot/initramfs-linux.img |
||
+ | # lsinitcpio -a /boot/initramfs-linux.img |
||
=== 展開して修正を加えたイメージの再圧縮 === |
=== 展開して修正を加えたイメージの再圧縮 === |
||
− | 上記のようにイメージを展開してから修正を加えたら、再圧縮に必要なコマンドを確認します。{{ic|/usr/bin/mkinitcpio}} を編集して以下のように行を変更してください (mkinitcpio v20-1 の場合は531行目): |
||
− | #MKINITCPIO_PROCESS_PRESET=1 "$0" "${preset_cmd[@]}" |
||
− | MKINITCPIO_PROCESS_PRESET=1 /usr/bin/bash -x "$0" "${preset_cmd[@]}" |
||
− | + | {{ic|/usr/bin/mkinitcpio}} スクリプトの {{ic|build_image}} 関数を以下のパラメータで実行してください: |
|
− | + find -mindepth 1 -printf '%P\0' |
||
− | + LANG=C |
||
− | + bsdcpio -0 -o -H newc --quiet |
||
− | + gzip |
||
+ | build_image ''出力ファイル'' ''圧縮方式'' |
||
− | 上記の出力が再圧縮するのに必要なコマンドになります。例: |
||
− | # find -mindepth 1 -printf '%P\0' | LANG=C bsdcpio -0 -o -H newc --quiet | gzip > /boot/initramfs-linux.img |
||
+ | {{ic|build_image}} 関数の内容で新しいスクリプトを作成することでこれを実行できます。 |
||
− | {{Warning|上書きするまえに自動生成された {{ic|/boot/initramfs-linux.img}} の名前を変更することで、簡単に元に戻すことができるようになります。何か問題が発生して起動できなくなった場合、フォールバックイメージやブート CD で起動して、{{ic|mkinitcpio}} を実行して元のイメージに戻してください。}} |
||
+ | これはカレントディレクトリ内の内容を {{ic|''出力ファイル''}} というファイルに圧縮します。 |
||
+ | |||
+ | {{Warning|上書きするまえに自動生成された {{ic|/boot/initramfs-linux.img}} の名前を変更することで、簡単に元に戻すことができるようになります。何か問題が発生して起動できなくなった場合、fallback イメージやブート CD で起動して、{{ic|mkinitcpio}} を実行して元のイメージに戻してください。あるいは、自分で修正してイメージを再圧縮してください。}} |
||
=== マウントされているのに "/dev must be mounted" と表示される === |
=== マウントされているのに "/dev must be mounted" と表示される === |
||
− | {{ic|/dev}} がマウントされているかどうか確認するのに mkinitcpio は {{ic|/dev/fd/}} が存在するかどうかを確かめます。問題がないようでしたら、手動で作成することができます: |
||
− | # ln -s /proc/self/fd /dev/ |
||
+ | {{ic|/dev}} がマウントされているかどうか確認するために mkinitcpio は {{ic|/dev/fd/}} が存在するかどうかを確かめます。問題がないようでしたら、手動で作成することができます: |
||
− | 当然 {{ic|/proc}} のマウントも必要です。mkinitcpio によって次にチェックされます。 |
||
+ | # ln -s /proc/self/fd /dev/ |
||
− | === LUKS/LVM/resume セットアップで systemd フックを使う === |
||
+ | |||
− | 伝統的な {{ic|encrypt}}/{{ic|lvm2}}/{{ic|resume}} の代わりに {{ic|systemd}}/{{ic|sd-encrypt}}/{{ic|sd-lvm2}} フックを使う場合、ブートローダーで別の initrd パラメータを渡す必要があります。詳しくはフォーラムの投稿を見て下さい [https://bbs.archlinux.org/viewtopic.php?pid=1480241]。 |
||
+ | (当然 {{ic|/proc}} のマウントも必要です。''mkinitcpio'' によって次にチェックされます。) |
||
=== Possibly missing firmware for module XXXX === |
=== Possibly missing firmware for module XXXX === |
||
380行目: | 393行目: | ||
カーネルのアップデート後に initramfs を再生成する際、以下のような警告が表示されることがあります: |
カーネルのアップデート後に initramfs を再生成する際、以下のような警告が表示されることがあります: |
||
− | ==> WARNING: Possibly missing firmware for module: |
+ | ==> WARNING: Possibly missing firmware for module: '<nowiki/>''module_name''<nowiki/>' |
− | ==> WARNING: Possibly missing firmware for module: wd719x |
||
+ | ''default'' initramfs イメージを生成するときに同じようなメッセージが表示される場合、警告メッセージが言っている通り、追加のファームウェアをインストールする必要があるかもしれません。ほとんどの一般的なファームウェアファイルは {{Pkg|linux-firmware}} パッケージを[[インストール]]することで入手できます。ファームウェアを提供する他のパッケージについては、以下の表を見るか、[[公式リポジトリ]]や [[AUR]] でモジュール名を検索してみてください。 |
||
− | ファームウェアモジュールをインストールしていない Arch Linux ユーザーなら誰でも表示されます。ファームウェアを使用するハードウェアを使っていない場合、上記のメッセージは無視してかまいません。 |
||
+ | |||
+ | メッセージが ''fallback'' initramfs イメージの生成時にのみ表示される場合は、以下の2つの選択肢があります: |
||
+ | |||
+ | * 影響を受けるハードウェアを使用しないことがわかっている場合は、警告を安全に無視できます。 |
||
+ | * 警告を抑制したい場合、不足しているファームウェアをインストールできます。メタパッケージ {{AUR|mkinitcpio-firmware}} には、ほどんどのオプションのファームウェアが含まれています。あるいは、手動で必要なパッケージをインストールしてください: |
||
+ | :{| class="wikitable" |
||
+ | |- |
||
+ | ! モジュール !! パッケージ |
||
+ | |- |
||
+ | | aic94xx || {{AUR|aic94xx-firmware}} |
||
+ | |- |
||
+ | | ast || {{AUR|ast-firmware}} |
||
+ | |- |
||
+ | | bfa || {{Pkg|linux-firmware-qlogic}} |
||
+ | |- |
||
+ | | bnx2x || {{Pkg|linux-firmware-bnx2x}} |
||
+ | |- |
||
+ | | liquidio || {{Pkg|linux-firmware-liquidio}} |
||
+ | |- |
||
+ | | mlxsw_spectrum || {{Pkg|linux-firmware-mellanox}} |
||
+ | |- |
||
+ | | nfp || {{Pkg|linux-firmware-nfp}} |
||
+ | |- |
||
+ | | qed || {{Pkg|linux-firmware-qlogic}} |
||
+ | |- |
||
+ | | qla1280 || {{Pkg|linux-firmware-qlogic}} |
||
+ | |- |
||
+ | | qla2xxx || {{Pkg|linux-firmware-qlogic}} |
||
+ | |- |
||
+ | | wd719x || {{AUR|wd719x-firmware}} |
||
+ | |- |
||
+ | | xhci_pci || {{AUR|upd72020x-fw}} |
||
+ | |} |
||
+ | * 警告を取り除きたいが、必要ないファームウェアパッケージのためにシステムの空き領域を無駄にしたくない場合、fallback initramfs の生成を無効化することができます: |
||
+ | *# {{ic|/etc/mkinitcpio.d/}} 内のすべての ''.preset'' ファイルで、{{ic|1=PRESETS=('default' 'fallback')}} 行を {{ic|1=PRESETS=('default')}} に変更してください。 |
||
+ | *# fallback initramfs イメージを削除してください: {{ic|# rm /boot/*-fallback.img}}。 |
||
+ | *# [[ブートローダー]]の設定ファイルを更新してください。 |
||
+ | :{{Warning|fallback initramfs の生成を無効化すると、デフォルトの initramfs でシステムの起動が失敗した場合に、システムを起動するためのもう一つの手段が失われることになります。上記の手順を実行する前に、システムリカバリのための起動可能[[USB インストールメディア|インストールメディア]]を作成しておいてください。}} |
||
+ | |||
+ | === No PS/2 controller found === |
||
+ | |||
+ | 一部のマザーボードで (ほとんどの場合、古いもの。しかし、一部の新しいものでも起こります)、i8042 コントローラが自動検出できません。稀なケースですが、キーボードが使えなくなってしまうことがあります。この状況を事前に察知することができます。PS/2 ポートがあり、{{ic|i8042: PNP: No PS/2 controller found. Probing ports directly}} というメッセージが表示される場合、{{ic|MODULES}} 配列に {{ic|atkbd}} を追加してください。[https://archlinux.org/news/linux-313-warning-ps2-keyboard-support-is-now-modular/] |
||
=== 標準的なレスキュー手順 === |
=== 標準的なレスキュー手順 === |
||
− | 不適切な初期 RAM ディスクを使用すると、システムが起動できなくなることがよくあります。 したがって、以下のようなシステムレスキュー手順に従ってください |
+ | 不適切な初期 RAM ディスクを使用すると、システムが起動できなくなることがよくあります。 したがって、以下のようなシステムレスキュー手順に従ってください: |
==== あるマシンでは起動できるが他のマシンでは起動できない ==== |
==== あるマシンでは起動できるが他のマシンでは起動できない ==== |
||
+ | |||
− | ''mkinitcpio'' の {{ic|autodetect}} フックは {{ic|/sys}} をスキャンしてロードされているカーネルモジュールを確認して不要な[[カーネルモジュール]]を排除します。{{ic|/boot}} ディレクトリを他のマシンに移動して、初期ユーザー空間でブートが失敗する場合、カーネルモジュールが存在しないために新しいハードウェアが検出されていないのが原因かもしれません。USB 2.0 と 3.0 では必要なカーネルモジュールが異なるので注意してください。 |
||
+ | ''mkinitcpio'' の {{ic|autodetect}} フックは {{ic|/sys}} をスキャンして、ロードされている[[カーネルモジュール]]を確認して不要なカーネルモジュールを排除します。{{ic|/boot}} ディレクトリを他のマシンに移動して、初期ユーザー空間でブートが失敗する場合、カーネルモジュールが存在しないために新しいハードウェアが検出されていないのが原因かもしれません。USB 2.0 と 3.0 では必要なカーネルモジュールが異なるので注意してください。 |
||
修正するには、[[ブートローダー]]から [[#イメージ作成とアクティベーション|fallback]] イメージを選択してください (fallback は {{ic|autodetect}} によるフィルタリングがされていません)。起動したら、新しいマシンで ''mkinitcpio'' を実行して適切なモジュールでイメージを再生成してください。fallback イメージで起動できない場合、Arch Linux のライブ CD/USB で起動して、chroot し、新しいマシンで ''mkinitcpio'' を実行して下さい。それでも駄目な場合、initramfs にモジュールを[[#MODULES|手動]]で追加します。 |
修正するには、[[ブートローダー]]から [[#イメージ作成とアクティベーション|fallback]] イメージを選択してください (fallback は {{ic|autodetect}} によるフィルタリングがされていません)。起動したら、新しいマシンで ''mkinitcpio'' を実行して適切なモジュールでイメージを再生成してください。fallback イメージで起動できない場合、Arch Linux のライブ CD/USB で起動して、chroot し、新しいマシンで ''mkinitcpio'' を実行して下さい。それでも駄目な場合、initramfs にモジュールを[[#MODULES|手動]]で追加します。 |
||
== 参照 == |
== 参照 == |
||
+ | |||
− | * Linux カーネルドキュメントの [https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/plain/Documentation/filesystems/ramfs-rootfs-initramfs.txt?id=HEAD initramfs] ''What is rootfs?'' でページ内を検索してください |
||
− | * Linux カーネルドキュメント |
+ | * Linux カーネルドキュメント [https://docs.kernel.org/filesystems/ramfs-rootfs-initramfs.html#what-is-rootfs initramfs, "What is rootfs?"] |
+ | * Linux カーネルドキュメント [https://docs.kernel.org/admin-guide/initrd.html initrd] |
||
− | * [[Wikipedia:ja:initrd]] |
||
+ | * Wikipedia 記事 [[wikipedia:ja:initrd|initrd]] |
||
+ | |||
+ | {{TranslationStatus|mkinitcpio|2024-05-09|807603}} |
2024年7月10日 (水) 20:32時点における版
mkinitcpio は初期 RAM ディスク環境を作成するために使われる Bash スクリプトです。mkinitcpio(8) man ページより:
- 初期 ram ディスクは非常に小さい環境(初期ユーザー空間)であり、様々なカーネルモジュールをロードして
init
にコントロールを移す前に必要なことをセットアップします。これにより、root ファイルシステムを暗号化したりソフトウェア RAID アレイに root を載せたりすることが可能になります。mkinitcpio はカスタムフックによって簡単に拡張することができ、実行時の自動検知など様々な機能を持っています。
伝統的には、ブートプロセスの初めにハードウェアを検知したりタスクの初期化を行うのはカーネルで、それから root ファイルシステムがマウントされ init
にコントロールが移されます。しかしながら、先端技術が生まれるにつれ、こういった作業は複雑になりつつあります。
今日、root ファイルシステムが載るハードウェアは SCSI から SATA、USB ドライブまで様々にわたり、それらハードウェアはそれぞれのメーカーによって作られたいろんなドライブコントローラによってコントロールされています。しかも、root ファイルシステムは暗号化されたり圧縮されたりする可能性もあります; ソフトウェア RAID アレイや論理ボリュームグループに含まれるかもしれません。複雑になったものをシンプルに扱う方法はユーザースペース (初期RAMディスク) へ管理を譲渡することです。参照: /dev/brain0 » Blog Archive » Early Userspace in Arch Linux。
mkinitcpio は Arch Linux デベロッパーとコミュニティの貢献によって開発されています。public Git リポジトリを見て下さい。
初期 ramdisk フェーズ中に行われる様々なタスクがどのように実行されるかには、2つの異なるアプローチがあることに注意が必要です。
- Busybox ベースの初期 ramdisk
- 初期 ramdisk のファイルシステムをスキャンし、実行されるスクリプト(この文脈ではランタイムフックと呼ばれる)を開始する init スクリプトが起動されます。
- systemd ベースの初期 ramdisk
- 初期 ramdisk フェーズの開始時にすでに systemd が起動されています。実行されるタスクは、通常の systemd ユニットファイルによって決定されます。参照:systemd bootup process。
具体的なバリアントは、/etc/mkinitcpio.conf
内の HOOKS
配列に systemd
フックが存在するかどうかによって決まります。より詳細については、#通常のフック を参照してください。
インストール
mkinitcpio パッケージをインストールしてください。このパッケージは linux の依存パッケージとなっているので、大抵すでにインストールされているでしょう。
上級者は mkinitcpio-gitAUR パッケージで mkinitcpio の最新開発バージョンをインストールできます。
イメージ作成とアクティベーション
自動生成
カーネルがインストールまたはアップグレードされるたびに、pacman フックは /etc/mkinitcpio.d/
内に保存される .preset ファイルを自動的に生成します。例えば、公式の安定版 linux カーネルパッケージの場合は linux.preset
です。プリセットは、様々なパラメーターや出力ファイルの場所を手動で指定する手間を省き、初期 RAM ディスクイメージを作成するために必要な情報のリストです。
デフォルトでは、2つのイメージを生成するための命令が含まれています:
- default RAM ディスクイメージ。このイメージの内容は、mkinicpio の #設定 で指定されたディレクティブに従って生成されます。
- fallback RAM ディスクイメージ。作成時に autodetect フックがスキップされることを除いて上記と同じであるため、ほとんどのシステムをサポートするすべてのモジュールが含まれます。
プリセットを作成した後、pacman フックは、プリセットで提供された情報を使用して2つのイメージを生成する mkinitcpio スクリプトを呼び出します。
手動生成
スクリプトを手動で実行するには、マニュアルページ mkinitcpio(8) で手順を確認してください。特に、カーネルパッケージによって提供されるプリセットを(再)生成するには、使用するプリセットを -p
/--preset
オプションで指定してください。例えば、linux パッケージの場合、次のコマンドを使用してください:
# mkinitcpio -p linux
既存のすべてのプリセットを(再)生成するには、-P
/--allpresets
スイッチを使用してください。これは通常、グローバルな #設定 の変更後にすべての initramfs イメージを再生成するために使用されます:
# mkinitcpio -P
ユーザーは、さまざまな構成で initramfs イメージをいくつでも作成できます。生成したいイメージは、それぞれのブートローダーの設定ファイルで指定する必要があります。
生成のカスタマイズ
ユーザーは、代替の設定ファイルを使用してイメージを生成できます。次の例では、/etc/mkinitcpio-custom.conf
に記述されている指示に従って初期 RAM ディスクイメージを生成し、/boot/initramfs-custom.img
として保存します。
# mkinitcpio --config /etc/mkinitcpio-custom.conf --generate /boot/initramfs-custom.img
現在実行中のカーネル以外のカーネルのイメージを生成する場合は、カーネルリリースバージョンをコマンドラインに追加してください。インストールされているカーネルリリースは /usr/lib/modules/
にあり、構文は各カーネルのコマンド uname -r
の出力と一致しています。
# mkinitcpio --generate /boot/initramfs-custom2.img --kernel 5.7.12-arch1-1
ユニファイドカーネルイメージ
mkinitcpio はユニファイドカーネルイメージ (UKI) を作成することができます。systemd-ukify がインストールされている場合、mkinitcpio は UKI の生成を systemd-ukify に委託します。このパッケージがインストールされていない場合、mkinitcpio は自身の実装を使用します。
設定
mkinitcpio のプライマリ設定ファイルは、/etc/mkinitcpio.conf
です。ドロップインの設定ファイル (例: /etc/mkinitcpio.conf.d/myhooks.conf
) もサポートされています (ドロップインファイルは、mkinitcpio が -c
オプションと共に実行された場合や、ALL_config
を含んでいるプリセットを使用した場合には使用されません)。さらに、カーネルパッケージによって提供されるプリセット定義が /etc/mkinitcpio.d
ディレクトリにあります (例: /etc/mkinitcpio.d/linux.preset
)。
ユーザーは、設定ファイルの中にある7つの変数を変更できます (詳細は mkinitcpio.conf(5) を見てください):
MODULES
- ブートフックが実行される前にロードされるカーネルモジュール。
BINARIES
- initramfs イメージに含める追加のバイナリ。
FILES
- initramfs イメージに含める追加のファイル。
HOOKS
- フックは初期 RAM ディスクで実行するスクリプトです。
COMPRESSION
- initramfs イメージを圧縮する際に使用されます。
COMPRESSION_OPTIONS
COMPRESSION
のプログラムに渡す追加の引数。この設定の使用は推奨されません。mkinitcpio は圧縮プログラムに対する特殊な要件を処理するため (例: xz には--check=crc32
を指定します)、誤って利用するとシステムが起動できなくなる可能性があります。MODULES_DECOMPRESS
- ロード可能なカーネルモジュールとファームウェアのファイルを解凍しておくか、もとの圧縮した状態のままにしておくかを設定します。
MODULES
MODULES
配列では、何か他のことが行われる前にロードするモジュールを指定します。
モジュールの後ろに ?
を付けると、モジュールが見つからなかったときでもエラーを投げません。これは、フックや設定ファイルにリストアップされたモジュールを含んでコンパイルするカスタムカーネルで有益かもしれません。
BINARIES と FILES
以下のオプションを使ってイメージにファイルを追加することができます。BINARIES
と FILES
はフックが実行される前に追加され、フックによって使用/提供されるファイルを上書きすることがあります。BINARIES
は標準の PATH
に自動で配置され、依存関係がパースされます。つまり必要なライブラリも全て追加されます。FILES
はそのままの状態で追加されます。例:
FILES=(/etc/modprobe.d/modprobe.conf)
BINARIES=(kexec)
BINARIES
と FILES
は両方とも Bash 配列です。なので、スペースで区切ることで複数のエントリを追加することができます。
HOOKS
HOOKS
配列は設定ファイルの中で一番重要な設定です。フックはイメージに追加されるものを記述する小さなスクリプトです。フックによっては、デーモンを起動したりスタックしたブロックデバイスを集めたりするためのランタイムコンポーネントを含んでいるものもあります。フックは名前によって参照され、設定ファイルの HOOKS
にある順番通りに実行されます。
ほとんどのシンプルな単一ディスク環境では、デフォルトの HOOKS
設定で十分なはずです。LVM、RAID、dm-crypt などのスタックルートデバイスやマルチブロックデバイスを使う時は、関連する wiki ページを見て必要な設定を調べて下さい。
ビルドフック
ビルドフックは /usr/lib/initcpio/install/
にあります。カスタムビルドフックは /etc/initcpio/install/
に配置します。これらのファイルは mkinitcpio の実行時に bash シェルによって実行されます。ビルドフックには2つの関数が含まれています: build
と help
。build
関数にはイメージに追加するモジュール、ファイル、バイナリを記述します。これらのアイテムの追加を容易にする mkinitcpio(8) による API が用意されています。help
関数はフックの役割を出力します。
すべてのフックを一覧するには:
$ mkinitcpio -L
特定のフックのヘルプを出力するには mkinitcpio の -H
/--hookhelp
オプションを使って下さい、例えば:
$ mkinitcpio -H udev
ランタイムフック
ランタイムフックは /usr/lib/initcpio/hooks/
にあります。カスタムランタイムフックは /etc/initcpio/hooks/
に配置します。全てのランタイムフックには同じ名前のビルドフックが存在している必要があり、そのビルドフックは add_runscript
をコールしてランタイムフックをイメージに追加します。これらのファイルは初期ユーザ空間で busybox の ash シェルによって実行されます。cleanup フックを除いて全てのフックは HOOKS
設定の順番で実行されます。ランタイムフックには複数の関数を含めることができます:
run_earlyhook
: API ファイルシステムがマウントされカーネルコマンドラインがパースされたときに、この名前の関数が実行されます。一般的に udev など初期ユーザ空間が始まったときに必要になる追加のデーモンはこの関数に置きます。
run_hook
: 初期のフックの後すぐに、この名前の関数が実行されます。一番一般的なフックポイントで、スタックブロックデバイスのアセンブリなどのオペレーションはここで行なって下さい。
run_latehook
: root デバイスがマウントされた後、この名前の関数が実行されます。root デバイスの後のセットアップや /usr
など他のファイルシステムのマウントなどに控えめに使われます。
run_cleanuphook
: できる限り最後に、この名前の関数が実行されます。設定ファイルの HOOKS
の順番とは逆に実行されます。これらのフックは初期のフックによって起動したデーモンのシャットダウンなど、最後のクリーンアップに使われます。
通常のフック
以下は、通常のフックとイメージ生成への影響と関連するランタイムを示した表です。パッケージにカスタムフックを入れることができるので、この表は完全ではないことに注意してください。
busybox init | systemd init | ビルドフック | ランタイムフック (busybox init のみ) |
---|---|---|---|
base | 任意 | 全ての初期ディレクトリをセットアップし、基本のユーティリティとライブラリをインストールします。systemd フックを使用していない場合、このフックは重要な busybox init を提供するので、何をしようとしているか理解していない限りはこのフックを常に1番最初に置いてください。 systemd フックを使用する場合、base フックは busybox のリカバリシェルを提供するだけなので、base の追加は任意となります。 |
– |
udev | systemd | イメージに udevd, udevadm, そして udev ルールの小さなサブセットを追加します。 | udev デーモンを起動して、カーネルからの uevent を処理します; デバイスノードを作成します。ブートプロセスの単純化として、必要なモジュールを明示的に指定する必要をなくすため、udev フックの使用が推奨されています。 |
usr | /usr の分割パーティションのサポートを追加します。詳細は #/usr を別のパーティションに分割する を見てください。 |
本物のルートファイルシステムがマウントされた後に /usr パーティションをマウントします。
| |
resume | ハイバネートイメージにカーネルのコンパイル時デフォルト以外の圧縮アルゴリズムを使用する際に復帰できるようにするために、lzo と lz4 カーネルモジュールを (initramfs に) 追加します。HibernateLocation UEFI 変数で指定されたハイバネートイメージから復帰できるようにするために systemd-hibernate-resume(8) バイナリを追加します。 |
"ハイバネート" (suspend to disk) 状態からの復帰を試みます。詳しい設定方法は ハイバネート を見てください。 | |
btrfs | – | Btrfs を有効にして、Btrfs でフォーマットされた複数のデバイスを使用するために必要なモジュールを設定します。このフックを使うには、btrfs-progs をインストールする必要があります。単一のデバイスで Btrfs を使うだけならこのフックは不要であり、filesystems フックで十分です。 |
udev フックが存在しないときに btrfs device scan を実行してマルチデバイスの Btrfs root ファイルシステムを構築します。このフックを使うには btrfs-progs パッケージが必要です。
|
autodetect | sysfs のスキャンによってモジュールのホワイトリストを作成して initramfs を小さくします。含まれているモジュールが正しく、欠けているものがないか確認してください。自動検知の利点を活かすためにこのフックは他の subsystem フックより前に実行してください。'autodetect' より前に置かれたフックは完全にインストールされます。 | – | |
microcode | Intel 及び AMD プロセッサ向けのマイクロコード早期アップデートファイルを未圧縮 initramfs イメージの先頭に埋め込みます。これは、利用可能であれば /usr/lib/firmware/amd-ucode/ と /usr/lib/firmware/intel-ucode/ にあるマイクロコードファイルを使用します。これらのファイルが利用できない場合は、/boot/amd-ucode.img と /boot/intel-ucode.img を展開して使用します。autodetect フックがこのフックより前に実行される場合、イメージをビルドする際に使用したシステムに搭載されているプロセッサ向けのマイクロコードの早期アップデートファイルのみが追加されます。 このフックは、非推奨となっている --microcode フラグと、プリセットファイルの microcode オプションの機能を置き換えるものです。また、このフックによって、メインの initramfs イメージにマイクロコードのアップデートが埋め込まれるようになるため、マイクロコードを読み込む initrd 行をブートローダーの設定に追加する必要が無くなります。 |
– | |
modconf | /etc/modprobe.d/ と /usr/lib/modprobe.d/ から modprobe 設定ファイルをロードします。 |
– | |
kms | KMS の早期開始 を提供する GPU モジュールを追加します。加えて、一部のノート PC の LCD パネルに組み込まれているプライバシースクリーンに必要なモジュールも追加します。 | – | |
keyboard | キーボードデバイスに必要なモジュールを追加します。あなたが USB キーボードを使っていて、それを初期ユーザ空間で使う必要があるとき (暗号化のパスフレーズを入力したりインタラクティブシェルを使う場合) はこのフックを使って下さい。副作用としてキーボード以外の入力デバイス用のモジュールが追加されることがありますが、困ることはないはずです。 | – | |
keymap | sd-vconsole | /etc/vconsole.conf から initramfs に、指定したコンソールキーマップを追加します。システム暗号化を使用する場合 (特にフルディスク暗号化) 、encrypt フックよりも前に追加するようにしてください。 |
初期ユーザ空間で /etc/vconsole.conf から指定されたキーマップをロードします。
|
consolefont | /etc/vconsole.conf から initramfs に、指定したコンソールフォントを追加します。 |
初期ユーザ空間で /etc/vconsole.conf から指定されたコンソールフォントをロードします。
| |
block | ブロックデバイスのモジュールを追加します。autodetect フックがこのフックより前に実行される場合、このフックはシステム上で使用されているブロックデバイスのモジュールのみを追加します。例外は ahci 、sd_mod 、usb_storage 、uas 、mmc_block 、nvme 、virtio_scsi 、virtio_blk モジュールで、これらは無条件に必ず追加されます。 |
– | |
net | 未実装 | ネットワークデバイスに必要なモジュールを追加します。このフックを使うには mkinitcpio-nfs-utils をインストールしなければなりません。詳細は #net を使う を見てください。 | NFS の root ファイルシステムの管理を提供します。 |
dmraid | ? | fakeRAID root デバイスのサポートを提供します。これを使うには dmraid をインストールする必要があります。コントローラがサポートしている場合、fakeRAID では mdadm_udev フックと一緒に mdadm を使うことが推奨されます。詳細は #RAID を使う を見てください。 | dmraid を使用して fakeRAID ブロックデバイスを検索・構築します。
|
mdadm_udev | udev を使って RAID アレイの構築をサポートします。このフックを使うには mdadm をインストールする必要があります。詳細は RAID#mkinitcpio を設定する を見てください。 | – | |
encrypt | sd-encrypt | dm_crypt カーネルモジュールと cryptsetup ツールをイメージに追加します。これを使うには cryptsetup をインストールする必要があります。 |
暗号化された root パーティションを検知してアンロックします。設定については #ランタイムのカスタマイズ を見て下さい。
sd-encrypt については Dm-crypt/システム設定#sd-encrypt フックを使うを見てください。 |
lvm2 | device mapper カーネルモジュールと lvm ツールをイメージに追加します。これを使うには lvm2 をインストールする必要があります。ルートファイルシステムを LVM 上に置いている場合、このフックは必須です。 |
– | |
filesystems | イメージに必要なファイルシステムモジュールを含めます。ファイルシステムモジュールを MODULES で指定していない限りこのフックが必要になります。 |
– | |
fsck | fsck バイナリとファイルシステム固有のヘルパーを追加し、マウント前にルードデバイスに対して fsck を実行できるようにします。autodetect フックの後ろにこのフックを追加した場合、root ファイルシステムのヘルパーだけが追加されます。このフックの使用は強く推奨されており、/usr パーティションを分割する場合は必須です。このフックを含める場合、初期ユーザ空間でキーボードが動作することを保証するために必要なモジュールも追加することを強く推奨します。このフックを使用するには、カーネルコマンドラインにパラメータ rw を設定する必要があります (議論)。詳細は fsck#ブート時のチェック を見てください。 |
– | |
acpi_override | /usr/initcpio/acpi_override/ と /etc/initcpio/acpi_override/ ディレクトリ内にある ACPI Machine Language (.aml) ファイルを未圧縮早期 initramfs イメージに追加します。そうすることで、カーネルがブートの非常に早い段階で ACPI テーブル (例えば DSDT) をオーバーライドできるようにします。[1] |
– |
ポストフック
ポストフックは /usr/lib/initcpio/post/
(パッケージによって提供されているフック) と /etc/initcpio/post/
(カスタムのフック) に配置されている実行ファイルまたはシェルスクリプトです。これらのファイルは、署名などの追加のタスクを実行するために、イメージが生成された後に実行されます。
各実行ファイルに対して以下の引数が以下の順番で渡されます:
- (イメージに) 使用されているカーネル (状況によってはこの引数が空になる場合があります)
- 生成された initramfs イメージ
- (オプション) 生成されたユニファイドカーネルイメージ
さらに、次の環境変数が設定されます: カーネルの完全なバージョン KERNELVERSION
、起動するためにカーネルを配置する必要のある場所のデフォルト KERNELDESTINATION
。
COMPRESSION
カーネルは、initramfs の圧縮にいくつかの形式をサポートしています: gzip、bzip2、lzma (xz)、xz、lzo (lzop)、lz4、zstd。mkinitcpio はデフォルトで zstd 圧縮イメージを使用します。mkinitcpio は デフォルトで、カーネル 5.9 及びそれ以降に対しては zstd 圧縮を、5.9 より前のカーネルバージョンに対しては gzip を使用します。
提供されている mkinitcpio.conf
には、さまざまな COMPRESSION
オプションがコメントアウトされています。別の圧縮方法に切り替える場合は、コメントを解除し、対応する圧縮ユーティリティがインストールされていることを確認してください。何も指定しない場合は、デフォルトのメソッドが使用されます。非圧縮イメージを作成する場合は、設定ファイルで COMPRESSION=cat
を指定するか、コマンドラインで -z cat
を使用します。
COMPRESSION_OPTIONS
COMPRESSION
で指定したプログラムに渡す追加のフラグを記述します、例:
COMPRESSION_OPTIONS=(-9)
このオプションは空のままにしておくことができます。mkinitcpio は、サポートされている圧縮メソッドに、機能するイメージを生成するために必須なフラグを渡すことを保証しています。
デフォルトの zstd 圧縮では、カスタムカーネルのスペースを節約するために (特にデュアルブート環境で、EFI システムパーティションを /boot
として使用する場合)、--long
オプションは非常に効果的です。ただし、RAM の限られたシステムは、このオプションをした場合に initramfs を解凍できない場合があります。また、-v
オプションは、initramfs の生成中に詳細を見たい場合に必要になるかもしれません。例:
COMPRESSION="zstd" COMPRESSION_OPTIONS=(-v -5 --long)
xz で圧縮レベル -9e
を使用し、ローダブルなカーネルモジュールとファームウェアを解凍しておくことで、圧縮速度が最も遅くなりますが、圧縮率を最大に高めることができます:
COMPRESSION="xz" COMPRESSION_OPTIONS=(-9e) MODULES_DECOMPRESS="yes"
MODULES_DECOMPRESS
MODULES_DECOMPRESS
は、initramfs の作成時にカーネルモジュールとファームウェアのファイルを解凍しておくかを決めます。デフォルトは no
です。
Arch ではカーネルモジュールと linux-firmware を zstd でレベル 19 で圧縮しています。Initramfs でより高い圧縮率を使用する場合、MODULES_DECOMPRESS="yes"
を設定することで、initramfs のサイズをさらに小さくすることができます。しかし、カーネルが個々のモジュールとファームウェアをロード時に解凍する場合よりも、initramfs イメージ全体を解凍するのにより多くの時間が掛かるようになるため、ブートの初期段階で RAM と CPU の使用率を増加させ、RAM 容量が限られていて CPU の性能が低いシステムで悪影響を及ぼします。
ランタイムのカスタマイズ
ランタイム設定オプションはカーネルコマンドラインを通して init
や特定のフックに渡すことができます。カーネルコマンドラインパラメータはブートローダによって与えられることがほとんどです。下で書かれているオプションをカーネルコマンドラインに追加することでデフォルトの挙動を変えることができます。詳しくは カーネルパラメータ や Arch ブートプロセス を見て下さい。
base フックの init
root=
- カーネルコマンドラインで指定する一番重要なパラメータであり、どのデバイスを root デバイスとしてマウントするかを決めます。mkinitcpio は柔軟に様々な形式を使うことができるようになっています。形式の例は 永続的なブロックデバイスの命名#カーネルパラメータ を見てください。
break
break
やbreak=premount
が指定された場合、(フックをロードした後、root ファイルシステムをマウントする前に)init
はブートプロセスを停止してトラブルシューティングに使うことができるインタラクティブシェルを起動します。break=postmount
と指定することで root がマウントされた後にこのシェルを起動することもできます。シェルを終了すると通常通りに起動が行われます。
disablehooks=
disablehooks=hook1[,hook2,...]
を追加すると実行時にフックを無効化します。例:disablehooks=resume
earlymodules=
earlymodules=mod1[,mod2,...]
という風に先にロードするモジュールを指定することでモジュールがロードされる順番を変更することができます (例えば、複数のネットワークインターフェイスの順番を適切に確定したいときなどに使います)。
他のパラメータについては ブートデバッグ や mkinitcpio(8) を見て下さい。
RAID を使う
RAID#mdadm フックを mkinitcpio.conf に追加する を見てください。
net を使う
必要なパッケージ
net
は mkinitcpio-nfs-utils パッケージを必要とします。
カーネルパラメータ
公式のカーネルドキュメントに包括的で最新の情報が載っています。
ip=
このパラメータはカーネルに、デバイスの IP アドレスの設定方法と、IP ルーティングテーブルの設定方法を指定します。コロンで区切った9つまでの引数を指定できます: ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>:<ntp0-ip>
。
カーネルコマンドラインにこのパラメータが存在しなかった場合、全てのフィールドが空とされて、カーネルドキュメントに書かれているデフォルト設定が適用されます。一般的にはカーネルは自動設定を使って全てを設定しようとします。
<autoconf>
パラメータは ip
パラメータの唯一の値として指定できます (前の全ての :
文字を排除)。値が ip=off
や ip=none
の場合、自動設定は行われません。そうでないなら、自動的に設定されます。最も一般的な使い方は ip=dhcp
です。
パラメータの説明は、カーネルドキュメントを参照してください。
例:
ip=127.0.0.1:::::lo:none --> ループバックインターフェイスを有効化。 ip=192.168.1.1:::::eth2:none --> 静的 eth2 インターフェイスを有効化。 ip=:::::eth0:dhcp --> eth0 構成に対して dhcp プロトコルを有効化。
BOOTIF=
複数のネットワークカードを使っているときは、このパラメータに起動するインターフェイスの MAC アドレスを含めることができます。インターフェイスの数字が変わってしまったり、pxelinux の IPAPPEND 2 や IPAPPEND 3 オプションを使うときに便利です。指定しなかった場合、eth0
が使われます。
例:
BOOTIF=01-A1-B2-C3-D4-E5-F6 # 先頭の "01-" と大文字に注意
nfsroot=
nfsroot
パラメータがコマンドラインで指定されなかった場合、デフォルトで /tftpboot/%s
が使われます。
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
パラメータの説明を見るには mkinitcpio -H net
を実行してください。
LVM を使う
root デバイスを LVM 上に置く場合は、LVM に Arch Linux をインストールする#mkinitcpio フックを追加する を見てください。
暗号化されたルートを使う
root を暗号化している場合、どのフックを含めるべきかに関する詳細な情報は Dm-crypt/システム設定#mkinitcpio を見て下さい。
/usr を別のパーティションに分割する
/usr
のパーティションを別にする場合、以下を行う必要があります:
- 起動時にこのパーティションのチェックを実行するために、
fsck
フックを追加して、/etc/fstab
で/usr
のpassno
を2
にする。起動時に/usr
を fsck したい場合は必須です (これはすべてのユーザに推奨されます)。このフックが存在しないと、/usr
は永遠に fsck されません。 - systemd フックを使っていない場合、
usr
フックを追加する。ルートがマウントされた後に/usr
パーティションがマウントされるようになります。
トラブルシューティング
イメージの展開
initramfs イメージの中に何が入っているか気になるときは、イメージを展開して中に入っているファイルを調べることができます。
initramfs イメージは SVR4 CPIO アーカイブであり、find
と bsdcpio
コマンドによって生成されています。また、任意で、カーネルが対応した圧縮方法によって圧縮されています。圧縮方法について詳しくは #COMPRESSION を見て下さい。
mkinitcpio には lsinitcpio(1) というユーティリティが含まれており initramfs イメージの中身を一覧・展開することができます。
イメージ内のファイルを一覧するには:
# lsinitcpio /boot/initramfs-linux.img
カレントディレクトリにファイルを全て展開するには:
# lsinitcpio -x /boot/initramfs-linux.img
イメージの重要なパーツについて読みやすいリストを取得することもできます:
# lsinitcpio -a /boot/initramfs-linux.img
展開して修正を加えたイメージの再圧縮
/usr/bin/mkinitcpio
スクリプトの build_image
関数を以下のパラメータで実行してください:
build_image 出力ファイル 圧縮方式
build_image
関数の内容で新しいスクリプトを作成することでこれを実行できます。
これはカレントディレクトリ内の内容を 出力ファイル
というファイルに圧縮します。
マウントされているのに "/dev must be mounted" と表示される
/dev
がマウントされているかどうか確認するために mkinitcpio は /dev/fd/
が存在するかどうかを確かめます。問題がないようでしたら、手動で作成することができます:
# ln -s /proc/self/fd /dev/
(当然 /proc
のマウントも必要です。mkinitcpio によって次にチェックされます。)
Possibly missing firmware for module XXXX
カーネルのアップデート後に initramfs を再生成する際、以下のような警告が表示されることがあります:
==> WARNING: Possibly missing firmware for module: 'module_name'
default initramfs イメージを生成するときに同じようなメッセージが表示される場合、警告メッセージが言っている通り、追加のファームウェアをインストールする必要があるかもしれません。ほとんどの一般的なファームウェアファイルは linux-firmware パッケージをインストールすることで入手できます。ファームウェアを提供する他のパッケージについては、以下の表を見るか、公式リポジトリや AUR でモジュール名を検索してみてください。
メッセージが fallback initramfs イメージの生成時にのみ表示される場合は、以下の2つの選択肢があります:
- 影響を受けるハードウェアを使用しないことがわかっている場合は、警告を安全に無視できます。
- 警告を抑制したい場合、不足しているファームウェアをインストールできます。メタパッケージ mkinitcpio-firmwareAUR には、ほどんどのオプションのファームウェアが含まれています。あるいは、手動で必要なパッケージをインストールしてください:
モジュール パッケージ aic94xx aic94xx-firmwareAUR ast ast-firmwareAUR bfa linux-firmware-qlogic bnx2x linux-firmware-bnx2x liquidio linux-firmware-liquidio mlxsw_spectrum linux-firmware-mellanox nfp linux-firmware-nfp qed linux-firmware-qlogic qla1280 linux-firmware-qlogic qla2xxx linux-firmware-qlogic wd719x wd719x-firmwareAUR xhci_pci upd72020x-fwAUR
- 警告を取り除きたいが、必要ないファームウェアパッケージのためにシステムの空き領域を無駄にしたくない場合、fallback initramfs の生成を無効化することができます:
/etc/mkinitcpio.d/
内のすべての .preset ファイルで、PRESETS=('default' 'fallback')
行をPRESETS=('default')
に変更してください。- fallback initramfs イメージを削除してください:
# rm /boot/*-fallback.img
。 - ブートローダーの設定ファイルを更新してください。
No PS/2 controller found
一部のマザーボードで (ほとんどの場合、古いもの。しかし、一部の新しいものでも起こります)、i8042 コントローラが自動検出できません。稀なケースですが、キーボードが使えなくなってしまうことがあります。この状況を事前に察知することができます。PS/2 ポートがあり、i8042: PNP: No PS/2 controller found. Probing ports directly
というメッセージが表示される場合、MODULES
配列に atkbd
を追加してください。[2]
標準的なレスキュー手順
不適切な初期 RAM ディスクを使用すると、システムが起動できなくなることがよくあります。 したがって、以下のようなシステムレスキュー手順に従ってください:
あるマシンでは起動できるが他のマシンでは起動できない
mkinitcpio の autodetect
フックは /sys
をスキャンして、ロードされているカーネルモジュールを確認して不要なカーネルモジュールを排除します。/boot
ディレクトリを他のマシンに移動して、初期ユーザー空間でブートが失敗する場合、カーネルモジュールが存在しないために新しいハードウェアが検出されていないのが原因かもしれません。USB 2.0 と 3.0 では必要なカーネルモジュールが異なるので注意してください。
修正するには、ブートローダーから fallback イメージを選択してください (fallback は autodetect
によるフィルタリングがされていません)。起動したら、新しいマシンで mkinitcpio を実行して適切なモジュールでイメージを再生成してください。fallback イメージで起動できない場合、Arch Linux のライブ CD/USB で起動して、chroot し、新しいマシンで mkinitcpio を実行して下さい。それでも駄目な場合、initramfs にモジュールを手動で追加します。
参照
- Linux カーネルドキュメント initramfs, "What is rootfs?"
- Linux カーネルドキュメント initrd
- Wikipedia 記事 initrd