djv*_*orp 5 arch-linux lvm grub2 luks nixos
我有一个物理磁盘 ( /dev/sda),它被划分为/dev/sda1(它是/boot使用 Arch 的可引导 GRUB2 分区并设置),/dev/sda2这是我的cryptroot,当解锁时,它是一个lvmpool具有完整分区大小的单个大磁盘/dev/sda2。我已经在 3 上安装了 Arch lvs,如下图所示。该设置基本上是 LUKS 上的 LVM,如 Dm-crypt 上的 Arch Wiki 所述。
由于我阅读了很多关于 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。
但是,为了实现这一点,我想向 my 添加一个额外的菜单项,grub.cfg并指向configfileNixOS 安装程序在我的nix-root lv(/NixOS 中的文件系统根目录)上创建的菜单项,几乎与此处描述的相同。但是,我不确定如何创建一个指向 的条目nix-root lv,因为似乎 GRUB 想要一些类似 的语法set root='(hd0,X)',但是我怎样才能让这样的东西set root知道 my lvto 指向而不是物理磁盘和分区号?无论是选择configfile和chainloader是不是在GRUB很好的描述,也不是set root只要我能找到。
我希望有人能指出我正确的方向,告诉我我做错了什么,或者为什么/如何让我对自己太难,只需将一个可引导的 GRUB2 分区用于位于lvsLUKS上不同 LVM上的多个 Linux 发行版.
编辑:
我尝试了各种选项,set root=例如(lv/nix-root),(lvmpool/nix-root)和(/dev/mapper/lvmpool-nix--root),但问题是 LVMlvs似乎对 GRUB 不可见,因为在 GRUB 加载时,/dev/sda2/仍然是加密的 LUKS cryptroot。
在 Alexander Batischev 的帮助以及Reddit 用户在Reddit 页面上提供的一些非常有用的信息的帮助下,我成功地完成了这项工作。cookie_enthusiast/r/linuxquestions
事实证明,GRUB2 可以很好地处理 UUID,但不能很好地处理设备名称。考虑到这些知识,我们需要以下 4 个 UUID,然后才能(手动)为 NixOS 创建额外的 GRUB 菜单项grub.cfg configfile:
grub.cfg我们想要通过configfileGRUB2 中的指令加载的文件。我在这里列出如何获取这四个UUID:
cryptsetup luksUUID /dev/sda2并删除UUID 中的所有破折号 (- ) ,在我的情况下a0cb535a-8468-485f-a220-a5f49e85c9f4会变成这样a0cb535a8468485fa220a5f49e85c9f4。vgdisplay并查找带有 UUID 的VG UUID, 。lvmpool5atKN9-PQBi-T9wb-Iyz8-qP4y-HN2E-c5uLOTlvdisplay并查找LV UUID包含您的grub.cfg文件的 LV 名称或 LV 路径,nix-root或者在我的情况下/dev/lvmpool/nix-root使用 UUID C9zkjF-IHu0-qQkP-KgLf-8rAy-TVPu-HQ7gtj。lsblk -p -o +UUID并查找包含您的grub.cfg文件的设备路径的 UUID,在我的例子中/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'
}
Run Code Online (Sandbox Code Playgroud)
为了更清楚地说明这一点,它包含一些文字值,例如lvmid不应替换为 LVM 的名称或 ID。似乎在任何地方都没有正确记录这一点。同样的问题也适用于当您将 LUKS 设备的 UUID 放在带有破折号cryptomount -u的行中时,GRUB 只会告诉您,这(显然)不是很有帮助。Press any key to continue
因此,在 LUKScrypt -> LVM -> root设置上通过LVM启动的手动 GRUB 菜单项的裸模板将是:
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'
}
Run Code Online (Sandbox Code Playgroud)
对于那些对另一半也感兴趣的人,我将/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; } ];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3142 次 |
| 最近记录: |