mkinitcpio (日本語) - ArchWiki

# mkinitcpio (日本語)

関連記事

- systemd
- カーネルモジュール

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

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

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

デフォルトで、カーネルのインストール・アップグレードが行われた後 mkinitcpio スクリプトは２つのイメージを生成します: `/boot/initramfs-linux.img` と `/boot/initramfs-linux-fallback.img`。fallback イメージは 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 イメージを作成する方法がプリセットに定義されています。

Warning: プリセットファイルはカーネルがアップデートされた後 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`)。

Warning: デフォルトでは lvm2, mdadm, encrypt は有効化されていません。これらのフックが必要なときは注意してこのセクションを読んで下さい。
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 `/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.
Note: PS/2 キーボードを使っている場合: init でキーボード入力を使えるようにするには、`HOOKS` に keyboard フックを追加してください。マザーボードによっては (特に旧世代のマザーボード)、i8042 コントローラが自動で検出されないことがあります。稀ですが、キーボードがないということもありえます。事前にこの状態を検出することができます。PS/2 端子があって `i8042: PNP: No PS/2 controller found. Probing ports directly` メッセージが表示される場合、atkbd を `MODULES` に追加してください。

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

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

### MODULES

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

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

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.

### BINARIES と FILES

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

    FILES="/etc/modprobe.d/modprobe.conf"

    BINARIES="kexec"

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

### HOOKS

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

ほとんどのシンプルな、シングルディスクセットアップではデフォルトの `HOOKS` 設定で十分なはずです。LVM, mdadm, dm-crypt などスタックした root デバイスやマルチブロックデバイスを使う時は、関連する wiki ページを見て必要な設定を調べて下さい。

#### ビルドフック

ビルドフックは `/usr/lib/initcpio/install` にあります。これらのファイルは mkinitcpio の実行時に bash シェルによって実行されます。ビルドフックには２つの関数が含まれています: `build` と `help`。`build` 関数にはイメージに追加するモジュール・ファイル・バイナリを記述します。これらのアイテムの追加を容易にする 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 を再ビルドしないためです。 | `udev` と `mdadm` を使ってソフトウェア 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) 状態からの復帰を試みます。swsusp と suspend2 の両方と一緒に動作します。設定は #ランタイムのカスタマイズ を見て下さい。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 コミット 97368c0e78 や arch-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

Note: 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`
  `break` や `break=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` 内の `HOOKS` に `mdadm_udev` または `mdadm` フックを追加し、必要な RAID モジュール全て (例: raid456, ext4) を `MODULES` に追加して下さい。

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

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

### net を使う

Warning: 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.

Note: `<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 アーカイブであり、`find` と `bsdcpio` コマンドによって生成されています。また、任意でカーネルが対応した圧縮方法によって圧縮されています。圧縮方法について詳しくは #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.)

## 参照

- Boot debugging - GRUB によるデバッグ
- Linux カーネルドキュメントの initramfs
- Linux カーネルドキュメントの initrd
- Wikipedia:ja:initrd

Categories:

- Boot process (日本語)
- Kernel (日本語)