-
我现在正在使用 Grub,我想使用 systemd-boot,应该怎么做
答:如果你是正在装系统,那么按手册走的时候直接在配置内核1和启动项2的时候选 systemd-boot 就可以了。如果是已经安装完系统就是想换到 systemd-boot,那么可以分以下几步3走(以下假设 ESP 分区在
/efi
,用的 init 系统是 systemd,如果不是根据实际调整):-
编辑
/etc/portage/packages.use/installkernel
(一般在这个 use 文件,如果你放到了其他的地方编辑即可),移除所有 grub 相关,加入如下的 systemd-boot:sys-apps/systemd boot # 添加 systemd boot 支持 sys-kernel/installkernel systemd-boot dracut # 内核编译的时候自动生成启动项
-
执行 use 变更更新:
(root)$: emerge -avuDN @world
这样会重新编译 systemd 以及 installkernel。
-
确认当前系统在 UEFI 模式:
ls /sys/firmware/efi/efivars
如果当前是 UEFI 模式,那么以上命令不报错,如果报错就别往下走了,使用 livecd 引导进入 EFI 模式,如下的操作在 livecd 操作即可。
-
安装 systemd-boot 到 efi:
(root)$: bootctl install
执行完一般输出如下:
Created "/efi/EFI/systemd". Created "/efi/EFI/BOOT". Created "/efi/loader". Created "/efi/loader/entries". Created "/efi/EFI/Linux". Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/efi/EFI/systemd/systemd-bootx64.efi". Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/efi/EFI/BOOT/BOOTX64.EFI". Random seed file /efi/loader/random-seed successfully written (32 bytes). Successfully initialized system token in EFI variable with 32 bytes. Created EFI boot entry "Linux Boot Manager".
-
安装完后查看启动项:
(root)$: bootctl list
如果发现没有任何启动项,那么进行下一步。
-
配置内核添加启动项:
(root)$: emerge -a --config sys-kernel/gentoo-kernel
注意自己使用的内核包,这时候再使用第 5 步的命令查看应该有启动项了:
type: Boot Loader Specification Type #1 (.conf) title: Gentoo Linux (default) (not reported/new) id: 58e13536913f47119e3a0f56d6982f70-6.11.7-gentoo-dist.conf source: /efi//loader/entries/58e13536913f47119e3a0f56d6982f70-6.11.7-gentoo-dist.conf sort-key: gentoo version: 6.11.7-gentoo-dist machine-id: 58e13536913f47119e3a0f56d6982f70 linux: /efi//58e13536913f47119e3a0f56d6982f70/6.11.7-gentoo-dist/linux initrd: /efi//58e13536913f47119e3a0f56d6982f70/6.11.7-gentoo-dist/initrd options: root=UUID=fb61f375-9c41-4f4f-b935-569ac81acb82 ro systemd.machine_id=58e13536913f47119e3a0f56d6982f70
-
配置启动内核参数(可选),编辑
/etc/kernel/cmdline
写入:quiet splash
注意这一步并不会变更实际的启动项内容,需要再次执行第 6 步进行启动项生成。
-
配置启动选项(可选),编辑
/efi/loader/loader.conf
:timeout 3
这一步会自动生效。
-
自动更新 systemd-boot(重要):
(root)$: systemctl enable --now systemd-boot-update.service
也可以使用 Portage 钩子。
-
清理无用目录以及 Grub 软件包相关依赖:
(root)$: rm -rf /boot/* (root)$: rm -rf /efi/EFI/gentoo (root)$: emerge -W grub (root)$: emerge -ac
其实安装的时候如果你用的 Grub,很可能在 make.conf 还有个
GRUB_PLATFORMS="efi-64"
也可以删除,没啥用了。 -
重启享用
-
深入 systemd-boot4
-
QA:
-
systemd-boot 与 grub 比有哪些不足
- 只支持 UEFI
- 启动项发现只能在一个 ESP,这其实也不叫事,本来就可以手动切换
-
清理内核会自动清理 systemd-boot 启动项么
是的,使用 eclean-kernel 清理旧内核的时候可以自动清理 systemd-boot 的启动项,比如我当前有两个内核(新的是 6.11.8,旧的是 6.11.7),执行 eclean-kernel 后会自动清理:
(root)$: eclean-kernel -n 1 Legend: [-] file being removed [x] file does not exist (anymore) [+] file being kept (used by other kernels) * Removing kernel bls 6.11.7-gentoo-dist (not referenced by bootloader (symlinks)) [-] /lib/modules/6.11.7-gentoo-dist/../../../src/linux-6.11.7-gentoo-dist [-] /lib/modules/6.11.7-gentoo-dist [x] /efi/58e13536913f47119e3a0f56d6982f70/6.11.7-gentoo-dist/linux [x] /efi/58e13536913f47119e3a0f56d6982f70/6.11.7-gentoo-dist/initrd [x] /efi/58e13536913f47119e3a0f56d6982f70/6.11.7-gentoo-dist
通过 bootctl 查看已经没了:
(root)$: bootctl list type: Boot Loader Specification Type #1 (.conf) title: Gentoo Linux (default) (selected) id: 58e13536913f47119e3a0f56d6982f70-6.11.8-gentoo-dist.conf source: /efi//loader/entries/58e13536913f47119e3a0f56d6982f70-6.11.8-gentoo-dist.conf sort-key: gentoo version: 6.11.8-gentoo-dist machine-id: 58e13536913f47119e3a0f56d6982f70 linux: /efi//58e13536913f47119e3a0f56d6982f70/6.11.8-gentoo-dist/linux initrd: /efi//58e13536913f47119e3a0f56d6982f70/6.11.8-gentoo-dist/initrd options: root=UUID=fb61f375-9c41-4f4f-b935-569ac81acb82 ro systemd.machine_id=58e13536913f47119e3a0f56d6982f70 type: Automatic title: Reboot Into Firmware Interface id: auto-reboot-to-firmware-setup source: /sys/firmware/efi/efivars/LoaderEntries-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f
如果发现还是没有清理掉,可以手动执行
bootctl cleanup
。