Yukitoha 站站站

v0.13 ... 能跑就行了吧?

从统一内核镜像启动

只是记录,看 Arch Wiki 肯定比这靠谱啊。

https://wiki.archlinuxcn.org/wiki/UKI

目标

实现启动时直接由 UEFI 固件启动到系统。

步骤

更改 preset

编辑 /etc/mkinitcpio.d/*.preset

#PRESETS=('default' 'fallback')
PRESETS=('default')

#default_config="/etc/mkinitcpio.conf"
#default_image="/boot/initramfs-linux-lily.img"
#default_uki="/efi/EFI/Linux/arch-linux-lily.efi"
# 设置为默认启动路径
default_uki="/efi/EFI/BOOT/BOOTx64.efi"
# 启动时显示 LOGO
default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp"

内核参数

内核参数会被直接写入至生成的 UKI 中,每次更改都需要重新生成。


(或许也能直接编辑 EFI 文件中的字符串?用 xxd 看内核参数前后都是一堆0,或许也可行吧)

> diff <(xxd /efi/EFI/BOOT/BOOTx64.EFI) <(xxd BOOTx64.EFI )
14c14
< 000000d0: 0080 a808 0004 0000 7a14 a808 0a00 6001  ........z.....`.
---
> 000000d0: 0080 a808 0004 0000 e792 a808 0a00 6001  ..............`.
46c46
< 000002d0: 3800 0000 00f0 0100 0002 0000 0080 0100  8...............
---
> 000002d0: 2b00 0000 00f0 0100 0002 0000 0080 0100  +...............

d0 那边看不出来是啥,2d0 是内核参数的长度。 因为没整明白 d0 是啥所以就没弄明白怎么直接修改内核参数而不重置 UKI。


我自行打了个包将内核参数配置文件放至了 /etc/cmdline.d/

不指定 root 参数

使用mkinitcpio时,需要systemd hook。

/etc/mkinitcpio.conf:

HOOKS=(systemd autodetect microcode modconf kms keyboard sd-vconsole block filesystems fsck)

在 HOOKS 里添加 systemd 并移除几个不需要的,参见 https://wiki.archlinuxcn.org/wiki/Mkinitcpio#%E5%B8%B8%E7%94%A8%E9%92%A9%E5%AD%90

所有自动挂载的分区必须与ESP分区在同一块物理硬盘上。

字面意思。

必须设置正确的GPT分区类型。
$ fdisk -l
...
/dev/nvme0n1p2      104448  204904447  204800000  97.7G Linux root (x86-64)
...

确保 root 分区的类型显示为 Linux root。 如不是可以使用 fdisk 更改。

参考: https://wiki.archlinuxcn.org/wiki/Systemd#GPT%E5%88%86%E5%8C%BA%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BD

生成 UKI

正常 mkinitcpio 就行,一般更新内核包也会自动生成。

启动项更改

在 UEFI(BIOS?) 的设置中把所在硬盘的启动项提至最前, 而不是其他的可能在本硬盘的启动项(可能为遗留的grub或是失效的启动项等)。

Written on September 30, 2025