使用 GRUB 在多引导系统上安装 NixOS(来自 Arch 安装)

使用 GRUB 在多引导系统上安装 NixOS(来自 Arch 安装)

我有一个物理磁盘 ( /dev/sda),它分为/dev/sda1/boot使用的可引导 GRUB2 分区并使用 Arch 设置),/dev/sda2这是我的cryptroot,当解锁时,它是一个lvmpool具有完整大小的分区的大磁盘/dev/sda2。我已经在 3 上安装了 Arch lvs,如下图所示。此设置基本上是 LUKS 上的 LVM,如 Dm-crypt 上的 Arch Wiki 中所述。

分区布局和lvs

由于我阅读了很多有关 NixOS 的精彩内容,因此我尝试在当前的 Arch 安装旁边安装 NixOS,因此我创建了 3 个与上面lvs类似的版本arch- lvs,并遵循 NixOS 安装指南。我已指定boot.loader.grub.device = "nodev"NixOS 不会在其他任何地方安装 GRUB,因为我想重新使用位于 .Arch 上的现有 GRUB2 /dev/sda1。然而,它会grub.cfg为 NixOS 写入一个文件/boot/grub/grub.cfg,在本例中,该文件位于 NixOS nix-root lv/NixOS 中的文件系统根)上,因此不在实际(可引导)GRUB2 分区上/dev/sda1

然而,为了实现这一点,我想向我添加一个额外的菜单项grub.cfg,并指向configfileNixOS 安装程序在我的nix-root lv/NixOS 中的文件系统根目录)上创建的菜单项,几乎与所描述的内容一样这里。但是,我不确定如何创建一个指向 的条目nix-root lv,因为 GRUB 似乎需要一些类似 的语法set root='(hd0,X)',但是我怎样才能使这样的东西set root知道我lv指向而不是物理磁盘和分区号?这两个选项在 GRUB 中configfile都没有得到很好的描述,据我所知chainloader也没有。set root

我希望有人能给我指明正确的方向,告诉我我做错了什么,或者为什么/如何让自己变得如此困难,只为驻留在lvsLUKS 上不同 LVM 上的多个 Linux 发行版使用一个可启动 GRUB2 分区。

编辑: 我尝试了各种选项,例如set root=(lv/nix-root)(lvmpool/nix-root)(/dev/mapper/lvmpool-nix--root)但问题是 LVMlvs似乎对 GRUB 不可见,因为在 GRUB 加载时,LVM/dev/sda2/仍然是加密的 LUKS cryptroot

答案1

在亚历山大·巴蒂舍夫(Alexander Batischev)的上述帮助下,以及一些非常有用的信息来自 Redditcookie_enthusiast用户/r/linuxquestionsReddit 页面上,我设法让它工作。

事实证明,GRUB2 可以很好地处理 UUID,但不能很好地处理设备名称。考虑到这些知识,我们需要以下 4 个 UUID,然后才能(手动)为 NixOS 创建额外的 GRUB 菜单项grub.cfg configfile

  1. LUKS 设备的 UUID。
  2. LVM 卷组的 UUID。
  3. LVM 逻辑卷的 UUID。
  4. 文件系统的 UUID,包含grub.cfg我们想要通过configfileGRUB2 中的指令加载的文件。

我在这里列出如何获取这四个UUID:

  1. 执行cryptsetup luksUUID /dev/sda2-从 UUID 中删除所有破折号 ( ),在我的情况下a0cb535a-8468-485f-a220-a5f49e85c9f4会变成。a0cb535a8468485fa220a5f49e85c9f4
  2. 在我的例子中,执行vgdisplay并查找带有 UUID 的VG UUID, 。lvmpool5atKN9-PQBi-T9wb-Iyz8-qP4y-HN2E-c5uLOT
  3. 执行lvdisplay并查找包含您的文件LV UUID的 LV 名称或 LV 路径,或者在我的情况下使用 UUID 。grub.cfgnix-root/dev/lvmpool/nix-rootC9zkjF-IHu0-qQkP-KgLf-8rAy-TVPu-HQ7gtj
  4. 执行lsblk -p -o +UUID并查找包含您的文件的设备路径的 UUID grub.cfg,在我的例子中/dev/mapper/lvmpool-nix--root为 UUID 。cc6a06bb-336f-4e9f-a5f0-fdd43e7f548f

这将允许您创建以下额外的 GRUB 菜单项来引用我们的 NixOS grub.cfg configfile,该菜单项位于 my 上nix-root lv,因为boot.loader.grub.device = "nodev";my 中/etc/nixos/configuration.nix没有为我的 NixOS 安装安装 GRUB (在 Arch 中,这将进入/etc/grub.d/40_custom):

menuentry 'NixOS' {
    insmod crypto
    insmod cryptodisk
    insmod luks
    insmod lvm
    cryptomount -u a0cb535a8468485fa220a5f49e85c9f4
    set root='lvmid/5atKN9-PQBi-T9wb-Iyz8-qP4y-HN2E-c5uLOT/C9zkjF-IHu0-qQkP-KgLf-8rAy-TVPu-HQ7gtj'
    search --fs-uuid --set=root cc6a06bb-336f-4e9f-a5f0-fdd43e7f548f
    configfile '/boot/grub/grub.cfg'
}

为了更清楚地说明这一点,这包含一些文字值,lvmid例如不是应该替换为您的 LVM 的名称或 ID。似乎在任何地方都没有正确记录这一点。当您将 LUKS 设备的 UUID 放入该cryptomount -u行时,也会出现同样的问题带破折号其中,GRUB 只会告诉您Press any key to continue,这(显然)不是很有帮助。

crypt -> LVM -> root用于通过以下方式启动的手动 GRUB 菜单项的裸模板LUKS 上的 LVM设置因此将是:

menuentry 'NixOS' {
    insmod crypto
    insmod cryptodisk
    insmod luks
    insmod lvm
    cryptomount -u <LUKS UUID without dashes>
    set root='lvmid/<LVM Volume Group UUID>/<LVM Logical Volume UUID>'
    search --fs-uuid --set=root <Filesystem UUID>
    configfile '/boot/grub/grub.cfg'
}

对于那些对另一半也感兴趣的人,我将/etc/nixos/configuration.nix文件修改为如下所示:

boot.loader.grub.enable = true;
boot.loader.grub.version = 2;
boot.loader.grub.device = "nodev";
boot.initrd.luks.devices = [ { name = "cryptroot"; device = "/dev/sda2"; preLVM = true; } ];

相关内容