「Dracut」の版間の差分
(→カーネルパラメータのスペース: 微修正) |
Kusanaginoturugi (トーク | 投稿記録) (→Unified カーネルイメージ: ユニファイドカーネルイメージに変更) |
||
(3人の利用者による、間の25版が非表示) | |||
1行目: | 1行目: | ||
{{Lowercase title}} |
{{Lowercase title}} |
||
− | [[Category: |
+ | [[Category:Initramfs]] |
[[en:Dracut]] |
[[en:Dracut]] |
||
+ | [[pt:Dracut]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
+ | {{Related|booster}} |
||
{{Related|mkinitcpio}} |
{{Related|mkinitcpio}} |
||
+ | {{Related|Unified カーネルイメージ}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
− | {{Note|メーリングリストに [https://lists.archlinux.org/pipermail/arch-dev-public/2019-May/029570.html Mkinitcpio を Dracut で置き換える計画] について投稿されています。}} |
||
− | [https:// |
+ | [https://github.com/dracutdevs/dracut/wiki dracut] はカーネルによって使用される初期イメージを生成し、ルートファイルシステムにアクセスするのに必要なブロックデバイスモジュール (IDE、SCSI、RAID など) をプリロードします。{{Pkg|linux}} のインストール時に [[mkinitcpio]] と ''dracut'' のどちらを使うか選択できます。''dracut'' は Fedora、RHEL、Gentoo、Debian などのディストリビューションで使われています。Arch はデフォルトで [[mkinitcpio]] を使用します。 |
− | dracut の |
+ | ''dracut'' の完全なプロジェクトドキュメントは[https://github.com/dracutdevs/dracut/wiki ドキュメント]で読むことができます。 |
== インストール == |
== インストール == |
||
− | + | {{Pkg|dracut}} パッケージを[[インストール]]してください。最新の開発バージョンの場合は {{AUR|dracut-git}} をインストールしてください。 |
|
− | {{Tip|dracut が動作することが確認できたのであれば、{{Pkg|mkinitcpio}} は |
+ | {{Tip|''dracut'' が動作することが確認できたのであれば、{{Pkg|mkinitcpio}} は[[アンインストール]]できます。}} |
== 使用方法 == |
== 使用方法 == |
||
− | dracut |
+ | {{ic|dracut}} は使いやすく、[[dm-crypt/システム全体の暗号化#LVM on LUKS|LVM on LUKS]] のような非標準的なセットアップでも、大抵、ユーザによる設定は不要です。 |
− | + | 実行中のカーネルの initramfs を生成するには: |
|
− | # dracut /boot/initramfs-linux.img |
+ | # dracut --hostonly --no-hostonly-cmdline /boot/initramfs-linux.img |
+ | フォールバック initramfs を生成するには: |
||
− | {{ic|/boot/initramfs-linux.img}} は出力するイメージファイルを指定します。標準のカーネルを使っていない場合は、ファイルの名前を変更する必要があります。例えば {{Pkg|linux-lts}} カーネルの場合、出力ファイルの名前は {{ic|/boot/initramfs-linux-lts.img}} としてください。ただし、[[ブートローダー]]の設定も一緒に変更するのであればファイルの名前は好きにつけることができます。 |
||
+ | # dracut /boot/initramfs-linux-fallback.img |
||
− | ==== 追加フラグ ==== |
||
− | {{ic|- |
+ | {{ic|/boot/initramfs-linux.img}} は出力イメージファイルを指します。ノーマルのカーネル以外を使用している場合は、ファイル名の変更を検討してください。例えば、{{Pkg|linux-lts}} カーネルの場合、出力ファイルの名前は {{ic|/boot/initramfs-linux-lts.img}} にするべきです、しかし、[[ブートローダー]]の設定が同じファイル名を使用していれば、これらのファイルに好きな名前を付けることができます。 |
+ | {{Note| |
||
− | {{ic|--force}} フラグはイメージファイルが既に存在する場合に上書きします。 |
||
+ | * これらのコマンドで作成されたファイルには、インストールされている[[マイクロコード]]イメージがすべて埋め込まれます。 |
||
+ | * {{Bug|59841}} のため、ホストオンリーモードでは、システムで必要とされるものだけでなく、全ての Intel マイクロコードが initramfs に含まれます。[https://github.com/dracutdevs/dracut/commit/d613d88dd272cde8b69445bd69d64f99aac5b94b] |
||
+ | }} |
||
+ | |||
+ | === 追加オプション === |
||
+ | |||
+ | {{ic|--force}} フラグは、イメージファイルが既に存在する場合に上書きします。 |
||
+ | |||
+ | {{ic|--kver}} オプションは、使用するカーネルを指定します。このオプションの引数は、{{ic|/usr/lib/modules}} にあるディレクトリの名前と一致する必要があります。 |
||
{{man|8|dracut}} には他のフラグの説明が載っています。 |
{{man|8|dracut}} には他のフラグの説明が載っています。 |
||
− | == 設定 == |
+ | == 詳細設定 == |
− | 常に特定のフラグを使 |
+ | {{ic|dracut}} は、コマンドラインで引数を直接渡して設定できます ({{man|8|dracut|OPTIONS}} を参照)。常に特定のフラグを使用して {{ic|dracut}} を実行する場合は、設定を {{ic|/etc/dracut.conf.d/}} 内の {{ic|.conf}} ファイルに保存できます。例えば: |
− | {{hc|/etc/dracut.conf.d/myflags.conf| |
+ | {{hc|/etc/dracut.conf.d/myflags.conf|2= |
− | + | hostonly="yes" |
|
compress="lz4" |
compress="lz4" |
||
add_drivers+=" i915 " |
add_drivers+=" i915 " |
||
− | omit_dracutmodules+=" network iscsi " |
+ | omit_dracutmodules+=" network iscsi " |
}} |
}} |
||
− | + | {{man|5|dracut.conf}} でその他の設定オプションを見ることができます。各オプションの完全な説明は、{{man|8|dracut}} で見ることができます。以下では、いくつかの一般的なオプションについて説明します。 |
|
+ | |||
+ | === Dracut モジュール === |
||
+ | |||
+ | ''dracut'' は initramfs を構築するためにモジュール方式を採用しています ({{man|7|dracut.modules}} を参照)。全ての ''dracut'' の組み込みモジュールは {{ic|/lib/dracut/modules.d}} にあり、{{ic|dracut --list-modules}} で一覧を見ることができます。追加モジュールは例えば {{aur|dracut-sshd-git}} のような外部パッケージから提供されます。''dracut'' の組み込みモジュールには、名前は自明であっても残念ながら文書がありません。 |
||
+ | |||
+ | 一部のモジュールはデフォルトで有効/無効になっており、{{ic|--add}}/{{ic|--omit}} コマンドライン引数または永続的な {{ic|1= add_dracutmodules+=""}}/{{ic|1= omit_dracutmodules+=""}} 設定エントリ行で有効/無効を切り替えることができるようになっています。 |
||
+ | |||
+ | {{hc|/etc/dracut.conf.d/myflags.conf|2= |
||
+ | # ... |
||
+ | add_dracutmodules+=" <アクティブ化する dracut モジュールのリスト> " |
||
+ | omit_dracutmodules+=" <非アクティブ化する dracut モジュールのリスト> " |
||
+ | # ... |
||
+ | }} |
||
+ | |||
+ | ==== TPM2 ==== |
||
+ | |||
+ | [[Trusted Platform Module#systemd-cryptenroll|systemd-cryptenroll]] を介して TPM2 で ''luks2'' 暗号化ボリュームをアンロックする ''systemd'' の機能を使用するには、{{Pkg|tpm2-tools}} パッケージをインストールし、かつ {{ic|tpm2-tss}} ''dracut'' モジュールを有効化してください。 |
||
+ | |||
+ | === カーネルモジュールの早期ロード === |
||
+ | |||
+ | Dracut では、{{ic|--force_drivers}} 引数または {{ic|1= force_drivers+=""}} 設定エントリで早期ロードを有効化します (initramfs の段階で {{ic|modprobe}} によってロードされます)。例えば: |
||
+ | |||
+ | {{hc|/etc/dracut.conf.d/myflags.conf|2= |
||
+ | # ... |
||
+ | force_drivers+=" nvidia nvidia_modeset nvidia_uvm nvidia_drm " |
||
+ | # ... |
||
+ | }} |
||
+ | |||
+ | === カーネルコマンドラインオプション === |
||
+ | |||
+ | カーネルコマンドラインオプションは、{{ic|/etc/dracut.conf.d/}} の ''.conf'' ファイルで {{ic|1=kernel_cmdline=}} フラグで設定できます。Dracut は自動的にこのファイルを読み込み、{{ic|01-default.conf}} ファイルを作成し、initramfs ディレクトリ {{ic|/etc/cmdline.d/}} 内に配置します。例えば、カーネルコマンドラインオプションのファイルは次のようになります: |
||
+ | |||
+ | {{hc|/etc/dracut.conf.d/cmdline.conf|2= |
||
+ | 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" |
||
+ | }} |
||
+ | |||
+ | ==== 雑記 ==== |
||
+ | |||
+ | {{ic|dracut}} でルートブロックデバイスを指定することは必須ではありません。{{man|7|dracut.cmdline}} によると: |
||
+ | |||
+ | : カーネルによって使用されるルートブロックデバイスは、通常通り、ブート設定ファイル内でカーネルコマンドラインによって指定されます。 |
||
+ | |||
+ | しかし、一部のパラメータを早期に設定しておくと便利な場合があり、追加のコマンドラインパラメーターのプロンプトなどといった追加機能を有効にすることができます。すべてのオプションについては、{{man|7|dracut.cmdline}} を参照してください。設定オプションの例を次に示します: |
||
+ | |||
+ | * スワップパーティションを使ってハイバネートから復帰する: {{ic|1=resume=UUID=80895b78-7312-45bc-afe5-58eb4b579422}} |
||
+ | * 追加のカーネルコマンドラインパラメータを入力するためのプロンプトを表示する: {{ic|1=rd.cmdline=ask}} {{Warning|プロンプトが表示される前にキーボードが初期化されていないと、{{ic|1=rd.cmdline=ask}} は問題を発生させる可能性があり、そうなると、ハードリセットしなくてはならなくなります。[https://github.com/dracutdevs/dracut/issues/728 dracut issue 728] を見てください}} |
||
+ | * {{ic|quiet}} が設定されている場合でも情報を出力する: {{ic|1=rd.info}} |
||
+ | |||
+ | === ユニファイドカーネルイメージ === |
||
+ | |||
+ | ''dracut'' は、{{ic|--uefi}} コマンドラインオプションまたは {{ic|1=uefi="yes"}} 設定オプションを使用して [[Unified カーネルイメージ]]を生成できます。 |
||
== ヒントとテクニック == |
== ヒントとテクニック == |
||
54行目: | 116行目: | ||
生成された initramfs イメージの情報をページャを使って表示するには: |
生成された initramfs イメージの情報をページャを使って表示するには: |
||
− | + | # lsinitrd ''/path/to/initramfs_or_uefi_image'' | less |
|
− | 上記のコマンドはイメージ生成時に dracut に指定された引数や dracut モジュールのリスト、含まれているファイルのリストを表示します。 |
+ | 上記のコマンドはイメージ生成時に {{ic|dracut}} に指定された引数や {{ic|dracut}} モジュールのリスト、含まれているファイルのリストを表示します。 |
=== 圧縮プログラムの変更 === |
=== 圧縮プログラムの変更 === |
||
63行目: | 125行目: | ||
{{Warning| |
{{Warning| |
||
− | * |
+ | * 使用する圧縮アルゴリズムがカーネルでサポートされていることを確認してください。さもないと、ブートできなくなってしまいます。また、使用する圧縮プログラムのパッケージをインストールしておく必要があります。 |
− | * バージョン 5.9 より前の Linux カーネルは |
+ | * バージョン 5.9 より前の上流の Linux カーネルは、zstd で圧縮された initramfs をサポートしていません。{{Pkg|linux-zen}} はバージョン 5.8 から zstd をサポートしています。 |
}} |
}} |
||
− | 以下の行のどれかを |
+ | 以下の行のどれかを [[#詳細設定|dracut の設定ファイル]]に追加してください (2つ以上追加してはいけません): |
+ | compress="cat" |
||
compress="gzip" |
compress="gzip" |
||
compress="bzip2" |
compress="bzip2" |
||
81行目: | 144行目: | ||
公式でサポートされていない圧縮プログラムを使うこともできます: |
公式でサポートされていない圧縮プログラムを使うこともできます: |
||
− | compress=" |
+ | compress="''program''" |
=== カーネルのアップグレード時に新しい initramfs を生成 === |
=== カーネルのアップグレード時に新しい initramfs を生成 === |
||
− | カーネル |
+ | カーネルをアップグレードするたびに、新しい initramfs イメージを自動的に生成することが可能です。ここでは、デフォルトの {{Pkg|linux}} カーネルについて説明しますが、他のカーネル用のフックを追加するのも簡単なはずです。 |
+ | {{Tip|{{AUR|dracut-hook}} パッケージは以下のようなフックとスクリプトを含んでいます。EFI 実行ファイルである initramfs イメージ (つまり {{ic|''esp''/EFI/Linux/linux-''kernel''-''machine_id''-''build_id''.efi}}) が欲しい場合は、代わりに {{AUR|dracut-uefi-hook}} か {{AUR|dracut-hook-uefi}} をインストールしたほうが良いでしょう。このディレクトリにある EFI バイナリは [[systemd-boot]] によって自動的に検出されるので、{{ic|/boot/loader/loader.conf}} にエントリを書く必要はありません。}} |
||
− | カーネルのバージョンを確認するコマンドはやや複雑なので、[[pacman]] フックの中で単独で使うことはできません。したがってシステムのどこかにスクリプトを作成してください。例えば、以下のように {{ic|~/.local/bin}} に作成します: |
||
+ | カーネルバージョンを調べるコマンドはやや複雑なので、[[pacman フック]]の中では単独では動きません。そのため、システム上の任意の場所にスクリプトを作成します。この例では {{ic|/usr/local/bin/}} に作成します。 |
||
− | {{hc|~/.local/bin/90-dracut-linux.script| |
||
− | <nowiki>#!/bin/bash |
||
+ | このスクリプトは、新しい {{ic|vmlinuz}} カーネルファイルを {{ic|/boot/}} にコピーします。これは、カーネルパッケージが {{ic|/boot/}} にファイルを配置しなくなったためです。[https://lists.archlinux.org/archives/list/arch-general@lists.archlinux.org/message/ZSO3ZLU2ATKBRLZBPOE3EHR6GS63RO3P/] |
||
− | args=('-H' '--no-hostonly-cmdline') |
||
+ | |||
+ | {{hc|/usr/local/bin/dracut-install.sh|<nowiki> |
||
+ | #!/usr/bin/env bash |
||
+ | |||
+ | args=('--force' '--no-hostonly-cmdline') |
||
while read -r line; do |
while read -r line; do |
||
− | + | if [[ "$line" == 'usr/lib/modules/'+([^/])'/pkgbase' ]]; then |
|
− | + | read -r pkgbase < "/${line}" |
|
− | + | kver="${line#'usr/lib/modules/'}" |
|
− | + | kver="${kver%'/pkgbase'}" |
|
+ | |||
− | fi |
||
+ | 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 |
done |
||
+ | </nowiki>}} |
||
+ | {{hc|/usr/local/bin/dracut-remove.sh|<nowiki> |
||
− | dracut "${args[@]}" -f /boot/initramfs-"${pkgbase[@]}".img --kver "${kver[@]}" |
||
+ | #!/usr/bin/env bash |
||
− | dracut -f /boot/initramfs-"${pkgbase[@]}"-fallback.img --kver "${kver[@]}"</nowiki> |
||
− | }} |
||
+ | while read -r line; do |
||
− | スクリプトは {{ic|chmod a+x ~/.local/bin/90-dracut-linux.script}} で実行可能権限を与えてください。フラグを追加したり削除したい場合、dracut の[[#設定|設定]]に追加してください。 |
||
+ | 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 |
||
+ | </nowiki>}} |
||
+ | スクリプトを[[実行可能属性|実行可能にする]]必要があります。フラグを追加したり削除したりしたい場合は、[[#詳細設定|dracut の設定ファイル]]に追加する必要があります。 |
||
− | 次に [[pacman]] フックを作成します: |
||
+ | 次に、[[pacman フック]]を作成します: |
||
− | {{hc|/etc/pacman.d/hooks/90-dracut-linux.hook| |
||
+ | |||
− | <nowiki>[Trigger] |
||
+ | {{hc|/etc/pacman.d/hooks/90-dracut-install.hook|<nowiki> |
||
− | Type = File |
||
+ | [Trigger] |
||
+ | Type = Path |
||
Operation = Install |
Operation = Install |
||
Operation = Upgrade |
Operation = Upgrade |
||
120行目: | 199行目: | ||
Description = Updating linux initcpios (with dracut!)... |
Description = Updating linux initcpios (with dracut!)... |
||
When = PostTransaction |
When = PostTransaction |
||
− | Exec = / |
+ | Exec = /usr/local/bin/dracut-install.sh |
+ | Depends = dracut |
||
− | NeedsTargets</nowiki> |
||
+ | NeedsTargets |
||
− | }} |
||
+ | </nowiki>}} |
||
+ | {{hc|/etc/pacman.d/hooks/60-dracut-remove.hook|<nowiki> |
||
− | {{ic|username}} はあなたのユーザー名に置き換えてください。 |
||
+ | [Trigger] |
||
+ | Type = Path |
||
+ | Operation = Remove |
||
+ | Target = usr/lib/modules/*/pkgbase |
||
+ | [Action] |
||
− | {{Pkg|mkinitcpio}} を削除するか以下のコマンドを実行することで[[mkinitcpio]] が initramfs イメージを生成するのを止めることができます: |
||
+ | Description = Removing linux initcpios... |
||
+ | When = PreTransaction |
||
+ | Exec = /usr/local/bin/dracut-remove.sh |
||
+ | NeedsTargets |
||
+ | </nowiki>}} |
||
+ | |||
+ | {{Pkg|mkinitcpio}} を削除するか以下のコマンドを使って、[[mkinitcpio]] が initramfs イメージを作成したり削除するのも止める必要があります: |
||
# ln -sf /dev/null /etc/pacman.d/hooks/90-mkinitcpio-install.hook |
# 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 がホストオンリーモードで実行されている必要があります。ホストオンリーモードはデフォルトではないようです。以下を dracut の設定ファイルに追加することで、ホストオンリーモードを有効化することができます: |
||
− | また、カーネルのアップグレード時に毎回新しい {{ic|vmlinuz}} カーネルを {{ic|/usr/lib/modules/[kver]/vmlinuz}} から {{ic|/boot/vmlinuz-linux}} にコピーする必要があります。{{Pkg|linux}} パッケージではなく {{ic|90-mkinitcpio-install.hook}} によってコピーが行われているためです。[https://lists.archlinux.org/pipermail/arch-general/2019-October/047056.html arch-general メーリングリスト] より: |
||
+ | hostonly=yes |
||
− | :カーネルはもはや自分自身を /boot にインストールしません。代わりに、mkinitcpio フックがインストールを実行します。それによって、以前と同じ挙動を少しだけ柔軟な形で再現しています。 |
||
− | :現在は dracut フックで同じような仕事をこなせるように作業していますが、今後は起動をより柔軟にして、ユーザーにより多くの選択肢が与えられるようにする予定です。Arch のアナウンスメーリングリストやウェブサイトのニュースから目を離さないでください。 |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
− | === |
+ | === ハイバネート === |
+ | ハイバネートからの復帰がうまくいかない場合、{{ic|resume}} モジュールをイメージに含めるように {{ic|dracut}} を設定する必要がある場合があります。以下を[[#Dracut モジュール|設定ファイルに追加する]]必要があります: |
||
− | dracut は、 {{ic|1=root=}} および {{ic|1=resume=}} [[カーネルパラメータ]] にスペースを含む引用符付きの値をサポートしていません。 たとえば、 {{ic|1=root="PARTLABEL=ArchLinux"}} です。 [https://github.com/dracutdevs/dracut/issues/720 dracut issue720] を参照してください。 |
||
+ | {{hc|/etc/dracut.conf.d/resume-from-hibernate.conf|2= |
||
− | [[UUID]] などの別のブロックデバイス命名スキームを使用してパラメータを指定する必要があります。 |
||
+ | add_dracutmodules+=" resume " |
||
+ | }} |
||
+ | === LVM / ソフトウェア RAID / LUKS === |
||
− | === ハイバネーション === |
||
+ | カーネルに LVM / ソフトウェア RAID / LUKS ブロックの自動検出とマウントに問題がある場合、以下のカーネルコマンドラインオプションを使用して initramfs の生成を再度試してみることができます: |
||
− | 休止状態からの再開が機能しない場合は、 {{ic|resume}} モジュールを含めるように dracut を構成する必要がある場合があります。 [[#Configuration|構成ファイルを追加]] する必要があります: |
||
+ | rd.auto rd.lvm=1 rd.dm=1 rd.md=1 rd.luks=1 |
||
− | {{hc|/etc/dracut.conf.d/resume-from-hibernate.conf|2= |
||
+ | |||
− | add_dracutmodules+="resume" |
||
+ | === A stop job is running for "brltty" === |
||
− | }} |
||
+ | |||
+ | ブートの問題が発生する場合や、システムが {{ic|brllty}} の終了を待機するせいでシャットダウンに非常に長い時間が掛かる場合、以下を dracut の設定ファイルに追加してください: |
||
+ | |||
+ | omit_dracutmodules+=" brltty " |
||
+ | |||
+ | あるいは、{{Pkg|brltty}} が必要ない場合はアンインストールしてください。 |
||
+ | |||
+ | === No usable keyslot is available === |
||
+ | |||
+ | Cannot use whirlpool hash for keyslot encryption. |
||
+ | Keyslot open failed. |
||
+ | No usable keyslot is available. |
||
+ | |||
+ | 上記のようなメッセージが表示されてブートに失敗する場合、大抵、{{ic|add_dracutmodules}} に {{ic|crypt}} モジュールを追加するだけで解決します。しかし、このモジュールを追加した後もメッセージが表示され続ける場合、以下のように設定を変更する必要がある場合があります: |
||
+ | |||
+ | install_items+=" /usr/lib/ossl-modules/legacy.so " |
||
+ | |||
+ | これは、[[OpenSSL]] が whirlpool ハッシュ関数を非推奨にして、この関数を上記のライブラリに移動したせいです。Arch を使用する場合、dracut は自動的にこのライブラリを initramfs にインストールしません。 |
||
== 参照 == |
== 参照 == |
||
* [[Wikipedia:dracut (software)]] |
* [[Wikipedia:dracut (software)]] |
||
− | * [ |
+ | * [[Gentoo:Dracut]] |
+ | |||
+ | {{TranslationStatus|dracut|2023-08-03|783287}} |
2024年4月24日 (水) 20:16時点における最新版
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 /boot/initramfs-linux.img
フォールバック 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) には他のフラグの説明が載っています。
詳細設定
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+=" network iscsi "
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 モジュールのリスト> " omit_dracutmodules+=" <非アクティブ化する dracut モジュールのリスト> " # ...
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 イメージを自動的に生成することが可能です。ここでは、デフォルトの linux カーネルについて説明しますが、他のカーネル用のフックを追加するのも簡単なはずです。
カーネルバージョンを調べるコマンドはやや複雑なので、pacman フックの中では単独では動きません。そのため、システム上の任意の場所にスクリプトを作成します。この例では /usr/local/bin/
に作成します。
このスクリプトは、新しい vmlinuz
カーネルファイルを /boot/
にコピーします。これは、カーネルパッケージが /boot/
にファイルを配置しなくなったためです。[2]
/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 がホストオンリーモードで実行されている必要があります。ホストオンリーモードはデフォルトではないようです。以下を dracut の設定ファイルに追加することで、ホストオンリーモードを有効化することができます:
hostonly=yes
トラブルシューティング
ハイバネート
ハイバネートからの復帰がうまくいかない場合、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 にインストールしません。