「Mkinitcpio」の版間の差分
細 |
細 (リンクを修正) |
||
(11人の利用者による、間の76版が非表示) | |||
1行目: | 1行目: | ||
+ | {{Lowercase title}} |
||
− | [[Category:ブートプロセス]] |
||
+ | [[Category:initramfs]] |
||
[[Category:カーネル]] |
[[Category:カーネル]] |
||
+ | [[Category:Arch プロジェクト]] |
||
− | [[da:Mkinitcpio]] |
||
+ | [[Category:コマンド]] |
||
[[de:Mkinitcpio]] |
[[de:Mkinitcpio]] |
||
[[en:Mkinitcpio]] |
[[en:Mkinitcpio]] |
||
− | [[ |
+ | [[fr:Mkinitcpio]] |
− | [[ |
+ | [[pt:Mkinitcpio]] |
− | [[it:Mkinitcpio]] |
||
[[ru:Mkinitcpio]] |
[[ru:Mkinitcpio]] |
||
− | [[zh- |
+ | [[zh-hans:Mkinitcpio]] |
− | {{Related articles start |
+ | {{Related articles start}} |
− | {{Related| |
+ | {{Related|Booster}} |
+ | {{Related|ブートデバッグ}} |
||
+ | {{Related|dracut}} |
||
{{Related|カーネルモジュール}} |
{{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'' スクリプトを呼び出します。 |
||
+ | |||
+ | {{Note|''.preset'' ファイルは、カーネルの更新後に initramfs を自動的に再生成するために使用されます。編集するときは注意してください。}} |
||
+ | === 手動生成 === |
||
− | デフォルトで、カーネルのインストール・アップグレードが行われた後 mkinitcpio スクリプトは2つのイメージを生成します: {{ic|/boot/initramfs-linux.img}} と {{ic|/boot/initramfs-linux-fallback.img}}。''fallback'' イメージは ''default'' イメージと同じ設定ファイルを利用しますが、作成中に '''autodetect''' フックだけはスキップされ、全てのモジュールが入ります。'''autodetect''' フックは必要なモジュールを検出して、イメージを固有のハードウェアにあわせて、initramfs を小さくします。 |
||
+ | スクリプトを手動で実行するには、マニュアルページ {{man|8|mkinitcpio}} で手順を確認してください。特に、カーネルパッケージによって提供されるプリセットに基づく initramfs イメージを(再)生成するには、使用するプリセットを {{ic|-p}}/{{ic|--preset}} オプションで指定してください。例えば、{{Pkg|linux}} パッケージの場合、次のコマンドを使用してください: |
||
− | 様々な設定ファイルを使って initramfs イメージを沢山作りたいと思っているユーザーもいるかもしれません。ブートローダに使いたいイメージを指定する必要があります、主としてブートローダの[[Boot Loader#Configuration files|設定ファイル]]で指定します。設定ファイルに変更を加えた後は、イメージを再生成しなければなりません。標準の Arch Linux カーネル {{Pkg|linux}} で再生成するには次のコマンドを root 権限で実行してください: |
||
# mkinitcpio -p linux |
# mkinitcpio -p linux |
||
− | + | 既存のすべてのプリセットに基づく initramfs イメージを(再)生成するには、{{ic|-P}}/{{ic|--allpresets}} スイッチを使用してください。これは通常、グローバルな [[#設定]] の変更後にすべての initramfs イメージを再生成するために使用されます: |
|
+ | # mkinitcpio -P |
||
− | {{Warning|''プリセット''ファイルはカーネルがアップデートされた後 initramfs を再生成するときに自動で使われます; 編集する時は気をつけて下さい。}} |
||
− | ユーザーは |
+ | ユーザーは、さまざまな構成で 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 - |
+ | # 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}} に追加してください。}} |
||
− | ユーザーは設定ファイルの中にある |
+ | ユーザーは、設定ファイルの中にある7つの変数を変更できます (詳細は {{man|5|mkinitcpio.conf}} を見てください): |
− | ; {{ic|MODULES}}: |
+ | ; {{ic|MODULES}}: ブートフックが実行される前にロードされるカーネルモジュール。 |
; {{ic|BINARIES}}: initramfs イメージに含める追加のバイナリ。 |
; {{ic|BINARIES}}: initramfs イメージに含める追加のバイナリ。 |
||
; {{ic|FILES}}: initramfs イメージに含める追加のファイル。 |
; {{ic|FILES}}: initramfs イメージに含める追加のファイル。 |
||
− | ; {{ic|HOOKS}}: フックは |
+ | ; {{ic|HOOKS}}: フックは初期 RAM ディスクで実行するスクリプトです。 |
− | ; {{ic|COMPRESSION}}: initramfs イメージを圧縮する |
+ | ; {{ic|COMPRESSION}}: initramfs イメージを圧縮する際に使用されます。 |
− | ; {{ic|COMPRESSION_OPTIONS}}: {{ic|COMPRESSION}} プログラムに渡す |
+ | ; {{ic|COMPRESSION_OPTIONS}}: {{ic|COMPRESSION}} のプログラムに渡す追加の引数。この設定の使用は推奨されません。''mkinitcpio'' は圧縮プログラムに対する特殊な要件を処理するため (例: xz には {{ic|1=--check=crc32}} を指定します)、誤って利用するとシステムが起動できなくなる可能性があります。 |
+ | ; {{ic|MODULES_DECOMPRESS}}: ロード可能なカーネルモジュールとファームウェアのファイルを解凍しておくか、もとの圧縮した状態のままにしておくかを設定します。 |
||
+ | |||
+ | {{Note| |
||
+ | * システムが必要とする場合があるフックのいくつか ('''lvm2'''、'''mdadm_udev'''、'''encrypt''' など) は、デフォルトで有効化されて'''いません'''。これに関する指示は [[#HOOKS]] セクションを注意深く読んでください。 |
||
+ | * バージョン 36 より前の ''mkinitcpio'' によって作成されたプリセットファイルでは、{{ic|ALL_config}} 変数が定義されており、この変数が存在しているとドロップインの設定ファイルが読み込まれません。ドロップインファイルを有効化するには、古いプリセットファイルにある {{ic|1=ALL_config="/etc/mkinitcpio.conf"}} 行をコメントアウトしてください。 |
||
+ | }} |
||
=== MODULES === |
=== MODULES === |
||
− | MODULES |
+ | {{ic|MODULES}} 配列では、何か他のことが行われる前にロードするモジュールを指定します。 |
モジュールの後ろに {{ic|?}} を付けると、モジュールが見つからなかったときでもエラーを投げません。これは、フックや設定ファイルにリストアップされたモジュールを含んでコンパイルするカスタムカーネルで有益かもしれません。 |
モジュールの後ろに {{ic|?}} を付けると、モジュールが見つからなかったときでもエラーを投げません。これは、フックや設定ファイルにリストアップされたモジュールを含んでコンパイルするカスタムカーネルで有益かもしれません。 |
||
+ | {{Note| |
||
− | {{Note|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}} は''そのままの状態で''追加されます。例: |
|
− | FILES= |
+ | FILES=(/etc/modprobe.d/modprobe.conf) |
− | BINARIES= |
+ | BINARIES=(kexec) |
− | {{ic|BINARIES}} と {{ic|FILES}} の |
+ | {{ic|BINARIES}} と {{ic|FILES}} は両方とも [[Bash]] 配列です。なので、スペースで区切ることで複数のエントリを追加することができます。 |
=== HOOKS === |
=== HOOKS === |
||
− | {{ic|HOOKS}} |
+ | {{ic|HOOKS}} 配列は設定ファイルの中で一番重要な設定です。フックはイメージに追加されるものを記述する小さなスクリプトです。フックによっては、デーモンを起動したりスタックしたブロックデバイスを集めたりするためのランタイムコンポーネントを含んでいるものもあります。フックは名前によって参照され、設定ファイルの {{ic|HOOKS}} にある順番通りに実行されます。 |
− | ほとんどのシンプルな |
+ | ほとんどのシンプルな単一ディスク環境では、デフォルトの {{ic|HOOKS}} 設定で十分なはずです。[[LVM]]、[[RAID]]、[[dm-crypt]] などのスタックルートデバイスやマルチブロックデバイスを使う時は、関連する wiki ページを見て必要な設定を調べて下さい。 |
==== ビルドフック ==== |
==== ビルドフック ==== |
||
− | ビルドフックは {{ic|/usr/lib/initcpio/install}} にあります。これらのファイルは mkinitcpio の実行時に bash シェルによって実行されます。ビルドフックには2つの関数が含まれています: {{ic|build}} と {{ic|help}}。{{ic|build}} 関数にはイメージに追加するモジュール |
+ | ビルドフックは {{ic|/usr/lib/initcpio/install/}} にあります。カスタムビルドフックは {{ic|/etc/initcpio/install/}} に配置します。これらのファイルは ''mkinitcpio'' の実行時に bash シェルによって実行されます。ビルドフックには2つの関数が含まれています: {{ic|build}} と {{ic|help}}。{{ic|build}} 関数にはイメージに追加するモジュール、ファイル、バイナリを記述します。これらのアイテムの追加を容易にする {{man|8|mkinitcpio}} による API が用意されています。{{ic|help}} 関数はフックの役割を出力します。 |
すべてのフックを一覧するには: |
すべてのフックを一覧するには: |
||
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|run_cleanuphook}}: できる限り最後に、この名前の関数が実行されます。設定ファイルの {{ic|HOOKS}} の順番とは逆に実行されます。これらのフックは初期のフックによって起動したデーモンのシャットダウンなど、最後のクリーンアップに使われます。 |
+ | |||
+ | {{Note|ランタイムフックは busybox init でのみ使用されます。 '''systemd''' フックは systemd ベースの init をトリガーします。これはランタイムフックを実行せず、代わりに systemd ユニットを使用します。}} |
||
==== 通常のフック ==== |
==== 通常のフック ==== |
||
− | 通常のフックとイメージ生成への影響と関連するランタイムを示した表です。パッケージにカスタムフックを入れることができるので、この表は完全ではないことに注意してください。 |
+ | 以下は、通常のフックとイメージ生成への影響と関連するランタイムを示した表です。パッケージにカスタムフックを入れることができるので、この表は完全ではないことに注意してください。 |
− | {| class="wikitable |
+ | {| 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}} をインストールする必要があります。 || -- |
||
|- |
|- |
||
− | | ''' |
+ | |colspan="2" {{C|'''kms'''}} || [[カーネルモード設定#設定|KMS の早期開始]] を提供する GPU モジュールを追加します。加えて、一部のノート PC の LCD パネルに組み込まれているプライバシースクリーンに必要なモジュールも追加します。|| {{-}} |
|- |
|- |
||
− | | ''' |
+ | |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'' フックを使うよりも)。 |
||
|- |
|- |
||
− | | ''' |
+ | |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}} から指定されたコンソールフォントをロードします。 |
||
|- |
|- |
||
+ | |colspan="2" {{C|'''mdadm_udev'''}} || udev を使って RAID アレイの構築をサポートします。このフックを使うには {{Pkg|mdadm}} をインストールする必要があります。詳細は [[RAID#mkinitcpio を設定する]] を見てください。 || {{-}} |
||
− | | '''sd-vconsole''' || {{ic|/etc/vconsole.conf}} から systemd ベースの initramfs に指定したキーマップとコンソールフォントを追加します。 || 初期ユーザ空間で {{ic|/etc/vconsole.conf}} から指定されたキーマップとコンソールフォントをロードします。 |
||
|- |
|- |
||
− | | '''encrypt''' || {{ic|dm_crypt}} カーネルモジュールと {{ic|cryptsetup}} ツールをイメージに追加します。これを使うには {{Pkg|cryptsetup}} をインストールする必要があります。 || 暗号化された root パーティションを検知してアンロックします。設定については [[#ランタイムのカスタマイズ]] を見て下さい。 |
+ | | {{C|'''encrypt'''}} || {{C|'''sd-encrypt'''}} || {{ic|dm_crypt}} カーネルモジュールと {{ic|cryptsetup}} ツールをイメージに追加します。これを使うには {{Pkg|cryptsetup}} をインストールする必要があります。{{Note|暗号化されたデバイスを起動時にアンロックするための ''keyboard'' フックの注意書きや、ファイルをアンロックする際はファイルシステムについての [[#MODULES]] にある注意書きを見てください。}} || 暗号化された root パーティションを検知してアンロックします。設定については [[#ランタイムのカスタマイズ]] を見て下さい。 |
+ | '''sd-encrypt''' については [[Dm-crypt/システム設定#sd-encrypt フックを使う]]を見てください。 |
||
|- |
|- |
||
+ | |colspan="2" {{C|'''lvm2'''}} || device mapper カーネルモジュールと {{ic|lvm}} ツールをイメージに追加します。これを使うには {{Pkg|lvm2}} をインストールする必要があります。ルートファイルシステムを [[LVM]] 上に置いている場合、このフックは必須です。 || {{-}} |
||
− | | '''sd-encrypt''' || このフックを使うことで systemd initramfs で暗号化された root デバイスを扱えます。 |
||
− | |||
− | 利用できるカーネルコマンドラインオプションについては systemd-cryptsetup-generator(8) の man ページを見て下さい。また、{{ic|/etc/crypttab.initramfs}} ファイルが存在する場合、{{ic|/etc/crypttab}} として initramfs に追加されます。crypttab の構文の詳細は crypttab(5) manpage を見て下さい。 |
||
− | | -- |
||
|- |
|- |
||
+ | |colspan="2" {{C|'''filesystems'''}} || イメージに必要なファイルシステムモジュールを含めます。ファイルシステムモジュールを {{ic|MODULES}} で指定していない限りこのフックが'''必要'''になります。 || {{-}} |
||
− | | '''lvm2''' || device mapper カーネルモジュールと {{ic|lvm}} ツールをイメージに追加します。これを使うには {{Pkg|lvm2}} をインストールする必要があります。 || 全ての LVM2 ボリュームグループを有効にします。root ファイルシステムが [[LVM (日本語)|LVM]] 上にある場合は必須です。 |
||
|- |
|- |
||
− | | '''fsck''' || fsck バイナリとファイルシステム |
+ | |colspan="2" {{C|'''fsck'''}} || fsck バイナリとファイルシステム固有のヘルパーを追加し、マウント前にルードデバイスに対して fsck を実行できるようにします。'''autodetect''' フックの後ろにこのフックを追加した場合、root ファイルシステムのヘルパーだけが追加されます。このフックの使用は'''強く'''推奨されており、{{ic|/usr}} パーティションを分割する場合は必須です。このフックを含める場合、初期ユーザ空間でキーボードが動作することを保証するために必要なモジュールも追加することを強く推奨します。<br/>このフックを使用するには、[[カーネルコマンドライン]]にパラメータ {{ic|rw}} を設定する必要があります ([https://bbs.archlinux.org/viewtopic.php?pid=1307895#p1307895 議論])。詳細は [[fsck#ブート時のチェック]] を見てください。 || {{-}} |
|- |
|- |
||
+ | |colspan="2" {{C|'''acpi_override'''}} || {{ic|/usr/initcpio/acpi_override/}} と {{ic|/etc/initcpio/acpi_override/}} ディレクトリ内にある ACPI Machine Language (''.aml'') ファイルを未圧縮早期 initramfs イメージに追加します。そうすることで、カーネルがブートの非常に早い段階で ACPI テーブル (例えば [[DSDT]]) をオーバーライドできるようにします。[https://docs.kernel.org/admin-guide/acpi/initrd_table_override.html] || {{-}} |
||
− | | '''resume''' || ハイバネートを検出・復帰するための sh initramfs で動作するシェルスクリプトをインストールします。 || "ハイバネート" (suspend to disk) 状態からの復帰を試みます。''swsusp'' と ''[[suspend2]]'' の両方と一緒に動作します。設定は [[#ランタイムのカスタマイズ]] を見て下さい。systemd 217 から、systemd initramfs ではハイバネートに必要ありません。 |
||
− | |- |
||
− | | '''filesystems''' || イメージに必要なファイルシステムモジュールを含めます。ファイルシステムモジュールを MODULES で指定していない限りこのフックが'''必要になります'''。 || -- |
||
− | |- |
||
− | | '''shutdown''' || シャットダウン initramfs サポートを追加します。mkinitcpio 0.16 以前までは {{ic|/usr}} パーティションを分割していたり root を暗号化しているときはこのフックを使うことを強く推奨されていました。mkinitcpio 0.16 以降から、[https://mailman.archlinux.org/pipermail/arch-dev-public/2013-December/025742.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 の圧縮にいくつかの形式をサポートしています: {{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}} を指定しない |
+ | 提供されている {{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= |
+ | 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=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'') では動作しません。}} |
||
− | ''' |
+ | '''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 |
||
− | ''' |
+ | '''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行目: | ||
=== イメージの展開 === |
=== イメージの展開 === |
||
− | + | initramfs イメージの中に何が入っているか気になるときは、イメージを展開して中に入っているファイルを調べることができます。 |
|
− | + | initramfs イメージは SVR4 CPIO アーカイブであり、{{ic|find}} と {{ic|bsdcpio}} コマンドによって生成されています。また、任意で、カーネルが対応した圧縮方法によって圧縮されています。圧縮方法について詳しくは [[#COMPRESSION]] を見て下さい。 |
|
− | mkinitcpio には {{ |
+ | ''mkinitcpio'' には {{man|1|lsinitcpio}} というユーティリティが含まれており initramfs イメージの中身を一覧・展開することができます。 |
イメージ内のファイルを一覧するには: |
イメージ内のファイルを一覧するには: |
||
− | $ lsinitcpio /boot/initramfs-linux.img |
||
+ | # lsinitcpio /boot/initramfs-linux.img |
||
− | 作業ディレクトリにファイルを全て展開するには: |
||
+ | |||
− | $ lsinitcpio -x /boot/initramfs-linux.img |
||
+ | カレントディレクトリにファイルを全て展開するには: |
||
+ | |||
+ | # lsinitcpio -x /boot/initramfs-linux.img |
||
イメージの重要なパーツについて読みやすいリストを取得することもできます: |
イメージの重要なパーツについて読みやすいリストを取得することもできます: |
||
+ | |||
− | $ lsinitcpio -a /boot/initramfs-linux.img |
||
+ | # lsinitcpio -a /boot/initramfs-linux.img |
||
+ | |||
+ | === 展開して修正を加えたイメージの再圧縮 === |
||
+ | |||
+ | {{ic|/usr/bin/mkinitcpio}} スクリプトの {{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 カーネルドキュメント |
+ | * Linux カーネルドキュメント [https://docs.kernel.org/filesystems/ramfs-rootfs-initramfs.html#what-is-rootfs initramfs, "What is rootfs?"] |
− | * Linux カーネルドキュメント |
+ | * Linux カーネルドキュメント [https://docs.kernel.org/admin-guide/initrd.html 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つのイメージを生成するための命令が含まれています:
- default RAM ディスクイメージ。このイメージの内容は、mkinicpio の #設定 で指定されたディレクティブに従って生成されます。
- fallback RAM ディスクイメージ。作成時に autodetect フックがスキップされることを除いて上記と同じであるため、ほとんどのシステムをサポートするすべてのモジュールが含まれます。
プリセットを作成した後、pacman フックは、プリセットで提供された情報を使用して2つのイメージを生成する mkinitcpio スクリプトを呼び出します。
手動生成
スクリプトを手動で実行するには、マニュアルページ 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
- ロード可能なカーネルモジュールとファームウェアのファイルを解凍しておくか、もとの圧縮した状態のままにしておくかを設定します。
MODULES
MODULES
配列では、何か他のことが行われる前にロードするモジュールを指定します。
モジュールの後ろに ?
を付けると、モジュールが見つからなかったときでもエラーを投げません。これは、フックや設定ファイルにリストアップされたモジュールを含んでコンパイルするカスタムカーネルで有益かもしれません。
BINARIES と FILES
以下のオプションを使ってイメージにファイルを追加することができます。BINARIES
と FILES
はフックが実行される前に追加され、フックによって使用/提供されるファイルを上書きすることがあります。BINARIES
は標準の PATH
に自動で配置され、依存関係がパースされます。つまり必要なライブラリも全て追加されます。FILES
はそのままの状態で追加されます。例:
FILES=(/etc/modprobe.d/modprobe.conf)
BINARIES=(kexec)
BINARIES
と FILES
は両方とも Bash 配列です。なので、スペースで区切ることで複数のエントリを追加することができます。
HOOKS
HOOKS
配列は設定ファイルの中で一番重要な設定です。フックはイメージに追加されるものを記述する小さなスクリプトです。フックによっては、デーモンを起動したりスタックしたブロックデバイスを集めたりするためのランタイムコンポーネントを含んでいるものもあります。フックは名前によって参照され、設定ファイルの HOOKS
にある順番通りに実行されます。
ほとんどのシンプルな単一ディスク環境では、デフォルトの HOOKS
設定で十分なはずです。LVM、RAID、dm-crypt などのスタックルートデバイスやマルチブロックデバイスを使う時は、関連する wiki ページを見て必要な設定を調べて下さい。
ビルドフック
ビルドフックは /usr/lib/initcpio/install/
にあります。カスタムビルドフックは /etc/initcpio/install/
に配置します。これらのファイルは mkinitcpio の実行時に bash シェルによって実行されます。ビルドフックには2つの関数が含まれています: build
と help
。build
関数にはイメージに追加するモジュール、ファイル、バイナリを記述します。これらのアイテムの追加を容易にする mkinitcpio(8) による API が用意されています。help
関数はフックの役割を出力します。
すべてのフックを一覧するには:
$ mkinitcpio -L
特定のフックのヘルプを出力するには mkinitcpio の -H
/--hookhelp
オプションを使って下さい、例えば:
$ mkinitcpio -H udev
ランタイムフック
ランタイムフックは /usr/lib/initcpio/hooks/
にあります。カスタムランタイムフックは /etc/initcpio/hooks/
に配置します。全てのランタイムフックには同じ名前のビルドフックが存在している必要があり、そのビルドフックは add_runscript
をコールしてランタイムフックをイメージに追加します。これらのファイルは初期ユーザ空間で busybox の ash シェルによって実行されます。cleanup フックを除いて全てのフックは HOOKS
設定の順番で実行されます。ランタイムフックには複数の関数を含めることができます:
run_earlyhook
: API ファイルシステムがマウントされカーネルコマンドラインがパースされたときに、この名前の関数が実行されます。一般的に udev など初期ユーザ空間が始まったときに必要になる追加のデーモンはこの関数に置きます。
run_hook
: 初期のフックの後すぐに、この名前の関数が実行されます。一番一般的なフックポイントで、スタックブロックデバイスのアセンブリなどのオペレーションはここで行なって下さい。
run_latehook
: root デバイスがマウントされた後、この名前の関数が実行されます。root デバイスの後のセットアップや /usr
など他のファイルシステムのマウントなどに控えめに使われます。
run_cleanuphook
: できる限り最後に、この名前の関数が実行されます。設定ファイルの HOOKS
の順番とは逆に実行されます。これらのフックは初期のフックによって起動したデーモンのシャットダウンなど、最後のクリーンアップに使われます。
通常のフック
以下は、通常のフックとイメージ生成への影響と関連するランタイムを示した表です。パッケージにカスタムフックを入れることができるので、この表は完全ではないことに注意してください。
busybox init | systemd init | ビルドフック | ランタイムフック (busybox init のみ) |
---|---|---|---|
base | 任意 | 全ての初期ディレクトリをセットアップし、基本のユーティリティとライブラリをインストールします。systemd フックを使用していない場合、このフックは重要な busybox init を提供するので、何をしようとしているか理解していない限りはこのフックを常に1番最初に置いてください。 systemd フックを使用する場合、base フックは busybox のリカバリシェルを提供するだけなので、base の追加は任意となります。 |
– |
udev | systemd | イメージに udevd, udevadm, そして udev ルールの小さなサブセットを追加します。 | udev デーモンを起動して、カーネルからの uevent を処理します; デバイスノードを作成します。ブートプロセスの単純化として、必要なモジュールを明示的に指定する必要をなくすため、udev フックの使用が推奨されています。 |
usr | /usr の分割パーティションのサポートを追加します。詳細は #/usr を別のパーティションに分割する を見てください。 |
本物のルートファイルシステムがマウントされた後に /usr パーティションをマウントします。
| |
resume | ハイバネートイメージにカーネルのコンパイル時デフォルト以外の圧縮アルゴリズムを使用する際に復帰できるようにするために、lzo と lz4 カーネルモジュールを (initramfs に) 追加します。HibernateLocation UEFI 変数で指定されたハイバネートイメージから復帰できるようにするために systemd-hibernate-resume(8) バイナリを追加します。 |
"ハイバネート" (suspend to disk) 状態からの復帰を試みます。詳しい設定方法は ハイバネート を見てください。 | |
btrfs | – | Btrfs を有効にして、Btrfs でフォーマットされた複数のデバイスを使用するために必要なモジュールを設定します。このフックを使うには、btrfs-progs をインストールする必要があります。単一のデバイスで Btrfs を使うだけならこのフックは不要であり、filesystems フックで十分です。 |
udev フックが存在しないときに btrfs device scan を実行してマルチデバイスの Btrfs root ファイルシステムを構築します。このフックを使うには btrfs-progs パッケージが必要です。
|
autodetect | sysfs のスキャンによってモジュールのホワイトリストを作成して initramfs を小さくします。含まれているモジュールが正しく、欠けているものがないか確認してください。自動検知の利点を活かすためにこのフックは他の subsystem フックより前に実行してください。'autodetect' より前に置かれたフックは完全にインストールされます。 | – | |
microcode | Intel 及び AMD プロセッサ向けのマイクロコード早期アップデートファイルを未圧縮 initramfs イメージの先頭に埋め込みます。これは、利用可能であれば /usr/lib/firmware/amd-ucode/ と /usr/lib/firmware/intel-ucode/ にあるマイクロコードファイルを使用します。これらのファイルが利用できない場合は、/boot/amd-ucode.img と /boot/intel-ucode.img を展開して使用します。autodetect フックがこのフックより前に実行される場合、イメージをビルドする際に使用したシステムに搭載されているプロセッサ向けのマイクロコードの早期アップデートファイルのみが追加されます。 このフックは、非推奨となっている --microcode フラグと、プリセットファイルの microcode オプションの機能を置き換えるものです。また、このフックによって、メインの initramfs イメージにマイクロコードのアップデートが埋め込まれるようになるため、マイクロコードを読み込む initrd 行をブートローダーの設定に追加する必要が無くなります。 |
– | |
modconf | /etc/modprobe.d/ と /usr/lib/modprobe.d/ から modprobe 設定ファイルをロードします。 |
– | |
kms | KMS の早期開始 を提供する GPU モジュールを追加します。加えて、一部のノート PC の LCD パネルに組み込まれているプライバシースクリーンに必要なモジュールも追加します。 | – | |
keyboard | キーボードデバイスに必要なモジュールを追加します。あなたが USB キーボードを使っていて、それを初期ユーザ空間で使う必要があるとき (暗号化のパスフレーズを入力したりインタラクティブシェルを使う場合) はこのフックを使って下さい。副作用としてキーボード以外の入力デバイス用のモジュールが追加されることがありますが、困ることはないはずです。 | – | |
keymap | sd-vconsole | /etc/vconsole.conf から initramfs に、指定したコンソールキーマップを追加します。システム暗号化を使用する場合 (特にフルディスク暗号化) 、encrypt フックよりも前に追加するようにしてください。 |
初期ユーザ空間で /etc/vconsole.conf から指定されたキーマップをロードします。
|
consolefont | /etc/vconsole.conf から initramfs に、指定したコンソールフォントを追加します。 |
初期ユーザ空間で /etc/vconsole.conf から指定されたコンソールフォントをロードします。
| |
block | ブロックデバイスのモジュールを追加します。autodetect フックがこのフックより前に実行される場合、このフックはシステム上で使用されているブロックデバイスのモジュールのみを追加します。例外は ahci 、sd_mod 、usb_storage 、uas 、mmc_block 、nvme 、virtio_scsi 、virtio_blk モジュールで、これらは無条件に必ず追加されます。 |
– | |
net | 未実装 | ネットワークデバイスに必要なモジュールを追加します。このフックを使うには mkinitcpio-nfs-utils をインストールしなければなりません。詳細は #net を使う を見てください。 | NFS の root ファイルシステムの管理を提供します。 |
dmraid | ? | fakeRAID root デバイスのサポートを提供します。これを使うには dmraid をインストールする必要があります。コントローラがサポートしている場合、fakeRAID では mdadm_udev フックと一緒に mdadm を使うことが推奨されます。詳細は #RAID を使う を見てください。 | dmraid を使用して fakeRAID ブロックデバイスを検索・構築します。
|
mdadm_udev | udev を使って RAID アレイの構築をサポートします。このフックを使うには mdadm をインストールする必要があります。詳細は RAID#mkinitcpio を設定する を見てください。 | – | |
encrypt | sd-encrypt | dm_crypt カーネルモジュールと cryptsetup ツールをイメージに追加します。これを使うには cryptsetup をインストールする必要があります。 |
暗号化された root パーティションを検知してアンロックします。設定については #ランタイムのカスタマイズ を見て下さい。
sd-encrypt については Dm-crypt/システム設定#sd-encrypt フックを使うを見てください。 |
lvm2 | device mapper カーネルモジュールと lvm ツールをイメージに追加します。これを使うには lvm2 をインストールする必要があります。ルートファイルシステムを LVM 上に置いている場合、このフックは必須です。 |
– | |
filesystems | イメージに必要なファイルシステムモジュールを含めます。ファイルシステムモジュールを MODULES で指定していない限りこのフックが必要になります。 |
– | |
fsck | fsck バイナリとファイルシステム固有のヘルパーを追加し、マウント前にルードデバイスに対して fsck を実行できるようにします。autodetect フックの後ろにこのフックを追加した場合、root ファイルシステムのヘルパーだけが追加されます。このフックの使用は強く推奨されており、/usr パーティションを分割する場合は必須です。このフックを含める場合、初期ユーザ空間でキーボードが動作することを保証するために必要なモジュールも追加することを強く推奨します。このフックを使用するには、カーネルコマンドラインにパラメータ rw を設定する必要があります (議論)。詳細は fsck#ブート時のチェック を見てください。 |
– | |
acpi_override | /usr/initcpio/acpi_override/ と /etc/initcpio/acpi_override/ ディレクトリ内にある ACPI Machine Language (.aml) ファイルを未圧縮早期 initramfs イメージに追加します。そうすることで、カーネルがブートの非常に早い段階で ACPI テーブル (例えば DSDT) をオーバーライドできるようにします。[1] |
– |
ポストフック
ポストフックは /usr/lib/initcpio/post/
(パッケージによって提供されているフック) と /etc/initcpio/post/
(カスタムのフック) に配置されている実行ファイルまたはシェルスクリプトです。これらのファイルは、署名などの追加のタスクを実行するために、イメージが生成された後に実行されます。
各実行ファイルに対して以下の引数が以下の順番で渡されます:
- (イメージに) 使用されているカーネル (状況によってはこの引数が空になる場合があります)
- 生成された initramfs イメージ
- (オプション) 生成されたユニファイドカーネルイメージ
さらに、次の環境変数が設定されます: カーネルの完全なバージョン KERNELVERSION
、起動するためにカーネルを配置する必要のある場所のデフォルト KERNELDESTINATION
。
COMPRESSION
カーネルは、initramfs の圧縮にいくつかの形式をサポートしています: gzip、bzip2、lzma (xz)、xz、lzo (lzop)、lz4、zstd。mkinitcpio はデフォルトで zstd 圧縮イメージを使用します。mkinitcpio は デフォルトで、カーネル 5.9 及びそれ以降に対しては zstd 圧縮を、5.9 より前のカーネルバージョンに対しては gzip を使用します。
提供されている mkinitcpio.conf
には、さまざまな COMPRESSION
オプションがコメントアウトされています。別の圧縮方法に切り替える場合は、コメントを解除し、対応する圧縮ユーティリティがインストールされていることを確認してください。何も指定しない場合は、デフォルトのメソッドが使用されます。非圧縮イメージを作成する場合は、設定ファイルで COMPRESSION=cat
を指定するか、コマンドラインで -z cat
を使用します。
COMPRESSION_OPTIONS
COMPRESSION
で指定したプログラムに渡す追加のフラグを記述します、例:
COMPRESSION_OPTIONS=(-9)
このオプションは空のままにしておくことができます。mkinitcpio は、サポートされている圧縮メソッドに、機能するイメージを生成するために必須なフラグを渡すことを保証しています。
デフォルトの zstd 圧縮では、カスタムカーネルのスペースを節約するために (特にデュアルブート環境で、EFI システムパーティションを /boot
として使用する場合)、--long
オプションは非常に効果的です。ただし、RAM の限られたシステムは、このオプションをした場合に initramfs を解凍できない場合があります。また、-v
オプションは、initramfs の生成中に詳細を見たい場合に必要になるかもしれません。例:
COMPRESSION="zstd" COMPRESSION_OPTIONS=(-v -5 --long)
xz で圧縮レベル -9e
を使用し、ローダブルなカーネルモジュールとファームウェアを解凍しておくことで、圧縮速度が最も遅くなりますが、圧縮率を最大に高めることができます:
COMPRESSION="xz" COMPRESSION_OPTIONS=(-9e) MODULES_DECOMPRESS="yes"
MODULES_DECOMPRESS
MODULES_DECOMPRESS
は、initramfs の作成時にカーネルモジュールとファームウェアのファイルを解凍しておくかを決めます。デフォルトは no
です。
Arch ではカーネルモジュールと linux-firmware を zstd でレベル 19 で圧縮しています。Initramfs でより高い圧縮率を使用する場合、MODULES_DECOMPRESS="yes"
を設定することで、initramfs のサイズをさらに小さくすることができます。しかし、カーネルが個々のモジュールとファームウェアをロード時に解凍する場合よりも、initramfs イメージ全体を解凍するのにより多くの時間が掛かるようになるため、ブートの初期段階で RAM と CPU の使用率を増加させ、RAM 容量が限られていて CPU の性能が低いシステムで悪影響を及ぼします。
ランタイムのカスタマイズ
ランタイム設定オプションはカーネルコマンドラインを通して init
や特定のフックに渡すことができます。カーネルコマンドラインパラメータはブートローダによって与えられることがほとんどです。下で書かれているオプションをカーネルコマンドラインに追加することでデフォルトの挙動を変えることができます。詳しくは カーネルパラメータ や Arch ブートプロセス を見て下さい。
base フックの init
root=
- カーネルコマンドラインで指定する一番重要なパラメータであり、どのデバイスを root デバイスとしてマウントするかを決めます。mkinitcpio は柔軟に様々な形式を使うことができるようになっています。形式の例は 永続的なブロックデバイスの命名#カーネルパラメータ を見てください。
break
break
やbreak=premount
が指定された場合、(フックをロードした後、root ファイルシステムをマウントする前に)init
はブートプロセスを停止してトラブルシューティングに使うことができるインタラクティブシェルを起動します。break=postmount
と指定することで root がマウントされた後にこのシェルを起動することもできます。シェルを終了すると通常通りに起動が行われます。
disablehooks=
disablehooks=hook1[,hook2,...]
を追加すると実行時にフックを無効化します。例:disablehooks=resume
earlymodules=
earlymodules=mod1[,mod2,...]
という風に先にロードするモジュールを指定することでモジュールがロードされる順番を変更することができます (例えば、複数のネットワークインターフェイスの順番を適切に確定したいときなどに使います)。
他のパラメータについては ブートデバッグ や mkinitcpio(8) を見て下さい。
RAID を使う
RAID#mkinitcpio の設定 を見てください。
net を使う
必要なパッケージ
net
は mkinitcpio-nfs-utils パッケージを必要とします。
カーネルパラメータ
公式のカーネルドキュメントに包括的で最新の情報が載っています。
ip=
このパラメータはカーネルに、デバイスの IP アドレスの設定方法と、IP ルーティングテーブルの設定方法を指定します。コロンで区切った9つまでの引数を指定できます: ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>:<ntp0-ip>
。
カーネルコマンドラインにこのパラメータが存在しなかった場合、全てのフィールドが空とされて、カーネルドキュメントに書かれているデフォルト設定が適用されます。一般的にはカーネルは自動設定を使って全てを設定しようとします。
<autoconf>
パラメータは ip
パラメータの唯一の値として指定できます (前の全ての :
文字を排除)。値が ip=off
や ip=none
の場合、自動設定は行われません。そうでないなら、自動的に設定されます。最も一般的な使い方は ip=dhcp
です。
パラメータの説明は、カーネルドキュメントを参照してください。
例:
ip=127.0.0.1:::::lo:none --> ループバックインターフェイスを有効化。 ip=192.168.1.1:::::eth2:none --> 静的 eth2 インターフェイスを有効化。 ip=:::::eth0:dhcp --> eth0 構成に対して dhcp プロトコルを有効化。
BOOTIF=
複数のネットワークカードを使っているときは、このパラメータに起動するインターフェイスの MAC アドレスを含めることができます。インターフェイスの数字が変わってしまったり、pxelinux の IPAPPEND 2 や IPAPPEND 3 オプションを使うときに便利です。指定しなかった場合、eth0
が使われます。
例:
BOOTIF=01-A1-B2-C3-D4-E5-F6 # 先頭の "01-" と大文字に注意
nfsroot=
nfsroot
パラメータがコマンドラインで指定されなかった場合、デフォルトで /tftpboot/%s
が使われます。
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
パラメータの説明を見るには mkinitcpio -H net
を実行してください。
LVM を使う
root デバイスを LVM 上に置く場合は、LVM に Arch Linux をインストールする#mkinitcpio フックを追加する を見てください。
暗号化されたルートを使う
root を暗号化している場合、どのフックを含めるべきかに関する詳細な情報は Dm-crypt/システム設定#mkinitcpio を見て下さい。
/usr を別のパーティションに分割する
/usr
のパーティションを別にする場合、以下を行う必要があります:
- 起動時にこのパーティションのチェックを実行するために、
fsck
フックを追加して、/etc/fstab
で/usr
のpassno
を2
にする。起動時に/usr
を fsck したい場合は必須です (これはすべてのユーザに推奨されます)。このフックが存在しないと、/usr
は永遠に fsck されません。 - systemd フックを使っていない場合、
usr
フックを追加する。ルートがマウントされた後に/usr
パーティションがマウントされるようになります。
トラブルシューティング
イメージの展開
initramfs イメージの中に何が入っているか気になるときは、イメージを展開して中に入っているファイルを調べることができます。
initramfs イメージは SVR4 CPIO アーカイブであり、find
と bsdcpio
コマンドによって生成されています。また、任意で、カーネルが対応した圧縮方法によって圧縮されています。圧縮方法について詳しくは #COMPRESSION を見て下さい。
mkinitcpio には lsinitcpio(1) というユーティリティが含まれており initramfs イメージの中身を一覧・展開することができます。
イメージ内のファイルを一覧するには:
# lsinitcpio /boot/initramfs-linux.img
カレントディレクトリにファイルを全て展開するには:
# lsinitcpio -x /boot/initramfs-linux.img
イメージの重要なパーツについて読みやすいリストを取得することもできます:
# lsinitcpio -a /boot/initramfs-linux.img
展開して修正を加えたイメージの再圧縮
/usr/bin/mkinitcpio
スクリプトの build_image
関数を以下のパラメータで実行してください:
build_image 出力ファイル 圧縮方式
build_image
関数の内容で新しいスクリプトを作成することでこれを実行できます。
これはカレントディレクトリ内の内容を 出力ファイル
というファイルに圧縮します。
マウントされているのに "/dev must be mounted" と表示される
/dev
がマウントされているかどうか確認するために mkinitcpio は /dev/fd/
が存在するかどうかを確かめます。問題がないようでしたら、手動で作成することができます:
# ln -s /proc/self/fd /dev/
(当然 /proc
のマウントも必要です。mkinitcpio によって次にチェックされます。)
Possibly missing firmware for module XXXX
カーネルのアップデート後に initramfs を再生成する際、以下のような警告が表示されることがあります:
==> WARNING: Possibly missing firmware for module: 'module_name'
default initramfs イメージを生成するときに同じようなメッセージが表示される場合、警告メッセージが言っている通り、追加のファームウェアをインストールする必要があるかもしれません。ほとんどの一般的なファームウェアファイルは linux-firmware パッケージをインストールすることで入手できます。ファームウェアを提供する他のパッケージについては、以下の表を見るか、公式リポジトリや AUR でモジュール名を検索してみてください。
メッセージが fallback initramfs イメージの生成時にのみ表示される場合は、以下の2つの選択肢があります:
- 影響を受けるハードウェアを使用しないことがわかっている場合は、警告を安全に無視できます。
- 警告を抑制したい場合、不足しているファームウェアをインストールできます。メタパッケージ mkinitcpio-firmwareAUR には、ほどんどのオプションのファームウェアが含まれています。あるいは、手動で必要なパッケージをインストールしてください:
モジュール パッケージ aic94xx aic94xx-firmwareAUR ast ast-firmwareAUR bfa linux-firmware-qlogic bnx2x linux-firmware-bnx2x liquidio linux-firmware-liquidio mlxsw_spectrum linux-firmware-mellanox nfp linux-firmware-nfp qed linux-firmware-qlogic qla1280 linux-firmware-qlogic qla2xxx linux-firmware-qlogic wd719x wd719x-firmwareAUR xhci_pci upd72020x-fwAUR
- 警告を取り除きたいが、必要ないファームウェアパッケージのためにシステムの空き領域を無駄にしたくない場合、fallback initramfs の生成を無効化することができます:
/etc/mkinitcpio.d/
内のすべての .preset ファイルで、PRESETS=('default' 'fallback')
行をPRESETS=('default')
に変更してください。- fallback initramfs イメージを削除してください:
# rm /boot/*-fallback.img
。 - ブートローダーの設定ファイルを更新してください。
No PS/2 controller found
一部のマザーボードで (ほとんどの場合、古いもの。しかし、一部の新しいものでも起こります)、i8042 コントローラが自動検出できません。稀なケースですが、キーボードが使えなくなってしまうことがあります。この状況を事前に察知することができます。PS/2 ポートがあり、i8042: PNP: No PS/2 controller found. Probing ports directly
というメッセージが表示される場合、MODULES
配列に atkbd
を追加してください。[2]
標準的なレスキュー手順
不適切な初期 RAM ディスクを使用すると、システムが起動できなくなることがよくあります。 したがって、以下のようなシステムレスキュー手順に従ってください:
あるマシンでは起動できるが他のマシンでは起動できない
mkinitcpio の autodetect
フックは /sys
をスキャンして、ロードされているカーネルモジュールを確認して不要なカーネルモジュールを排除します。/boot
ディレクトリを他のマシンに移動して、初期ユーザー空間でブートが失敗する場合、カーネルモジュールが存在しないために新しいハードウェアが検出されていないのが原因かもしれません。USB 2.0 と 3.0 では必要なカーネルモジュールが異なるので注意してください。
修正するには、ブートローダーから fallback イメージを選択してください (fallback は autodetect
によるフィルタリングがされていません)。起動したら、新しいマシンで mkinitcpio を実行して適切なモジュールでイメージを再生成してください。fallback イメージで起動できない場合、Arch Linux のライブ CD/USB で起動して、chroot し、新しいマシンで mkinitcpio を実行して下さい。それでも駄目な場合、initramfs にモジュールを手動で追加します。
参照
- Linux カーネルドキュメント initramfs, "What is rootfs?"
- Linux カーネルドキュメント initrd
- Wikipedia 記事 initrd