mkinitcpio

提供: ArchWiki
2021年10月29日 (金) 14:17時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎カスタマイズされた生成: 構成ファイルを設定ファイルに変更)
ナビゲーションに移動 検索に移動

関連記事

mkinitcpioinitial ramdisk 環境を作成するために使われる Bash スクリプトです。mkinitcpio(8) より:

initial ramdisk は非常に小さい環境(初期ユーザー空間)であり、様々なカーネルモジュールをロードして init にコントロールを移す前に必要なことをセットアップします。これにより、root ファイルシステムを暗号化したりソフトウェア RAID アレイに root を載せることが可能になります。mkinitcpio はカスタムフックによって簡単に拡張することができ、自動時の自動検知など様々な機能を持っています。

伝統的には、ブートプロセスの初めにハードウェアを検知したりタスクの初期化を行うのはカーネルで、それから root ファイルシステムがマウントされ init にコントロールが移されます。しかしながら、先端技術が生まれるにつれ、こういった作業は複雑になりつつあります。

今日、root ファイルシステムが載るハードウェアは SCSI から SATA、USB ドライブまで様々にわたり、それらハードウェアはそれぞれのマニュファクチャーによって作られたいろんなドライブコントローラによってコントロールされています。しかも、root ファイルシステムは暗号化されたり圧縮されたりする可能性もあります; ソフトウェア RAID アレイや論理ボリュームグループに含まれるかもしれません。複雑になったものをシンプルに扱う方法はユーザースペースへ管理を譲渡することです。 参照: /dev/brain0 » Blog Archive » Early Userspace in Arch Linux

mkinitcpio は Arch Linux デベロッパーとコミュニティの貢献によって開発されています。Git リポジトリを見て下さい。

インストール

mkinitcpio パッケージは公式リポジトリで利用可能で linux パッケージの依存パッケージになっています。

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

ノート: Git から mkinitcpio を使う時は arch-projects メーリングリストを購読することが強く推奨されます!

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

自動生成

カーネルがインストールまたはアップグレードされるたびに、pacman フック/etc/mkinitcpio.d/ に保存されている .preset ファイルを自動的に生成します。たとえば、公式の安定した linux カーネルパッケージの場合は linux.preset です。プリセットは、さまざまなパラメーターや出力ファイルの場所を手動で指定するのではなく、初期ramdiskイメージを作成するために必要な情報のリストです。 デフォルトでは、2つのイメージを作成するための手順が含まれています。

  1. mkinitcpio #設定 で指定されたディレクティブに従って作成された デフォルト の RAM ディスクイメージ、および
  2. フォールバック RAM ディスクイメージ。作成時に 自動検出 フックがスキップされることを除いて上記と同じであるため、ほとんどのシステムをサポートするすべてのモジュールが含まれます。

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

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

手動生成

スクリプトを手動で実行するには、手順について mkinitcpio(8) のマニュアルページを参照してください。特に、カーネルパッケージによって提供されるプリセットを(再)生成するには、 -p/--preset オプションを使用してから、使用するプリセットを使用します。たとえば、 linux パッケージの場合、次のコマンドを使用します。

# mkinitcpio -p linux

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

# mkinitcpio -P

ユーザーは、さまざまな構成で initramfs イメージをいくつでも作成できます。目的のイメージは、それぞれの ブートローダー 構成ファイルで指定する必要があります。

カスタマイズされた生成

ユーザーは、代替の設定ファイルを使用してイメージを生成できます。たとえば、次の例では、 /etc/mkinitcpio-custom.confの指示に従って初期ramdiskイメージを生成し、 /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 の基本の設定ファイルは /etc/mkinitcpio.conf です。さらに、カーネルパッケージによって提供されるプリセット定義が /etc/mkinitcpio.d ディレクトリにあります (例: /etc/mkinitcpio.d/linux.preset)。

警告: デフォルトでは lvm2, mdadm, encrypt は有効化されていません。これらのフックが必要なときは注意してこのセクションを読んで下さい。
ノート: ノード名が同一でカーネルモジュールが異なる複数のディスクコントローラを使っている場合 (例: 2つの SCSI/SATA または2つの IDE コントローラ)、/etc/mkinitcpio.conf で指定するモジュールの順番が正しいことを確認して下さい。再起動で root デバイスの場所が変わってしまって、カーネルパニックが発生する可能性があります。また、永続的なブロックデバイスの命名を使えば正しいデバイスを確実にマウントすることができます。
ノート: PS/2 キーボードを使っている場合: init でキーボード入力を使えるようにするには、HOOKSkeyboard フックを追加してください。マザーボードによっては (特に旧世代のマザーボード)、i8042 コントローラが自動で検出されないことがあります。稀ですが、キーボードがないということもありえます。事前にこの状態を検出することができます。PS/2 端子があって i8042: PNP: No PS/2 controller found. Probing ports directly メッセージが表示される場合、atkbdMODULES に追加してください。

ユーザーは設定ファイルの中にある6つの変数を修正することが可能です:

MODULES
boot フックが実行される前にロードするべきカーネルモジュール。
BINARIES
initramfs イメージに含める追加のバイナリ。
FILES
initramfs イメージに含める追加のファイル。
HOOKS
フックは initial ramdisk で実行するスクリプトです。
COMPRESSION
initramfs イメージを圧縮するのに使われます。
COMPRESSION_OPTIONS
COMPRESSION プログラムに渡すコマンドラインオプション。この設定の使用はあまり推奨されません。mkinitcpio は圧縮プログラムに特殊な細工を施すので (例: xz には --check=crc32 を指定します)、誤って利用するとシステムが起動できなくなる可能性があります。

MODULES

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

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

ノート:
  • reiser4 を使う場合、モジュールのリストに必ず追加するようにしてください。
  • mkinitcpio の実行時ライブでないブートプロセスの間にファイルシステムが必要な場合 (例えば LUKS の暗号化キーファイルが ext2 ファイルシステム上にあって mkinitcpio の実行時には ext2 ファイルシステムはマウントしない場合)、そのファイルシステムのモジュールも MODULES リストに追加する必要があります。詳しくは Dm-crypt/システム設定#cryptkey を参照。

BINARIES と FILES

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

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

BINARIESFILES のどちらでも、スペースで区切ることで複数のエントリを追加することができます。

HOOKS

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

ほとんどのシンプルな、シングルディスクセットアップではデフォルトの HOOKS 設定で十分なはずです。LVM, mdadm, dm-crypt などスタックした root デバイスやマルチブロックデバイスを使う時は、関連する 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 の順番とは逆に実行されます。これらのフックは初期のフックによって起動したデーモンのシャットダウンなど、最後のクリーンアップに使われます。

ノート: ランタイムフックは busyboxinit でのみ使用されます。 systemd フックは systemd ベースの init をトリガーします。これはランタイムフックを実行せず、代わりに systemd ユニットを使用します。

通常のフック

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

現行のフック
busybox init systemd init ビルドフック ランタイムフック (busybox init のみ)
base 全ての initial directory をセットアップし基本のユーティリティとライブラリをインストールする。何をしようとしているのかわからない限りはこのフックを一番最初のフックにしておいてください。systemd フックを使用している場合、busybox のリカバリシェルが提供されます。
ノート: initramfs の root アカウントが locked されてるため、リカバリシェルは使用できません。
--
udev systemd イメージに udevd, udevadm, そして udev ルールの小さなサブセットを追加します。 dev デーモンを起動してカーネルからの uevent を処理します。デバイスノードを作成します。ブートプロセスの単純化として、必要なモジュールを明示的に指定する必要をなくすため、udev フックの使用が推奨されています。
usr /usr の分割パーティションのサポートを追加。 real root がマウントされた後に /usr パーティションをマウントします。
resume -- "ハイバネート" (suspend to disk) 状態からの復帰を試みます。詳しい設定方法はハイバネートを見てください。
btrfs -- root で Btrfs を有効にしてサブボリュームを使用するために必要なモジュールを設定します。シングルデバイスで Btrfs を使うだけならこのフックは不要です。 udev フックが存在しないときに btrfs device scan を実行してマルチデバイスの Btrfs root ファイルシステムを構築します。このフックを使うには btrfs-progs パッケージが必要です。
autodetect sysfs のスキャンによってモジュールのホワイトリストを作成して initramfs を小さくします。含まれているモジュールが正しく、欠けているものがないか確認してください。自動検知の利点を活かすためにこのフックは他の subsystem フックより前に実行してください。'autodetect' より前に置かれたフックは完全にインストールされます。 --
modconf /etc/modprobe.d/usr/lib/modprobe.d/ から modprobe 設定ファイルをロードします。 --
block 全てのブロックデバイスモジュールを追加します。昔は fw, mmc, pata, sata, scsi , usb, virtio フックに分かれていました。 --
net 未実装 ネットワークデバイスに必要なモジュールを追加します。PCMCIA net デバイスには pcmcia フックも追加してください。 NFS の root ファイルシステムの管理を提供します。
dmraid ? fakeRAID root デバイスのサポートを提供します。これを使うには dmraid をインストールする必要があります。コントローラがサポートしている場合、fakeRAID では mdadm_udev フックと一緒に mdadm を使うことが推奨されます。 dmraid を使用して fakeRAID ブロックデバイスを構築します。
mdadm -- /etc/mdadm.conf からの RAID アレイの構築や、起動中の自動検出のサポートを提供します。これを使うには mdadm のインストールが必須です。このフックよりも mdadm_udev フックが推奨されています。 mdassemble を使ってソフトウェア RAID ブロックデバイスを構築します。
mdadm_udev udev による RAID アレイの構築のサポートを提供します。これを使うには mdadm のインストールが必要です。FakeRAID アレイでこのフックを使う場合、binaries セクションに mdmon を含めて shutdown フックを追加することが推奨されます。再起動時に不必要な RAID を再ビルドしないためです。 udevmdadm を使ってソフトウェア RAID ブロックデバイスを動的に構築します。mdadm アセンブリの推奨方法です (上記の mdadm フックを使うよりも)。
keyboard キーボードデバイスに必要なモジュールを追加します。あなたが USB キーボードを使っていて、それを初期ユーザ空間で使う必要があるとき (暗号化のパスフレーズを入力したりインタラクティブシェルを使う場合) はこのフックを使って下さい。副作用としてキーボード以外の入力デバイス用のモジュールが追加されることがありますが、困ることはないはずです。
ヒント: 異なるハードウェア構成で起動されるシステム(たとえば、外部キーボードと内部キーボードを備えたラップトップまたは headless systems) の場合、このフックを 自動検出 の前に配置すると便利です。 常にすべてのキーボードドライバを含めるため。 それ以外の場合、外部キーボードは、イメージの作成時に接続されている場合にのみ、初期のユーザースペースで機能します。
--
keymap sd-vconsole /etc/vconsole.conf から initramfs に指定したキーマップを追加します。システム暗号化 (特に完全なシステム暗号化) を使用する場合、encrypt フックよりも前に追加するようにしてください。 初期ユーザ空間で /etc/vconsole.conf から指定されたキーマップをロードします。
consolefont /etc/vconsole.conf から initramfs に指定したコンソールフォントを追加します。 初期ユーザ空間で /etc/vconsole.conf から指定されたコンソールフォントをロードします。
encrypt sd-encrypt dm_crypt カーネルモジュールと cryptsetup ツールをイメージに追加します。これを使うには cryptsetup をインストールする必要があります。 暗号化された root パーティションを検知してアンロックします。設定については #ランタイムのカスタマイズ を見て下さい。sd-encrypt については Dm-crypt/システム設定#sd-encrypt フックを使うを見てください。
lvm2 sd-lvm2 device mapper カーネルモジュールと lvm ツールをイメージに追加します。これを使うには lvm2 をインストールする必要があります。 全ての LVM2 ボリュームグループを有効にします。root ファイルシステムが LVM 上にある場合は必須です。
fsck fsck バイナリとファイルシステム特有のヘルパーを追加します。autodetect フックの後ろに追加した場合、root ファイルシステムのヘルパーだけが追加されます。このフックの使用は強く推奨されており、/usr パーティションを分割する場合は必須です。 root デバイス (と分割している場合は /usr) に対してマウントする前に fsck を実行します。ブートローダーのデフォルト設定で問題ありませんが、疑問がある場合は こちらの設定 を読んで下さい。
filesystems イメージに必要なファイルシステムモジュールを含めます。ファイルシステムモジュールを MODULES で指定していない限りこのフックが必要になります。 --

廃止されたフック

mkinitcpio 0.13.0 では、usbinput フックは廃止され keyboard フックを使うようになりました。

mkinitcpio 0.12.0 では、以下のフックが廃止されました。以下のフックのどれかを使っているときは、block フックに置き換える必要があります。

  • fw
  • mmc
  • pata
  • sata
  • scsi
  • usb
  • virtio

詳しくは、Git コミット 97368c0e78arch-projects メーリングリストを見て下さい。

COMPRESSION

カーネルは、 initramfs の圧縮にいくつかの形式をサポートしています: gzipbzip2、 lzma、 xzlzolz4 および zstd mkinitcpio はデフォルトで zstd 圧縮イメージを使用します。 zstd 圧縮はマルチスレッドモードで実行されます (検出されたコアと同じ数のスレッドを使用します。 -T 0 オプションを使用)

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

ヒント: 高圧縮モード (-9) のイメージの圧縮比は通常の約2.5で、解凍速度が非常に速いため、 lz4 はより遅いシングルスレッド圧縮を犠牲にして最も速い解凍速度を実現します。わずかに優れた圧縮の、lzo も解凍が速いです。zstd は、マルチスレッド圧縮と、そのオプションを使用した幅広い圧縮レベルを備えた汎用的なソリューションを提供します。 zstd(1) § Operation modifiers を参照してください。 xz は、解凍速度がはるかに遅くなりますが、高圧縮プリセット (-9) で約5の縮小係数で最小サイズを実現します。

COMPRESSION_OPTIONS

COMPRESSION で指定したプログラムに渡す追加のフラグを記述します、例:

COMPRESSION_OPTIONS=(-9)

mkinitcpio はイメージを作成するときサポートされている圧縮方法に必要なフラグを渡すので、通常はこのオプションは必要ありません。なお、カーネルが作成された圧縮ファイルを解凍できないとき、このオプションを使っていないとシステムをブートできなくなる可能性があります。

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

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

init

root
カーネルコマンドラインで指定する一番重要なパラメータであり、どのデバイスを root デバイスとしてマウントするかを決めます。mkinitcpio は柔軟に様々な形式を使うことができるようになっています、例:
root=/dev/sda1                                                # /dev node
root=LABEL=CorsairF80                                         # label
root=UUID=ea1c4959-406c-45d0-a144-912f4e86b207                # UUID
root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660            # GPT partition UUID
ノート: 以下のブートパラメーターは 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,...} という風に先にロードするモジュールを指定することでモジュールがロードされる順番を変更することができます (例えば、複数のネットワークインターフェイスの順番を適切に確定したいときなどに使います)。
rootdelay=N
rootdelay を追加すると root ファイルシステムをマウントする前に N 秒間だけ停止します (例えば、初期化に時間がかかる USB ハードドライブから起動するときなどに使います)。

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

RAID を使う

ノート: mdadm は推奨されません。更新時に ==> WARNING: Hook 'mdadm' is deprecated. Replace it with 'mdadm_udev' in your config が表示されます。

まず、/etc/mkinitcpio.conf 内の HOOKSmdadm_udev または mdadm フックを追加し、必要な RAID モジュール全て (例: raid456, ext4) を MODULES に追加して下さい。

mdadm フックを使う場合、カーネルパラメータで RAID アレイを設定する必要はありません。mdadm フックは /etc/mdadm.conf ファイルを使うか、またはブート時の init 段階でアレイを自動で検出します。

mdadm_udev フックを使うことで udev による構築も可能です。上流ではこの方法が推奨されています。/etc/mdadm.conf は構築されたデバイスに名前を付けるために読み込まれます。

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>

カーネルコマンドラインにこのパラメータが存在しなかった場合、全てのフィールドが空とされて、カーネルドキュメントに書かれているデフォルト設定が適用されます。一般的にはカーネルは自動設定を使って全てを設定しようとします。

<autoconf> パラメータは 'ip' パラメータの唯一の値として指定できます (前の全ての ':' 文字を排除)。値が ip=offip=none の場合、自動設定は行われません。そうでないなら、自動的に設定されます。最も一般的な使い方は ip=dhcp です。

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

ip=127.0.0.1:::::lo:none  --> Enable the loopback interface.
ip=192.168.1.1:::::eth2:none --> Enable static eth2 interface.
ip=:::::eth0:dhcp --> Enable dhcp protocol for eth0 configuration.
ノート: <device> パラメータにはカーネルのデバイス名を使用してください (例: eth0)、udev のデバイス名 (例: enp2s0) では動作しません。

BOOTIF=

複数のネットワークカードを使っているときは、このパラメータに起動するインターフェイスの MAC アドレスを含めることができます。インターフェイスの数字が変わってしまったり、pxelinux の IPAPPEND 2 や IPAPPEND 3 オプションを使うときに便利です。指定しなかった場合、eth0 が使われます。

例:

BOOTIF=01-A1-B2-C3-D4-E5-F6  # Note the prepended "01-" and capital letters.

nfsroot=

nfsroot パラメータがコマンドラインで指定されなかった場合、デフォルトで /tftpboot/%s が使われます。

nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

パラメータの説明を見るには mkinitcpio -H net を実行してください。

root=/dev/nfs

nfsroot パラメータを使わない場合、root=/dev/nfs を設定して自動設定により NFS root から起動するようにする必要があります。

LVM を使う

root デバイスを LVM 上に置く場合は、lvm2 フックを mkinitcpio.conf に追加する必要があります。

暗号化された root を使う

root を暗号化している場合、filesystems の前に encrypt フックを追加する必要があり、他のフックも必要になります。ブートローダーによって特定のカーネルコマンドラインパラメータを指定しなくてはなりません: 詳しくは Dm-crypt/システム設定#mkinitcpio を見て下さい。

/usr パーティションを分割する

/usr のパーティションを別にする場合、以下を行う必要があります:

  • fsck フックを追加して、/etc/fstab/usrpassno0 にする。起動時に /usr を fsck したい場合は必須です。このフックが存在しないと、/usr は永遠に fsck されません。
  • systemd フックを使っていない場合、usr フックを追加。ルートがマウントされた後に /usr パーティションがマウントされるようになります。0.9.0 以前では、/usr はルートの /etc/fstab で確認されたら自動的にマウントされていました。Fstab を参照。

トラブルシューティング

イメージの展開

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

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

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

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

$ lsinitcpio /boot/initramfs-linux.img

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

$ lsinitcpio -x /boot/initramfs-linux.img

イメージの重要なパーツについて読みやすいリストを取得することもできます:

$ lsinitcpio -a /boot/initramfs-linux.img

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

上記のようにイメージを展開してから修正を加えたら、再圧縮に必要なコマンドを確認します。/usr/bin/mkinitcpio を編集して以下のように行を変更してください (mkinitcpio v20-1 の場合は531行目):

#MKINITCPIO_PROCESS_PRESET=1 "$0" "${preset_cmd[@]}"
MKINITCPIO_PROCESS_PRESET=1 /usr/bin/bash -x "$0" "${preset_cmd[@]}"

そして通常のオプションで mkinitcpio を実行 (mkinitcpio -p linux) すると、最後の20行に以下のような表示がされます:

+ find -mindepth 1 -printf '%P\0'
+ LANG=C
+ bsdcpio -0 -o -H newc --quiet
+ gzip

上記の出力が再圧縮するのに必要なコマンドになります。例:

# find -mindepth 1 -printf '%P\0' | LANG=C bsdcpio -0 -o -H newc --quiet | gzip > /boot/initramfs-linux.img
警告: 上書きするまえに自動生成された /boot/initramfs-linux.img の名前を変更することで、簡単に元に戻すことができるようになります。何か問題が発生して起動できなくなった場合、フォールバックイメージやブート CD で起動して、mkinitcpio を実行して元のイメージに戻してください。

マウントされているのに "/dev must be mounted" と表示される

/dev がマウントされているかどうか確認するのに mkinitcpio は /dev/fd/ が存在するかどうかを確かめます。問題がないようでしたら、手動で作成することができます:

# ln -s /proc/self/fd /dev/

当然 /proc のマウントも必要です。mkinitcpio によって次にチェックされます。

LUKS/LVM/resume セットアップで systemd フックを使う

伝統的な encrypt/lvm2/resume の代わりに systemd/sd-encrypt/sd-lvm2 フックを使う場合、ブートローダーで別の initrd パラメータを渡す必要があります。詳しくはフォーラムの投稿を見て下さい [1]

Possibly missing firmware for module XXXX

カーネルのアップデート後に initramfs を再生成する際、以下のような警告が表示されることがあります:

==> WARNING: Possibly missing firmware for module: aic94xx
==> WARNING: Possibly missing firmware for module: wd719x 

ファームウェアモジュールをインストールしていない Arch Linux ユーザーなら誰でも表示されます。ファームウェアを使用するハードウェアを使っていない場合、上記のメッセージは無視してかまいません。

標準的なレスキュー手順

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

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

mkinitcpioautodetect フックは /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:ja:initrd