相关这个问题,似乎我可以从一个加密启动驱动器访问另一个加密启动驱动器的唯一方法是两个驱动器具有不同的卷组 (VG) 名称(安装 Ubuntu 时均使用默认加密选项)。默认情况下,Ubuntu 使用卷组名称“ubuntu-vg”,如果您有两个同名的卷组,lvm2 就会出现问题。
更大的问题是当我读这个并决定将我的活动启动驱动器的 VG 重命名为其他名称。然后我重新启动,cryptsetup 不再识别我的密码。它给了我错误
未知的文件类型、错误的密码或选项?
使用 LiveUSB,我将该启动驱动器上的 VG 重命名为 ubuntu-vg,然后它再次启动(松了一口气)。
现在,如果 VG 名称必须是唯一的,但也不能更改,那么就会出现问题。我在安装 Ubuntu 时没有看到设置 VG 名称的选项。我猜它要么是硬编码的,要么在某个配置文件中。我检查了驱动器上较小的(未加密的)启动区域,我看到
/grub/grub.cfg
有一些关于这个“ubuntu-vg”的引用,这让我认为我可以改变它。
然而,我对 Ubuntu 还不太熟悉,所以在我开始用另一个不可启动的驱动器进行创作之前,我希望得到这里专家的一些意见。
我可以使用 vgrename 重命名 VG,然后通过查找并将所有旧 VG 名称替换为新 VG 名称来更改 /grub/grug.cfg,然后一切都会神奇地正常工作吗?
答案1
在阅读了乔治的链接(以及其他几个链接)后,我想在这里将其作为答案发布。
如果您需要重命名加密启动驱动器的卷组,请按照以下步骤操作。至少在 16.04 上,这些步骤似乎运行良好。
- 拔下所有其他驱动器,只插入 LiveUSB(或类似设备)和加密启动驱动器。请注意,不要从另一个加密启动驱动器启动,因为两个启动驱动器具有相同的卷组名称(ubuntu-vg)。
- 从 LiveUSB 启动,而不是从加密的启动驱动器启动
- LiveUSB 运行活动系统后,请确保 lvm2 已安装(尽管 16.04.2 LiveUSB 已经安装了 lvm2)。
sudo apt 安装 lvm2
- 挂载加密驱动器。然后,验证卷组的名称(应该只有一个,因为除了 LiveUSB 之外不应连接其他驱动器)。16.04(似乎还有 18.04)的默认值是“ubuntu-vg”(下文将假定是这种情况)。
命令vgscan
- 将卷组重命名为唯一的名称
sudo vgrename ubuntu-vg my_new_volume_group_name
- 您应该会收到卷组已重命名的确认信息。
- 此时,您的加密启动驱动器将无法启动,因为 grub 无法再找到名为 ubuntu-vg 的卷组。因此,您需要更新 grub。在加密的启动驱动器上,转到 grub 文件夹并查看文件 grub.cfg。如果您尝试从 LiveUSB 打开它,它将是只读的,因此请打开终端并输入:
命令gedit
- 在 gedit 中,打开 grub.cfg 文件(位于 grub 文件夹中未加密的部分)。
- 将此文件的副本保存为 backup-grub.cfg,以防接下来几个步骤出现问题。
- 查找 ubuntu--vg 并将其替换为您的新卷组名称(ctrl+H,查找:ubuntu--vg 替换为:my_new_volume_group_name)。查找到的文本是正确的。您应该找到“ubuntu--vg”(请注意,“ubuntu”和“vg”之间有两个破折号,因为当您在此处使用破折号时,grub 需要双破折号)。
- 将文件保存回 grup.cfg
- 重启,移除 LiveUSB
现在,当 grub 加载时,它将看到它期望的卷组名称,并且您将能够加载加密的启动驱动器。
答案2
我实际上是通过这样的实时系统来做到这一点的:
OLDVG=old-vg-name
NEWVG=new-vgname
vgrename $OLDVG NEWVG
OLDVG=$(echo $OLDVG | sed 's/-/--/g') # if the vg-name contains a dash, replace by double dashes as that is used for the device-name
sed -i "s/$OLDVG/$NEWVG/g" /etc/fstab
sed -i "s/$OLDVG/$NEWVG/g" /etc/initramfs-tools/conf.d/resume
/proc/mounts 被 update-initramfs 和 update-grub 使用来设置根设备。不幸的是,更改 vg 名称时 /proc/mounts 不会更新。
因此,我们需要伪造 /proc/mounts 文件。执行 mount --bind mounts /proc/mounts 不起作用。我们需要伪造整个 /proc 目录。
mkdir proc
find /proc -type f -or -type l -maxdepth 1 |grep -Ev '(kmsg|kcore|sysrq-trigger)' | xargs -I {} sh -c 'echo {} && cp {} proc'
sed -i "s/$OLDVG/$NEWVG/g" proc/mounts
# we could perhaps 'unshare --mount' to create a mount namespace for the current shell. however, this did not seem neccessary.
mount --bind proc /proc
update-initramfs -u -k all
update-grub
umount /proc
rm -r proc
reboot