「Mkinitcpio」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(1版 をインポートしました)
(リンクを修正)
 
(11人の利用者による、間の78版が非表示)
1行目: 1行目:
  +
{{Lowercase title}}
[[Category:Boot process (日本語)]]
 
[[Category:Kernel (日本語)]]
+
[[Category:initramfs]]
  +
[[Category:カーネル]]
[[da:Mkinitcpio]]
 
  +
[[Category:Arch プロジェクト]]
  +
[[Category:コマンド]]
 
[[de:Mkinitcpio]]
 
[[de:Mkinitcpio]]
 
[[en:Mkinitcpio]]
 
[[en:Mkinitcpio]]
[[es:Mkinitcpio]]
+
[[fr:Mkinitcpio]]
[[fr:mkinitcpio]]
+
[[pt:Mkinitcpio]]
[[it:Mkinitcpio]]
 
 
[[ru:Mkinitcpio]]
 
[[ru:Mkinitcpio]]
[[zh-CN:Mkinitcpio]]
+
[[zh-hans:Mkinitcpio]]
{{Related articles start (日本語)}}
+
{{Related articles start}}
  +
{{Related|Booster}}
{{Related2|systemd (日本語)|systemd}}
 
  +
{{Related|ブートデバッグ}}
{{Related2|Kernel modules (日本語)|カーネルモジュール}}
 
  +
{{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 ページより:
{{DISPLAYTITLE:mkinitcpio (日本語)}}
 
'''mkinitcpio''' は次世代の [[Wikipedia:ja:initrd|initramfs]] 作成ツールです。
 
   
  +
:初期 ram ディスクは非常に小さい環境(初期ユーザー空間)であり、様々なカーネルモジュールをロードして {{ic|init}} にコントロールを移す前に必要なことをセットアップします。これにより、root ファイルシステムを暗号化したりソフトウェア RAID アレイに root を載せたりすることが可能になります。''mkinitcpio'' はカスタムフックによって簡単に拡張することができ、実行時の自動検知など様々な機能を持っています。
== 概要 ==
 
   
  +
伝統的には、[[Arch ブートプロセス|ブートプロセス]]の初めにハードウェアを検知したりタスクの初期化を行うのはカーネルで、それから root ファイルシステムがマウントされ {{ic|init}} にコントロールが移されます。しかしながら、先端技術が生まれるにつれ、こういった作業は複雑になりつつあります。
mkinitcpio は initial ramdisk 環境を作成するために使われる Bash スクリプトです。[https://projects.archlinux.org/mkinitcpio.git/tree/man/mkinitcpio.8.txt mkinitcpio man page] より:
 
   
  +
今日、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]。
:''initial ramdisk は非常に小さい環境(初期ユーザー空間)であり、様々なカーネルモジュールをロードして init にコントロールを移す前に必要なことをセットアップします。これにより、root ファイルシステムを暗号化したりソフトウェア RAID アレイに root を載せることが可能になります。mkinitcpio はカスタムフックによって簡単に拡張することができ、自動時の自動検知など様々な機能を持っています。''
 
   
  +
''mkinitcpio'' は Arch Linux デベロッパーとコミュニティの貢献によって開発されています。[https://gitlab.archlinux.org/archlinux/mkinitcpio/mkinitcpio public Git リポジトリ]を見て下さい。
伝統的には、[[Arch Boot Process (日本語)|ブートプロセス]]の初めにハードウェアを検知したりタスクの初期化を行うのはカーネルで、それから root ファイルシステムがマウントされ {{ic|init}} にコントロールが移されます。しかしながら、先端技術が生まれるにつれ、こういった作業は複雑になりつつあります。
 
   
  +
初期 ramdisk フェーズ中に行われる様々なタスクがどのように実行されるかには、2つの異なるアプローチがあることに注意が必要です。
今日、root ファイルシステムが載るハードウェアは SCSI から SATA、USB ドライブまで様々にわたり、それらハードウェアはそれぞれのマニュファクチャーによって作られたいろんなドライブコントローラによってコントロールされています。しかも、root ファイルシステムは暗号化されたり圧縮されたりする可能性もあります; ソフトウェア RAID アレイや論理ボリュームグループに含まれるかもしれません。複雑になったものをシンプルに扱う方法はユーザースペースへ管理を譲渡することです: initial ramdisk。
 
   
  +
; Busybox ベースの初期 ramdisk: 初期 ramdisk のファイルシステムをスキャンし、実行されるスクリプト(この文脈ではランタイムフックと呼ばれる)を開始する init スクリプトが起動されます。
参照: [http://archlinux.me/brain0/2010/02/13/early-userspace-in-arch-linux/ /dev/brain0 » Blog Archive » Early Userspace in Arch 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}} フックが存在するかどうかによって決まります。より詳細については、[[#通常のフック]] を参照してください。
mkinitcpio は initramfs CPIO イメージを作成するためのモジュール式のツールで、他の方法に比べて多くのアドバンテージを有します。例えば:
 
   
  +
== インストール ==
* 初期ユーザ空間の小さくて軽量な基盤として [http://www.busybox.net/ BusyBox] を使用。
 
* 実行時のハードウェア自動検知のための '''[[udev (日本語)|udev]]''' サポート、そして不必要なモジュールのロードの回避。
 
* 拡張性のあるフックベースの init スクリプト、カスタムフックを簡単に [[pacman (日本語)|pacman]] パッケージに含めることが可能。
 
* LUKS ボリュームのための '''LVM2''', '''dm-crypt''' サポート。USB マスストレージデバイスからのレジューム・ブートのための '''mdadm''', '''swsusp''', '''suspend2''' サポート。
 
* イメージをリビルドする必要なくカーネルコマンドラインから多くの機能を設定可能。
 
   
  +
{{Pkg|mkinitcpio}} パッケージを[[インストール]]してください。このパッケージは {{Pkg|linux}} の依存パッケージとなっているので、大抵すでにインストールされているでしょう。
mkinitcpio は Arch Linux デベロッパーとコミュニティの貢献によって開発されています。[https://projects.archlinux.org/mkinitcpio.git/ Git リポジトリ]を見て下さい。
 
   
  +
上級者は {{AUR|mkinitcpio-git}} パッケージで ''mkinitcpio'' の最新開発バージョンをインストールできます。
== インストール ==
 
   
  +
== イメージ作成とアクティベーション ==
{{Pkg|mkinitcpio}} パッケージは[[Official_Repositories (日本語)|公式リポジトリ]]で利用可能で {{Pkg|linux}} パッケージの依存パッケージになっています。
 
   
  +
=== 自動生成 ===
上級ユーザーのために Git から mkinitcpio の最新開発バージョンをインストールできます:
 
<nowiki>$ git clone git://projects.archlinux.org/mkinitcpio.git</nowiki>
 
   
  +
カーネルがインストールまたはアップグレードされるたびに、[[pacman フック]]は {{ic|/etc/mkinitcpio.d/}} 内に保存される ''.preset'' ファイルを自動的に生成します。例えば、公式の安定版 {{Pkg|linux}} カーネルパッケージの場合は {{ic|linux.preset}} です。プリセットは、様々なパラメーターや出力ファイルの場所を手動で指定する手間を省き、初期 RAM ディスクイメージを作成するために必要な情報のリストです。
{{Note|Git から mkinitcpio を使う時は [https://mailman.archlinux.org/mailman/listinfo/arch-projects arch-projects メーリングリスト]を購読することが'''強く'''推奨されます!}}
 
  +
デフォルトでは、2つのイメージを生成するための命令が含まれています:
   
  +
# ''default'' RAM ディスクイメージ。このイメージの内容は、mkinicpio の [[#設定]] で指定されたディレクティブに従って生成されます。
== イメージ作成とアクティベーション ==
 
  +
# ''fallback'' RAM ディスクイメージ。作成時に ''autodetect'' フックがスキップされることを除いて上記と同じであるため、ほとんどのシステムをサポートするすべてのモジュールが含まれます。
   
  +
プリセットを作成した後、pacman フックは、プリセットで提供された情報を使用して2つのイメージを生成する ''mkinitcpio'' スクリプトを呼び出します。
デフォルトで、カーネルのインストール・アップグレードが行われた後 mkinitcpio スクリプトは2つのイメージを生成します: {{ic|/boot/initramfs-linux.img}} と {{ic|/boot/initramfs-linux-fallback.img}}。''fallback'' イメージは ''default'' イメージと同じ設定ファイルを利用しますが、作成中に '''autodetect''' フックだけはスキップされ、全てのモジュールが入ります。'''autodetect''' フックは必要なモジュールを検出して、イメージを固有のハードウェアにあわせて、initramfs を小さくします。
 
   
  +
{{Note|''.preset'' ファイルは、カーネルの更新後に initramfs を自動的に再生成するために使用されます。編集するときは注意してください。}}
様々な設定ファイルを使って initramfs イメージを沢山作りたいと思っているユーザーもいるかもしれません。ブートローダに使いたいイメージを指定する必要があります、主としてブートローダの[[Boot Loader#Configuration files|設定ファイル]]で指定します。設定ファイルに変更を加えた後は、イメージを再生成しなければなりません。標準の Arch Linux カーネル {{Pkg|linux}} で再生成するには次のコマンドを root 権限で実行してください:
 
  +
  +
=== 手動生成 ===
  +
  +
スクリプトを手動で実行するには、マニュアルページ {{man|8|mkinitcpio}} で手順を確認してください。特に、カーネルパッケージによって提供されるプリセットに基づく initramfs イメージを(再)生成するには、使用するプリセットを {{ic|-p}}/{{ic|--preset}} オプションで指定してください。例えば、{{Pkg|linux}} パッケージの場合、次のコマンドを使用してください:
   
 
# mkinitcpio -p linux
 
# mkinitcpio -p linux
   
{{ic|-p}} スイッチはプリセット (''preset'')使うことを示しま; ほとんどのカーネルパッケージ {{ic|/etc/mkinitcpio.d}} の中に関連する mkinitcpio プリセトファイル提供しています (例: {{ic|linux}} {{ic|/etc/mkinitcpio.d/linux.preset}})。毎回設定ファイルと出力ファイルを指定る代わりに initramfs イメージを成する方法がプリセット定義されています
+
既存のすべてのプリセットに基づく initramfs イメージ(再)生成るに{{ic|-P}}/{{ic|--allpresets}} スイ使用してくださ。これ通常、グローバルな [[#設定]] の変更後にべての initramfs イメージを再生成するため使用されます:
   
  +
# mkinitcpio -P
{{Warning|''プリセット''ファイルはカーネルがアップデートされた後 initramfs を再生成するときに自動で使われます; 編集する時は気をつけて下さい。}}
 
   
ユーザーは他の設定ファイルを使ってイメージを手動で作成することもできます。例えば、以下のコマンドは {{ic|/etc/mkinitcpio-custom.conf}} の指示に従って initramfs イメージを生成し {{ic|/boot/linux-custom.img}} にイメージを保存します。
+
ユーザーは、さまざまな構成で initramfs イメージをいくつ作成できます。生成したいイメージは、それぞれの[[ブートローダー]]の設定ファイルで指定する必要があります。
   
  +
=== 生成のカスタマイズ ===
# mkinitcpio -c /etc/mkinitcpio-custom.conf -g /boot/linux-custom.img
 
   
  +
ユーザーは、代替の設定ファイルを使用してイメージを生成できます。次の例では、{{ic|/etc/mkinitcpio-custom.conf}} に記述されている指示に従って初期 RAM ディスクイメージを生成し、{{ic|/boot/initramfs-custom.img}} として保存します。
現在動作しているカーネル以外のカーネル用のイメージを作成するときは、コマンドラインにカーネルのバージョンを加えて下さい。{{ic|/usr/lib/modules}} 内でカーネルバージョンを見ることができます。
 
   
# mkinitcpio -g /boot/linux.img -k 3.3.0-ARCH
+
# 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''' の基本の設定ファイルは {{ic|/etc/mkinitcpio.conf}} です。さらに、カーネルパッケージによって提供されるプリセット定義が {{ic|/etc/mkinitcpio.d}} ディレクトリにあります (例: {{ic|/etc/mkinitcpio.d/linux.preset}})。
 
   
  +
=== ユニファイドカーネルイメージ ===
{{Warning|デフォルトでは '''lvm2''', '''mdadm''', '''encrypt''' は'''有効化されていません'''。これらのフックが必要なときは注意してこのセクションを読んで下さい。}}
 
   
  +
''mkinitcpio'' は[[ユニファイドカーネルイメージ]] (UKI) を作成することができます。{{Pkg|systemd-ukify}} がインストールされている場合、''mkinitcpio'' は UKI の生成を systemd-ukify に委託します。このパッケージがインストールされていない場合、''mkinitcpio'' は自身の実装を使用します。
{{Note|Users with multiple hardware disk controllers that use the same node names but different kernel modules (e.g. two SCSI/SATA or two IDE controllers) should ensure the correct order of modules is specified in {{ic|/etc/mkinitcpio.conf}}. Otherwise, the root device location may change between boots, resulting in kernel panics.
 
   
  +
== 設定 ==
A more elegant alternative is to use [[persistent block device naming]] to ensure that the right devices are mounted.}}
 
   
  +
''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|PS/2 キーボードを使っている場合: init でキーボード入力を使えるようにするには、{{ic|HOOKS}} に ''keyboard'' フックを追加してください。マザーボードによっては (特に旧世代のマザーボード)、i8042 コントローラが自動で検出されないことがあります。稀ですが、キーボードがないということもありえます。事前にこの状態を検出することができます。PS/2 端子があって {{ic|i8042: PNP: No PS/2 controller found. Probing ports directly}} メッセージが表示される場合、''atkbd'' を {{ic|MODULES}} に追加してください。}}
 
   
ユーザーは設定ファイルの中にある6つの変数を修正することが可能です:
+
ユーザーは設定ファイルの中にある7つの変数を変更きま (詳細は {{man|5|mkinitcpio.conf}} を見てください):
   
; {{ic|MODULES}}: boot フックが実行される前にロードべきカーネルモジュール。
+
; {{ic|MODULES}}: ブートフックが実行される前にロードされるカーネルモジュール。
 
; {{ic|BINARIES}}: initramfs イメージに含める追加のバイナリ。
 
; {{ic|BINARIES}}: initramfs イメージに含める追加のバイナリ。
 
; {{ic|FILES}}: initramfs イメージに含める追加のファイル。
 
; {{ic|FILES}}: initramfs イメージに含める追加のファイル。
; {{ic|HOOKS}}: フックは initial ramdisk で実行するスクリプトです。
+
; {{ic|HOOKS}}: フックは初期 RAM ディスクで実行するスクリプトです。
; {{ic|COMPRESSION}}: initramfs イメージを圧縮するに使れます。
+
; {{ic|COMPRESSION}}: initramfs イメージを圧縮するに使用されます。
; {{ic|COMPRESSION_OPTIONS}}: {{ic|COMPRESSION}} プログラムに渡すコマンドラインオプション。この設定の使用はあまり推奨されません。mkinitcpio は圧縮プログラムに特殊な細工ので (例: xz には {{ic|1=--check=crc32}} を指定します)、誤って利用するとシステムが起動できなくなる可能性があります。
+
; {{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|If using '''reiser4''', it ''must'' be added to the modules list. Additionally, if you will be needing any file system during the boot process that is not live when you run mkinitcpio — for example, if your LUKS encryption key file is on an '''ext2''' file system but no '''ext2''' file systems are mounted when you run mkinitcpio — that file system module must also be added to the MODULES list. See [[Dm-crypt/System configuration#cryptkey]] for more details.}}
 
  +
* Out-of-tree のファイルシステムを初期ユーザー空間でマウントするつもりであるならば (例えば、そのようなファイルシステムをルートファイルシステムとしてを使用する場合)、そのファイルシステムのモジュール ({{ic|reiser4}} など) を {{ic|MODULES}} 配列に'''追加しておかなければなりません'''。
  +
* '''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}} は''そのままの状態で'' (as-is) 追加されます。例:
+
以下のオプションを使ってイメージにファイルを追加することができます。{{ic|BINARIES}} と {{ic|FILES}} はフックが実行される前に追加され、フックによって使用/提供されるファイルを上書きすることがあります。{{ic|BINARIES}} は標準の {{ic|PATH}} に自動で配置され、依存関係がパースされます。つまり必要なライブラリも全て追加されます。{{ic|FILES}} は''そのままの状態で''追加されます。例:
   
FILES="/etc/modprobe.d/modprobe.conf"
+
FILES=(/etc/modprobe.d/modprobe.conf)
   
BINARIES="kexec"
+
BINARIES=(kexec)
   
{{ic|BINARIES}} と {{ic|FILES}} のどちら、スペースで区切ることで複数のエントリを追加することができます。
+
{{ic|BINARIES}} と {{ic|FILES}} は両方とも [[Bash]] 配列です。なので、スペースで区切ることで複数のエントリを追加することができます。
   
 
=== HOOKS ===
 
=== HOOKS ===
   
{{ic|HOOKS}} 設定は設定ファイルの中で一番重要な設定です。フックはイメージに追加されるものを記述する小さなスクリプトです。フックによっては、デーモンを起動したりスタックしたブロックデバイスを集めたりするためのランタイムコンポーネントを含んでいるものもあります。フックは名前によって参照され、設定ファイルの {{ic|HOOKS}} にある順番通りに実行されます。
+
{{ic|HOOKS}} 配列は設定ファイルの中で一番重要な設定です。フックはイメージに追加されるものを記述する小さなスクリプトです。フックによっては、デーモンを起動したりスタックしたブロックデバイスを集めたりするためのランタイムコンポーネントを含んでいるものもあります。フックは名前によって参照され、設定ファイルの {{ic|HOOKS}} にある順番通りに実行されます。
   
ほとんどのシンプルな、シングルディスクセットアップではデフォルトの {{ic|HOOKS}} 設定で十分なはずです。[[LVM (日本語)|LVM]], [[Software_RAID_and_LVM|mdadm]], [[dm-crypt (日本語)|dm-crypt]] などスタックした root デバイスやマルチブロックデバイスを使う時は、関連する wiki ページを見て必要な設定を調べて下さい。
+
ほとんどのシンプルな単一ディスク環境ではデフォルトの {{ic|HOOKS}} 設定で十分なはずです。[[LVM]][[RAID]][[dm-crypt]] などスタックルートデバイスやマルチブロックデバイスを使う時は、関連する wiki ページを見て必要な設定を調べて下さい。
   
 
==== ビルドフック ====
 
==== ビルドフック ====
   
ビルドフックは {{ic|/usr/lib/initcpio/install}} にあります。これらのファイルは mkinitcpio の実行時に bash シェルによって実行されます。ビルドフックには2つの関数が含まれています: {{ic|build}} と {{ic|help}}。{{ic|build}} 関数にはイメージに追加するモジュールファイルバイナリを記述します。これらのアイテムの追加を容易にする mkinitcpio(8) による API が用意されています。{{ic|help}} 関数はフックの役割を出力します。
+
ビルドフックは {{ic|/usr/lib/initcpio/install/}} にあります。カスタムビルドフックは {{ic|/etc/initcpio/install/}} に配置します。これらのファイルは ''mkinitcpio'' の実行時に bash シェルによって実行されます。ビルドフックには2つの関数が含まれています: {{ic|build}} と {{ic|help}}。{{ic|build}} 関数にはイメージに追加するモジュールファイルバイナリを記述します。これらのアイテムの追加を容易にする {{man|8|mkinitcpio}} による API が用意されています。{{ic|help}} 関数はフックの役割を出力します。
   
 
すべてのフックを一覧するには:
 
すべてのフックを一覧するには:
120行目: 138行目:
 
$ mkinitcpio -L
 
$ mkinitcpio -L
   
特定のフックのヘルプを出力するには mkinitcpio の {{ic|-H}} オプションを使って下さい、例えば:
+
特定のフックのヘルプを出力するには ''mkinitcpio'' の {{ic|-H}}/{{ic|--hookhelp}} オプションを使って下さい、例えば:
   
 
$ mkinitcpio -H udev
 
$ mkinitcpio -H udev
126行目: 144行目:
 
==== ランタイムフック ====
 
==== ランタイムフック ====
   
ランタイムフックは {{ic|/usr/lib/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}} 設定の順番で実行されます。ランタイムフックには複数の関数を含めることができます:
   
 
{{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|HOOKS}} の順番とは逆に実行されます。これらのフックは初期のフックによって起動したデーモンのシャットダウンなど、最後のクリーンアップに使われます。
+
{{ic|run_cleanuphook}}: できる限り最後に、この名前の関数が実行されます。設定ファイルの {{ic|HOOKS}} の順番とは逆に実行されます。これらのフックは初期のフックによって起動したデーモンのシャットダウンなど、最後のクリーンアップに使われます。
  +
  +
{{Note|ランタイムフックは busybox init でのみ使用されます。 '''systemd''' フックは systemd ベースの init をトリガーします。これはランタイムフックを実行せず、代わりに systemd ユニットを使用します。}}
   
 
==== 通常のフック ====
 
==== 通常のフック ====
   
通常のフックとイメージ生成への影響と関連するランタイムを示した表です。パッケージにカスタムフックを入れることができるので、この表は完全ではないことに注意してください。
+
以下は、通常のフックとイメージ生成への影響と関連するランタイムを示した表です。パッケージにカスタムフックを入れることができるので、この表は完全ではないことに注意してください。
   
{| class="wikitable sortable"
+
{| class="wikitable"
  +
! 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 フックの使用が推奨されています。
| '''base''' || 全ての initial directory をセットアップし基本のユーティリティとライブラリをインストールする。何をしようとしているのかわからない限りはこのフックを一番最初のフックにしておいてください。 || --
 
 
|-
 
|-
  +
| {{C|'''usr'''}} || {{ic|/usr}} の分割パーティションのサポートを追加します。詳細は [[#/usr を別のパーティションに分割する]] を見てください。 || 本物のルートファイルシステムがマウントされた後に {{ic|/usr}} パーティションをマウントします。
| '''systemd''' || このフックは基本的な systemd セットアップを initramfs にインストールします。これによって 'base', 'usr', 'udev', 'timestamp' フックが置き換えられます。(暗号化など) 他のフックも移す必要がありますが、期待通りには動作しません。下にある systemd 特有のフック ("sd-*") を使用するときは、必須になります。{{Pkg|systemd}} 207 から、このフックは lvm2 と一緒に使うと上手く動作せず起動できなくなることがあります。''lvm2'' フックの代わりに ''sd-lvm2'' フックを使って下さい。initramfs で緊急シェルが使えるように (このフックの前に) ''base'' フックを含めると良いでしょう。{{Pkg|systemd}} 217 から、このフックはハイバネートからの復帰に必要なサービスやバイナリヘルパーもインストールします。 || systemd 217 で起動して、カーネルコマンドラインの resume パラメータのハイバネーションイメージを探して、イメージからの復帰を開始します。
 
 
|-
 
|-
| '''btrfs''' || root で [[Btrfs (日本語)|Btrfs]] を有効にしてサブボリュームを使用するために必要なモジュールを設定します。 || udev フックが存在しないときに {{ic|btrfs device scan}} を実行してマルチデバイスの Btrfs root ファイルシステムを構築します。このフックを使うには {{Pkg|btrfs-progs}} パッケージが必要です。
 
 
|-
 
|-
  +
| {{C|'''resume'''}} || ハイバネートイメージにカーネルのコンパイル時デフォルト以外の圧縮アルゴリズムを使用する際に復帰できるようにするために、{{ic|lzo}} と {{ic|lz4}} カーネルモジュールを (initramfs に) 追加します。{{ic|HibernateLocation}} UEFI 変数で指定されたハイバネートイメージから復帰できるようにするために {{man|8|systemd-hibernate-resume}} バイナリを追加します。|| "ハイバネート" (suspend to disk) 状態からの復帰を試みます。詳しい設定方法は [[ハイバネート]] を見てください。
| '''udev''' || イメージに udevd, udevadm, そして udev ルールの小さなサブセットを追加します。 || udev デーモンを起動してカーネルからの uevent を処理します。デバイスノードを作成します。ブートプロセスの単純化として、必要なモジュールを明示的に指定する必要をなくすため、udev フックの使用が推奨されています。
 
 
|-
 
|-
  +
| {{C|'''btrfs'''}} || {{Grey|–}} || [[Btrfs]] を有効にして、Btrfs でフォーマットされた複数のデバイスを使用するために必要なモジュールを設定します。このフックを使うには、{{Pkg|btrfs-progs}} をインストールする必要があります。単一のデバイスで Btrfs を使うだけならこのフックは不要であり、{{ic|filesystems}} フックで十分です。 || udev フックが存在しないときに {{ic|btrfs device scan}} を実行してマルチデバイスの Btrfs root ファイルシステムを構築します。このフックを使うには {{Pkg|btrfs-progs}} パッケージが必要です。
| '''autodetect''' || sysfs のスキャンによってモジュールのホワイトリストを作成して initramfs を小さくします。含まれているモジュールが正しく、欠けているものがないか確認してください。自動検知の利点を活かすためにこのフックは他の subsystem フックより前に実行してください。'autodetect' より前に置かれたフックは完全にインストールされます。 || --
 
 
|-
 
|-
  +
|colspan="2" {{C|'''autodetect'''}} || sysfs のスキャンによってモジュールのホワイトリストを作成して initramfs を小さくします。含まれているモジュールが正しく、欠けているものがないか確認してください。自動検知の利点を活かすためにこのフックは他の subsystem フックより前に実行してください。'autodetect' より前に置かれたフックは完全にインストールされます。 || {{-}}
| '''modconf''' || {{ic|/etc/modprobe.d}} と {{ic|/usr/lib/modprobe.d}} から modprobe 設定ファイルをロードします。 || --
 
 
|-
 
|-
  +
|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}} 行をブートローダーの設定に追加する必要が無くなります。 || {{-}}
| '''block''' || 全てのブロックデバイスモジュールを追加します。昔は '''fw''', '''mmc''', '''pata''', '''sata''', '''scsi''' , '''usb''', '''virtio''' フックに分かれていました。 || --
 
 
|-
 
|-
  +
|colspan="2" {{C|'''modconf'''}} || {{ic|/etc/modprobe.d/}} と {{ic|/usr/lib/modprobe.d/}} から modprobe 設定ファイルをロードします。 || {{-}}
| '''pcmcia''' || PCMCIA デバイスに必要なモジュールを追加します。これを使うには {{Pkg|pcmciautils}} をインストールする必要があります。 || --
 
 
|-
 
|-
| '''net''' || ネットワクデバイスに必要なモジュールを追加します。PCMCIA net デバイスには '''pcmcia''' フックも追ください。 || NFSroot ファイルシステムの管理を提供します。
+
|colspan="2" {{C|'''kms'''}} || [[カールモド設定#設定|KMS の早期開始]] を提供する GPU モジュールを追加します。加、一部のノート PCLCD パネに組み込まれているプライバクリーンに必要なモジュールも追加します。|| {{-}}
 
|-
 
|-
| '''dmraid''' || fakeRAID root デバイスのサポ提供します。れを使うには {{Pkg|dmraid}} をインストールする必要があります。コトローがサポートしている場合、fakeRAID '''mdadm_udev''' フックと一緒に {{ic|mdadm}} を使うことが推奨れます || {{ic|dmraid}} を使用して fakeRAID ブロックデバイスを構築します。
+
|colspan="2" {{C|'''keyboard'''}} || キーボードデバイスに必要なモジュ追加します。あなたが USB キーボードを使っていて、それを初期ユーザ空間で使う必要があるとき (暗号化のパスフレーズを入力したクティブシェルを使う場合)このフックを使って下副作してキーボード以外の入力デバイス用のモジュールが追加されることがありすが、困ることはないはずです。
  +
  +
{{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}} から指定されたキーマップをロードします。
| '''mdadm''' || {{ic|/etc/mdadm.conf}} からの RAID アレイの構築や、起動中の自動検出のサポートを提供します。これを使うには {{Pkg|mdadm}} のインストールが必須です。このフックよりも '''mdadm_udev''' フックが推奨されています。 || {{ic|mdassemble}} を使ってソフトウェア RAID ブロックデバイスを構築します。
 
 
|-
 
|-
  +
| {{C|'''consolefont'''}} || {{ic|/etc/vconsole.conf}} から initramfs に、指定した[[コンソールでのキーボード設定#永続的な設定|コンソールフォント]]を追加します。 || 初期ユーザ空間で {{ic|/etc/vconsole.conf}} から指定されたコンソールフォントをロードします。
| '''mdadm_udev''' || udev による RAID アレイの構築のサポートを提供します。これを使うには {{Pkg|mdadm}} のインストールが必要です。FakeRAID アレイでこのフックを使う場合、binaries セクションに {{ic|mdmon}} を含めて '''shutdown''' フックを追加することが推奨されます。再起動時に不必要な RAID を再ビルドしないためです。 || {{ic|udev}} と {{ic|mdadm}} を使ってソフトウェア RAID ブロックデバイスを動的に構築します。mdadm アセンブリの推奨方法です (上記の ''mdadm'' フックを使うよりも)。
 
 
|-
 
|-
| '''keyboard''' || キーボードデバイスに必要なモジュールを追加します。あなたが USB キーボードを使っていて、それを初期ユーザ空間で使う必要あるとき (暗号化パスレーズを入力したりインタラティブシェルを使う場合) はこのフック使って下さい。副作としキーボード以外の入力デバイスのモジュール追加されることがあります困るとはないはずす。 || --
+
|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}} モジュールで、これら無条件に必追加されます。 || {{-}}
 
|-
 
|-
  +
| {{C|'''net'''}} || {{Grey|''未実装''}} || ネットワークデバイスに必要なモジュールを追加します。このフックを使うには {{Pkg|mkinitcpio-nfs-utils}} をインストールしなければなりません。詳細は [[#net を使う]] を見てください。 || NFS の root ファイルシステムの管理を提供します。
| '''keymap''' || {{ic|/etc/vconsole.conf}} から initramfs に指定したキーマップを追加します。 || 初期ユーザ空間で {{ic|/etc/vconsole.conf}} から指定されたキーマップをロードします。
 
 
|-
 
|-
  +
| {{C|'''dmraid'''}} || {{Grey|''?''}} || fakeRAID root デバイスのサポートを提供します。これを使うには {{Pkg|dmraid}} をインストールする必要があります。コントローラがサポートしている場合、fakeRAID では ''mdadm_udev'' フックと一緒に [[mdadm]] を使うことが推奨されます。詳細は [[#RAID を使う]] を見てください。 || {{ic|dmraid}} を使用して fakeRAID ブロックデバイスを検索・構築します。
| '''consolefont''' || {{ic|/etc/vconsole.conf}} から initramfs に指定したコンソールフォントを追加します。 || 初期ユーザ空間で {{ic|/etc/vconsole.conf}} から指定されたコンソールフォントをロードします。
 
|-
 
| '''sd-vconsole''' || {{ic|/etc/vconsole.conf}} から systemd ベースの initramfs に指定したキーマップとコンソールフォントを追加します。 || 初期ユーザ空間で {{ic|/etc/vconsole.conf}} から指定されたキーマップとコンソールフォントをロードします。
 
|-
 
| '''encrypt''' || {{ic|dm_crypt}} カーネルモジュールと {{ic|cryptsetup}} ツールをイメージに追加します。これを使うには {{Pkg|cryptsetup}} をインストールする必要があります。 || 暗号化された root パーティションを検知してアンロックします。設定については [[#ランタイムのカスタマイズ]] を見て下さい。
 
|-
 
| '''sd-encrypt''' || このフックを使うことで systemd initramfs で暗号化された root デバイスを扱えます。
 
 
利用できるカーネルコマンドラインオプションについては systemd-cryptsetup-generator(8) の man ページを見て下さい。また、{{ic|/etc/crypttab.initramfs}} ファイルが存在する場合、{{ic|/etc/crypttab}} として initramfs に追加されます。crypttab の構文の詳細は crypttab(5) manpage を見て下さい。
 
| --
 
 
|-
 
|-
| '''lvm2''' || device mapper カーネルモジュールと {{ic|lvm}} ツールイメジに追加します。こを使うには {{Pkg|lvm2}} をインストールする必要があります。 || 全ての LVM2 ボリュームグループ有効にしますroot ファイルシステムが [[LVM (日本語)|LVM]] 上にある場合は必須です。
+
|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 パーティションを検知してアンロックします。設定については [[#ランタイムのカスタマイズ]] を見て下さい。
| '''fsck''' || fsck バイナリとファイルシステム特有のヘルパーを追加します。'''autodetect''' フックの後ろに追加した場合、root ファイルシステムのヘルパーだけが追加されます。このフックの使用は強く推奨されており、{{ic|/usr}} パーティションを分割する場合は必須です。 || root デバイス (と分割している場合は {{ic|/usr}}) に対してマウントする前に fsck を実行します。ブートローダーのデフォルト設定で問題ありませんが、疑問がある場合は[https://bbs.archlinux.org/viewtopic.php?pid=1307895#p1307895 こちらの設定]を読んで下さい。
 
  +
'''sd-encrypt''' については [[Dm-crypt/システム設定#sd-encrypt フックを使う]]を見てください。
 
|-
 
|-
  +
|colspan="2" {{C|'''lvm2'''}} || device mapper カーネルモジュールと {{ic|lvm}} ツールをイメージに追加します。これを使うには {{Pkg|lvm2}} をインストールする必要があります。ルートファイルシステムを [[LVM]] 上に置いている場合、このフックは必須です。 || {{-}}
| '''resume''' || ハイバネートを検出・復帰するための sh initramfs で動作するシェルスクリプトをインストールします。 || "ハイバネート" (suspend to disk) 状態からの復帰を試みます。''swsusp'' と ''[[suspend2]]'' の両方と一緒に動作します。設定は [[#ランタイムのカスタマイズ]] を見て下さい。systemd 217 から、systemd initramfs ではハイバネートに必要ありません。
 
 
|-
 
|-
| '''filesystems''' || イメージに必要なファイルシステムモジュールを含めます。ファイルシステムモジュールを 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#ブート時のチェック]] を見てください。 || {{-}}
| '''shutdown''' || シャットダウン initramfs サポートを追加します。mkinitcpio 0.16 以前までは {{ic|/usr}} パーティションを分割していたり root を暗号化しているときはこのフックを使うことを強く推奨されていました。mkinitcpio 0.16 以降から、[https://mailman.archlinux.org/pipermail/arch-dev-public/2013-December/025742.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] || {{-}}
| '''usr''' || {{ic|/usr}} の分割パーティションのサポートを追加。 || real root がマウントされた後に {{ic|/usr}} パーティションをマウントします。
 
 
|}
 
|}
   
==== 廃止されたフック ====
+
==== ポストフック ====
{{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 の圧縮に複数フォーマットをサポートしています - gzip, bzip2, lzma, xz (別名 lzma2), lzo, lz4。ほとんどの場合gzip か lzop、またlz4 を使ったときに圧縮イメージサイズと展開速度のバスが一番良くなります。
+
カーネルは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 を使用します。
COMPRESSION="gzip"
 
COMPRESSION="bzip2" # since kernel 2.6.30
 
COMPRESSION="lzma" # since kernel 2.6.30
 
COMPRESSION="lzop" # since kernel 2.6.34
 
COMPRESSION="xz" # since kernel 2.6.38
 
COMPRESSION="lz4" # since kernel 3.11; mkinitcpio>=16-2
 
   
{{ic|COMPRESSION}} を指定しないとき initramfs ァイは gzip で圧縮されます。イメージを圧縮したくないときは、{{ic|1=COMPRESSION=cat}} を定するかコマンドラインで {{ic|-z cat}} を使って下さい
+
提供されている {{ic|mkinitcpio.conf}} には、さまざまな {{ic|COMPRESSION}} オプションがコメントアウトされています。別の圧縮方法に切り替える場合は、コメント解除し、対応する圧縮ユーティリティがインストールされていることを確認してください。何も指定しない場合、デトのメソッドが使用されます。非圧縮イメージを作成する場合は、設定ファイルで {{ic|1=COMPRESSION='''cat'''}} を定するかコマンドラインで {{ic|-z cat}} を使用します
   
  +
{{Tip|
使用する圧縮方法の適切なファイル圧縮ユーティリティがインストールされているか確認してください。
 
  +
* lz4 と xz 圧縮ユーティリティはデフォルトでマルチスレッド化されており、zstd はマルチスレッドモードで実行されます ({{ic|-T0}} オプションが使用され、検出されたコアと同じ数のスレッドを作成しようと試みます)。
  +
* lz4 は、高圧縮モード ({{ic|-9}}) のイメージの圧縮率は通常約2.5で、最速の解凍速度を達成しています。zstd は、マルチスレッド圧縮と、オプションによる幅広い圧縮レベルにより、多用途のソリューションを提供します - {{man|1|zstd|Operation Modifiers}} を参照。xz は、その高圧縮プリセット ({{ic|-9}}) で約5の縮小率により最小サイズを実現しますが、その代償として展開速度がかなり遅くなります。
  +
}}
   
 
=== COMPRESSION_OPTIONS ===
 
=== COMPRESSION_OPTIONS ===
230行目: 240行目:
 
{{ic|COMPRESSION}} で指定したプログラムに渡す追加のフラグを記述します、例:
 
{{ic|COMPRESSION}} で指定したプログラムに渡す追加のフラグを記述します、例:
   
COMPRESSION_OPTIONS='-9'
+
COMPRESSION_OPTIONS=(-9)
   
  +
このオプションは空のままにしておくことができます。''mkinitcpio'' は、サポートされている圧縮メソッドに、機能するイメージを生成するために必須なフラグを渡すことを保証しています。
mkinitcpio はイメージを作成するときサポートされている圧縮方法に必要なフラグを渡すので、通常はこのオプションは必要ありません。なお、カーネルが作成された圧縮ファイルを解凍できないとき、このオプションを使っていないとシステムをブートできなくなる可能性があります。
 
   
  +
{{Warning|このオプションを間違って使用すると、カーネルが生成されたイメージを解凍できない場合、''システムが起動不能になる''場合があります。}}
== ランタイムのカスタマイズ ==
 
   
  +
デフォルトの zstd 圧縮では、カスタムカーネルのスペースを節約するために (特に[[デュアルブート]]環境で、EFI システムパーティションを {{ic|/boot}} として使用する場合)、{{ic|--long}} オプションは非常に効果的です。ただし、RAM の限られたシステムは、このオプションをした場合に initramfs を解凍できない場合があります。また、{{ic|-v}} オプションは、initramfs の生成中に詳細を見たい場合に必要になるかもしれません。例:
ランタイム設定オプションはカーネルコマンドラインを通して {{ic|init}} や特定のフックに渡すことができます。カーネルコマンドラインパラメータはブートローダによって与えられることがほとんどです。下で書かれているオプションをカーネルコマンドラインに追加することでデフォルトの挙動を変えることができます。詳しくは[[Kernel parameters (日本語)|カーネルパラメータ]]や [[Arch Boot Process (日本語)|Arch ブートプロセス]]を見て下さい。
 
   
  +
COMPRESSION="zstd"
=== init ===
 
  +
COMPRESSION_OPTIONS=(-v -5 --long)
   
  +
xz で圧縮レベル {{ic|-9e}} を使用し、ローダブルなカーネルモジュールとファームウェアを解凍しておくことで、圧縮速度が最も遅くなりますが、圧縮率を最大に高めることができます:
{{Note|The following options alter the default behavior of {{ic|init}} in the initramfs environment. See {{ic|/usr/lib/initcpio/init}} for details.}}
 
   
  +
COMPRESSION="xz"
; {{ic|root}}: カーネルコマンドラインで指定する一番重要なパラメータであり、どのデバイスを root デバイスとしてマウントするかを決めます。mkinitcpio は柔軟に様々な形式を使うことができるようになっています、例:
 
  +
COMPRESSION_OPTIONS=(-9e)
root=/dev/sda1 # /dev node
 
  +
MODULES_DECOMPRESS="yes"
root=LABEL=CorsairF80 # label
 
root=UUID=ea1c4959-406c-45d0-a144-912f4e86b207 # UUID
 
root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 # GPT partition UUID
 
root=/dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0-part1 # udev symlink (requires the '''udev''' hook)
 
root=801 # hex-encoded major/minor number
 
   
  +
=== 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&#61;N}}: {{ic|rootdelay}} を追加すると root ファイルシステムをマウントする前に {{ic|N}} 秒間だけ停止します (例えば、初期化に時間がかかる USB ハードドライブから起動するときなどに使います)。
 
   
  +
== ランタイムのカスタマイズ ==
参照: [[Boot debugging|Debugging with GRUB and init]]
 
   
  +
ランタイム設定オプションはカーネルコマンドラインを通して {{ic|init}} や特定のフックに渡すことができます。カーネルコマンドラインパラメータはブートローダによって与えられることがほとんどです。下で書かれているオプションをカーネルコマンドラインに追加することでデフォルトの挙動を変えることができます。詳しくは [[カーネルパラメータ]] や [[Arch ブートプロセス]] を見て下さい。
=== RAID を使う ===
 
   
  +
=== base フックの init ===
まず、{{ic|/etc/mkinitcpio.conf}} 内の {{ic|HOOKS}} に {{ic|mdadm_udev}} または {{ic|mdadm}} フックを追加し、必要な RAID モジュール全て (例: raid456, ext4) を {{ic|MODULES}} に追加して下さい。
 
   
  +
; {{ic|1=root=}}: カーネルコマンドラインで指定する一番重要なパラメータであり、どのデバイスを root デバイスとしてマウントするかを決めます。''mkinitcpio'' は柔軟に様々な形式を使うことができるようになっています。形式の例は [[永続的なブロックデバイスの命名#カーネルパラメータ]] を見てください。
{{ic|mdadm}} フックを使う場合、[[カーネルパラメータ]]で RAID アレイを設定する必要はありません。{{ic|mdadm}} フックは {{ic|/etc/mdadm.conf}} ファイルを使うか、またはブート時の init 段階でアレイを自動で検出します。
 
   
  +
{{Note|以下のブートパラメーターは initramfs 環境における {{ic|init}} のデフォルトの挙動を変更します。詳しくは {{ic|/usr/lib/initcpio/init}} を参照。{{ic|systemd}} フックが使われている場合 {{ic|base}} フックの {{ic|init}} は置き換わるため機能しません。}}
{{ic|mdadm_udev}} フックを使うことで udev による構築も可能です。上流ではこの方法が推奨されています。{{ic|/etc/mdadm.conf}} は構築されたデバイスに名前を付けるために読み込まれます。
 
   
  +
; {{ic|break}}: {{ic|break}} や {{ic|1=break=premount}} が指定された場合、(フックをロードした後、root ファイルシステムをマウントする前に) {{ic|init}} はブートプロセスを停止してトラブルシューティングに使うことができるインタラクティブシェルを起動します。{{ic|1=break=postmount}} と指定することで root がマウントされた後にこのシェルを起動することもできます。シェルを終了すると通常通りに起動が行われます。
=== net を使う ===
 
   
  +
; {{ic|1=disablehooks=}}: {{ic|1=disablehooks=hook1[,hook2,...]}} を追加すると実行時にフックを無効化します。例: {{bc|1=disablehooks=resume}}
{{Warning|NFSv4 はまだサポートされていません。}}
 
   
  +
; {{ic|1=earlymodules=}}: {{ic|1=earlymodules=mod1[,mod2,...]}} という風に先にロードするモジュールを指定することでモジュールがロードされる順番を変更することができます (例えば、複数のネットワークインターフェイスの順番を適切に確定したいときなどに使います)。
'''必要なパッケージ:'''
 
   
  +
他のパラメータについては [[ブートデバッグ]] や {{man|8|mkinitcpio}} を見て下さい。
{{ic|net}} は[[Official Repositories (日本語)|公式リポジトリ]]の {{Pkg|mkinitcpio-nfs-utils}} パッケージを必要とします。
 
   
  +
=== RAID を使う ===
'''カーネルパラメータ:'''
 
   
  +
[[RAID#mkinitcpio の設定]] を見てください。
公式の[https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt カーネルドキュメント]に最新の情報が載っています。
 
   
  +
=== net を使う ===
'''ip='''
 
   
  +
{{Note|NFSv4 はまだサポートされていません {{Bug|28287}}。}}
このパラメータはカーネルに、デバイスの IP アドレスの設定方法と、IP ルーティングテーブルの設定方法を指定します。コロンで区切った9つの引数を指定できます: {{ic|1=ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>}}。
 
   
  +
'''必要なパッケージ'''
カーネルコマンドラインにこのパラメータが存在しなかった場合、全てのフィールドが空とされて、[https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt カーネルドキュメント]に書かれているデフォルト設定が適用されます。一般的にはカーネルは自動設定を使って全てを設定しようとします。
 
   
  +
{{ic|net}} は {{Pkg|mkinitcpio-nfs-utils}} パッケージを必要とします。
The {{ic|<autoconf>}} parameter can appear alone as the value to the 'ip' parameter (without all the ':' characters before). If the value is "ip=off" or "ip=none", no autoconfiguration will take place, otherwise autoconfiguration will take place. The most common way to use this is "ip=dhcp".
 
   
  +
'''カーネルパラメータ'''
パラメータの説明は、[https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt カーネルドキュメント]を参照してください。
 
 
; 例
 
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.
 
   
  +
公式の[https://docs.kernel.org/admin-guide/nfs/nfsroot.html カーネルドキュメント]に包括的で最新の情報が載っています。
{{Note|{{ic|<device>}} パラメータにはカーネルのデバイス名を使用してください (例: ''eth0'')、[[Network_Configuration (日本語)#デバイス名|udev]] のデバイス名 (例: ''enp2s0'') では動作しません。}}
 
   
'''BOOTIF='''
+
'''ip='''
   
  +
このパラメータはカーネルに、デバイスの IP アドレスの設定方法と、IP ルーティングテーブルの設定方法を指定します。コロンで区切った9つまでの引数を指定できます: {{ic|1=ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>:<ntp0-ip>}}。
複数のネットワークカードを使っているときは、このパラメータに起動するインターフェイスの MAC アドレスを含めることができます。インターフェイスの数字が変わってしまったり、pxelinux の IPAPPEND 2 や IPAPPEND 3 オプションを使うときに便利です。指定しなかった場合、eth0 が使われます。
 
   
  +
カーネルコマンドラインにこのパラメータが存在しなかった場合、全てのフィールドが空とされて、[https://docs.kernel.org/admin-guide/nfs/nfsroot.html カーネルドキュメント]に書かれているデフォルト設定が適用されます。一般的にはカーネルは自動設定を使って全てを設定しようとします。
''例:''
 
BOOTIF=01-A1-B2-C3-D4-E5-F6 # Note the prepended "01-" and capital letters.
 
   
  +
{{ic|<autoconf>}} パラメータは {{ic|ip}} パラメータの唯一の値として指定できます (前の全ての {{ic|:}} 文字を排除)。値が {{ic|1=ip=off}} や {{ic|1=ip=none}} の場合、自動設定は行われません。そうでないなら、自動的に設定されます。最も一般的な使い方は {{ic|1=ip=dhcp}} です。
'''nfsroot='''
 
   
  +
パラメータの説明は、[https://docs.kernel.org/admin-guide/nfs/nfsroot.html カーネルドキュメント]を参照してください。
{{ic|nfsroot}} パラメータがコマンドラインで指定されなかった場合、デフォルトで {{ic|/tftpboot/%s}} が使われます。
 
   
  +
例:
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
 
   
  +
ip=127.0.0.1:::::lo:none --> ループバックインターフェイスを有効化。
''パラメータの説明:''
 
  +
ip=192.168.1.1:::::eth2:none --> 静的 eth2 インターフェイスを有効化。
  +
ip=:::::eth0:dhcp --> eth0 構成に対して dhcp プロトコルを有効化。
   
  +
{{Note|{{ic|<device>}} パラメータにはカーネルのデバイス名を使用してください (例: {{ic|eth0}})、永続的な名前のデバイス名 (例: {{ic|enp2s0}}) では動作しません。詳細は [[ネットワーク設定#ネットワークインターフェイス]] を見てください。}}
<server-ip> Specifies the IP address of the NFS server. If this field
 
is not given, the default address as determined by the
 
`ip' variable (see below) is used. One use of this
 
parameter is for example to allow using different servers
 
for RARP and NFS. Usually you can leave this blank.
 
 
<root-dir> Name of the directory on the server to mount as root. If
 
there is a "%s" token in the string, the token will be
 
replaced by the ASCII-representation of the client's IP
 
address.
 
 
<nfs-options> Standard NFS options. All options are separated by commas.
 
If the options field is not given, the following defaults
 
will be used:
 
port = as given by server portmap daemon
 
rsize = 1024
 
wsize = 1024
 
timeo = 7
 
retrans = 3
 
acregmin = 3
 
acregmax = 60
 
acdirmin = 30
 
acdirmax = 60
 
flags = hard, nointr, noposix, cto, ac
 
   
'''root=/dev/nfs'''
+
'''BOOTIF='''
   
  +
複数のネットワークカードを使っているときは、このパラメータに起動するインターフェイスの MAC アドレスを含めることができます。インターフェイスの数字が変わってしまったり、pxelinux の IPAPPEND 2 や IPAPPEND 3 オプションを使うときに便利です。指定しなかった場合、{{ic|eth0}} が使われます。
{{ic|nfsroot}} パラメータを使わない場合、{{ic|1=root=/dev/nfs}} を設定して自動設定により NFS root から起動するようにする必要があります。
 
 
=== LVM を使う ===
 
 
root デバイスを LVM 上に置いている場合は、'''lvm2''' フックを追加する必要があります。カーネルコマンドラインで以下の形式を使って root デバイスのパスを通して下さい:
 
 
root=/dev/mapper/<volume group name>-<logical volume name>
 
   
 
例:
 
例:
   
  +
BOOTIF=01-A1-B2-C3-D4-E5-F6 # 先頭の "01-" と大文字に注意
root=/dev/mapper/myvg-root
 
   
  +
'''nfsroot='''
さらに、root デバイスの初期化が遅かったり (例: USB デバイス) 起動時に "volume group not found" エラーが表示される場合は、以下をカーネルコマンドラインに追加する必要があります:
 
   
  +
{{ic|nfsroot}} パラメータがコマンドラインで指定されなかった場合、デフォルトで {{ic|/tftpboot/%s}} が使われます。
lvmwait=/dev/mapper/<volume group name>-<logical volume name>
 
   
  +
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
例:
 
   
  +
パラメータの説明を見るには {{ic|mkinitcpio -H net}} を実行してください。
lvmwait=/dev/mapper/myvg-root
 
   
  +
=== LVM を使う ===
これは LVM がデバイスを利用可能にするまでブートプロセスを待機させます。
 
   
  +
root デバイスを [[LVM]] 上に置く場合は、[[LVM に Arch Linux をインストールする#mkinitcpio フックを追加する]] を見てください。
=== 暗号化された root を使う ===
 
   
  +
=== 暗号化されたルートを使う ===
[[Dm-crypt/Encrypting_an_entire_system|root を暗号化]]している場合、{{ic|filesystems}} の前に {{ic|encrypt}} フックを追加する必要があり、他のフックも必要になります。ブートローダーによって特定のカーネルコマンドラインパラメータを指定しなくてはなりません: 詳しくは [[Dm-crypt/System configuration#mkinitcpio]] を見て下さい。
 
   
  +
[[Dm-crypt/システム全体の暗号化|root を暗号化]]している場合、どのフックを含めるべきかに関する詳細な情報は [[Dm-crypt/システム設定#mkinitcpio]] を見て下さい。
=== /usr パーティションを分割する ===
 
  +
  +
=== /usr を別のパーティションに分割する ===
   
 
{{ic|/usr}} のパーティションを別にする場合、以下を行う必要があります:
 
{{ic|/usr}} のパーティションを別にする場合、以下を行う必要があります:
   
  +
* 起動時にこのパーティションのチェックを実行するために、{{ic|fsck}} フックを追加して、{{ic|/etc/fstab}} で {{ic|/usr}} の {{ic|passno}} を {{ic|2}} にする。起動時に {{ic|/usr}} を fsck したい場合は必須です (これはすべてのユーザに推奨されます)。このフックが存在しないと、{{ic|/usr}} は永遠に fsck されません。
* {{ic|mkinitcpio-generate-shutdown-ramfs.service}} を有効にするか {{ic|shutdown}} フックを追加してください。
 
  +
* systemd フックを使っていない場合、{{ic|usr}} フックを追加する。ルートがマウントされた後に {{ic|/usr}} パーティションがマウントされるようになります。
* Add the {{ic|fsck}} hook, mark {{ic|/usr}} with a {{ic|passno}} of {{ic|0}} in {{ic|/etc/fstab}}. While recommended for everyone, it is mandatory if you want your {{ic|/usr}} partition to be fsck'ed at boot-up. Without this hook, {{ic|/usr}} will never be fsck'd.
 
* Add the {{ic|usr}} hook. This will mount the {{ic|/usr}} partition after root is mounted. Prior to 0.9.0, mounting of {{ic|/usr}} would be automatic if it was found in the real root's {{ic|/etc/fstab}}.
 
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
377行目: 352行目:
 
=== イメージの展開 ===
 
=== イメージの展開 ===
   
initrd イメージの中に何が入っているか気になるときは、イメージを展開して中に入っているファイルを調べることができます。
+
initramfs イメージの中に何が入っているか気になるときは、イメージを展開して中に入っているファイルを調べることができます。
   
initrd イメージは SVR4 CPIO アーカイブであり、{{ic|find}} と {{ic|bsdcpio}} コマンドによって生成されています。また、任意でカーネルが対応した圧縮方法によって圧縮されています。圧縮方法について詳しくは [[#COMPRESSION]] を見て下さい。
+
initramfs イメージは SVR4 CPIO アーカイブであり、{{ic|find}} と {{ic|bsdcpio}} コマンドによって生成されています。また、任意でカーネルが対応した圧縮方法によって圧縮されています。圧縮方法について詳しくは [[#COMPRESSION]] を見て下さい。
   
mkinitcpio には {{ic|lsinitcpio}} というユーティリティが含まれており initramfs イメージの中身を一覧・展開することができます。
+
''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}} スクリプトの {{ic|build_image}} 関数を以下のパラメータで実行してください:
  +
  +
build_image ''出力ファイル'' ''圧縮方式''
  +
  +
{{ic|build_image}} 関数の内容で新しいスクリプトを作成することでこれを実行できます。
  +
これはカレントディレクトリ内の内容を {{ic|''出力ファイル''}} というファイルに圧縮します。
  +
  +
{{Warning|上書きするまえに自動生成された {{ic|/boot/initramfs-linux.img}} の名前を変更することで、簡単に元に戻すことができるようになります。何か問題が発生して起動できなくなった場合、fallback イメージやブート CD で起動して、{{ic|mkinitcpio}} を実行して元のイメージに戻してください。あるいは、自分で修正してイメージを再圧縮してください。}}
   
 
=== マウントされているのに "/dev must be mounted" と表示される ===
 
=== マウントされているのに "/dev must be mounted" と表示される ===
  +
The test used by mkinitcpio to determine if {{ic|/dev}} is mounted is to see if {{ic|/dev/fd/}} is there. If everything else looks fine, it can be "created" manually by:
 
  +
{{ic|/dev}} がマウントされているかどうか確認するために mkinitcpio は {{ic|/dev/fd/}} が存在するかどうかを確かめます。問題がないようでしたら、手動で作成することができます:
  +
 
# ln -s /proc/self/fd /dev/
 
# ln -s /proc/self/fd /dev/
   
  +
(当然 {{ic|/proc}} のマウントも必要です。''mkinitcpio'' によって次にチェックされます。)
(Obviously, /proc must be mounted as well. mkinitcpio requires that anyway, and that is the next thing it will check.)
 
  +
  +
=== Possibly missing firmware for module XXXX ===
  +
  +
カーネルのアップデート後に initramfs を再生成する際、以下のような警告が表示されることがあります:
  +
  +
==> WARNING: Possibly missing firmware for module: '<nowiki/>''module_name''<nowiki/>'
  +
  +
''default'' initramfs イメージを生成するときに同じようなメッセージが表示される場合、警告メッセージが言っている通り、追加のファームウェアをインストールする必要があるかもしれません。ほとんどの一般的なファームウェアファイルは {{Pkg|linux-firmware}} パッケージを[[インストール]]することで入手できます。ファームウェアを提供する他のパッケージについては、以下の表を見るか、[[公式リポジトリ]]や [[AUR]] でモジュール名を検索してみてください。
  +
  +
メッセージが ''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 ディスクを使用すると、システムが起動できなくなることがよくあります。 したがって、以下のようなシステムレスキュー手順に従ってください:
  +
  +
==== あるマシンでは起動できるが他のマシンでは起動できない ====
  +
  +
''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|手動]]で追加します。
   
 
== 参照 ==
 
== 参照 ==
  +
* [[Boot debugging]] - GRUB によるデバッグ
 
* Linux カーネルドキュメント [https://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/filesystems/ramfs-rootfs-initramfs.txt;hb=HEAD initramfs]
+
* Linux カーネルドキュメント [https://docs.kernel.org/filesystems/ramfs-rootfs-initramfs.html#what-is-rootfs initramfs, "What is rootfs?"]
* Linux カーネルドキュメント [https://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/initrd.txt;hb=HEAD initrd]
+
* Linux カーネルドキュメント [https://docs.kernel.org/admin-guide/initrd.html initrd]
* [[Wikipedia:ja:initrd]]
+
* Wikipedia 記事 [[wikipedia:ja:initrd|initrd]]
  +
  +
{{TranslationStatus|mkinitcpio|2024-08-24|813591}}

2024年10月12日 (土) 17: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つのイメージを生成するための命令が含まれています:

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

プリセットを作成した後、pacman フックは、プリセットで提供された情報を使用して2つのイメージを生成する 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ユニファイドカーネルイメージ (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
ロード可能なカーネルモジュールとファームウェアのファイルを解凍しておくか、もとの圧縮した状態のままにしておくかを設定します。
ノート:
  • システムが必要とする場合があるフックのいくつか (lvm2mdadm_udevencrypt など) は、デフォルトで有効化されていません。これに関する指示は #HOOKS セクションを注意深く読んでください。
  • バージョン 36 より前の mkinitcpio によって作成されたプリセットファイルでは、ALL_config 変数が定義されており、この変数が存在しているとドロップインの設定ファイルが読み込まれません。ドロップインファイルを有効化するには、古いプリセットファイルにある ALL_config="/etc/mkinitcpio.conf" 行をコメントアウトしてください。

MODULES

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

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

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

BINARIES と FILES

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

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

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

HOOKS

HOOKS 配列は設定ファイルの中で一番重要な設定です。フックはイメージに追加されるものを記述する小さなスクリプトです。フックによっては、デーモンを起動したりスタックしたブロックデバイスを集めたりするためのランタイムコンポーネントを含んでいるものもあります。フックは名前によって参照され、設定ファイルの HOOKS にある順番通りに実行されます。

ほとんどのシンプルな単一ディスク環境では、デフォルトの HOOKS 設定で十分なはずです。LVMRAIDdm-crypt などのスタックルートデバイスやマルチブロックデバイスを使う時は、関連する wiki ページを見て必要な設定を調べて下さい。

ビルドフック

ビルドフックは /usr/lib/initcpio/install/ にあります。カスタムビルドフックは /etc/initcpio/install/ に配置します。これらのファイルは mkinitcpio の実行時に bash シェルによって実行されます。ビルドフックには2つの関数が含まれています: buildhelpbuild 関数にはイメージに追加するモジュール、ファイル、バイナリを記述します。これらのアイテムの追加を容易にする 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 フックは systemd ベースの init をトリガーします。これはランタイムフックを実行せず、代わりに systemd ユニットを使用します。

通常のフック

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

busybox init systemd init ビルドフック ランタイムフック (busybox init のみ)
base 任意 全ての初期ディレクトリをセットアップし、基本のユーティリティとライブラリをインストールします。systemd フックを使用していない場合、このフックは重要な busybox init を提供するので、何をしようとしているか理解していない限りはこのフックを常に1番最初に置いてください。
systemd フックを使用する場合、base フックは busybox のリカバリシェルを提供するだけなので、base の追加は任意となります。
ノート: initramfs の root アカウントがロックされているため、リカバリシェルは使用できません。FS#70408 を見てください。
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]

ポストフック

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

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

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

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

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 イメージは SVR4 CPIO アーカイブであり、findbsdcpio コマンドによって生成されています。また、任意で、カーネルが対応した圧縮方法によって圧縮されています。圧縮方法について詳しくは #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 関数の内容で新しいスクリプトを作成することでこれを実行できます。 これはカレントディレクトリ内の内容を 出力ファイル というファイルに圧縮します。

警告: 上書きするまえに自動生成された /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-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 の生成を無効化することができます:
    1. /etc/mkinitcpio.d/ 内のすべての .preset ファイルで、PRESETS=('default' 'fallback') 行を PRESETS=('default') に変更してください。
    2. fallback initramfs イメージを削除してください: # rm /boot/*-fallback.img
    3. ブートローダーの設定ファイルを更新してください。
警告: fallback initramfs の生成を無効化すると、デフォルトの initramfs でシステムの起動が失敗した場合に、システムを起動するためのもう一つの手段が失われることになります。上記の手順を実行する前に、システムリカバリのための起動可能インストールメディアを作成しておいてください。

No PS/2 controller found

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

標準的なレスキュー手順

不適切な初期 RAM ディスクを使用すると、システムが起動できなくなることがよくあります。 したがって、以下のようなシステムレスキュー手順に従ってください:

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

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

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

参照

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