该机器是全新安装的 Ubuntu 18.04.1,安装过程中使用了 LVM 和 LUKS。该机器在内核 4.15.0-33-generic 上运行良好。
内核从 4.15.0-33 升级到 4.15.0-34-generic。内核更新后,不再提示输入 LUKS 密码,直接启动到 BusyBox v1.27.2
从旧内核启动时,它会像平常一样提示 LUKS,并且机器能够正常启动。问题出在从新内核启动时。
我尝试从 18.04 的 liveCD 运行 fsck。我先解锁驱动器,然后运行
fsck -f /deb/sda3
然而我只得到
fsck from util-linux 2.31.1
仅此而已。
有没有我可以运行的修复程序?
答案1
问题是它/sbin/cryptsetup
不在 initramfs 文件中/boot/initrd.img-4.15.0-36-generic
。
您需要CRYPTSETUP=y
在 中添加。您还需要在 中/etc/cryptsetup-initramfs/conf-hook
添加选项。然后,您必须运行,这解决了这个问题。initramfs
/etc/crypttab
update-initramfs
详细解决方案:
- 在另一台 Ubuntu 机器上,使用“启动盘创建器”创建可启动的 Ubuntu 18.04 USB 驱动器
- 将此 USB 驱动器插入启动至 BusyBox 的计算机的 USB 端口
当实时 USB Ubuntu 准备就绪后,连接到互联网(WiFi 或有线)
打开终端
ubuntu@ubuntu:~$ sudo su
查找加密的块设备。
root@ubuntu:~# blkid|grep LUKS /dev/nvme0n1p3: UUID="4b206e76-1531-48ae-95be-ae0ed7a244c1" TYPE="crypto_LUKS" PARTUUID="21db499d-b87b-41c6-864f-04d1531cb083"
解密设备
root@ubuntu:~# cryptsetup open UUID="4b206e76-1531-48ae-95be-ae0ed7a244c1" nvme0n1p3_crypt Enter passphrase for /dev/disk/by-uuid/4b206e76-1531-48ae-95be-ae0ed7a244c1:
列出映射的设备。
control
是用于向设备映射器发送命令的文件。nvme0n1p3_crypt
是解密的设备。ubuntu--vg-root
是 LVM 卷组中的 LVM 逻辑卷ubuntu-vg
。root@ubuntu:~# ls /dev/mapper/* /dev/mapper/control /dev/mapper/ubuntu--vg-root /dev/mapper/nvme0n1p3_crypt
创建挂载点。我们将在这里挂载无法启动的系统的 /。
root@ubuntu:~# mkdir -p /mnt/ubuntu-root
挂载根逻辑卷
root@ubuntu:~# mount /dev/mapper/ubuntu--vg-root /mnt/ubuntu-root/
挂载伪文件系统
root@ubuntu:~# mount -o bind /sys /mnt/ubuntu-root/sys root@ubuntu:~# mount -o bind /proc /mnt/ubuntu-root/proc root@ubuntu:~# mount -o bind /dev /mnt/ubuntu-root/dev
复制 DNS 信息
root@ubuntu:~# cp /etc/resolv.conf /mnt/ubuntu-root/etc/
更改根
root@ubuntu:~# chroot /mnt/ubuntu-root/
Mount
/boot
,其中包含 initramfs 文件。此分区未加密。root@ubuntu:/# mount /boot/
安装binwalk(查看init ram文件系统的内容)
root@ubuntu:~# apt update root@ubuntu:~# apt install binwalk
查找 gzip 压缩的 initramfs 内容的偏移量
root@ubuntu:~# binwalk /boot/initrd.img-4.15.0-36-generic | grep gzip 1605632 0x188000 gzip compressed data, from Unix, last modified: 2018-10-18 13:00:32
问题在于 initramfs 文件系统不包含 cryptsetup。因此,没有 LUKS 密码提示。
root@ubuntu:/# cd /root/ root@ubuntu:~# mkdir initramfs-4.15.0-36-generic root@ubuntu:~# cd initramfs-4.15.0-36-generic root@ubuntu:~/initramfs-4.15.0-36-generic# dd if=/boot/initrd.img-4.15.0-36-generic bs=1605632 skip=1 | gunzip | cpio -i root@ubuntu:~/initramfs-4.15.0-36-generic# ls sbin/cryptsetup ls: cannot access 'sbin/cryptsetup': No such file or directory
为了在启动时解密根,initramfs 需要包含:
sbin/cryptsetup lib/modules/4.15.0-36-generic/kernel/drivers/md/dm-crypt.ko
添加
initramfs
选项/etc/crypttab
root@ubuntu:/# cat /etc/crypttab nvme0n1p3_crypt UUID=4b206e76-1531-48ae-95be-ae0ed7a244c1 none luks,discard,initramfs
加入
CRYPTSETUP=y
/etc/cryptsetup-initramfs/conf-hook
跑步
update-initramfs
:root@ubuntu:~# update-initramfs -k 4.15.0-36-generic -c -v &> update-initramfs-4.15.0-36-generic.cryptsetup.log
现在,我们
cryptsetup
在 initramfs 和 Linux 内核模块中dm-crypt.ko
也有了:root@ubuntu:~# grep /sbin/cryptsetup update-initramfs-4.15.0-36-generic.cryptsetup.log Adding binary /sbin/cryptsetup root@ubuntu:~# grep dm-crypt.ko update-initramfs-4.15.0-36-generic.cryptsetup.log Adding module /lib/modules/4.15.0-36-generic/kernel/drivers/md/dm-crypt.ko
现在,运行 update-initramfs,不带 -c(新)和 -v(详细):
root@ubuntu:~# update-initramfs -k 4.15.0-36-generic -u
验证 initramfs 是否正确
root@ubuntu:~# binwalk /boot/initrd.img-4.15.0-36-generic | grep gzip 1605632 0x188000 gzip compressed data, from Unix, last modified: 2018-10-18 14:26:29 root@ubuntu:~# dd if=/boot/initrd.img-4.15.0-36-generic bs=1605632 skip=1 2> /dev/null | gunzip | cpio -t 2> /dev/null |grep sbin/crypt sbin/cryptsetup root@ubuntu:~# dd if=/boot/initrd.img-4.15.0-36-generic bs=1605632 skip=1 2> /dev/null | gunzip | cpio -t 2> /dev/null |grep dm-crypt.ko lib/modules/4.15.0-36-generic/kernel/drivers/md/dm-crypt.ko
现在,重新启动。
答案2
如果你有 NVIDIA 硬件,并且遇到了问题sebhtml 的解决方案,按照 BusyBox 终端中提到的相同步骤尝试较新的 Linux 内核。
答案3
要在 Ubuntu 22 上的 initramfs 上安装缺失的 cryptsetup,您可以添加以下cryptsetup-initramfs
包:
sudo apt install cryptsetup-initramfs