「ユニファイドカーネルイメージ」の版間の差分
(→UEFI から直接起動: 情報を更新) |
(→unified カーネルイメージの準備: kernel-installを翻訳して追加) |
||
91行目: | 91行目: | ||
最後に、[[initramfs]] を再生成します。 |
最後に、[[initramfs]] を再生成します。 |
||
+ | |||
+ | === kernel-install === |
||
+ | |||
+ | [[systemd]] の {{man|8|kernel-install}} スクリプトを使用して、カスタムカーネルとカーネルパッケージ (Pacman を使用してインストール) の両方について、UKI 形式のカーネルを ''esp'' に自動的にインストールできます。 Pacman フックを ''mkinitcpio'' から ''kernel-install'' に切り替えます。 |
||
+ | |||
+ | {{ic|kernel-install}} は initramfs ジェネレータではありませんが、"プラグイン" システムを通じて、パッケージがシステムのカーネルのインストール/生成にフックすることができるフレームワークです。実行中にシステムの適切な initramfs ジェネレータ (例:''mkinitcpio'') が呼び出されます。プラグインは、カーネルイメージ/initramfs の生成、署名、インストールなどに関与しています。カーネルのインストール中に何をしているか気になる場合は、{{ic|kernel-install}} に独自の "プラグイン" をインストールすることで通知できます ("プラグイン" は {{ic|/usr/lib/kernel/install.d/}} に配置されています。) |
||
+ | |||
+ | "layout" のような設定オプションがあり、{{ic|kernel-install}} が呼ばれたときにカーネルがインストールされる場所や方法に影響を与えることができます。 |
||
+ | |||
+ | ''mkinitcpio'' には、適切な画像 (layout=uki の場合は UKI イメージ) を生成する {{ic|kernel-install}} プラグインが同梱されています。{{Pkg|sbctl}} のような他のプログラムも {{ic|kernel-install}} プラグインと一緒にリリースされています。 |
||
+ | |||
+ | UKI を生成するように kernel-install をセットアップするには: |
||
+ | |||
+ | * カーネルインストールレイアウトを 'uki' に設定します: {{bc|1=# echo "layout=uki" >> /etc/kernel/install.conf}} |
||
+ | * カーネルを直接インストールする Pacman フック:{{bc|<nowiki># ln -s /dev/null /etc/pacman.d/hooks/60-mkinitcpio-remove.hook |
||
+ | # ln -s /dev/null /etc/pacman.d/hooks/90-mkinitcpio-install.hook |
||
+ | </nowiki>}} |
||
+ | * ''kernel-install'' の Pacman フックを作成します。{{AUR|pacman-hook-kernel-install}} を使うことができます。 |
||
+ | * 使用しているカーネルパッケージを削除して再インストールします。 |
||
=== dracut === |
=== dracut === |
2023年3月23日 (木) 18:08時点における版
Unified カーネルイメージ は単一の実行ファイルで、UEFI ファームウェアから直接起動したり、ブートローダによってほとんどあるいは全く設定なしで自動的に起動することができます。
Arch がサポートするカーネル自体は UEFI ファームウェアでロードできます が、ユニファイドイメージはそれを組み込むことを可能にします。
- systemd-stub(7) のような UEFI スタブローダー。
- kernel イメージです。
- initramfs イメージ
- カーネルコマンドライン
- オプションでスプラッシュスクリーンを表示します。
出来上がった実行ファイル、つまりこれら全ての要素は、signed で簡単にセキュアブート で使用できるようにすることができます。
目次
unified カーネルイメージの準備
mkinitpcio
例として実行することで機能をテストできます
# mkinitcpio -p linux -- --uefi esp/EFI/Linux/test-systemd.efi
これにより、linux プリセットのカーネルイメージが生成されます。
.preset ファイル
まず、EFI システムパーティション の適切なマウントポイントを指定して、 /etc/mkinitcpio.d/linux.preset
あるいは使用しているプリセットを以下のように変更します。
- マイクロコード が必要な場合は、
ALL_microcode=(/boot/*-ucode.img)
を追加して、mkinitcpio にその場所を追加します。 PRESET_efi_image=
PRESETS=
の各項目に対して、PRESET_efi_image=
パラメータを追加します。default_efi_image="esp/EFI/Linux/archlinux-linux.efi"
とfallback_efi_image="esp/EFI/Linux/archlinux-linux-fallback.efi"
の各項目です。これにより、実行ファイル名が設定されます。- オプションとして、各
--splash /usr/share/systemd/bootctl/splash-arch.bmp
行にPRESET_options=
を追加して、スプラッシュ画像を追加することも可能です、つまりdefault_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp"
とfallback_options="-S autodetect --splash /usr/share/systemd/bootctl/splash-arch.bmp"
のように指定します。
以下は、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_image="/boot/initramfs-linux.img" default_efi_image="esp/EFI/Linux/archlinux-linux.efi" default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp" fallback_image="/boot/initramfs-linux-fallback.img" fallback_efi_image="esp/EFI/Linux/archlinux-linux-fallback.efi" fallback_options="-S autodetect --splash /usr/share/systemd/bootctl/splash-arch.bmp"
この2番目の例では、linux のデフォルトイメージと linux-lts のフォールバックイメージを作成します。
/etc/mkinitcpio.d/linux.preset
ALL_config="/etc/mkinitcpio.conf" 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"
カーネルコマンドライン
次に、カーネルパラメータ を使用して /etc/kernel/cmdline
を作成します。
# cp /proc/cmdline /etc/kernel/cmdline
例:
/etc/kernel/cmdline
rw quiet bgrt_disable
最後に、initramfs を再生成します。
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 を生成
手動で
使いたいカーネルコマンドラインをファイルに入れて、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"
この正確な数値が選ばれた理由については、[2] を参照してください。
イメージを作成したら、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
からのカーネルパラメータは渡されません。
UEFI から直接起動
efibootmgr を使って .efi ファイルに UEFI ブートエントリを作成することができます。
# efibootmgr --create --disk /dev/sdX --part partition_number --label "label" --loader 'EFI\Linux\file.efi' --unicode
オプションの説明は efibootmgr(8) をご覧ください。