Skip to content

Instantly share code, notes, and snippets.

@douglarek
Last active November 16, 2024 02:53
Show Gist options
  • Save douglarek/1e6d382a708dc818aa2769ef8282b8eb to your computer and use it in GitHub Desktop.
Save douglarek/1e6d382a708dc818aa2769ef8282b8eb to your computer and use it in GitHub Desktop.
Gentoo 使用系列之一
  • 我现在正在使用 Grub,我想使用 systemd-boot,应该怎么做

    答:如果你是正在装系统,那么按手册走的时候直接在配置内核1和启动项2的时候选 systemd-boot 就可以了。如果是已经安装完系统就是想换到 systemd-boot,那么可以分以下几步3走(以下假设 ESP 分区在 /efi,用的 init 系统是 systemd,如果不是根据实际调整):

    1. 编辑 /etc/portage/packages.use/installkernel(一般在这个 use 文件,如果你放到了其他的地方编辑即可),移除所有 grub 相关,加入如下的 systemd-boot:

      sys-apps/systemd boot # 添加 systemd boot 支持
      sys-kernel/installkernel systemd-boot dracut # 内核编译的时候自动生成启动项
      
    2. 执行 use 变更更新:

      (root)$: emerge -avuDN @world
      

      这样会重新编译 systemd 以及 installkernel。

    3. 确认当前系统在 UEFI 模式:

      ls /sys/firmware/efi/efivars
      

      如果当前是 UEFI 模式,那么以上命令不报错,如果报错就别往下走了,使用 livecd 引导进入 EFI 模式,如下的操作在 livecd 操作即可。

    4. 安装 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".
      
    5. 安装完后查看启动项:

      (root)$: bootctl list
      

      如果发现没有任何启动项,那么进行下一步。

    6. 配置内核添加启动项:

      (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
      
    7. 配置启动内核参数(可选),编辑 /etc/kernel/cmdline 写入:

      quiet splash
      

      注意这一步并不会变更实际的启动项内容,需要再次执行第 6 步进行启动项生成。

    8. 配置启动选项(可选),编辑 /efi/loader/loader.conf

      timeout 3
      

      这一步会自动生效。

    9. 自动更新 systemd-boot(重要):

      (root)$: systemctl enable --now systemd-boot-update.service
      

      也可以使用 Portage 钩子。

    10. 清理无用目录以及 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" 也可以删除,没啥用了。

    11. 重启享用

    12. 深入 systemd-boot4

QA:

  1. systemd-boot 与 grub 比有哪些不足

    • 只支持 UEFI
    • 启动项发现只能在一个 ESP,这其实也不叫事,本来就可以手动切换
  2. 清理内核会自动清理 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

Footnotes

  1. https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Kernel#systemd-boot 安装手册内核配置相关

  2. https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Bootloader 安装手册启动项相关

  3. https://wiki.gentoo.org/wiki/Systemd/systemd-boot wiki systemd 条目

  4. https://systemd.io/BOOT/ 延伸阅读

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment