如何使用 update-grub 为加密的 zfs 根文件系统生成 grub2 菜单项?

如何使用 update-grub 为加密的 zfs 根文件系统生成 grub2 菜单项?

我在 ZFS 0.8.4 上运行 Ubuntu 18.04,并且正在尝试加密。我希望在 grub 中有一个菜单项,让我可以启动到加密的根目录。

系统设置

勾选表示 grub 中有对应的菜单项。

  • aquarium/ds1/u18
    包含我的 ubuntu 18.04,并将其挂载点设置为/
  • tank/ds1/u18
    是从中复制而来的,aquarium唯一的区别是它ds1被加密并u18继承了该属性。
  • Windows 10 ✓
    我希望这与我的问题无关。
  • /dev/nvme0n1p8
    当我切换到 ZFS 时,EXT4 格式的系统仍然存在aquarium

我有一个 EXT2 分区/boot和另一个分区/boot/efi

手动解决方法

当我选择并编辑aquarium条目,将其替换root=ZFS=aquarium/ds1/u18为时,root=ZFS=tank/ds1/u18我可以正常启动到 initramfs,并提示我输入密码。输入密码后,我的系统便如预期一样运行。

在该系统内(或任何其他 ubuntu 系统内),我可以在 中创建自定义条目/etc/grub/40_custom

menuentry "Encryptioned Magic 18.04" {
    linux /vmlinuz-5.3.0-51-generic root=ZFS=tank/ds1/u18 ro acpi_backlight=video resume=UUID-OF-SWAP-PARTITION
    initrd /initrd.img-5.3.0-51-generic
}

我想避免这种情况,因为手动输入意味着当我的交换文件系统的 UUID 发生变化或其他情况时,我需要修改它。我的意思是,我们不为每个操作系统创建自定义条目的所有原因基本上也适用于此。

解决方案尝试

理想情况下,这将使用sudo update-grub,但即使加载了加密密钥,或者即使我在加密系统中,它似乎也找不到它。此日志来自 中的运行aquarium

$ sudo update-grub
Sourcing file `/etc/default/grub`
Generating grub configuration file ...
Found theme: /boot/grub/themes/poly-dark/theme.txt
Found linux image: /boot/vmlinuz-5.3.0-51-generic
Found initrd image: /boot/initrd.img-5.3.0-51-generic
Found linux image: /boot/vmlinuz-5.3.0-28-generic
Found initrd image: /boot/initrd.img-5.3.0-28-generic
Found Windows Boot Manager on /dev/nvme0n1p2@/EFI/Microsoft/Boot/bootmgfw.efi
Found Ubuntu 18.04.4 LTS (18.04) on /dev/nvme0n1p8
Adding boot menu entry for EFI firmware configuration
done

当我在加密系统中运行相同的命令时tank,我在第二行Found initrd image和以下Found Windows Boot Manager行之间另外收到一条消息:

device-mapper: reload ioctl on osprober-linux-nvme0n1p10   failed: Device or resource busy
Command failed

所提到的分区是设置了 加密数据nvme0n1p10集池的单个分区。tanktank/ds1/u18

zfs我运行update-grub 因为它开放了独占访问,无论我登录的是哪个系统。这种行为是一种已确认错误在 os-prober 中,但他们称它为

实际上没有失败,只是在 os-prober 期间出现错误。我们想清理它(它是表面的)。

如何为加密的 zfs 数据集自动生成 grub 条目?

答案1

目前这仍然是未决问题在 zfsonlinux/grub 上,但我已在那里(和这里)发布了一个解决方法,感谢 github 用户特佩勒

我们要做的是从 Ubuntu 19.04 获取用于 Ubuntu 18.04 的 grub 脚本。

  1. 下载grub-common_2.04-1ubuntu12_amd64.debhttps://packages.ubuntu.com/eoan/amd64/grub-common/download并用 提取它ar x grub-common_2.04-1ubuntu12_amd64.deb

  2. /etc/grub.d/10_linux_zfs从那里取出文件data.tar.xz。我不知道正确的方法,所以我只是vim data.tar.xz打开文件,然后执行:w 10_linux_zfs

  3. 移至/etc/grub.d

  4. 使其可执行,否则它可能无法运行。
    sudo chmod +x /etc/grub.d/10_linux_zfs

  5. sudo update-grub

这足以生成正确的条目。但是我们也不想有任何不正确的条目,所以我们必须10_linux以相同的方式替换,因为他们在其中添加了几行跳过 zfs 条目的生成。

   # We have a more specialized ZFS handler, with multiple system in 10_linux_zfs.
   if [ -e "`dirname $(readlink -f $0)`/10_linux_zfs" ]; then
     exit 0
  1. 重复步骤2)至5)来10_linux代替10_linux_zfs

相关内容