「Dracut」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(カテゴリを修正)
111行目: 111行目:
 
=== カーネルのアップグレード時に新しい initramfs を生成 ===
 
=== カーネルのアップグレード時に新しい initramfs を生成 ===
   
カーネルアップグレードがあるたびに自動的に initramfs イメージを新しく生成することができます。以下はデフォルトの {{Pkg|linux}} カーネルを前提にしていますが、他のカーネルでも同じようにフックを追加できます。
+
カーネルアップグレードるたびに、新しい initramfs イメージを自動的に生成することが可能です。ここでデフォルトの {{Pkg|linux}} カーネルについて説明しますが、他のカーネル用のフックを追加するのも簡単でしょう
   
  +
{{Tip|{{AUR|dracut-hook}} パッケージは以下のようなフックとスクリプトを含んでいます。EFI 実行ファイルである initramfs イメージ (例:{{ic|''esp''/EFI/Linux/linux-''kernel''-''machine_id''-''build_id''.efi}}) が欲しい場合は、代わりに {{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/pipermail/arch-general/2019-October/047056.html]
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
+
if [[ "$line" == 'usr/lib/modules/'+([^/])'/pkgbase' ]]; then
mapfile -O ${#pkgbase[@]} -t pkgbase < "/$line"
+
read -r pkgbase < "/${line}"
kver=${line#"usr/lib/modules/"}
+
kver="${line#'usr/lib/modules/'}"
kver=${kver%"/pkgbase"}
+
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
146行目: 162行目:
 
Description = Updating linux initcpios (with dracut!)...
 
Description = Updating linux initcpios (with dracut!)...
 
When = PostTransaction
 
When = PostTransaction
Exec = /home/username/.local/bin/90-dracut-linux.script
+
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
また、カーネルのアップグレード時に毎回新しい {{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 メーリングリスト] より:
 
  +
# ln -sf /dev/null /etc/pacman.d/hooks/60-mkinitcpio-remove.hook
 
:カーネルはもはや自分自身を /boot にインストールしません。代わりに、mkinitcpio フックがインストールを実行します。それによって、以前と同じ挙動を少しだけ柔軟な形で再現しています。
 
:現在は dracut フックで同じような仕事をこなせるように作業していますが、今後は起動をより柔軟にして、ユーザーにより多くの選択肢が与えられるようにする予定です。Arch のアナウンスメーリングリストやウェブサイトのニュースから目を離さないでください。
 
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==

2022年1月18日 (火) 02:12時点における版

関連記事

dracut はカーネルによって使用される初期イメージを生成し、ルートファイルシステムにアクセスするのに必要なブロックデバイスモジュール (IDE, SCSI, RAID など) をプリロードします。linux のインストール時に mkinitcpio と dracut のどちらを使うか選択できます。dracut は Fedora, RHEL, Gentoo, Debian などのディストリビューションで使われています。

dracut の詳しいプロジェクト説明は カーネルドキュメント から確認できます。

インストール

dracut は dracut パッケージでインストールできます。最新の開発バージョンの場合は dracut-gitAUR

ヒント: dracut が動作することが確認できたのであれば、mkinitcpio は削除することができます。

使用方法

dracut の使い方は簡単で基本的にユーザーによる設定を必要としません。LVM on LUKS などの特殊な環境でもそれはあてはまります。

現在動作しているカーネルの initramfs を生成するには:

# dracut /boot/initramfs-linux.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) に存在します。

カーネルコマンドラインオプション

ノート: マニュアルページのドキュメントには、ファイルを挿入する方法があまり説明されておらず、システムに /etc/cmdline.d がインストールされているかのように書かれています。これ (/etc/cmdline.d) は initramfs ファイルシステムの一部であり、 dracut は作成されたシステム /etc/cmdline.d を認識しません。したがって、このディレクトリを作成しても意味がありません

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 モジュールのリスト、含まれているファイルのリストを表示します。

圧縮プログラムの変更

使用する圧縮プログラムを変更して、生成イメージの圧縮時間を減らすことができます。

警告:
  • カーネルで使用する圧縮方法のサポートがコンパイル時に組み込まれているかどうか確認してください (組み込まれていない場合、起動できなくなります)。また、圧縮プログラムのパッケージをインストールする必要があります。
  • バージョン 5.9 より前の Linux カーネルは zstd 圧縮 ををサポートしていません。 linux-zen はバージョン 5.8 以降でサポートしています

以下の行のどれかを 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 カーネルについて説明しますが、他のカーネル用のフックを追加するのも簡単でしょう。

ヒント: dracut-hookAUR パッケージは以下のようなフックとスクリプトを含んでいます。EFI 実行ファイルである initramfs イメージ (例:esp/EFI/Linux/linux-kernel-machine_id-build_id.efi) が欲しい場合は、代わりに dracut-hook-uefiAUR が必要かもしれません。このディレクトリにある EFI バイナリは systemd-boot によって自動的に検出されるので、 /boot/loader/loader.conf にエントリを書く必要はありません。

カーネルバージョンを調べるコマンドはやや複雑なので、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

トラブルシューティング

カーネルパラメータのスペース

dracut は、 root= および resume= カーネルパラメータ にスペースを含む引用符付きの値をサポートしていません。 たとえば、 root="PARTLABEL=ArchLinux" です。 dracut issue720 を参照してください。

UUID などの別のブロックデバイス命名スキームを使用してパラメータを指定する必要があります。

ハイバネーション

休止状態からの再開が機能しない場合は、 resume モジュールを含めるように dracut に 構成ファイルを追加 する必要があります:

/etc/dracut.conf.d/resume-from-hibernate.conf
add_dracutmodules+="resume"

参照