我之前运行的是 20.04,曾经sudo do-release-upgrade -d
升级到 22.04。
一切似乎都很好,并提示我重新启动,这样做后,我得到了通常的加密密码输入屏幕,但在输入密码后,我收到消息:
sda3_crypt:cryptsetup 失败,密码或选项错误?
按 F1 显示:
未找到卷组 vgubuntu
无法处理卷组 vgubuntu
密码绝对正确,它很短而且是数字,所以不可能是键盘语言问题。
输入密码后显示:
此密码短语没有可用的密钥
这里有任何人可以帮我恢复过来吗?
答案1
我现在遇到了完全相同的问题,在进行了完全相同的升级后。好消息!您的数据是安全的。
设置: 加密的 LUKS 分区包含具有根和交换分区的 LVM。引导分区未加密。
问题: 在 do-release-upgrade -d (20.04 -> 22.04) 之后,在启动过程中解锁 LUKS 失败(“密码或选项错误”)当使用恢复模式启动时,我收到一个更有用的错误。在出现 cryptsetup 提示之前,出现了以下错误
/sbin/cryptsetup:符号查找错误:/lib/x86_64-linux-gnu/libcryptsetup.so.12:未定义符号:EVP_MD_get_size,版本 OPENSSL_3.0.0
任何密码都失败,在出现新提示之前会出现相同的错误。类似于 bidaveygeorge“未找到 vgubuntu”,在显示第一个提示之前会出现类似的消息。
我的理论: initramfs 包含一个针对 openssl 编译的 cryptsetup。编译时版本与 initramfs 中包含的版本不同。免责声明:我没有使用过 Ubuntu 的加密生态系统。我的编程经验会提示这样的错误。cryptsetup 手册页提到了编译后的后端。
进一步的研究: 作为临时解决方案,我下载了 22.04 的实时 USB 映像。我能够挂载我的磁盘并分析 initrd.img
root@ubuntu-mate:/# lsinitramfs /boot/initrd.img | grep ssl
etc/ld.so.conf.d/openssl-3.0.0-alpha14.conf
usr/local/ssl
usr/local/ssl/lib
usr/local/ssl/lib/libcrypto.so.3
root@ubuntu-mate:/# lsinitramfs /boot/initrd.img | grep cryptsetup
usr/lib/cryptsetup
usr/lib/cryptsetup/askpass
usr/lib/cryptsetup/functions
usr/lib/x86_64-linux-gnu/libcryptsetup.so.12
usr/lib/x86_64-linux-gnu/libcryptsetup.so.12.7.0
usr/sbin/cryptsetup
以下命令均以 root 身份执行:
cryptsetup open /dev/sda3 sda3_crypt
重要的sda3_crypt 部分应与 /etc/crypttab 中使用的名称相同。否则 chroot 将无法正常工作。
这会自动打开加密 LUKS 中的 LVM。如果 LUKS 后面有一个普通的 FS,则 sda3_crypt 应该是要挂载的 fs。
mount /dev/mapper/my-vg--root /mnt
# No data is lost. Password works fine.
准备 chroot
mount --rbind /dev /mnt/dev
mount --rbind /run /mnt/run
mount --rbind /proc /mnt/proc
mount --rbind /sys /mnt/sys
sda2 是我的启动分区
挂载 /dev/sda2 /mnt/boot
Chroot 能够在不可启动的系统上运行命令
chroot /mnt
截至本文发布时系统已完全更新
apt update
apt upgrade
apt dist-upgrade
do-release-upgrade -d
重新安装无效
apt reinstall openssl cryptsetup cryptsetup-initramfs
安装新的 initramfs 不会改变任何东西。
update-initramfs -c -k all
答案2
我之前确认该问题的评论已被删除。但给出的答案都无法解决根本问题。
问题和解决方案以ubuntu 错误报告。
“该问题是由于 OpenSSL 3.0 中引入的更改以及 Ubuntu 预发布测试中没有包括将使用加密根的旧版本 Ubuntu 升级到新版本的测试用例,导致 initramfs 环境中缺少对各种 luks 加密协议的支持。
可以通过以下方式解决该问题:
从 22.04 liveCD 启动。
chroot 到目标系统的根目录。请参阅https://help.ubuntu.com/community/ManualFullSystemEncryption/Troubleshooting
创建包含以下内容的文件
/etc/initramfs-tools/hooks/custom-add-openssl-compat.conf
:. /usr/share/initramfs-tools/hook-functions copy_exec /usr/lib/x86_64-linux-gnu/ossl-modules/legacy.so /usr/lib/x86_64-linux-gnu/ossl-modules/
将文件标记为可执行文件:
chmod +x /etc/initramfs-tools/hooks/custom-add-openssl-compat.conf
重新生成 initramfs。即。
update-initramfs -k all -u
答案3
我不知道如何解决这个问题,但我发现如果我将 USB 驱动器插入计算机,然后从 F1 屏幕多次重试密码,它最终会让我进入。
然后,我通过加密分区上的磁盘实用程序重置了加密密码(密码肯定是正确的,因为它在尝试重置时标记了这一点)。
自此以后它现在运行良好。
现在只需想办法禁用 GNOME 所有应用程序菜单的手动排序应用程序,并使其按 AZ 排序。
答案4
我执行了完全相同的步骤从 20.04 升级到 22.04,遇到了同样的问题。我不知道是什么原因造成的,但我能够通过从 ubuntu live usb 启动并添加新密码来使用旧密码解密分区,从而解决这个问题。
- 从 ubuntu live usb 启动。我使用了官方下载页面的 22.04。
- 使用 UI,我已经解锁了分区。- 只需尝试从文件管理器打开磁盘
- 确定哪个分区是加密分区。分区 UUID 存储在
/etc/crypttab
相对于您的驱动器的 上。例如cat /media/GUID/ubuntu/etc/crypttab
。然后使用blkid | grep PARTITION_GUID <- change the guid
来确定分区名称。在我的情况下是/dev/nvme0n1p3
- 添加新的附加密码
sudo cryptsetup luksAddKey /dev/nvme0n1p3 <- change the partition name
。系统将提示您两次输入新密码。 - 重新启动进入主操作系统
旧密码仍然不起作用,但新密码却能起作用。
很可能有更优化的方法来实现这一点,但这个方法对我有用:p