我有一个 grub2 引导加载程序的设置,系统的其余部分位于加密分区 (LVM-on-LUKS) 上。我在 LUKS 容器内安装了两个操作系统:Kali Sana 和 Debian 8,以及一个共享交换分区。
这是通过安装带有全盘加密的 Kali,然后为 Debian 腾出空间来设置的。 grub 安装来自 Kali。
我完全意识到为 Debian 创建第二个 /boot 分区会更容易。然而,考虑到这种设置方式,Debian 引导加载程序没有剩余空间,调整所有内容的大小以腾出空间将是一件痛苦的事情。
所以,这是我在 grub 下需要做的事情:
- 挂载加密分区(已经设法做到这一点)
- 启动 Debian 的 initramfs 和内核(这是有问题的地方)。
我对此做了一些研究,并尝试通过编辑 /boot/grub/custom.cfg 文件来做到这一点。每次编辑后,我都会运行sudo grub-mkconfig
和sudo update-grub
。然后我重新启动看看是否可以启动。虽然它可以解密 LUKS 容器,但无法找到 initramfs 或内核。
这是我的 custom.cfg 文件。注意:我对这一切的作用很模糊。这很可能是完全错误的。
menuentry "Debian 8 Jessie"{
insmod luks
insmod lvm
cryptdevice=UUID=ffe7a64d-e552-4db9-b0f3-1e42be118059:cryptolvm
set root=/dev/Outsider-vg/Outsider-debianroot
linux /boot/vmlinuz-3.16.0-4-amd64 root=/dev/Outsider-vg/Outsider-debianroot
initrd /boot/initrd.img-3.16.0-4-amd64
}
关于上述内容的注意事项:cryptdevice=UUID=ffe7a64d-e552-4db9-b0f3-1e42be118059:cryptolvm
最初是set root=/dev/sda5
.此版本的文件无法解密容器。请注意,我已经知道如何让它发挥作用,我只是在搞乱它,看看更改它是否有帮助。
我一直在参考这个链接寻求帮助编辑此文件。
基本上,我需要知道在 LUKS 分区解密后将 grub 指向正确的 initramfs 和 vmlinuz 文件的语法。它们位于逻辑卷下Outsider--debianroot
。我唯一真正的问题是我不知道该怎么做。
我很抱歉说得有些含糊。部分问题是我不确定我在寻找什么。如果您没有答案,但可以指导我编辑 custom.cfg 的综合指南,我也将不胜感激。如果您需要更多详细信息,请告诉我。
编辑:经过进一步研究,我发现:
基本上,我需要为 Grub 提供 LVM 上根目录的正确路径。在对文件系统进行一番研究后,我发现了两条可行的路径:/dev/mapper/volumeGroup-volumeName
和/dev/volumeGroup/volumeName
。在上述示例中,它们是/dev/mapper/Outsider--vg-Outsider--debianroot
和/dev/Outsider-vg/Outsider-debianroot
。
我需要知道哪个是正确的根目录的路径,以允许该发行版启动。两者之一都是正确的,两者都需要一起使用,或者我缺少一条不同的路径,我需要使用它。有任何想法吗?
此外,这两条路径有什么区别?它们各自指向什么?/dev/mapper/volumeGroup
和 只是 和有什么不一样/dev/volumeGroup
?
编辑2:我相信这/dev/volumeGroup/volumeName
是正确的路径,基于最终语法本教程。我将对此进行实验并报告。
注意:等我解决了这个问题后,我会来清理这个问题。
答案1
你应该有类似的东西:
menuentry 'Debian' --class debian --class gnu-linux --class gnu --class os {
load_video
set gfxpayload=keep
insmod gzio
insmod ext2
insmod fat
echo 'Loading Linux ...'
linux /boot/vmlinuz-3.16.0-4-amd64 cryptdevice=UUID=ffe7a64d-e552-4db9-b0f3-1e42be118059:cryptolvm root=/dev/Outsider-vg/Outsider-debianroot rw
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-3.16.0-4-amd64
}
但请注意,它insmod part_gpt
应该已经添加到您的 grub.cfg 中。lvm
并且luks
不需要,因为内核将处理它(您需要适当的内核挂钩),grub 仅加载 Linux 映像。
答案2
在 Linux 拥有设备映射器子系统之前,早在 2.4.x 及更早的内核系列中,就有 Linux LVM 版本 1。现代版本是版本 2。
LVM v1 使用专门的/dev/vgName/lvName
- 样式路径。
当引入设备映射器子系统和 LVM v2 时,新型 LVM 需要向后兼容旧版本,因此它保留旧式路径名作为真实设备的符号链接。
当前的 LVM v2 使用设备映射器,因此“真实”设备遵循其规则:它们将是/dev/dm-<number>
.这对于低级设备映射器用户空间工具(例如 )来说很容易dmsetup
,但对人类来说不方便,因此每个子系统(多路径、软件 RAID、磁盘加密、LVM v2 等)还将维护更人性化的名称,作为指向后面的符号链接到相关/dev/dm-*
设备。这些链接通常位于 下/dev/mapper/
,但为了向后兼容可能存在例外情况。
因此,当前的 LVM 设备命名方案使用/dev/mapper/vgName-lvName
schema 作为“官方”名称,尽管它们通常实现为/dev/dm-<number>
设备的符号链接。但由于传统的 LVMv1 风格的命名方案简单方便,因此仍然得到维护。由于官方方案和遗留方案都以相同的方式实现为符号链接,因此它们之间实际上没有实际差异。
唯一的例外可能是 initramfs 内,为了简单起见,启动脚本可能被设计为仅处理一种特定形式的 LVM 设备名称。如果是这样,您的发行版文档应该明确提及它。
(曾经有一些内核/udev
版本允许多个设备节点使用特定的主/次设备号组合,但这显然比它的价值更麻烦,打开了竞争条件和其他恶作剧的可能性。现代系统通常只创建每个设备下有一个实际设备节点/dev
;任何别名都必须是符号链接。)