コンテンツにスキップ

「Mkinitcpio」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
Kgx (トーク | 投稿記録)
AshMyzk (トーク | 投稿記録)
同期
 
7行目: 7行目:
[[en:Mkinitcpio]]
[[en:Mkinitcpio]]
[[fr:Mkinitcpio]]
[[fr:Mkinitcpio]]
[[hu:Mkinitcpio]]
[[pt:Mkinitcpio]]
[[pt:Mkinitcpio]]
[[ru:Mkinitcpio]]
[[ru:Mkinitcpio]]
[[zh-hans:Mkinitcpio]]
[[zh-hans:Mkinitcpio]]
{{Related articles start}}
{{Related articles start}}
{{Related|/Initramfs の最小化}}
{{Related|Booster}}
{{Related|Booster}}
{{Related|ブートデバッグ}}
{{Related|ブートデバッグ}}
{{Related|dracut}}
{{Related|カーネルモジュール}}
{{Related|カーネルモジュール}}
{{Related|mkinitcpio/Initramfs の最小化}}
{{Related|systemd}}
{{Related|ユニファイドカーネルイメージ}}
{{Related|ユニファイドカーネルイメージ}}
{{Related|dracut}}
{{Related articles end}}
{{Related articles end}}
[https://gitlab.archlinux.org/archlinux/mkinitcpio/mkinitcpio mkinitcpio] は[[Wikipedia:Initial ramdisk|初期 RAM ディスク]]環境を作成するために使われる Bash スクリプトです。{{man|8|mkinitcpio}} man ページより:


[https://gitlab.archlinux.org/archlinux/mkinitcpio/mkinitcpio mkinitcpio] は、[[initramfs]] イメージを作成するために使用される [[Bash]] スクリプトです。初期 RAM ディスクフェーズで行われる処理の実行方法については、2つあります:
:初期 ram ディスクは非常に小さい環境(初期ユーザー空間)であり、様々なカーネルモジュールをロードして {{ic|init}} にコントロールを移す前に必要なことをセットアップします。これにより、root ファイルシステムを暗号化したりソフトウェア RAID アレイに root を載せたりすることが可能になります。''mkinitcpio'' はカスタムフックによって簡単に拡張することができ、実行時の自動検知など様々な機能を持っています。


; systemd ベースの初期 RAM ファイルシステム
伝統的には、[[Arch ブートプロセス|ブートプロセス]]の初めにハードウェアを検知したりタスクの初期化を行うのはカーネルで、それから root ファイルシステムがマウントされ {{ic|init}} にコントロールが移されます。しかしながら、先端技術が生まれるにつれ、こういった作業は複雑になりつつあります。
: [[systemd]] は、初期 RAM ディスクフェーズの最初に起動されます。通常の systemd ユニットファイルによって、実行されるべき処理が決定されます。[https://www.freedesktop.org/software/systemd/man/latest/bootup.html systemd bootup process] を参照。
: '''長所''':
:* systemd エコシステムの他の部分と密接に統合されており、より一貫していて合理的なブートプロセスとなっています。
:* 特定のブート処理がより効率的に並列化されており、場合によっては全体的なブート時間がより早くなることがあります。
:* {{ic|/etc/crypttab.initramfs}} を使用する [[dm-crypt/システム設定#systemd-cryptsetup-generator を使う|systemd-cryptsetup-generator]] や [[Systemd#GPT パーティションの自動マウント|GPT パーティションの自動マウント]]など、使用できる機能はより包括的です。
: '''短所''':
:* 依存関係が増え、サイズも増加します: 一般に、systemd 関連のバイナリや依存関係が含まれるため、initramfs のサイズは増加します。これにより、ブート時間がわずかに増加する可能性があります。
; Busybox ベースの初期 RAM ファイルシステム
: 実行すべきスクリプト (ランタイムフックと呼ばれます) を探すために初期 RAM ディスクのファイルシステムをスキャンする init スクリプトが開始されます。
: '''長所''':
:* 軽量で、サイズも小さく、依存関係も少ないです。
:* Init スクリプトとランタイムフックは、順番に実行されます。これにより、ブート中に問題が発生した際は、どのステップが原因なのかをより簡単に特定できます。


これらは、{{ic|/etc/mkinitcpio.conf}} 内の {{ic|HOOKS}} 配列に {{ic|systemd}} フックがあるかないかで決まります。詳細は [[#フックのリスト]] を参照してください。
今日、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]。


''mkinitcpio'' は Arch Linux デベロッパーとコミュニティ貢献によって開発されています。[https://gitlab.archlinux.org/archlinux/mkinitcpio/mkinitcpio public Git リポジトリ]を見て下さい
''mkinitcpio'' はArch Linux の[https://archlinux.org/people/developers/ 開発者たち]とコミュニティによる貢献によって開発されています。

初期 ramdisk フェーズ中に行われる様々なタスクがどのように実行されるかには、2つの異なるアプローチがあることに注意が必要です。

; Busybox ベースの初期 ramdisk: 初期 ramdisk のファイルシステムをスキャンし、実行されるスクリプト(この文脈ではランタイムフックと呼ばれる)を開始する init スクリプトが起動されます。
; 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}} の依存パッケージとっているので、大抵すでにインストールされているでしょう
{{Pkg|mkinitcpio}} パッケージは、[[カーネル#公式サポーネル|カーネル]]のパッケージの依存関係なので、ほとんどの環境は既[[インストール]]されています

上級者は {{AUR|mkinitcpio-git}} パッケージで ''mkinitcpio'' の最新開発バージョンをインストールできます。


== イメージ作成とアクティベーション ==
== イメージ作成とアクティベーション ==
46行目: 48行目:
=== 自動生成 ===
=== 自動生成 ===


カーネルがインストールまたはアップグレードされるたびに、[[pacman フック]]は {{ic|/etc/mkinitcpio.d/}} 内に保存される ''.preset'' ファイルを自動的に生成します。例えば、公式の安定版 {{Pkg|linux}} カーネルパッケージの場合は {{ic|linux.preset}} です。プリセットは、様々なパラメーターや出力ファイルの場所を手動で指定する手間を省き、初期 RAM ディスクイメージを作成するために必要な情報のリストです。
カーネルがインストールまたはアップグレードされるたびに、[[pacman フック]]は {{ic|/etc/mkinitcpio.d/}} 内に保存される ''.preset'' ファイルを自動的に生成します。例えば、公式の安定版 {{Pkg|linux}} カーネルパッケージの場合は {{ic|linux.preset}} です。プリセットは、様々なパラメーターや出力ファイルの場所を手動で指定する手間を省き、初期 RAM ディスクイメージを作成するために必要な情報のリストです。デフォルトでは、以下の最初のイメージを作成する命令のみが含まれており、2つ目のイメージを作成するには[[#フォールバック initramfs の生成|明示的に有効化する]]必要があります:
デフォルトでは、2つのイメージを生成するための命令が含まれています:


# ''default'' RAM ディスクイメージ。このイメージの内容は、mkinicpio の [[#設定]] で指定されたディレクティブに従って生成されます。
# ''default'' RAM ディスクイメージ。このイメージの内容は、[[#設定|設定]]で指定されたディレクティブに従って生成されます。
# ''fallback'' RAM ディスクイメージ。作成時に ''autodetect'' フックがスキップされることを除いて上記と同じであるため、ほとんどのシステムをサポートするすべてのモジュールが含まれます。
# ''fallback'' RAM ディスクイメージ。作成時に ''autodetect'' フックがスキップされることを除いて上記と同じであるため、ほとんどのシステムをサポートするすべてのモジュールが含まれます。


プリセットを作成した後、pacman フックは、プリセットで提供された情報を使用して2つのイメージを生成する ''mkinitcpio'' スクリプトを呼び出します。
プリセットを作成した後、pacman フックは、プリセットで提供された情報を使用してイメージを生成する ''mkinitcpio'' スクリプトを呼び出します。


{{Note|''.preset'' ファイルは、カーネルの更新後に initramfs を自動的に再生成するために使用されます。編集するときは注意してください。}}
{{Note|''.preset'' ファイルは、カーネルの更新後に initramfs を自動的に再生成するために使用されます。編集するときは注意してください。}}
62行目: 63行目:
# mkinitcpio -p linux
# mkinitcpio -p linux


既存のすべてのプリセットに基づく initramfs イメージを(再)生成するには、{{ic|-P}}/{{ic|--allpresets}} スイッチを使用してください。これは通常、グローバルな [[#設定]] の変更後にすべての initramfs イメージを再生成するために使用されます:
既存のすべてのプリセットに基づく initramfs イメージを(再)生成するには、{{ic|-P}}/{{ic|--allpresets}} スイッチを使用してください。これは通常、グローバルな[[#設定|設定]]の変更後にすべての initramfs イメージを再生成するために使用されます:


# mkinitcpio -P
# mkinitcpio -P
86行目: 87行目:
== 設定 ==
== 設定 ==


''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}})。
''mkinitcpio'' のプライマリ設定ファイルは、{{ic|/etc/mkinitcpio.conf}} です。ドロップインの設定ファイル (例: {{ic|/etc/mkinitcpio.conf.d/myhooks.conf}}) もサポートされています (ドロップインファイルは、mkinitcpio が {{ic|-c}}/{{ic|--config}} オプションと共に実行された場合や、{{ic|ALL_config}} を含んでいるプリセットを使用した場合には使用されません)。さらに、カーネルパッケージによって提供されるプリセット定義が {{ic|/etc/mkinitcpio.d}} ディレクトリにあります (例: {{ic|/etc/mkinitcpio.d/linux.preset}})。


ユーザーは、設定ファイルの中にある7つの変数を変更できます (詳細は {{man|5|mkinitcpio.conf|VARIABLES}} を見てください):
ユーザーは、設定ファイルの中にある7つの変数を変更できます (詳細は {{man|5|mkinitcpio.conf|VARIABLES}} を見てください):
110行目: 111行目:


{{Note|
{{Note|
* Out-of-tree のファイルシステムを初期ユーザー空間でマウントするつもりであるならば (例えば、そのようなファイルシステムをルートファイルシステムとしてを使用する場合)、そのファイルシステムのモジュール ({{ic|reiser4}} など) を {{ic|MODULES}} 配列に'''追加しておかなければなりません'''。
* Out-of-tree のファイルシステムを初期ユーザー空間でマウントするつもりであるならば (例えば、そのようなファイルシステムをルートファイルシステムとしてを使用する場合)、そのファイルシステムのモジュール ({{ic|zfs}} など) を {{ic|MODULES}} 配列に'''追加しておかなければなりません'''。
* '''encrypt''' や '''sd-encrypt''' を使用し、かつ ''mkinitcpio'' が実行されるシステムと生成されたイメージが使用されるシステムが異なる場合、システムの起動中に LUKS デバイスをアンロックするために必要なキーボードモジュールやファイルシステムを {{ic|MODULES}} 配列に追加する必要があります。例えば、使用するキーファイルが ext2 ファイルシステム上にあるが、''mkinitcpio'' が実行されたときには ext2 ファイルシステムがマウントされていなかった場合、{{ic|ext2}} を追加してください。詳細は [[Dm-crypt/システム設定#cryptkey]] を見てください。
* '''encrypt''' や '''sd-encrypt''' を使用し、かつ ''mkinitcpio'' が実行されるシステムと生成されたイメージが使用されるシステムが異なる場合、システムの起動中に LUKS デバイスをアンロックするために必要なキーボードモジュールやファイルシステムを {{ic|MODULES}} 配列に追加する必要があります。例えば、使用するキーファイルが ext2 ファイルシステム上にあるが、''mkinitcpio'' が実行されたときには ext2 ファイルシステムがマウントされていなかった場合、{{ic|ext2}} を追加してください。詳細は [[Dm-crypt/システム設定#cryptkey]] を見てください。
* LUKS デバイスをアンロックするために USB 3 ハブのキーボードを使いたい場合、{{ic|usbhid xhci_hcd}} を追加してください。
* LUKS デバイスをアンロックするために USB 3 ハブのキーボードを使いたい場合、{{ic|usbhid xhci_hcd}} を追加してください。一部のノート PC では、搭載されているキーボードを使用するために {{ic|i2c_hid_acpi}} モジュールが必要です
* ドッキングステーションに接続されているディスプレイを使用する場合、initrd の出力を見えるようにするためにあなたのグラフィックカードのモジュールを追加する必要があるかもしれません (例: ほとんどの Intel カードでは {{ic|i915}})。
* ドッキングステーションに接続されているディスプレイを使用する場合、initrd の出力を見えるようにするためにあなたのグラフィックカードのモジュールを追加する必要があるかもしれません (例: ほとんどの Intel カードでは {{ic|i915}})。
}}
}}
128行目: 129行目:
=== HOOKS ===
=== HOOKS ===


{{ic|HOOKS}} 配列は設定ファイルの中で一番重要な設定です。フックはイメージに追加されものを記述る小さなスクリプトです。フックによってはデーモンを起動したりスタックしたブロックデバイスを集めたりするめのランイムコンポネントを含んでるものもあります。フックは名前によって参照され、設定ファイルの {{ic|HOOKS}} にある順番通りに実行されます。
{{ic|HOOKS}} 配列は設定ファイルの中で最も重要な設定です。フック、initramfs イメージに何を追加かが記述されている小さなスクリプトです。一部のフックには、通称ランタイムフックというものが付いおり、これはデーモンを起動したりスタックブロックデバイスをアセンブルしたりといっタートアップ機能提供しています。


フックは名前で指定し、設定ファイル内の {{ic|HOOKS}} 配列に記述した通りの順番で実行されます。自分が何をしているのか理解していない限り、[[#フックのリスト|フックのリスト]]の推奨される順番に従うのが良いです。
ほとんどのシンプルな単一ディスク環境では、デフォルトの {{ic|HOOKS}} 設定で十分なはずです。[[LVM]]、[[RAID]]、[[dm-crypt]] などのスタックルートデバイスやマルチブロックデバイスを使う時は、関連する wiki ページを見て必要な設定を調べて下さい。

ほとんどのシンプルな単一ディスク環境では、デフォルトの {{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}} 関数にはイメージに追加すモジュール、ファイル、バイナリ記述ます。これらのアイテムの追加を容易にする {{man|8|mkinitcpio}} による API が用意されています。{{ic|help}} 関数はフックの役割を出力します。
ビルドフック (イントールフックとも) ''mkinitcpio'' の実行に bash シェルによって source されるシェスクリプトァイルであり、通常、{{ic|build}} と {{ic|help}} という2つの関数を含んでいます。{{ic|build}} 関数には、initramfs イメージに追加すべきモジュール、バイナリ、その他のファイルが記述されています。これらのアイテムの追加を用意にする API ({{man|8|mkinitcpio}} にドキュメント化されています) が存在しています。{{ic|help}} 関数は、そのフックの機能と使用方法の短い説明文を出力します。


すべてのフックを一覧するには:
すべてのフックを一覧するには:
143行目: 146行目:


$ mkinitcpio -H udev
$ mkinitcpio -H udev

ビルドフックは {{ic|/usr/lib/initcpio/install/}} にあり、カスタムのビルドフックは {{ic|/etc/initcpio/install/}} に置くことができます。


==== ランタイムフック ====
==== ランタイムフック ====

{{ic|HOOKS}} にあるビルドフックには、同じ名前のランタイムフックが付属している場合があります。ランタイムフックとは、initramfs フェーズで busybox の {{ic|ash}} シェルによって source されるシェルスクリプトです。これは、デーモンの起動、スタックドブロックデバイスのアセンブルといった、スタートアップ処理を担います。ビルドフックは、{{ic|add_runscript}} を呼び出すことで、対応するランタイムフックをインストールします。ランタイムフックには、複数の機能が含まれていることがあります:


ランタイムフックは {{ic|/usr/lib/initcpio/hooks/}} にあります。カスタムランタイムフックは {{ic|/etc/initcpio/hooks/}} に配置します。全てのランタイムフックには同じ名前のビルドフックが存在している必要があり、そのビルドフックは {{ic|add_runscript}} をコールしてランタイムフックをイメージに追加します。これらのファイルは初期ユーザ空間で busybox の ash シェルによって実行されます。cleanup フックを除いて全てのフックは {{ic|HOOKS}} 設定の順番で実行されます。ランタイムフックには複数の関数を含めることができます:
ランタイムフックは {{ic|/usr/lib/initcpio/hooks/}} にあります。カスタムランタイムフックは {{ic|/etc/initcpio/hooks/}} に配置します。全てのランタイムフックには同じ名前のビルドフックが存在している必要があり、そのビルドフックは {{ic|add_runscript}} をコールしてランタイムフックをイメージに追加します。これらのファイルは初期ユーザ空間で busybox の ash シェルによって実行されます。cleanup フックを除いて全てのフックは {{ic|HOOKS}} 設定の順番で実行されます。ランタイムフックには複数の関数を含めることができます:
156行目: 163行目:
{{ic|run_cleanuphook}}: できる限り最後に、この名前の関数が実行されます。設定ファイルの {{ic|HOOKS}} の順番とは逆に実行されます。これらのフックは初期のフックによって起動したデーモンのシャットダウンなど、最後のクリーンアップに使われます。
{{ic|run_cleanuphook}}: できる限り最後に、この名前の関数が実行されます。設定ファイルの {{ic|HOOKS}} の順番とは逆に実行されます。これらのフックは初期のフックによって起動したデーモンのシャットダウンなど、最後のクリーンアップに使われます。


{{ic|run_cleanuphook}} を除き、これらの関数は、{{ic|HOOKS}} 配列に記述された、対応するビルドフックと同じ順番で実行されます。ランタイムフックは {{ic|/usr/lib/initcpio/hooks/}} に配置されており、カスタムのランタイムフックは {{ic|/etc/initcpio/hooks/}} に置くことができます。
{{Note|ランタイムフックは busybox init でのみ使用されます。 '''systemd''' フックは systemd ベースの init をトリガーします。これはランタイムフックを実行せず、代わりに systemd ユニットを使用します。}}


{{Note|ランタイムフックは busybox init でのみ使用されます。systemd ベースの initramfs ({{ic|HOOKS}} 配列に {{ic|systemd}} が存在する場合) では、ランタイムフックは実行されず、代わりに systemd ユニットが使用されます。}}
==== 通常のフック ====


==== ポストフック ====
以下は、通常のフックとイメージ生成への影響と関連するランタイムを示した表です。パッケージにカスタムフックを入れることができるので、この表は完全ではないことに注意してください。

ポストフックとは、署名などといった追加の処理を行うために、イメージが (再) 生成された後に実行されるシェルスクリプトです。

スクリプトには、以下の引数が以下の順番で渡されます:

# 使用された'''カーネル''' (一部の状況では空になる場合があります)
# 生成された '''initramfs イメージ'''
# (オプション) 生成された'''ユニファイドカーネルイメージ'''

さらに、以下の環境変数も設定されます:

{{ic|KERNELVERSION}}: カーネルの完全なバージョン
{{ic|KERNELDESTINATION}}: カーネルが起動されるために配置されるべきデフォルトの場所。

ポストフックは、{{ic|/usr/lib/initcpio/post/}} (パッケージによって提供されているフック) と {{ic|/etc/initcpio/post/}} (カスタムのフック) に置かれます。

==== フックのリスト ====

以下は、フックと、それらがイメージの作成とランタイムに与える影響をまとめた表です。


{| 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|'''base'''}} || {{Grey|''任意''}} || 全ての初期ディレクトリをセットアップし、基本のユーティリティとライブラリをインストールします。'''systemd''' フックを使用していない場合このフックは重要な busybox init を提供するので、何をしようとしているか理解していない限りはこのフックを常に1番最初に置いてください。

'''systemd''' フックを使用する際は、このフックは busybox のリカバリシェルを提供するだけなので、任意です。シェルを使用するには、'''base''' を有効化することに加え、{{ic|SYSTEMD_SULOGIN_FORCE{{=}}1}} を[[カーネルパラメータ]]に追加する必要があります。
| {{-}}
| {{-}}
|-
|-
179行目: 207行目:
|colspan="2" {{C|'''autodetect'''}} || sysfs のスキャンによってモジュールのホワイトリストを作成して initramfs を小さくします。含まれているモジュールが正しく、欠けているものがないか確認してください。自動検知の利点を活かすためにこのフックは他の subsystem フックより前に実行してください。'autodetect' より前に置かれたフックは完全にインストールされます。 || {{-}}
|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" {{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}} を展開して使用します。

'''autodetect''' フックがこのフックより前に実行される場合、イメージをビルドする際に使用したシステムに搭載されているプロセッサ向けのマイクロコードの早期アップデートファイルのみが追加されます。

このフックは、非推奨となっている {{ic|--microcode}} フラグと、プリセットファイルの {{ic|microcode}} オプションの機能を置き換えるものです。また、このフックによって、メインの initramfs イメージにマイクロコードのアップデートが埋め込まれるようになるため、マイクロコードを読み込む {{ic|initrd}} 行をブートローダーの設定に追加する必要が無くなります。
| {{-}}
|-
|-
|colspan="2" {{C|'''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 設定ファイルをロードします。 || {{-}}
210行目: 243行目:
|colspan="2" {{C|'''filesystems'''}} || イメージに必要なファイルシステムモジュールを含めます。ファイルシステムモジュールを {{ic|MODULES}} で指定していない限りこのフックが'''必要'''になります。 || {{-}}
|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|'''fsck'''}} || fsck バイナリとファイルシステム固有のヘルパーを追加し、マウント前にルードデバイスに対して fsck を実行できるようにします。'''autodetect''' フックの後ろにこのフックを追加した場合、root ファイルシステムのヘルパーだけが追加されます。このフックの使用は'''強く'''推奨されており、{{ic|/usr}} パーティションを分割する場合は必須です。このフックを含める場合、初期ユーザ空間でキーボードが動作することを保証するために必要なモジュールも追加することを強く推奨します。

このフックを使用するには、[[カーネルコマンドライン]]にパラメータ {{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] || {{-}}
|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] || {{-}}
|}
|}


{{Note|パッケージがカスタムのフックを提供していることがあるため、この表は完全ではありません。}}
==== ポストフック ====

ポストフックは {{ic|/usr/lib/initcpio/post/}} (パッケージによって提供されているフック) と {{ic|/etc/initcpio/post/}} (カスタムのフック) に配置されている実行ファイルまたはシェルスクリプトです。これらのファイルは、署名などの追加のタスクを実行するために、イメージが生成された後に実行されます。

各実行ファイルに対して以下の引数が以下の順番で渡されます:

# (イメージに) 使用されている'''カーネル''' (状況によってはこの引数が空になる場合があります)
# 生成された '''initramfs イメージ'''
# (オプション) 生成された'''ユニファイドカーネルイメージ'''

さらに、次の環境変数が設定されます: カーネルの完全なバージョン {{ic|KERNELVERSION}}、起動するためにカーネルを配置する必要のある場所のデフォルト {{ic|KERNELDESTINATION}}。


=== COMPRESSION ===
=== COMPRESSION ===
352行目: 378行目:
== ヒントとテクニック ==
== ヒントとテクニック ==


=== フォールバック initramfs の生成を無効化する ===
=== フォールバック initramfs の生成 ===


フォールバックイメージの生成は以下の方法で無効化できます:
[[#自動生成|フォールバック]] initramfs の生成は、デフォルトで無効化されています。有効化するには:


* {{ic|/etc/mkinitcpio.d/}} 内の対応する ''.preset'' ファイル内の {{ic|1=PRESETS=('default' 'fallback')}} 行 {{ic|1=PRESETS=('default')}} に変更する
* {{ic|/etc/mkinitcpio.d/}} 内のそれぞれの '''.preset''' ファイルを修正する
** {{ic|1=PRESETS=('default')}} を無効化し、代わりに {{ic|1=PRESETS=('default' 'fallback')}} を有効化する
* {{ic|/boot/}} 内のフォールバック initramfs イメージを削除する。
** {{ic|1=fallback_image="/boot/initramfs-linux-fallback.img"}} を有効化する
* [[ブートローダー]]の設定を更新する。
** {{ic|1=fallback_options="--skiphooks autodetect"}} を有効化する
* initramfs を再生成する
* [[ブートローダー]]の設定を更新する


{{Warning|フォールバック initramfs の生成を全て効化すると、デフォルトの initramfs でシステムの起動が失敗した場合に、システムを起動するためのもう一つの手段が失われることになります。上記の手順を実行する前に、システムリカバリのための起動可能[[USB インストールメディア|インストールメディア]]を作成しておいてください。}}
{{Note|フォールバック initramfs と、デフォルトの initramfs でシステムの起動が失敗した場合に、システムを起動するためのもう一つの手段が失われることになります。システムリカバリのための起動可能[[USB インストールメディア|インストールメディア]]を作成しておいてください。}}


== トラブルシューティング ==
== トラブルシューティング ==
368行目: 397行目:
initramfs イメージの中に何が入っているか気になるときは、イメージを展開して中に入っているファイルを調べることができます。
initramfs イメージの中に何が入っているか気になるときは、イメージを展開して中に入っているファイルを調べることができます。


initramfs イメージは SVR4 CPIO アーカイブであり、{{ic|find}}{{ic|bsdcpio}} コマンドによって生成されています。また、任意で、カーネルが対応した圧縮方法によって圧縮されています。圧縮方法について詳しくは [[#COMPRESSION]] を見て下さい。
initramfs イメージは SVR4 CPIO アーカイブであり、''find''''bsdcpio'' コマンドによって生成されています。また、任意で、カーネルが対応した圧縮方法によって圧縮されています。圧縮方法について詳しくは [[#COMPRESSION]] を見て下さい。


''mkinitcpio'' には {{man|1|lsinitcpio}} というユーティリティが含まれており initramfs イメージの中身を一覧・展開することができます。
{{Pkg|mkinitcpio}} パッケージには {{man|1|lsinitcpio}} というユーティリティが含まれており initramfs イメージの中身を一覧・展開することができます。


イメージ内のファイルを一覧するには:
イメージ内のファイルを一覧するには:
378行目: 407行目:
カレントディレクトリにファイルを全て展開するには:
カレントディレクトリにファイルを全て展開するには:


# lsinitcpio -x /boot/initramfs-linux.img
# lsinitcpio --extract /boot/initramfs-linux.img


イメージの重要なパーツについて読みやすいリストを取得することもできます:
イメージの重要なパーツについて読みやすいリストを取得することもできます (カーネルバージョン、初期 CPIO の存在、含まれているモジュールやバイナリなど):


# lsinitcpio -a /boot/initramfs-linux.img
# lsinitcpio --analyze /boot/initramfs-linux.img


=== 展開して修正を加えたイメージの再圧縮 ===
=== 展開して修正を加えたイメージの再圧縮 ===
425行目: 454行目:
| bfa || {{Pkg|linux-firmware-qlogic}}
| bfa || {{Pkg|linux-firmware-qlogic}}
|-
|-
| bnx2x || {{Pkg|linux-firmware-bnx2x}}
| bnx2x || {{Pkg|linux-firmware-broadcom}}
|-
|-
| liquidio || {{Pkg|linux-firmware-liquidio}}
| liquidio || {{Pkg|linux-firmware-liquidio}}
433行目: 462行目:
| nfp || {{Pkg|linux-firmware-nfp}}
| nfp || {{Pkg|linux-firmware-nfp}}
|-
|-
| qat_420xx || {{Pkg|linux-firmware-intel}}
| qat_420xx || ファームウェアはまだ利用できません。[https://intel.github.io/quickassist/RN/In-Tree/in_tree_firmware_RN.html?highlight=qat_420xx#id6] を参照。
|-
|-
| qed || {{Pkg|linux-firmware-qlogic}}
| qed || {{Pkg|linux-firmware-qlogic}}
443行目: 472行目:
| wd719x || {{AUR|wd719x-firmware}}
| wd719x || {{AUR|wd719x-firmware}}
|-
|-
| xhci_pci || {{AUR|upd72020x-fw}}
| xhci_pci<br>xhci_pci_renesas || {{AUR|upd72020x-fw}}
|}
|}
* 警告を取り除きたいが、必要ないファームウェアパッケージのためにシステムの空き領域を無駄にしたくない場合、[[#フォールバック initramfs の生成を無効化する|フォールバック initramfs の生成を無効化する]]ことができます。
* 警告を取り除きたいが、必要ないファームウェアパッケージのためにシステムの空き領域を無駄にしたくない場合、[[#フォールバック initramfs の生成|フォールバック initramfs の生成]]を無効化することができます。


利用できないファームウェアに関しては、ダミーのファイルを作成することで警告を消すことができます。例えば:
利用できないファームウェアに関しては、ダミーのファイルを作成することで警告を消すことができます。例えば:


# echo "Device not available" > /usr/lib/firmware/qat_420xx.bin
# echo 'Silence the "Possibly missing firmware for module" message' \
# echo "Device not available" > /usr/lib/firmware/qat_420xx_mmp.bin
| tee /usr/lib/firmware/qat_6xxx{,_mmp}.bin >/dev/null


=== No PS/2 controller found ===
=== No PS/2 controller found ===
456行目: 485行目:
一部のマザーボードで (ほとんどの場合、古いもの。しかし、一部の新しいものでも起こります)、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/]
一部のマザーボードで (ほとんどの場合、古いもの。しかし、一部の新しいものでも起こります)、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 ディスクを使用して、システムが起動できなくなった場合、以下のようなシステムレスキュー手順に従ってください:

==== あるマシンでは起動できるが他のマシンでは起動できない ====


''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|手動]]で追加します。

=== コンソールにアクセスできない、ルートアカウントがロックされている ===

{{ic|systemd}} フックは、[https://gitlab.archlinux.org/archlinux/packaging/packages/systemd/-/commit/292cdf8a2f7dd7c6c7d91d2b59617391935c837c (initramfs の) ルートアカウントを無効化します]。緊急シェルを有効化するには、一時的に {{ic|SYSTEMD_SULOGIN_FORCE{{=}}1}} を[[カーネルパラメータ]]に追加してください。

あるいは、{{AUR|initcpio-hook-shadowcopy}} を使う方法もあります。このパッケージをインストールし、{{ic|/etc/mkinitcpio.conf}} の {{ic|systemd}} フックの後に {{ic|shadowcopy}} フックを追加し、{{ic|mkinitcpio -P}} で initramfs を再生成してください。ドキュメントは [https://github.com/iTrooz/initcpio-hook-shadowcopy GitHub リポジトリ]にあります。


== 参照 ==
== 参照 ==
472行目: 503行目:
* Wikipedia 記事 [[wikipedia:ja:initrd|initrd]]
* Wikipedia 記事 [[wikipedia:ja:initrd|initrd]]


{{TranslationStatus|mkinitcpio|2024-12-27|823193}}
{{TranslationStatus|mkinitcpio|2026-05-03|870746}}

2026年5月3日 (日) 19:19時点における最新版

mkinitcpio は、initramfs イメージを作成するために使用される Bash スクリプトです。初期 RAM ディスクフェーズで行われる処理の実行方法については、2つあります:

systemd ベースの初期 RAM ファイルシステム
systemd は、初期 RAM ディスクフェーズの最初に起動されます。通常の systemd ユニットファイルによって、実行されるべき処理が決定されます。systemd bootup process を参照。
長所:
  • systemd エコシステムの他の部分と密接に統合されており、より一貫していて合理的なブートプロセスとなっています。
  • 特定のブート処理がより効率的に並列化されており、場合によっては全体的なブート時間がより早くなることがあります。
  • /etc/crypttab.initramfs を使用する systemd-cryptsetup-generatorGPT パーティションの自動マウントなど、使用できる機能はより包括的です。
短所:
  • 依存関係が増え、サイズも増加します: 一般に、systemd 関連のバイナリや依存関係が含まれるため、initramfs のサイズは増加します。これにより、ブート時間がわずかに増加する可能性があります。
Busybox ベースの初期 RAM ファイルシステム
実行すべきスクリプト (ランタイムフックと呼ばれます) を探すために初期 RAM ディスクのファイルシステムをスキャンする init スクリプトが開始されます。
長所:
  • 軽量で、サイズも小さく、依存関係も少ないです。
  • Init スクリプトとランタイムフックは、順番に実行されます。これにより、ブート中に問題が発生した際は、どのステップが原因なのかをより簡単に特定できます。

これらは、/etc/mkinitcpio.conf 内の HOOKS 配列に systemd フックがあるかないかで決まります。詳細は #フックのリスト を参照してください。

mkinitcpio は、Arch Linux の開発者たちとコミュニティによる貢献によって開発されています。

インストール

mkinitcpio パッケージは、カーネルのパッケージの依存関係なので、ほとんどの環境では既にインストールされています。

イメージ作成とアクティベーション

自動生成

カーネルがインストールまたはアップグレードされるたびに、pacman フック/etc/mkinitcpio.d/ 内に保存される .preset ファイルを自動的に生成します。例えば、公式の安定版 linux カーネルパッケージの場合は linux.preset です。プリセットは、様々なパラメーターや出力ファイルの場所を手動で指定する手間を省き、初期 RAM ディスクイメージを作成するために必要な情報のリストです。デフォルトでは、以下の最初のイメージを作成する命令のみが含まれており、2つ目のイメージを作成するには明示的に有効化する必要があります:

  1. default RAM ディスクイメージ。このイメージの内容は、設定で指定されたディレクティブに従って生成されます。
  2. fallback RAM ディスクイメージ。作成時に autodetect フックがスキップされることを除いて上記と同じであるため、ほとんどのシステムをサポートするすべてのモジュールが含まれます。

プリセットを作成した後、pacman フックは、プリセットで提供された情報を使用してイメージを生成する mkinitcpio スクリプトを呼び出します。

ノート .preset ファイルは、カーネルの更新後に initramfs を自動的に再生成するために使用されます。編集するときは注意してください。

手動生成

スクリプトを手動で実行するには、マニュアルページ mkinitcpio(8) で手順を確認してください。特に、カーネルパッケージによって提供されるプリセットに基づく initramfs イメージを(再)生成するには、使用するプリセットを -p/--preset オプションで指定してください。例えば、linux パッケージの場合、次のコマンドを使用してください:

# mkinitcpio -p linux

既存のすべてのプリセットに基づく initramfs イメージを(再)生成するには、-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 は、それ自体または systemd-ukify 経由でユニファイドカーネルイメージ (UKI) を作成することができます。systemd-ukify が存在しないか、--no-ukify によって明示的に無効化されている場合、UKI は mkinitcpio 自体によって構築されます。この場合、ukify の高度な機能は利用できません。

UKI 生成については ユニファイドカーネルイメージ を参照してください。

設定

mkinitcpio のプライマリ設定ファイルは、/etc/mkinitcpio.conf です。ドロップインの設定ファイル (例: /etc/mkinitcpio.conf.d/myhooks.conf) もサポートされています (ドロップインファイルは、mkinitcpio が -c/--config オプションと共に実行された場合や、ALL_config を含んでいるプリセットを使用した場合には使用されません)。さらに、カーネルパッケージによって提供されるプリセット定義が /etc/mkinitcpio.d ディレクトリにあります (例: /etc/mkinitcpio.d/linux.preset)。

ユーザーは、設定ファイルの中にある7つの変数を変更できます (詳細は mkinitcpio.conf(5) § VARIABLES を見てください):

MODULES
ブートフックが実行される前にロードされるカーネルモジュール。
BINARIES
initramfs イメージに含める追加のバイナリ。
FILES
initramfs イメージに含める追加のファイル。
HOOKS
フックは初期 RAM ディスクで実行するスクリプトです。
COMPRESSION
initramfs イメージを圧縮する際に使用されます。
COMPRESSION_OPTIONS
COMPRESSION のプログラムに渡す追加の引数。この設定の使用は推奨されません。mkinitcpio は圧縮プログラムに対する特殊な要件を処理するため (例: xz には --check=crc32 を指定します)、誤って利用するとシステムが起動できなくなる可能性があります。
MODULES_DECOMPRESS
ロード可能なカーネルモジュールとファームウェアのファイルを解凍しておくか、もとの圧縮した状態のままにしておくかを設定します。
ノート
  • システムが必要とする場合があるフックのいくつか (lvm2mdadm_udevencrypt など) は、デフォルトで有効化されていません。これに関する指示は #HOOKS セクションを注意深く読んでください。
  • バージョン 36 より前の mkinitcpio によって作成されたプリセットファイルでは、ALL_config 変数が定義されており、この変数が存在しているとドロップインの設定ファイルが読み込まれません。ドロップインファイルを有効化するには、古いプリセットファイルにある ALL_config="/etc/mkinitcpio.conf" 行をコメントアウトしてください。

MODULES

MODULES 配列では、何か他のことが行われる前にロードするモジュールを指定します。

モジュールの後ろに ? を付けると、モジュールが見つからなかったときでもエラーを投げません。これは、フックや設定ファイルにリストアップされたモジュールを含んでコンパイルするカスタムカーネルで有益かもしれません。

ノート
  • Out-of-tree のファイルシステムを初期ユーザー空間でマウントするつもりであるならば (例えば、そのようなファイルシステムをルートファイルシステムとしてを使用する場合)、そのファイルシステムのモジュール (zfs など) を MODULES 配列に追加しておかなければなりません
  • encryptsd-encrypt を使用し、かつ mkinitcpio が実行されるシステムと生成されたイメージが使用されるシステムが異なる場合、システムの起動中に LUKS デバイスをアンロックするために必要なキーボードモジュールやファイルシステムを MODULES 配列に追加する必要があります。例えば、使用するキーファイルが ext2 ファイルシステム上にあるが、mkinitcpio が実行されたときには ext2 ファイルシステムがマウントされていなかった場合、ext2 を追加してください。詳細は Dm-crypt/システム設定#cryptkey を見てください。
  • LUKS デバイスをアンロックするために USB 3 ハブのキーボードを使いたい場合、usbhid xhci_hcd を追加してください。一部のノート PC では、搭載されているキーボードを使用するために i2c_hid_acpi モジュールが必要です。
  • ドッキングステーションに接続されているディスプレイを使用する場合、initrd の出力を見えるようにするためにあなたのグラフィックカードのモジュールを追加する必要があるかもしれません (例: ほとんどの Intel カードでは i915)。

BINARIES と FILES

以下のオプションを使ってイメージにファイルを追加することができます。BINARIESFILES はフックが実行される前に追加され、フックによって使用/提供されるファイルを上書きすることがあります。BINARIES は標準の PATH に自動で配置され、依存関係がパースされます。つまり必要なライブラリも全て追加されます。FILESそのままの状態で追加されます。例:

FILES=(/etc/modprobe.d/modprobe.conf)
BINARIES=(kexec)

BINARIESFILES は両方とも Bash 配列です。なので、スペースで区切ることで複数のエントリを追加することができます。

HOOKS

HOOKS 配列は、設定ファイルの中で最も重要な設定です。フックとは、initramfs イメージに何を追加するかが記述されている小さなスクリプトです。一部のフックには、通称ランタイムフックというものが付いており、これはデーモンを起動したり、スタックドブロックデバイスをアセンブルしたりといったスタートアップ機能を提供しています。

フックは名前で指定し、設定ファイル内の HOOKS 配列に記述した通りの順番で実行されます。自分が何をしているのか理解していない限り、フックのリストの推奨される順番に従うのが良いです。

ほとんどのシンプルな単一ディスク環境では、デフォルトの HOOKS 設定で十分なはずです。ルートファイルシステムが、LVMRAIDdm-crypt などといった、スタックドデバイスベースであったり、複数のデバイスにまたがる場合は、関連する wiki ページを見て必要な設定を調べて下さい。

ビルドフック

ビルドフック (インストールフックとも) とは、mkinitcpio の実行中に bash シェルによって source されるシェルスクリプトファイルであり、通常、buildhelp という2つの関数を含んでいます。build 関数には、initramfs イメージに追加すべきモジュール、バイナリ、その他のファイルが記述されています。これらのアイテムの追加を用意にする API (mkinitcpio(8) にドキュメント化されています) が存在しています。help 関数は、そのフックの機能と使用方法の短い説明文を出力します。

すべてのフックを一覧するには:

$ mkinitcpio -L

特定のフックのヘルプを出力するには mkinitcpio-H/--hookhelp オプションを使って下さい、例えば:

$ mkinitcpio -H udev

ビルドフックは /usr/lib/initcpio/install/ にあり、カスタムのビルドフックは /etc/initcpio/install/ に置くことができます。

ランタイムフック

HOOKS にあるビルドフックには、同じ名前のランタイムフックが付属している場合があります。ランタイムフックとは、initramfs フェーズで busybox の ash シェルによって source されるシェルスクリプトです。これは、デーモンの起動、スタックドブロックデバイスのアセンブルといった、スタートアップ処理を担います。ビルドフックは、add_runscript を呼び出すことで、対応するランタイムフックをインストールします。ランタイムフックには、複数の機能が含まれていることがあります:

ランタイムフックは /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 の順番とは逆に実行されます。これらのフックは初期のフックによって起動したデーモンのシャットダウンなど、最後のクリーンアップに使われます。

run_cleanuphook を除き、これらの関数は、HOOKS 配列に記述された、対応するビルドフックと同じ順番で実行されます。ランタイムフックは /usr/lib/initcpio/hooks/ に配置されており、カスタムのランタイムフックは /etc/initcpio/hooks/ に置くことができます。

ノート ランタイムフックは busybox init でのみ使用されます。systemd ベースの initramfs (HOOKS 配列に systemd が存在する場合) では、ランタイムフックは実行されず、代わりに systemd ユニットが使用されます。

ポストフック

ポストフックとは、署名などといった追加の処理を行うために、イメージが (再) 生成された後に実行されるシェルスクリプトです。

スクリプトには、以下の引数が以下の順番で渡されます:

  1. 使用されたカーネル (一部の状況では空になる場合があります)
  2. 生成された initramfs イメージ
  3. (オプション) 生成されたユニファイドカーネルイメージ

さらに、以下の環境変数も設定されます:

KERNELVERSION: カーネルの完全なバージョン KERNELDESTINATION: カーネルが起動されるために配置されるべきデフォルトの場所。

ポストフックは、/usr/lib/initcpio/post/ (パッケージによって提供されているフック) と /etc/initcpio/post/ (カスタムのフック) に置かれます。

フックのリスト

以下は、フックと、それらがイメージの作成とランタイムに与える影響をまとめた表です。

busybox init systemd init ビルドフック ランタイムフック (busybox init のみ)
base 任意 全ての初期ディレクトリをセットアップし、基本のユーティリティとライブラリをインストールします。systemd フックを使用していない場合にこのフックは重要な busybox init を提供するので、何をしようとしているか理解していない限りはこのフックを常に1番最初に置いてください。

systemd フックを使用する際は、このフックは busybox のリカバリシェルを提供するだけなので、任意です。シェルを使用するには、base を有効化することに加え、SYSTEMD_SULOGIN_FORCE=1カーネルパラメータに追加する必要があります。

udev systemd イメージに udevd, udevadm, そして udev ルールの小さなサブセットを追加します。 udev デーモンを起動して、カーネルからの uevent を処理します; デバイスノードを作成します。ブートプロセスの単純化として、必要なモジュールを明示的に指定する必要をなくすため、udev フックの使用が推奨されています。
usr /usr の分割パーティションのサポートを追加します。詳細は #/usr を別のパーティションに分割する を見てください。 本物のルートファイルシステムがマウントされた後に /usr パーティションをマウントします。
resume ハイバネートイメージにカーネルのコンパイル時デフォルト以外の圧縮アルゴリズムを使用する際に復帰できるようにするために、lzolz4 カーネルモジュールを (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 キーボードを使っていて、それを初期ユーザ空間で使う必要があるとき (暗号化のパスフレーズを入力したりインタラクティブシェルを使う場合) はこのフックを使って下さい。副作用としてキーボード以外の入力デバイス用のモジュールが追加されることがありますが、困ることはないはずです。
ノート 異なるハードウェア構成で起動されるシステム(たとえば、外部キーボードと内部キーボードを備えたラップトップまたは ヘッドレスシステム) の場合、起動時にキーボードを利用できるようにするために (例えば、encrypt フックが使用されている場合に暗号化済みデバイスをアンロックするために)、このフックを autodetect の前に配置する必要があります。
keymap sd-vconsole /etc/vconsole.conf から initramfs に、指定したコンソールキーマップを追加します。システム暗号化を使用する場合 (特にフルディスク暗号化) 、encrypt フックよりも前に追加するようにしてください。 初期ユーザ空間で /etc/vconsole.conf から指定されたキーマップをロードします。
consolefont /etc/vconsole.conf から initramfs に、指定したコンソールフォントを追加します。 初期ユーザ空間で /etc/vconsole.conf から指定されたコンソールフォントをロードします。
block ブロックデバイスのモジュールを追加します。autodetect フックがこのフックより前に実行される場合、このフックはシステム上で使用されているブロックデバイスのモジュールのみを追加します。例外は ahcisd_modusb_storageuasmmc_blocknvmevirtio_scsivirtio_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 をインストールする必要があります。
ノート 暗号化されたデバイスを起動時にアンロックするための keyboard フックの注意書きや、ファイルをアンロックする際はファイルシステムについての #MODULES にある注意書きを見てください。
暗号化された 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]
ノート パッケージがカスタムのフックを提供していることがあるため、この表は完全ではありません。

COMPRESSION

カーネルは、initramfs の圧縮にいくつかの形式をサポートしています: gzipbzip2、lzma (xz)、xz、lzo (lzop)、lz4zstd。mkinitcpio はデフォルトで zstd 圧縮イメージを使用します。mkinitcpio は デフォルトで、カーネル 5.9 及びそれ以降に対しては zstd 圧縮を、5.9 より前のカーネルバージョンに対しては gzip を使用します。

提供されている mkinitcpio.conf には、さまざまな COMPRESSION オプションがコメントアウトされています。別の圧縮方法に切り替える場合は、コメントを解除し、対応する圧縮ユーティリティがインストールされていることを確認してください。何も指定しない場合は、デフォルトのメソッドが使用されます。非圧縮イメージを作成する場合は、設定ファイルで COMPRESSION=cat を指定するか、コマンドラインで -z cat を使用します。

ヒント
  • lz4 と xz 圧縮ユーティリティはデフォルトでマルチスレッド化されており、zstd はマルチスレッドモードで実行されます (-T0 オプションが使用され、検出されたコアと同じ数のスレッドを作成しようと試みます)。
  • lz4 は、高圧縮モード (-9) のイメージの圧縮率は通常約2.5で、最速の解凍速度を達成しています。zstd は、マルチスレッド圧縮と、オプションによる幅広い圧縮レベルにより、多用途のソリューションを提供します - zstd(1) § Operation Modifiers を参照。xz は、その高圧縮プリセット (-9) で約5の縮小率により最小サイズを実現しますが、その代償として展開速度がかなり遅くなります。

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 の性能が低いシステムで悪影響を及ぼします。

ヒント Initramfs の生成プロセスの終わりあたりになると、二重圧縮を防ぐために、残りの .bz2.gz.lz4.lzma.lzo.xz.zst ファイルは全て未圧縮早期 initramfs イメージに移動されます。

ランタイムのカスタマイズ

ランタイム設定オプションはカーネルコマンドラインを通して init や特定のフックに渡すことができます。カーネルコマンドラインパラメータはブートローダによって与えられることがほとんどです。下で書かれているオプションをカーネルコマンドラインに追加することでデフォルトの挙動を変えることができます。詳しくは カーネルパラメータArch ブートプロセス を見て下さい。

base フックの init

root=
カーネルコマンドラインで指定する一番重要なパラメータであり、どのデバイスを root デバイスとしてマウントするかを決めます。mkinitcpio は柔軟に様々な形式を使うことができるようになっています。形式の例は 永続的なブロックデバイスの命名#カーネルパラメータ を見てください。
ノート 以下のブートパラメーターは initramfs 環境における init のデフォルトの挙動を変更します。詳しくは /usr/lib/initcpio/init を参照。systemd フックが使われている場合 base フックの init は置き換わるため機能しません。
break
breakbreak=premount が指定された場合、(フックをロードした後、root ファイルシステムをマウントする前に) init はブートプロセスを停止してトラブルシューティングに使うことができるインタラクティブシェルを起動します。break=postmount と指定することで root がマウントされた後にこのシェルを起動することもできます。シェルを終了すると通常通りに起動が行われます。
disablehooks=
disablehooks=hook1[,hook2,...] を追加すると実行時にフックを無効化します。例:
disablehooks=resume
earlymodules=
earlymodules=mod1[,mod2,...] という風に先にロードするモジュールを指定することでモジュールがロードされる順番を変更することができます (例えば、複数のネットワークインターフェイスの順番を適切に確定したいときなどに使います)。

他のパラメータについては ブートデバッグmkinitcpio(8) を見て下さい。

RAID を使う

RAID#mkinitcpio の設定 を見てください。

net を使う

ノート NFSv4 はまだサポートされていません FS#28287

必要なパッケージ

netmkinitcpio-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=offip=none の場合、自動設定は行われません。そうでないなら、自動的に設定されます。最も一般的な使い方は ip=dhcp です。

パラメータの説明は、カーネルドキュメントを参照してください。

例:

ip=127.0.0.1:::::lo:none  --> ループバックインターフェイスを有効化。
ip=192.168.1.1:::::eth2:none --> 静的 eth2 インターフェイスを有効化。
ip=:::::eth0:dhcp --> eth0 構成に対して dhcp プロトコルを有効化。
ノート <device> パラメータにはカーネルのデバイス名を使用してください (例: eth0)、永続的な名前のデバイス名 (例: enp2s0) では動作しません。詳細は ネットワーク設定#ネットワークインターフェイス を見てください。

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/usrpassno2 にする。起動時に /usr を fsck したい場合は必須です (これはすべてのユーザに推奨されます)。このフックが存在しないと、/usr は永遠に fsck されません。
  • systemd フックを使っていない場合、usr フックを追加する。ルートがマウントされた後に /usr パーティションがマウントされるようになります。

ヒントとテクニック

フォールバック initramfs の生成

フォールバック initramfs の生成は、デフォルトで無効化されています。有効化するには:

  • /etc/mkinitcpio.d/ 内のそれぞれの .preset ファイルを修正する
    • PRESETS=('default') を無効化し、代わりに PRESETS=('default' 'fallback') を有効化する
    • fallback_image="/boot/initramfs-linux-fallback.img" を有効化する
    • fallback_options="--skiphooks autodetect" を有効化する
  • initramfs を再生成する
  • ブートローダーの設定を更新する
ノート フォールバック initramfs が無いと、デフォルトの initramfs でシステムの起動が失敗した場合に、システムを起動するためのもう一つの手段が失われることになります。システムリカバリのための起動可能インストールメディアを作成しておいてください。

トラブルシューティング

イメージの展開

initramfs イメージの中に何が入っているか気になるときは、イメージを展開して中に入っているファイルを調べることができます。

initramfs イメージは SVR4 CPIO アーカイブであり、findbsdcpio コマンドによって生成されています。また、任意で、カーネルが対応した圧縮方法によって圧縮されています。圧縮方法について詳しくは #COMPRESSION を見て下さい。

mkinitcpio パッケージには lsinitcpio(1) というユーティリティが含まれており initramfs イメージの中身を一覧・展開することができます。

イメージ内のファイルを一覧するには:

# lsinitcpio /boot/initramfs-linux.img

カレントディレクトリにファイルを全て展開するには:

# lsinitcpio --extract /boot/initramfs-linux.img

イメージの重要なパーツについて読みやすいリストを取得することもできます (カーネルバージョン、初期 CPIO の存在、含まれているモジュールやバイナリなど):

# lsinitcpio --analyze /boot/initramfs-linux.img

展開して修正を加えたイメージの再圧縮

/usr/bin/mkinitcpio スクリプトの build_image 関数を以下のパラメータで実行してください:

build_image 出力ファイル 圧縮方式

build_image 関数の内容で新しいスクリプトを作成することでこれを実行できます。 これはカレントディレクトリ内の内容を 出力ファイル というファイルに圧縮します。

警告 上書きするまえに自動生成された /boot/initramfs-linux.img の名前を変更することで、簡単に元に戻すことができるようになります。何か問題が発生して起動できなくなった場合、fallback イメージやブート CD で起動して、mkinitcpio を実行して元のイメージに戻してください。あるいは、自分で修正してイメージを再圧縮してください。

マウントされているのに "/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-broadcom
liquidio linux-firmware-liquidio
mlxsw_spectrum linux-firmware-mellanox
nfp linux-firmware-nfp
qat_420xx linux-firmware-intel
qed linux-firmware-qlogic
qla1280 linux-firmware-qlogic
qla2xxx linux-firmware-qlogic
wd719x wd719x-firmwareAUR
xhci_pci
xhci_pci_renesas
upd72020x-fwAUR
  • 警告を取り除きたいが、必要ないファームウェアパッケージのためにシステムの空き領域を無駄にしたくない場合、フォールバック initramfs の生成を無効化することができます。

利用できないファームウェアに関しては、ダミーのファイルを作成することで警告を消すことができます。例えば:

# echo 'Silence the "Possibly missing firmware for module" message' \
    | tee /usr/lib/firmware/qat_6xxx{,_mmp}.bin >/dev/null

No PS/2 controller found

一部のマザーボードで (ほとんどの場合、古いもの。しかし、一部の新しいものでも起こります)、i8042 コントローラが自動検出できません。稀なケースですが、キーボードが使えなくなってしまうことがあります。この状況を事前に察知することができます。PS/2 ポートがあり、i8042: PNP: No PS/2 controller found. Probing ports directly というメッセージが表示される場合、MODULES 配列に atkbd を追加してください。[2]

あるマシンでは起動できるが他のマシンでは起動できない

mkinitcpioautodetect フックは /sys をスキャンして、ロードされているカーネルモジュールを確認して不要なカーネルモジュールを排除します。/boot ディレクトリを他のマシンに移動して、初期ユーザー空間でブートが失敗する場合、カーネルモジュールが存在しないために新しいハードウェアが検出されていないのが原因かもしれません。USB 2.0 と 3.0 では必要なカーネルモジュールが異なるので注意してください。

修正するには、ブートローダーから fallback イメージを選択してください (fallback は autodetect によるフィルタリングがされていません) 起動したら、新しいマシンで mkinitcpio を実行して適切なモジュールでイメージを再生成してください。fallback イメージで起動できない場合、Arch Linux のライブ CD/USB で起動して、chroot し、新しいマシンで mkinitcpio を実行して下さい。それでも駄目な場合、initramfs にモジュールを手動で追加します。

コンソールにアクセスできない、ルートアカウントがロックされている

systemd フックは、(initramfs の) ルートアカウントを無効化します。緊急シェルを有効化するには、一時的に SYSTEMD_SULOGIN_FORCE=1カーネルパラメータに追加してください。

あるいは、initcpio-hook-shadowcopyAUR を使う方法もあります。このパッケージをインストールし、/etc/mkinitcpio.confsystemd フックの後に shadowcopy フックを追加し、mkinitcpio -P で initramfs を再生成してください。ドキュメントは GitHub リポジトリにあります。

参照

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