dracut
dracut はカーネルによって使用される初期イメージを生成し、ルートファイルシステムにアクセスするのに必要なブロックデバイスモジュール (IDE、SCSI、RAID など) をプリロードします。linux のインストール時に mkinitcpio と dracut のどちらを使うか選択できます。dracut は Fedora、RHEL、Gentoo、Debian などのディストリビューションで使われています。Arch はデフォルトで mkinitcpio を使用します。
dracut のプロジェクトドキュメントはこちらで読むことができます。
インストール
dracut パッケージをインストールしてください。最新の開発バージョンの場合は dracut-gitAUR をインストールしてください。
使用方法
dracut
は使いやすく、LVM on LUKS のような非標準的なセットアップを使用する場合でも、通常はユーザー設定を必要としません。
実行中のカーネルの initramfs を生成するには:
# dracut --hostonly --no-hostonly-cmdline --add-confdir no-network /boot/initramfs-linux.img
hostonly モードを永続的に有効にするには (コマンドラインに含める必要がないように) dracut 設定に以下を追加します。
/etc/dracut.conf.d/hostonly.conf
hostonly="yes"
フォールバック initramfs を生成するには、以下を実行します。
# dracut /boot/initramfs-linux-fallback.img
/boot/initramfs-linux.img
は、出力イメージファイルを指します。別のカーネルを使用している場合は、ファイル名を変更することを検討してください。たとえば、linux-lts カーネルの場合、出力ファイルは /boot/initramfs-linux-lts.img
という名前にする必要があります。ただし、ブートローダー 設定で同じファイル名を使用する限り、これらのファイルには好きな名前を付けることができます。
追加オプション
--force
フラグは、イメージファイルが既に存在する場合に上書きします。
--kver
オプションは、使用するカーネルを指定します。このオプションの引数は、/usr/lib/modules
にあるディレクトリの名前と一致する必要があります。
dracut(8) には他のフラグの説明が載っています。
詳細設定
初期 RAM ディスクフェーズ中の様々なタスクの実行方法には、2つの異なるアプローチがあることに注意することが重要です。
- シェル (bash/busybox/dash) ベースの初期 RAM ディスク
- init スクリプトが開始され、次に初期 RAM ディスクのファイルシステムをスキャンして実行される dracut スクリプトを検索します。
- systemd ベース(デフォルト)の初期 RAM ディスク
- systemd は初期 RAM ディスクフェーズの開始時にすでに開始されています。実行されるタスクは、通常の systemd ユニットファイルによって決定されます。systemdブートアッププロセスを参照してください。
具体的なバリアントは、systemd dracut モジュールの有無によって決定されます。詳細については、#dracut モジュールを参照してください。
dracut
は、コマンドラインで直接引数を渡すことによって構成できます (dracut(8) § OPTIONS を参照) 特定のフラグのセットを使用して常に dracut
を実行する場合は、/etc/dracut.conf.d/
に.conf
ファイルに指定された設定を保存できます。例:
/etc/dracut.conf.d/myflags.conf
hostonly="yes" compress="lz4" add_drivers+=" i915 " omit_dracutmodules+=" systemd network "
dracut.conf(5) でより多くの設定オプションを確認できます。各オプションのより詳細な説明は、dracut(8) にあります。以下では、いくつかの一般的なオプションについて説明します。
Dracut モジュール
dracut は、initramfs を構築するためにモジュール式のアプローチを採用しています (dracut.modules(7) を参照) dracut の組み込みモジュールはすべて /lib/dracut/modules.d
にあり、dracut --list-modules
で一覧表示できます。追加のモジュールは、dracut-sshd-gitAUR などの外部パッケージによって提供できます。残念ながら、dracut の組み込みモジュールにはドキュメントがありませんが、その名前はそれ自体で説明できる場合があります。
一部のモジュールはデフォルトでアクティブ/非アクティブであり、--add
/--omit
コマンドライン引数または add_dracutmodules+=""
/omit_dracutmodules+=""
永続設定エントリ行を使用してアクティブ化/非アクティブ化できます。
/etc/dracut.conf.d/myflags.conf
# ... add_dracutmodules+=" dracut modules to activate " omit_dracutmodules+=" dracut modules to deactivate " # ...
次の表に、dracut モジュール、必要なパッケージ(dracut のオプションの依存関係)およびモジュールの説明を示します。
ほとんどの dracut モジュールは、他の dracut モジュールに依存しています。例として、bluetooth dracut モジュールは dbus dracut モジュールに依存しています。以下の表は、直接的な dracut モジュールの依存関係のみを示しています。つまり、特定の dracut モジュールの module-setup.sh
にリストされている、特定のモジュールに必要なパッケージを示しています。
追加の dracut モジュールのドキュメントについては、アップストリームの dracut wiki を参照してください。
dracut モジュール | 必要なパッケージ | 説明 |
---|---|---|
bluetooth | bluez | Bluetooth (keyboard) |
btrfs | btrfs-progs | ブロックデバイスで btrfs をスキャンします |
busybox | busybox | BusyBox (自己責任で) の使用を許可します |
crypt | cryptsetup | 暗号化された dm-crypt ファイルシステムのサポート |
dash | dash | dash (自己責任で) の使用を許可します |
dmraid | dmraid, multipath-tools | DMRAID Dracut モジュールサポート |
multipath | multipath-tools | MultiPath Dracut モジュールサポート |
dmsquash-live-ntfs | fuse3, ntfs-3g | ライブ NTFS |
lvm | lvm2 | LVM のサポート |
mdraid | mdadm | ソフトウェア RAID デバイスとも呼ばれるMDデバイスをサポートします |
memstrack | memstrackAUR | memstrack をサポート |
nvdimm | ndctl | NVDIMM をサポート |
plymouth | plymouth | Plymouth ブートスプラッシュ |
rescue | 救助モード用のさまざまなユーティリティ (Ping、SSH、VI、FSCK などなど) が含まれています。 | |
resume | initramfs が低電力状態から再開できるようにします | |
rngd | 早期ブートでランダムジェネレーターサービスを開始します | |
syslog | rsyslogAUR | rsyslog でロギングを有効にする |
squash | squashfs-tools | squashed initramfs を構築するためのサポート |
tpm2-tss | tpm2-tools | Trusted Platform Module |
base | 必要なユーティリティを備えたベースモジュール | |
bash | bash | Bash が複数存在する場合、Bash を優先的に使用 |
biosdevname | biosdevnameAUR | BIOS に基づいたネットワークデバイス名を使用 |
caps | init 実行前にケーパビリティを削減可能 | |
convertfs | / を /usr に統合 (次回起動時に実行) | |
crypt-gpg | gnupg | GPG を使用した暗号化・SmartCard のサポート (GPG キーが必要な場合あり) |
crypt-loop | 暗号化されたループバックデバイスのサポート (対称鍵) | |
dbus | dbus-broker または dbus-daemon の仮想パッケージ | |
dbus-broker | dbus-broker | dbus-broker を dbus サービスプロバイダとして使用 |
dbus-daemon | dbus | dbus を dbus サービスプロバイダとして使用 |
debug | デバッグ機能を有効化 | |
dm | device-mapper のサポートを追加 | |
dmsquash-live-autooverlay | ルートファイルシステムの親ブロックデバイスの空き領域に overlayfs 用パーティションを作成 | |
dracut-systemd | 基本的な systemd 用 dracut モジュール | |
drm | DRM (Direct Rendering Manager) サポートのカーネルモジュールを含む | |
ecryptfs | ecryptfs ファイルシステムのサポートを追加 | |
fido2 | FIDO2 セキュリティトークンを使用して暗号化ファイルシステムを解読可能 | |
fips | FIPS セキュリティ標準を適用 | |
fs-lib | fsck.* や mount などのファイルシステムツールのライブラリ | |
fstab-sys | rootfs より前に任意のパーティションをマウント | |
i18n | キーマップ、コンソールフォントなどを含む | |
img-lib | イメージの展開ツールを含むライブラリ | |
integrity | 拡張検証モジュール (EVM) のサポートを追加 | |
kernel-modules | ルートファイルシステムおよびブート時に必要なデバイスのカーネルモジュール | |
kernel-modules-extra | 追加のカーネルモジュール (out-of-tree) | |
lunmask | 必要な LUN デバイスのみを選択してマスク | |
lvmmerge | LVM スナップショットをマージ | |
lvmthinpool-monitor | LVM thin pool を監視 | |
masterkey | 他の鍵の解読用マスターキーと keyutils を含む | |
modsign | 署名付きカーネルモジュールのサポートを追加 | |
overlayfs | OverlayFS のカーネルモジュール | |
pcsc | PCSC スマートカードのサポート | |
pkcs11 | PKCS#11 ライブラリを含む | |
pollcdrom | CD-ROM ポーリングを有効化 | |
qemu | QEMU 環境用のカーネルモジュールを含む | |
rescue | ping、ssh、vi、fsck.* などのレスキュー用ユーティリティ | |
rootfs-block | ルートファイルシステムを含むブロックデバイスのマウント処理 | |
securityfs | securityfs をブート初期にマウント | |
selinux | SELinux ポリシーのロードを処理 | |
shutdown | シャットダウン時に実行されるフックを設定 | |
systemd | 早期 init システムとして systemd を使用 | |
terminfo | terminfo ファイルを含む | |
udev-rules | udev と基本ルールのセット | |
uefi-lib | UEFI ツールを含むライブラリ | |
usrmount | /usr のマウントを処理 | |
virtfs | 仮想ファイルシステム (9p) のサポート | |
virtiofs | virtiofs ファイルシステムのサポート | |
warpclock | adjtime が LOCAL に設定されている場合にシステム時間をリセット | |
watchdog | watchdog デバイス管理を含む (systemd 非使用時のみ動作) | |
watchdog-modules | 起動時にロードされる watchdog 用カーネルモジュール |
これは、IPアドレス が初期ブート時に利用可能になることが想定される場合に使用される Dracut モジュールについての説明です。
ネットワーキング dracut モジュール | 必要なパッケージ | 説明 |
---|---|---|
cifs | cifs-utils | Samba のサポート |
nbd | nbd | ネットワークブロックデバイスのサポート |
network-manager | networkmanager | NetworkManager のサポート |
nfs | nfs-utils | NFS のサポート (NFSv3 および NFSv4) |
nvmf | nvme-cli, jq | NVMe over Fibre Channel および NVMe-over-Fabrics のサポート |
iscsi | open-iscsi | ISCSI のサポート |
ssh-client | openssh | SSH および SCP のインストール (設定ファイルや指定された鍵も含む) |
network-legacy | dhclient, iproute2, iputils | レガシーなネットワークのサポート |
connman | connman | ConnMan ネットワークのサポート |
kernel-network-modules | ネットワークデバイス用のカーネルモジュールを含み、ロードする | |
livenet | SquashFS イメージのライブアップデートを取得 | |
network | ネットワークサービスプロバイダーの仮想モジュール | |
url-lib | curl および SSL 証明書を含むライブラリ | |
qemu-net | QEMU 環境向けネットワークカーネルモジュールを含む | |
systemd-network-management | systemd のネットワーク管理を追加 (systemd-networkd, systemd-resolved などのネットワーク関連モジュールを含む) | |
systemd-networkd | Systemd-networkd | |
net-lib | ip を含むネットワークライブラリ |
TPM2
systemd-cryptenroll を介して TPM2 で luks2 暗号化ボリュームをアンロックする systemd の機能を使用するには、tpm2-tools パッケージをインストールし、かつ tpm2-tss
dracut モジュールを有効化してください。
カーネルモジュールの早期ロード
Dracut では、--force_drivers
引数または force_drivers+=""
設定エントリで早期ロードを有効化します (initramfs の段階で modprobe
によってロードされます)。例えば:
/etc/dracut.conf.d/myflags.conf
# ... force_drivers+=" nvidia nvidia_modeset nvidia_uvm nvidia_drm " # ...
カーネルコマンドラインオプション
カーネルコマンドラインオプションは、/etc/dracut.conf.d/
の .conf ファイルで kernel_cmdline=
フラグで設定できます。Dracut は自動的にこのファイルを読み込み、01-default.conf
ファイルを作成し、initramfs ディレクトリ /etc/cmdline.d/
内に配置します。例えば、カーネルコマンドラインオプションのファイルは次のようになります:
/etc/dracut.conf.d/cmdline.conf
kernel_cmdline="rd.luks.uuid=luks-f6c738f3-ee64-4633-b6b0-eceddb1bb010 rd.lvm.lv=arch/root rd.lvm.lv=arch/swap root=/dev/arch/root rootfstype=ext4 rootflags=rw,relatime"
雑記
dracut
でルートブロックデバイスを指定することは必須ではありません。dracut.cmdline(7) によると:
- カーネルによって使用されるルートブロックデバイスは、通常通り、ブート設定ファイル内でカーネルコマンドラインによって指定されます。
しかし、一部のパラメータを早期に設定しておくと便利な場合があり、追加のコマンドラインパラメーターのプロンプトなどといった追加機能を有効にすることができます。すべてのオプションについては、dracut.cmdline(7) を参照してください。設定オプションの例を次に示します:
- スワップパーティションを使ってハイバネートから復帰する:
resume=UUID=80895b78-7312-45bc-afe5-58eb4b579422
- 追加のカーネルコマンドラインパラメータを入力するためのプロンプトを表示する:
rd.cmdline=ask
quiet
が設定されている場合でも情報を出力する:rd.info
ユニファイドカーネルイメージ
dracut は、--uefi
コマンドラインオプションまたは uefi="yes"
設定オプションを使用して Unified カーネルイメージを生成できます。
ヒントとテクニック
生成されたイメージの情報を表示
生成された initramfs イメージの情報をページャを使って表示するには:
# lsinitrd /path/to/initramfs_or_uefi_image | less
上記のコマンドはイメージ生成時に dracut
に指定された引数や dracut
モジュールのリスト、含まれているファイルのリストを表示します。
圧縮プログラムの変更
使用する圧縮プログラムを変更して、生成イメージの圧縮時間を減らすことができます。
以下の行のどれかを dracut の設定ファイルに追加してください (2つ以上追加してはいけません):
compress="cat" compress="gzip" compress="bzip2" compress="lzma" compress="xz" compress="lzo" compress="lz4" compress="zstd"
gzip がデフォルトで使用される圧縮プログラムです。compress="cat"
は、圧縮なしで initramfs を作成します。
公式でサポートされていない圧縮プログラムを使うこともできます:
compress="program"
パフォーマンスに関する考慮事項
ブートと initramfs 作成のパフォーマンスを最適化するためのいくつかの考慮事項:
- 最速の圧縮方式を理解し、設定する: カーネルモジュールがすでに圧縮されている場合、initramfs作成時に再圧縮する必要はないかもしれない。
- initramfs に systemd を含めることの影響を理解する: 遅くなる場合は省略し、速くなる場合は含める。
- コピーオンライトファイルシステムを使用している場合は、dracut-cpio の使用を検討する: 適用可能性については、
--enhanced-cpio
オプションを参照。
- initramfs に含めるカーネルモジュールと dracut モジュールの数を最小限に抑える: 例:nfs-utilsがインストールされている(ただしブートには不要)場合、nfs dracutモジュールを明示的に省略する必要がある。そうしないと、デフォルト構成で生成されたinitramfsでネットワークブートが有効になる - https://github.com/dracut-ng/dracut-ng/pull/297 を参照。
- bash の代わりに busybox の使用を検討する:
- hostonly を検討する:
カーネルのアップグレード時に新しい initramfs を生成
カーネルをアップグレードするたびに、新しい initramfs イメージを自動的に生成することが可能です。ここでは、デフォルトの linux カーネルについて説明しますが、他のカーネル用のフックを追加するのも簡単なはずです。
カーネルバージョンを調べるコマンドはやや複雑なので、pacman フックの中では単独では動きません。そのため、システム上の任意の場所にスクリプトを作成します。この例では /usr/local/bin/
に作成します。
このスクリプトは、新しい vmlinuz
カーネルファイルを /boot/
にコピーします。これは、カーネルパッケージが /boot/
にファイルを配置しなくなったためです。[1]
/usr/local/bin/dracut-install.sh
#!/usr/bin/env bash args=('--force' '--no-hostonly-cmdline') while read -r line; do if [[ "$line" == 'usr/lib/modules/'+([^/])'/pkgbase' ]]; then read -r pkgbase < "/${line}" kver="${line#'usr/lib/modules/'}" kver="${kver%'/pkgbase'}" install -Dm0644 "/${line%'/pkgbase'}/vmlinuz" "/boot/vmlinuz-${pkgbase}" dracut "${args[@]}" --hostonly "/boot/initramfs-${pkgbase}.img" --kver "$kver" dracut "${args[@]}" --no-hostonly "/boot/initramfs-${pkgbase}-fallback.img" --kver "$kver" fi done
/usr/local/bin/dracut-remove.sh
#!/usr/bin/env bash while read -r line; do if [[ "$line" == 'usr/lib/modules/'+([^/])'/pkgbase' ]]; then read -r pkgbase < "/${line}" rm -f "/boot/vmlinuz-${pkgbase}" "/boot/initramfs-${pkgbase}.img" "/boot/initramfs-${pkgbase}-fallback.img" fi done
スクリプトを実行可能にする必要があります。フラグを追加したり削除したりしたい場合は、dracut の設定ファイルに追加する必要があります。
次に、pacman フックを作成します:
/etc/pacman.d/hooks/90-dracut-install.hook
[Trigger] Type = Path Operation = Install Operation = Upgrade Target = usr/lib/modules/*/pkgbase [Action] Description = Updating linux initcpios (with dracut!)... When = PostTransaction Exec = /usr/local/bin/dracut-install.sh Depends = dracut NeedsTargets
/etc/pacman.d/hooks/60-dracut-remove.hook
[Trigger] Type = Path Operation = Remove Target = usr/lib/modules/*/pkgbase [Action] Description = Removing linux initcpios... When = PreTransaction Exec = /usr/local/bin/dracut-remove.sh NeedsTargets
mkinitcpio を削除するか以下のコマンドを使って、mkinitcpio が initramfs イメージを作成したり削除するのも止める必要があります:
# ln -sf /dev/null /etc/pacman.d/hooks/90-mkinitcpio-install.hook # ln -sf /dev/null /etc/pacman.d/hooks/60-mkinitcpio-remove.hook
Bluetooth キーボードのサポート
Dracut は、Bluetooth キーボードが検出されると自動的に Bluetooth モジュールを有効にします。ただし、これには dracut が hostonly モードである必要があります。これはデフォルトではありません。
Limine ブートローダーのサポート
limine-dracut-supportAUR パッケージは、Limine ブートローダーでのカーネルとブートエントリのインストールと削除を自動化するために、dracut と pacman フックを備えた limine-entry-tool を利用します。詳細については、Limine#ブートエントリの自動化 を参照してください。
トラブルシューティング
ハイバネート
ハイバネートからの復帰がうまくいかない場合、resume
モジュールをイメージに含めるように dracut
を設定する必要がある場合があります。以下を設定ファイルに追加する必要があります:
/etc/dracut.conf.d/resume-from-hibernate.conf
add_dracutmodules+=" resume "
LVM / ソフトウェア RAID / LUKS
カーネルに LVM / ソフトウェア RAID / LUKS ブロックの自動検出とマウントに問題がある場合、以下のカーネルコマンドラインオプションを使用して initramfs の生成を再度試してみることができます:
rd.auto rd.lvm=1 rd.dm=1 rd.md=1 rd.luks=1
A stop job is running for "brltty"
ブートの問題が発生する場合や、システムが brllty
の終了を待機するせいでシャットダウンに非常に長い時間が掛かる場合、以下を dracut の設定ファイルに追加してください:
omit_dracutmodules+=" brltty "
あるいは、brltty が必要ない場合はアンインストールしてください。
No usable keyslot is available
Cannot use whirlpool hash for keyslot encryption. Keyslot open failed. No usable keyslot is available.
上記のようなメッセージが表示されてブートに失敗する場合、大抵、add_dracutmodules
に crypt
モジュールを追加するだけで解決します。しかし、このモジュールを追加した後もメッセージが表示され続ける場合、以下のように設定を変更する必要がある場合があります:
install_items+=" /usr/lib/ossl-modules/legacy.so "
これは、OpenSSL が whirlpool ハッシュ関数を非推奨にして、この関数を上記のライブラリに移動したせいです。Arch を使用する場合、dracut は自動的にこのライブラリを initramfs にインストールしません。