「ユニファイドカーネルイメージ」の版間の差分
(→mkinitpcio: UKI の構築を翻訳して追加) |
(→.preset ファイル: 情報を更新) |
||
55行目: | 55行目: | ||
==== .preset ファイル ==== |
==== .preset ファイル ==== |
||
− | ま |
+ | 次に、{{ic|/etc/mkinitcpio.d/linux.preset}}、または使用しているプリセットを、[[EFI システムパーティション]] の適切なマウントポイントを指定して、以下のように変更します: |
+ | * {{ic|1=PRESETS=}} の各項目について、{{ic|1=''PRESET''_uki=}} パラメータのコメントを解除する (つまり {{ic|#}} を削除する)、 |
||
− | * [[マイクロコード]] が必要な場合は、{{ic|1=ALL_microcode=(/boot/*-ucode.img)}} を追加して、[[mkinitcpio]] にその場所を追加します。 |
||
+ | * 冗長な {{ic|initramfs-*.img}} ファイルを保存しないように、{{ic|1=''PRESET''_image=}} をコメントアウトする、 |
||
− | * {{ic|1=''PRESET''_efi_image=}} {{ic|1=PRESETS=}} の各項目に対して、{{ic|1=''PRESET''_efi_image=}} パラメータを追加します。{{ic|1=default_efi_image="''esp''/EFI/Linux/archlinux-linux.efi"}} と {{ic|1=fallback_efi_image="''esp''/EFI/Linux/archlinux-linux-fallback.efi"}} の各項目です。これにより、実行ファイル名が設定されます。 |
||
− | * オプションと |
+ | * オプションとして、スプラッシュ画像を追加したい各 {{ic|1=''PRESET''_options=}} 行に {{ic|--splash}} パラメータを追加またはコメント解除します。 |
− | 以下は |
+ | 以下は {{Pkg|linux}} カーネルと Arch スプラッシュスクリーンの {{ic|linux.preset}} の例です。 |
{{hc|/etc/mkinitcpio.d/linux.preset|2= |
{{hc|/etc/mkinitcpio.d/linux.preset|2= |
||
# mkinitcpio preset file for the 'linux' package |
# mkinitcpio preset file for the 'linux' package |
||
− | ALL_config="/etc/mkinitcpio.conf" |
+ | #ALL_config="/etc/mkinitcpio.conf" |
ALL_kver="/boot/vmlinuz-linux" |
ALL_kver="/boot/vmlinuz-linux" |
||
ALL_microcode=(/boot/*-ucode.img) |
ALL_microcode=(/boot/*-ucode.img) |
||
72行目: | 72行目: | ||
PRESETS=('default' 'fallback') |
PRESETS=('default' 'fallback') |
||
+ | #default_config="/etc/mkinitcpio.conf" |
||
− | default_image="/boot/initramfs-linux.img" |
||
− | + | #default_image="/boot/initramfs-linux.img" |
|
+ | default_uki="''esp''/EFI/Linux/arch-linux.efi" |
||
− | default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp" |
||
+ | default_options="--splash=/usr/share/systemd/bootctl/splash-arch.bmp" |
||
+ | #fallback_config="/etc/mkinitcpio.conf" |
||
− | fallback_image="/boot/initramfs-linux-fallback.img" |
||
− | + | #fallback_image="/boot/initramfs-linux-fallback.img" |
|
+ | fallback_uki="''esp''/EFI/Linux/arch-linux-fallback.efi" |
||
− | fallback_options="-S autodetect --splash /usr/share/systemd/bootctl/splash-arch.bmp" |
||
+ | fallback_options="-S autodetect" |
||
}} |
}} |
||
+ | {{Tip| |
||
− | この2番目の例では、{{Pkg|linux}} のデフォルトイメージと {{Pkg|linux-lts}} のフォールバックイメージを作成します。 |
||
+ | * 統一されたカーネルイメージからブートしたいだけであれば、[[EFI システムパーティション#典型的なマウントポイント|ESP のマウント]]を {{ic|/efi}} にして、[[ESP]] パーティションに存在する必要があるものだけをマウントすることができます。 |
||
+ | * {{ic|--cmdline /etc/kernel/''fallback_cmdline''}} を {{ic|fallback_options}} に追加することで、フォールバックイメージに上記とは異なる [[Unified カーネルイメージ#カーネルコマンドライン|cmdline]] を使用することができます (例えば {{ic|quiet}} を無くす。) |
||
+ | * カーネルコマンドラインの埋め込みを省略するには、{{ic|--no-cmdline}} を {{ic|1=''PRESET''_options=}} に追加してください。カーネルパラメーターはブートローダー経由で渡す必要があります。 |
||
+ | }} |
||
+ | {{Note| |
||
− | {{hc|/etc/mkinitcpio.d/linux.preset|2= |
||
+ | * {{ic|''PRESET''_uki}} オプションは以前は {{ic|''PRESET''_efi_image}} として知られていました。[https://gitlab.archlinux.org/archlinux/mkinitcpio/mkinitcpio/-/issues/134 2022 年 11 月変更], 古いオプションは非推奨ですが、今のところ動作しています。 |
||
− | ALL_config="/etc/mkinitcpio.conf" |
||
+ | * [[Unified Extensible Firmware Interface# UEFI ファームウェアのビット数|IA32 UEFI]] では、{{ic|--uefistub /usr/lib/systemd/boot/efi/linuxia32.efi.stub}} を {{ic|1=''PRESET''_options=}} に追加してください。 |
||
− | ALL_microcode=(/boot/*-ucode.img) |
||
− | |||
− | PRESETS=('default' 'fallback') |
||
− | |||
− | default_kver="/boot/vmlinuz-linux" |
||
− | default_image="/boot/initramfs-linux.img" |
||
− | default_efi_image="/boot/EFI/Linux/archlinux-linux.efi" |
||
− | default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp" |
||
− | |||
− | fallback_kver="/boot/vmlinuz-linux-lts" |
||
− | fallback_image="/boot/initramfs-linux-lts-fallback.img" |
||
− | fallback_efi_image="/boot/EFI/Linux/archlinux-linux-lts-fallback.efi" |
||
− | fallback_options="-S autodetect --splash /usr/share/systemd/bootctl/splash-arch.bmp" |
||
}} |
}} |
||
− | |||
− | {{Tip|複数のカーネルを使用している場合は、[[ESP]] に十分なスペースがあることを確認してください。[[mkinitcpio]] は現在 {{ic|initramfs-*.img}} と{{ic|*.efi}} 実行可能ファイルの両方をビルドし、使用されるスペースを2倍にします。[https://github.com/archlinux/mkinitcpio/issues/77] を参照してください。}} |
||
==== pacman フック ==== |
==== pacman フック ==== |
2023年10月22日 (日) 23:39時点における版
Unified カーネルイメージ は単一の実行ファイルで、UEFI ファームウェアから直接起動したり、ブートローダによってほとんどあるいは全く設定なしで自動的に起動することができます。
Arch がサポートするカーネル自体は UEFI ファームウェアでロードできます が、ユニファイドイメージはそれを組み込むことを可能にします。
- systemd-stub(7) のような UEFI スタブローダー。
- kernel イメージです。
- initramfs イメージ
- カーネルコマンドライン
- オプションでスプラッシュスクリーンを表示します。
出来上がった実行ファイル、つまりこれら全ての要素は、signed で簡単にセキュアブート で使用できるようにすることができます。
目次
unified カーネルイメージの準備
mkinitpcio
カーネルコマンドライン
mkinitcpio は、/etc/cmdline.d
ディレクトリ内のコマンドライン ファイルからの カーネルパラメータ の読み取りをサポートします。Mkinitcpio は、このディレクトリ内の .conf
拡張子を持つすべてのファイルの内容を連結し、それらを使用してカーネルコマンドラインを生成します。コマンドラインファイル内の # 文字で始まる行はコメントとして扱われ、mkinitcpio によって無視されます。マイクロコードと initramfs を指す エントリを削除 するように注意してください。
例:
/etc/cmdline.d/root.conf
root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw
/etc/cmdline.d/security.conf
# enable apparmor lsm=landlock,lockdown,yama,integrity,apparmor,bpf audit=1 audit_backlog_limit=256
あるいは、/etc/kernel/cmdline
を使用してカーネルコマンドラインを構成することもできます。
例:
/etc/kernel/cmdline
root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3 rw quiet bgrt_disable
.preset ファイル
次に、/etc/mkinitcpio.d/linux.preset
、または使用しているプリセットを、EFI システムパーティション の適切なマウントポイントを指定して、以下のように変更します:
PRESETS=
の各項目について、PRESET_uki=
パラメータのコメントを解除する (つまり#
を削除する)、- 冗長な
initramfs-*.img
ファイルを保存しないように、PRESET_image=
をコメントアウトする、 - オプションとして、スプラッシュ画像を追加したい各
PRESET_options=
行に--splash
パラメータを追加またはコメント解除します。
以下は linux カーネルと Arch スプラッシュスクリーンの linux.preset
の例です。
/etc/mkinitcpio.d/linux.preset
# mkinitcpio preset file for the 'linux' package #ALL_config="/etc/mkinitcpio.conf" ALL_kver="/boot/vmlinuz-linux" ALL_microcode=(/boot/*-ucode.img) PRESETS=('default' 'fallback') #default_config="/etc/mkinitcpio.conf" #default_image="/boot/initramfs-linux.img" default_uki="esp/EFI/Linux/arch-linux.efi" default_options="--splash=/usr/share/systemd/bootctl/splash-arch.bmp" #fallback_config="/etc/mkinitcpio.conf" #fallback_image="/boot/initramfs-linux-fallback.img" fallback_uki="esp/EFI/Linux/arch-linux-fallback.efi" fallback_options="-S autodetect"
pacman フック
マイクロコードのアップグレード後に再構築をトリガーするには、pacman フック が必要です。
/etc/pacman.d/hooks/ucode.hook
[Trigger] Operation=Install Operation=Upgrade Operation=Remove Type=Package # Change to appropriate microcode package Target=amd-ucode # Change the linux part above and in the Exec line if a different kernel is used Target=linux [Action] Description=Update Microcode module in initcpio Depends=mkinitcpio When=PostTransaction NeedsTargets Exec=/bin/sh -c 'while read -r trg; do case $trg in linux) exit 0; esac; done; /usr/bin/mkinitcpio -P'
セキュアブート用の UKI への署名
mkinitcpio ポストフック (mkinitcpio(8) § ABOUT POST HOOKS) を使用すると、生成された統合カーネルイメージに セキュアブート 用に署名できます。次のファイルを 作成 し、実行可能 にします。
/etc/initcpio/post/uki-sbsign
#!/usr/bin/env bash uki="$3" [[ -n "$uki" ]] || exit 0 keypairs=(/path/to/db.key /path/to/db.crt) for (( i=0; i<${#keypairs[@]}; i+=2 )); do key="${keypairs[$i]}" cert="${keypairs[(( i + 1 ))]}" if ! sbverify --cert "$cert" "$uki" &>/dev/null; then sbsign --key "$key" --cert "$cert" --output "$uki" "$uki" fi done
/path/to/db.key
と /path/to/db.crt
を画像の署名に使いたい鍵ペアのパスに置き換えてください。
UKI の構築
最後に、UKI のディレクトリが存在することを確認し、initramfs を再生成 します。たとえば、linux プリセットの場合は次のようになります。
# mkdir -p esp/EFI/Linux # mkinitcpio -p linux
必要に応じて、残っている initramfs-*.img
を /boot
または /efi
から削除します。
kernel-install
systemd の kernel-install(8) スクリプトを使用して、カスタムカーネルとカーネルパッケージ (Pacman を使用してインストール) の両方について、UKI 形式のカーネルを esp に自動的にインストールできます。 Pacman フックを mkinitcpio から kernel-install に切り替えます。
kernel-install
は initramfs ジェネレータではありませんが、"プラグイン" システムを通じて、パッケージがシステムのカーネルのインストール/生成にフックすることができるフレームワークです。実行中にシステムの適切な initramfs ジェネレータ (例:mkinitcpio) が呼び出されます。プラグインは、カーネルイメージ/initramfs の生成、署名、インストールなどに関与しています。カーネルのインストール中に何をしているか気になる場合は、kernel-install
に独自の "プラグイン" をインストールすることで通知できます ("プラグイン" は /usr/lib/kernel/install.d/
に配置されています。)
"layout" のような設定オプションがあり、kernel-install
が呼ばれたときにカーネルがインストールされる場所や方法に影響を与えることができます。
mkinitcpio には、適切な画像 (layout=uki の場合は UKI イメージ) を生成する kernel-install
プラグインが同梱されています。sbctl のような他のプログラムも kernel-install
プラグインと一緒にリリースされています。
UKI を生成するように kernel-install をセットアップするには:
- カーネルインストールレイアウトを 'uki' に設定します:
# echo "layout=uki" >> /etc/kernel/install.conf
- カーネルを直接インストールする Pacman フック:
# ln -s /dev/null /etc/pacman.d/hooks/60-mkinitcpio-remove.hook # ln -s /dev/null /etc/pacman.d/hooks/90-mkinitcpio-install.hook
- kernel-install の Pacman フックを作成します。pacman-hook-kernel-installAUR を使うことができます。
- 使用しているカーネルパッケージを削除して再インストールします。
dracut
コマンドラインパラメータ を、例えば /etc/dracut.conf.d/cmdline.conf
に配置します。
画像を生成する。
# dracut -f -q --uefi --uefi-splash-image /usr/share/systemd/bootctl/splash-arch.bmp
こちらも参照 dracut#カーネルのアップグレード時に新しい initramfs を生成
sbctl
sbctl パッケージを インストール して下さい。カーネルコマンド ラインを /etc/kernel/cmdline
に保存します。--save
パラメータを指定した sbctl bundle
コマンドを使用してバンドルを作成し、適切なタイミングで Pacman フックによって再生成します。
# sbctl bundle --save esp/archlinux.efi
他のカーネルと initramfs イメージ用にさらに EFI バイナリを作成するには、パラメーター --kernel-img
と --initramfs
を指定して上記のコマンドを繰り返します。sbctl(8) § EFI BINARY COMMANDS を参照してください。EFI バイナリは、sbctl generate-bundles
を使用していつでも再生成できます。
手動で
使いたいカーネルコマンドラインをファイルに入れて、objcopy(1) でバンドルファイルを作成します。
マイクロコード の場合、まず以下のようにマイクロコードファイルと initrd を連結します。
$ cat /boot/cpu_manufacturer-ucode.img /boot/initramfs-linux.img > /tmp/combined_initrd.img
Unified カーネルイメージを構築するときに、/tmp/combined_initrd.img
を initrdとして渡します。このファイルは後で作成できます。
$ objcopy \ --add-section .osrel="/usr/lib/os-release" --change-section-vma .osrel=0x20000 \ --add-section .cmdline="/etc/kernel/cmdline" --change-section-vma .cmdline=0x30000 \ --add-section .splash="/usr/share/systemd/bootctl/splash-arch.bmp" --change-section-vma .splash=0x40000 \ --add-section .linux="vmlinuz-file" --change-section-vma .linux=0x2000000 \ --add-section .initrd="initrd-file" --change-section-vma .initrd=0x3000000 \ "/usr/lib/systemd/boot/efi/linuxx64.efi.stub" "linux.efi"
この正確な数値が選ばれた理由については、[1] を参照してください。
イメージを作成したら、EFI システムパーティションにコピーします。
# cp linux.efi esp/EFI/Linux/
起動方法
systemd-boot
systemd-boot は esp/EFI/Linux/
内で Unified カーネルイメージを検索しますので、それ以上の設定は必要ありません。sd-boot(7) § FILES を見て下さい。
rEFInd
rEFInd は、EFI システム パーティション上の Unified カーネルイメージを自動検出し、それらをロードできます。refind.conf
で手動で指定することもできます。デフォルトでは次の場所にあります。
esp/EFI/refind/refind.conf
menuentry Linux { loader esp/EFI/Linux/archlinux-linux.efi }
イメージが ESP のルートにある場合、rEFInd は次のようにその名前のみを必要とします: loader archlinux-linux.efi
この方法で起動すると、esp/EFI/refind_linux.conf
からのカーネルパラメータは渡されません。
GRUB
rEFInd と同様に、GRUB は GRUB#Unified カーネルイメージをチェインロード で説明されているように EFI UKI をチェーンロードできます。
UEFI から直接起動
efibootmgr を使って .efi ファイルに UEFI ブートエントリを作成することができます。
# efibootmgr --create --disk /dev/sdX --part partition_number --label "label" --loader 'EFI\Linux\file.efi' --unicode
オプションの説明は efibootmgr(8) をご覧ください。