![从加密设备上的 LVM 引导](https://linux22.com/image/138180/%E4%BB%8E%E5%8A%A0%E5%AF%86%E8%AE%BE%E5%A4%87%E4%B8%8A%E7%9A%84%20LVM%20%E5%BC%95%E5%AF%BC.png)
我刚刚完成 Debian 安装,正在尝试启动。我已经加密了我的硬盘 (LUKS),但没有分区,并在其上设置了 LVM。我没有单独的启动卷,因此系统将从逻辑卷启动root
。我已将 BIOS 替换为 GRUB,但没有为系统生成 GRUB 配置,因此我需要从 GRUB 手动引导。
我猜测正确的 GRUB shell 代码是这样的:
cryptomount ahci0
set root=lvm/vg-root
linux /vmlinuz root=/dev/mapper/vg-root cryptdevice=/dev/sda
initrd /initrd.img
这是对给定配置的修改这里对于不同的加密 LVM 设置。
GRUB 可以很好地解密驱动器,但是当我尝试像这样启动时,我会收到以下几十次消息:
Begin: Running /scripts/local-block ... WARNING: Failed to connect to lvmetad. Falling back to device scanning.
Volume group "vg" not found
Cannot process volume group vg
done.
然后我得到一个 initramfs shell。我怀疑内核在解密磁盘之前正在寻找根逻辑卷,因为如果我使用 example ,也会发生同样的事情root=/dev/mapper/bogus-root
。是否有内核参数允许我启动该系统,或者我是否必须更改 initrd?
答案1
这可以通过使用Debian 软件包添加/etc/crypttab
到 initramfs(有关crypttab
文件格式,请参阅手册页)来解决。update-initramfs
initramfs-tools
首先挂载加密盘。然后使用例如将主机上的/dev
、/proc
、/sys
、 和绑定到根文件系统。然后 chroot 进入根文件系统。现在可以创建 crypttab 文件(在任何位置),或者在 chroot 之前复制。/run
mount --bind /dev /mnt/dev
为了将 crypttab 包含在 initramfs 中,请创建一个挂钩脚本,将/usr/share/initramfs-tools/hooks
文件复制到 initramfs 中。请注意,它initramfs-tools
使用两种类型的脚本:引导脚本在系统引导时由 initramfs 运行init
,而挂钩脚本在创建 initramfs 映像期间运行。
钩子脚本应该看起来像这样(来源):
#!/bin/sh
. /usr/share/initramfs-tools/hook-functions
cp -pnL /path/to/crypttab ${DESTDIR}/etc/crypttab
chmod 644 ${DESTDIR}/etc/crypttab
${DESTDIR}
扩展至运行钩子时创建的 initramfs 的根目录。
然后update-initramfs
使用适当的选项运行。我使用是-k $(uname -r)
因为主机和目标使用相同的内核版本。我还使用-c
, 和-b
来指定图像的写入位置。
安装新映像或将其路径传递给 GRUB 后,早期用户空间应在尝试挂载根卷之前解密磁盘并映射所包含的逻辑卷。唯一需要的内核参数是根卷路径,例如root=/dev/mapper/vg-root
。