dracut
関連記事
dracut はカーネルによって使用される初期イメージを生成し、ルートファイルシステムにアクセスするのに必要なブロックデバイスモジュール (IDE, SCSI, RAID など) をプリロードします。linux のインストール時に mkinitcpio と dracut のどちらを使うか選択できます。dracut は Fedora, RHEL, Gentoo, Debian などのディストリビューションで使われています。
dracut の詳しいプロジェクト説明は カーネルドキュメント から確認できます。
目次
インストール
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
にするべきです、しかし ブートローダー の設定が同じファイル名を使用していれば、これらのファイルに好きな名前を付けることができます。
追加フラグ
--hostonly
フラグはローカルホスト環境を起動するのに必要なファイルのみ含んだイメージを生成します。フラグを付けない場合はより多くのファイルを含む汎用イメージが生成されます。このフラグを使うことで生成イメージの容量を減らすことができますが、他のコンピュータでイメージを使用したり別のルートファイルシステムに切り替えることができなくなります。その場合は新しいイメージの生成が必要です。
--force
フラグはイメージファイルが既に存在する場合に上書きします。
dracut(8) には他のフラグの説明が載っています。
設定
常に特定のフラグを使って 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) に存在します。
カーネルコマンドラインオプション
initramfs 環境でカーネルのコマンドラインパラメータを強制的に使用することができます。ブロックデバイスの指定には use the UUID naming scheme を使用してください。
dracut のルートブロックデバイスを指定する必要はありません。 dracut.cmdline(7) から:
- カーネルが使用するルートデバイスは、いつものように、カーネルコマンドラインのブート設定ファイルで指定されます。
ただし、一部のパラメータを早い段階で設定すると便利な場合があります。また、コマンドラインパラメータの追加を求めるプロンプトを表示するなど、追加機能を有効にすることもできます。すべてのオプションについては、 dracut.cmdline(7) を参照してください。次に、設定オプションの例を示します。
- スワップパーティションから再開する:
resume=UUID=80895b78-7312-45bc-afe5-58eb4b579422
- 追加のカーネルコマンドラインパラメータを要求する:
rd.cmdline=ask
- "quiet" が設定されていても情報出力を表示する:
rd.info
カーネルコマンドラインオプションは、 /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/mapper/arch-root rootfstype=ext4 rootflags=rw,relatime"
このファイルは、統合カーネルイメージ用に Dracut からも提供されています。生成されたファイル (initramfs.img と uefi.efi の両方のファイル) は、 --unpackearly
オプションを使用して lsinitrd
で表示できます。次に例を示します。
lsinitrd --unpackearly /boot/EFI/Arch/Arch.efi /etc/cmdline.d/01-default.conf | less
ヒントとテクニック
生成されたイメージの情報を表示
生成された initramfs イメージの情報をページャを使って表示するには:
$ lsinitrd <path to initramfs image> | less
上記のコマンドはイメージ生成時に dracut に指定された引数や dracut モジュールのリスト、含まれているファイルのリストを表示します。
圧縮プログラムの変更
使用する圧縮プログラムを変更して、生成イメージの圧縮時間を減らすことができます。
以下の行のどれかを dracut の設定に追加してください (2つ以上追加してはいけません):
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
トラブルシューティング
カーネルパラメータのスペース
dracut は、 root=
および resume=
カーネルパラメータ にスペースを含む引用符付きの値をサポートしていません。 たとえば、 root="PARTLABEL=ArchLinux"
です。 dracut issue720 を参照してください。
UUID などの別のブロックデバイス命名スキームを使用してパラメータを指定する必要があります。
ハイバネーション
休止状態からの再開が機能しない場合は、 resume
モジュールを含めるように dracut に 設定ファイルを追加 する必要があります:
/etc/dracut.conf.d/resume-from-hibernate.conf
add_dracutmodules+="resume"