![如何让 Linux 找到加密分区上的根文件系统?](https://linux22.com/image/201806/%E5%A6%82%E4%BD%95%E8%AE%A9%20Linux%20%E6%89%BE%E5%88%B0%E5%8A%A0%E5%AF%86%E5%88%86%E5%8C%BA%E4%B8%8A%E7%9A%84%E6%A0%B9%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%EF%BC%9F.png)
我有一台已经过多次内核升级的 Ubuntu 机器。当天开始时,我安装了 3 个内核:5.11.0-34、5.11.0-46 和 5.11.0-49。我必须升级一堆软件包,然后趁机删除中间内核以在启动分区中腾出空间。
现在,我无法启动剩余的内核。它们都不会提示输入密码来解密安装 Linux 的驱动器。无论我是否启动进入恢复模式,它们都会打印消息并最终进入 shell,如下所示:
Unable to init MCE device (rc: -5)
Volume group "vgubuntu" not found
Cannot process volume group vgubuntu
Gave up waiting for suspend/resume device
Gave up waiting for root file system device. Common problems:
- Boot args (cat /proc/cmdline)
- Check rootdelay= (did the system wait long enough?)
- Missing modules (cat /proc/modules; ls /dev)
ALERT! /dev/mapp/vgubuntu-root does not exist. Dropping to a shell!
BusyBox v1.30.1 (Ubuntu 1:1.30.1-6ubuntu2.1) built-in shell (ash)
很久以前我添加 mce=off
作为内核参数。它出现在每个 GRUB 菜单选项中。
如何修复我的安装以启动?
答案1
某处出了什么问题,我不得不逃跑update-initramfs
。我在三个不同的地方发现了非常相似的说明:
- https://ubuntuforums.org/showthread.php?t=2409754&s=e1f324bf5e566b3bb93374cd07bdcc17&p=13828993
- https://askubuntu.com/a/868726/538768
- https://feeding.cloud.geek.nz/posts/recovering-from-unbootable-ubuntu-encrypted-lvm-root-partition/
我是这样到达那里的。
我从实时 USB 加载 Ubuntu,然后跑去fdisk -l
查看我的分区并猜测哪个分区被加密。我看到了这些(除其他外):
/dev/nvme2n1p1
:512M电喷系统/dev/nvme2n1p2
: 732M Linux 文件系统/dev/nvme2n1p3
: 1.8T Linux 文件系统 <-- 我猜是这个。
然后我解密分区并安装它,如下所示:
sudo -i
cryptsetup open /dev/nvme2n1p3 $name
vgchange -ay
mkdir /mnt/root
mount /dev/mapper/$name /mnt/root
这让我可以检查/etc/crypttab
解密分区时使用哪个设备名称(nvme0n1p3_crypt
在本例中):
nvme0n1p3_crypt UUID=743ab129-75bb-429b-8366-9c066f00c4fe none luks,discard
然后我查看了/etc/fstab
哪些分区是boot分区和EFI分区:
# /boot was on /dev/nvme0n1p2 during installation
UUID=773ceeb2-5c0f-4838-baad-a1182d7fdd80 /boot ext4 defaults 0 2
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=5C17-FB32 /boot/efi vfat umask=0077 0 1
安装时,这些分区的名称类似于nvme0n1p*
,但不再命名。我可以通过列出来找到他们当前的名字/dev/disk/by-uuid
:
$ ls -l /dev/disk/by-uuid/
lrwxrwxrwx 1 root root 15 Jan 31 12:29 5C17-FB32 -> ../../nvme2n1p1
lrwxrwxrwx 1 root root 15 Jan 31 12:29 743ab129-75bb-429b-8366-9c066f00c4fe -> ../../nvme2n1p3
lrwxrwxrwx 1 root root 15 Jan 31 12:29 773ceeb2-5c0f-4838-baad-a1182d7fdd80 -> ../../nvme2n1p2
现在我已经拥有了遵循说明所需的所有部件。以下是我执行的实际命令:
sudo -i
cryptsetup open /dev/nvme2n1p3 nvme0n1p3_crypt
mount /dev/mapper/nvme0n1p3_crypt /mnt/root
mount /dev/nvme2n1p2 /mnt/root/boot
mount /dev/nvme2n1p1 /mnt/root/boot/efi
mount --bind /dev /mnt/root/dev
mount --bind /run /mnt/root/run
chroot /mnt/root
mount -t proc proc /proc
mount -t sysfs sys /sys
update-initramfs -c -k all
然后我就可以重新启动机器并启动到已安装的内核之一。