sda2 是我的启动分区

sda2 是我的启动分区

我之前运行的是 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 加密协议的支持。

可以通过以下方式解决该问题:

  1. 从 22.04 liveCD 启动。

  2. chroot 到目标系统的根目录。请参阅https://help.ubuntu.com/community/ManualFullSystemEncryption/Troubleshooting

  3. 创建包含以下内容的文件/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/
    
  4. 将文件标记为可执行文件:chmod +x /etc/initramfs-tools/hooks/custom-add-openssl-compat.conf

  5. 重新生成 initramfs。即。update-initramfs -k all -u

答案3

我不知道如何解决这个问题,但我发现如果我将 USB 驱动器插入计算机,然后从 F1 屏幕多次重试密码,它最终会让我进入。

然后,我通过加密分区上的磁盘实用程序重置了加密密码(密码肯定是正确的,因为它在尝试重置时标记了这一点)。

自此以后它现在运行良好。

现在只需想办法禁用 GNOME 所有应用程序菜单的手动排序应用程序,并使其按 AZ 排序。

答案4

我执行了完全相同的步骤从 20.04 升级到 22.04,遇到了同样的问题。我不知道是什么原因造成的,但我能够通过从 ubuntu live usb 启动并添加新密码来使用旧密码解密分区,从而解决这个问题。

  1. 从 ubuntu live usb 启动。我使用了官方下载页面的 22.04。
  2. 使用 UI,我已经解锁了分区。- 只需尝试从文件管理器打开磁盘
  3. 确定哪个分区是加密分区。分区 UUID 存储在/etc/crypttab相对于您的驱动器的 上。例如cat /media/GUID/ubuntu/etc/crypttab。然后使用blkid | grep PARTITION_GUID <- change the guid来确定分区名称。在我的情况下是/dev/nvme0n1p3
  4. 添加新的附加密码sudo cryptsetup luksAddKey /dev/nvme0n1p3 <- change the partition name。系统将提示您两次输入新密码。
  5. 重新启动进入主操作系统

旧密码仍然不起作用,但新密码却能起作用。

很可能有更优化的方法来实现这一点,但这个方法对我有用:p

相关内容