我有一个物理磁盘 ( /dev/sda
),它分为/dev/sda1
(/boot
使用的可引导 GRUB2 分区并使用 Arch 设置),/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
。
然而,为了实现这一点,我想向我添加一个额外的菜单项grub.cfg
,并指向configfile
NixOS 安装程序在我的nix-root
lv
(/
NixOS 中的文件系统根目录)上创建的菜单项,几乎与所描述的内容一样这里。但是,我不确定如何创建一个指向 的条目nix-root
lv
,因为 GRUB 似乎需要一些类似 的语法set root='(hd0,X)'
,但是我怎样才能使这样的东西set root
知道我lv
指向而不是物理磁盘和分区号?这两个选项在 GRUB 中configfile
都没有得到很好的描述,据我所知chainloader
也没有。set root
我希望有人能给我指明正确的方向,告诉我我做错了什么,或者为什么/如何让自己变得如此困难,只为驻留在lvs
LUKS 上不同 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/linuxquestions
Reddit 页面上,我设法让它工作。
事实证明,GRUB2 可以很好地处理 UUID,但不能很好地处理设备名称。考虑到这些知识,我们需要以下 4 个 UUID,然后才能(手动)为 NixOS 创建额外的 GRUB 菜单项grub.cfg
configfile
:
- LUKS 设备的 UUID。
- LVM 卷组的 UUID。
- LVM 逻辑卷的 UUID。
- 文件系统的 UUID,包含
grub.cfg
我们想要通过configfile
GRUB2 中的指令加载的文件。
我在这里列出如何获取这四个UUID:
- 执行
cryptsetup luksUUID /dev/sda2
并-
从 UUID 中删除所有破折号 ( ),在我的情况下a0cb535a-8468-485f-a220-a5f49e85c9f4
会变成。a0cb535a8468485fa220a5f49e85c9f4
- 在我的例子中,执行
vgdisplay
并查找带有 UUID 的VG UUID
, 。lvmpool
5atKN9-PQBi-T9wb-Iyz8-qP4y-HN2E-c5uLOT
- 执行
lvdisplay
并查找包含您的文件LV UUID
的 LV 名称或 LV 路径,或者在我的情况下使用 UUID 。grub.cfg
nix-root
/dev/lvmpool/nix-root
C9zkjF-IHu0-qQkP-KgLf-8rAy-TVPu-HQ7gtj
- 执行
lsblk -p -o +UUID
并查找包含您的文件的设备路径的 UUIDgrub.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; } ];