mkinitcpio

提供: ArchWiki
2015年1月14日 (水) 13:43時点におけるKusakata (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

関連記事

mkinitcpio は次世代の initramfs 作成ツールです。

概要

mkinitcpio は initial ramdisk 環境を作成するために使われる Bash スクリプトです。mkinitcpio man page より:

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

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

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

参照: /dev/brain0 » Blog Archive » Early Userspace in Arch Linux.

mkinitcpio は initramfs CPIO イメージを作成するためのモジュール式のツールで、他の方法に比べて多くのアドバンテージを有します。例えば:

  • 初期ユーザ空間の小さくて軽量な基盤として BusyBox を使用。
  • 実行時のハードウェア自動検知のための udev サポート、そして不必要なモジュールのロードの回避。
  • 拡張性のあるフックベースの init スクリプト、カスタムフックを簡単に pacman パッケージに含めることが可能。
  • LUKS ボリュームのための LVM2, dm-crypt サポート。USB マスストレージデバイスからのレジューム・ブートのための mdadm, swsusp, suspend2 サポート。
  • イメージをリビルドする必要なくカーネルコマンドラインから多くの機能を設定可能。

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

インストール

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

上級ユーザーのために Git から mkinitcpio の最新開発バージョンをインストールできます:

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

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

デフォルトで、カーネルのインストール・アップグレードが行われた後 mkinitcpio スクリプトは2つのイメージを生成します: /boot/initramfs-linux.img/boot/initramfs-linux-fallback.imgfallback イメージは default イメージと同じ設定ファイルを利用しますが、作成中に autodetect フックだけはスキップされ、全てのモジュールが入ります。autodetect フックは必要なモジュールを検出して、イメージを固有のハードウェアにあわせて、initramfs を小さくします。

様々な設定ファイルを使って initramfs イメージを沢山作りたいと思っているユーザーもいるかもしれません。ブートローダに使いたいイメージを指定する必要があります、主としてブートローダの設定ファイルで指定します。設定ファイルに変更を加えた後は、イメージを再生成しなければなりません。標準の Arch Linux カーネル linux で再生成するには次のコマンドを root 権限で実行してください:

# mkinitcpio -p linux

-p スイッチはプリセット (preset) を使うことを示します; ほとんどのカーネルパッケージは /etc/mkinitcpio.d の中に関連する mkinitcpio プリセットファイルを提供しています (例: linux/etc/mkinitcpio.d/linux.preset)。毎回設定ファイルと出力ファイルを指定する代わりに initramfs イメージを作成する方法がプリセットに定義されています。

警告: プリセットファイルはカーネルがアップデートされた後 initramfs を再生成するときに自動で使われます; 編集する時は気をつけて下さい。

ユーザーは他の設定ファイルを使ってイメージを手動で作成することもできます。例えば、以下のコマンドは /etc/mkinitcpio-custom.conf の指示に従って initramfs イメージを生成し /boot/linux-custom.img にイメージを保存します。

# mkinitcpio -c /etc/mkinitcpio-custom.conf -g /boot/linux-custom.img

現在動作しているカーネル以外のカーネル用のイメージを作成するときは、コマンドラインにカーネルのバージョンを加えて下さい。/usr/lib/modules 内でカーネルバージョンを見ることができます。

# mkinitcpio -g /boot/linux.img -k 3.3.0-ARCH

設定

mkinitcpio の基本の設定ファイルは /etc/mkinitcpio.conf です。さらに、カーネルパッケージによって提供されるプリセット定義が /etc/mkinitcpio.d ディレクトリにあります (例: /etc/mkinitcpio.d/linux.preset)。

警告: デフォルトでは lvm2, mdadm, encrypt有効化されていません。これらのフックが必要なときは注意してこのセクションを読んで下さい。
ノート: 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 /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.
ノート: 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 行では何か他のことが行われる前にロードするモジュールを指定します。

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

ノート: 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.

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 にあります。これらのファイルは mkinitcpio の実行時に bash シェルによって実行されます。ビルドフックには2つの関数が含まれています: buildhelpbuild 関数にはイメージに追加するモジュール・ファイル・バイナリを記述します。これらのアイテムの追加を容易にする mkinitcpio(8) による API が用意されています。help 関数はフックの役割を出力します。

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

$ mkinitcpio -L

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

$ mkinitcpio -H udev

ランタイムフック

ランタイムフックは /usr/lib/initcpio/hooks にあります。全てのランタイムフックには同じ名前のビルドフックが存在している必要があり、そのビルドフックは add_runscript をコールしてランタイムフックをイメージに追加します。これらのファイルは初期ユーザ空間で busybox の ash シェルによって実行されます。cleanup フックを除いて全てのフックは HOOKS 設定の順番で実行されます。ランタイムフックには複数の関数を含めることができます:

run_earlyhook: API ファイルシステムがマウントされカーネルコマンドラインがパースされたときに、この名前の関数が実行されます。一般的に udev など初期ユーザ空間が始まったときに必要になる追加のデーモンはこの関数に置きます。

run_hook: 初期のフックの後すぐに、この名前の関数が実行されます。一番普通のフックポイントで、スタックブロックデバイスのアセンブリなどのオペレーションはここで行なって下さい。

run_latehook: root デバイスがマウントされた後、この名前の関数が実行されます。root デバイスの後のセットアップや /usr など他のファイルシステムのマウントなどに控えめに使われます。

run_cleanuphook: 出来る限り最後に、この名前の関数が実行されます。設定ファイルの HOOKS の順番とは逆に実行されます。これらのフックは初期のフックによって起動したデーモンのシャットダウンなど、最後のクリーンアップに使われます。

通常のフック

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

現行のフック
フック インストール ランタイム
base 全ての initial directory をセットアップし基本のユーティリティとライブラリをインストールする。何をしようとしているのかわからない限りはこのフックを一番最初のフックにしておいてください。 --
systemd このフックは基本的な systemd セットアップを initramfs にインストールします。これによって 'base', 'usr', 'udev', 'timestamp' フックが置き換えられます。(暗号化など) 他のフックも移す必要がありますが、期待通りには動作しません。下にある systemd 特有のフック ("sd-*") を使用するときは、必須になります。systemd 207 から、このフックは lvm2 と一緒に使うと上手く動作せず起動できなくなることがあります。lvm2 フックの代わりに sd-lvm2 フックを使って下さい。initramfs で緊急シェルが使えるように (このフックの前に) base フックを含めると良いでしょう。systemd 217 から、このフックはハイバネートからの復帰に必要なサービスやバイナリヘルパーもインストールします。 systemd 217 で起動して、カーネルコマンドラインの resume パラメータのハイバネーションイメージを探して、イメージからの復帰を開始します。
btrfs root で Btrfs を有効にしてサブボリュームを使用するために必要なモジュールを設定します。 udev フックが存在しないときに btrfs device scan を実行してマルチデバイスの Btrfs root ファイルシステムを構築します。このフックを使うには btrfs-progs パッケージが必要です。
udev イメージに udevd, udevadm, そして udev ルールの小さなサブセットを追加します。 udev デーモンを起動してカーネルからの uevent を処理します。デバイスノードを作成します。ブートプロセスの単純化として、必要なモジュールを明示的に指定する必要をなくすため、udev フックの使用が推奨されています。
autodetect sysfs のスキャンによってモジュールのホワイトリストを作成して initramfs を小さくします。含まれているモジュールが正しく、欠けているものがないか確認してください。自動検知の利点を活かすためにこのフックは他の subsystem フックより前に実行してください。'autodetect' より前に置かれたフックは完全にインストールされます。 --
modconf /etc/modprobe.d/usr/lib/modprobe.d から modprobe 設定ファイルをロードします。 --
block 全てのブロックデバイスモジュールを追加します。昔は fw, mmc, pata, sata, scsi , usb, virtio フックに分かれていました。 --
pcmcia PCMCIA デバイスに必要なモジュールを追加します。これを使うには pcmciautils をインストールする必要があります。 --
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 キーボードを使っていて、それを初期ユーザ空間で使う必要があるとき (暗号化のパスフレーズを入力したりインタラクティブシェルを使う場合) はこのフックを使って下さい。副作用としてキーボード以外の入力デバイス用のモジュールが追加されることがありますが、困ることはないはずです。 --
keymap /etc/vconsole.conf から initramfs に指定したキーマップを追加します。 初期ユーザ空間で /etc/vconsole.conf から指定されたキーマップをロードします。
consolefont /etc/vconsole.conf から initramfs に指定したコンソールフォントを追加します。 初期ユーザ空間で /etc/vconsole.conf から指定されたコンソールフォントをロードします。
sd-vconsole /etc/vconsole.conf から systemd ベースの initramfs に指定したキーマップとコンソールフォントを追加します。 初期ユーザ空間で /etc/vconsole.conf から指定されたキーマップとコンソールフォントをロードします。
encrypt dm_crypt カーネルモジュールと cryptsetup ツールをイメージに追加します。これを使うには cryptsetup をインストールする必要があります。 暗号化された root パーティションを検知してアンロックします。設定については #ランタイムのカスタマイズ を見て下さい。
sd-encrypt このフックを使うことで systemd initramfs で暗号化された root デバイスを扱えます。

利用できるカーネルコマンドラインオプションについては systemd-cryptsetup-generator(8) の man ページを見て下さい。また、/etc/crypttab.initramfs ファイルが存在する場合、/etc/crypttab として initramfs に追加されます。crypttab の構文の詳細は crypttab(5) manpage を見て下さい。

--
lvm2 device mapper カーネルモジュールと lvm ツールをイメージに追加します。これを使うには lvm2 をインストールする必要があります。 全ての LVM2 ボリュームグループを有効にします。root ファイルシステムが LVM 上にある場合は必須です。
fsck fsck バイナリとファイルシステム特有のヘルパーを追加します。autodetect フックの後ろに追加した場合、root ファイルシステムのヘルパーだけが追加されます。このフックの使用は強く推奨されており、/usr パーティションを分割する場合は必須です。 root デバイス (と分割している場合は /usr) に対してマウントする前に fsck を実行します。ブートローダーのデフォルト設定で問題ありませんが、疑問がある場合はこちらの設定を読んで下さい。
resume ハイバネートを検出・復帰するための sh initramfs で動作するシェルスクリプトをインストールします。 "ハイバネート" (suspend to disk) 状態からの復帰を試みます。swsuspsuspend2 の両方と一緒に動作します。設定は #ランタイムのカスタマイズ を見て下さい。systemd 217 から、systemd initramfs ではハイバネートに必要ありません。
filesystems イメージに必要なファイルシステムモジュールを含めます。ファイルシステムモジュールを MODULES で指定していない限りこのフックが必要になります --
shutdown シャットダウン initramfs サポートを追加します。mkinitcpio 0.16 以前までは /usr パーティションを分割していたり root を暗号化しているときはこのフックを使うことを強く推奨されていました。mkinitcpio 0.16 以降から、必須ではないとされています。 シャットダウン時にデバイスをアンマウント・取り外します。
usr /usr の分割パーティションのサポートを追加。 real root がマウントされた後に /usr パーティションをマウントします。

廃止されたフック

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

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

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

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

COMPRESSION

カーネルは initramfs の圧縮に複数のフォーマットをサポートしています - gzip, bzip2, lzma, xz (別名 lzma2), lzo, lz4。ほとんどの場合、gzip か lzop、または lz4 を使ったときに圧縮イメージサイズと展開速度のバランスが一番良くなります。

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

COMPRESSION を指定しないときは initramfs ファイルは gzip で圧縮されます。イメージを圧縮したくないときは、COMPRESSION=cat を設定するかコマンドラインで -z cat を使って下さい。

使用する圧縮方法の適切なファイル圧縮ユーティリティがインストールされているか確認してください。

COMPRESSION_OPTIONS

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

COMPRESSION_OPTIONS='-9'

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

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

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

init

ノート: The following options alter the default behavior of init in the initramfs environment. See /usr/lib/initcpio/init for details.
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
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
break
breakbreak=premount が指定された場合、(フックをロードした後、root ファイルシステムをマウントする前に) init はブートプロセスを停止してトラブルシューティングに使うことができるインタラクティブシェルを起動します。break=postmount と指定することで root がマウントされた後にこのシェルを起動することもできます。シェルを終了すると通常通りに起動が行われます。
disablehooks
disablehooks=hook1{,hook2,...} を追加すると実行時にフックを無効化します。例:
disablehooks=resume
earlymodules
earlymodules=mod1{,mod2,...} という風に先にロードするモジュールを指定することでモジュールがロードされる順番を変更することができます (例えば、複数のネットワークインターフェイスの順番を適切に確定したいときなどに使います)。
rootdelay=N
rootdelay を追加すると root ファイルシステムをマウントする前に N 秒間だけ停止します (例えば、初期化に時間がかかる USB ハードドライブから起動するときなどに使います)。

参照: Debugging with GRUB and init

RAID を使う

まず、/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 はまだサポートされていません。

必要なパッケージ:

net公式リポジトリmkinitcpio-nfs-utils パッケージを必要とします。

カーネルパラメータ:

公式のカーネルドキュメントに最新の情報が載っています。

ip=

このパラメータはカーネルに、デバイスの IP アドレスの設定方法と、IP ルーティングテーブルの設定方法を指定します。コロンで区切った9つの引数を指定できます: ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

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

The <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".

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

 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>]

パラメータの説明:

 <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

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

LVM を使う

root デバイスを LVM 上に置いている場合は、lvm2 フックを追加する必要があります。カーネルコマンドラインで以下の形式を使って root デバイスのパスを通して下さい:

root=/dev/mapper/<volume group name>-<logical volume name>

例:

root=/dev/mapper/myvg-root

さらに、root デバイスの初期化が遅かったり (例: USB デバイス) 起動時に "volume group not found" エラーが表示される場合は、以下をカーネルコマンドラインに追加する必要があります:

lvmwait=/dev/mapper/<volume group name>-<logical volume name>

例:

lvmwait=/dev/mapper/myvg-root

これは LVM がデバイスを利用可能にするまでブートプロセスを待機させます。

暗号化された root を使う

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

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

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

  • mkinitcpio-generate-shutdown-ramfs.service を有効にするか shutdown フックを追加してください。
  • Add the fsck hook, mark /usr with a passno of 0 in /etc/fstab. While recommended for everyone, it is mandatory if you want your /usr partition to be fsck'ed at boot-up. Without this hook, /usr will never be fsck'd.
  • Add the usr hook. This will mount the /usr partition after root is mounted. Prior to 0.9.0, mounting of /usr would be automatic if it was found in the real root's /etc/fstab.

トラブルシューティング

イメージの展開

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

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

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

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

$ lsinitcpio /boot/initramfs-linux.img

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

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

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

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

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

The test used by mkinitcpio to determine if /dev is mounted is to see if /dev/fd/ is there. If everything else looks fine, it can be "created" manually by:

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

(Obviously, /proc must be mounted as well. mkinitcpio requires that anyway, and that is the next thing it will check.)

参照