上周,我愚蠢地更改了全盘加密密码,因为我显然无法可靠地输入以前的密码。不幸的是,从那时起我的电脑就一直开着,我没有把新密码记在任何地方,所以我已经忘记了。这不是我最自豪的时刻,但我非常感谢我在输入密码之前意识到了这一点。我仍然登录在电脑上,所以我可以访问我的所有文件,但一旦我关闭电脑,我就倒霉了。如果可以的话,我想避免重新安装所有东西。
所以我的问题是,当我仍然以管理员身份登录时,有什么方法可以恢复/更改我的加密密码吗?
答案1
备份和恢复解密的分区:警告,这有点技术性
我正在编写一些脚本来自动执行大部分操作,但如果您不想等待,我已经测试了以下步骤。只需确保您知道自己在做什么。不要盲目遵循我编写的命令。其中一些可能需要根据您的系统配置进行替换。一旦我完成脚本。我会将它们上传到 GitHub 并编辑此答案。
不幸的是,您将无法恢复或更改加密密码。如果没有现有密钥或密码,您也无法创建任何新密码。但是,由于您已登录系统,所以您很幸运!这是一个技术上不需要完全重新安装的选项。您说您正在使用全驱动器加密,所以我假设您的驱动器上有两个主分区,一个启动分区和一个 LUKS 分区(如果您使用的是 EFI,您可能有第三个分区)。然后,您的解密 LUKS 分区可能正在对任何其他解密分区使用 LVM。
您的 lsblk 输出可能看起来像这样:
名称 MAJ:MIN RM 大小 RO 类型 安装点 sr0 11:0 1 1024M 0 rom sda 8:0 0 16G 0 磁盘 ─sda2 8:2 0 488M 0 部分 /boot ─sda3 8:3 0 15G 0部分 │ └─sda3_crypt 253:0 0 15G 0 加密 │ ... │ └─ubuntu--vg-swap_1 253:2 0 3.3G 0 lvm [交换] └─sda1 8:1 0 512M 0 部分 /boot/efi
这里唯一感兴趣的部分是sda
磁盘。
总体来说如何实现
基本上,系统中加密的部分是sda3
,它是用 LUKS 加密的。解锁后的 LUKS 分区包含一个 LVM 物理卷,sda3_crypt
它托管一个名为的卷组ubuntu--vg
。然后,此卷组包含两个 LVM 逻辑卷ubuntu--vg-root
和ubuntu--vg-swap_1
。如果我们可以备份 LVM 物理卷,sda3_crypt
那么我们就可以删除 上的旧 LUKS 分区sda3
,创建一个新的分区,然后将 LVM 物理卷转储回新的 LUKS 分区。但是有一个问题!启动分区中的所有启动文件sda2
仍然引用您销毁的旧 LUKS 分区。您需要更新文件/etc/crypttab
以指向您创建的新 LUKS 分区并重建 initram 磁盘。只有完成后,您才应该重新启动系统。
继续阅读下一部分,了解实现此目标的实际步骤。
实际的逐步过程
- 您将需要一个可以承受擦除的驱动器,或者至少一个具有与 sda3 大小相同或更大的分区的驱动器。在此过程中,所述驱动器或分区的内容将被完全擦除。我将使用整个驱动器来执行此示例。
- 在我的情况下,在连接驱动器的情况下运行
lsusb
,并找到外部磁盘sdb
。sdb 8:16 0 16G 0 磁盘 └─sdb1 8:17 0 16G 0 部分 /media/test/external-drive sr0 11:0 1 1024M 0 rom sda 8:0 0 16G 0 磁盘 ─sda2 8:2 0 488M 0 部分 /boot ─sda3 8:3 0 15G 0部分 │ └─sda3_crypt 253:0 0 15G 0 加密 │ ... │ └─ubuntu--vg-swap_1 253:2 0 3.3G 0 lvm [交换] └─sda1 8:1 0 512M 0 部分 /boot/efi
- 卸载外部驱动器,因为我们将覆盖那里的内容。
/media/test/external-drive
在以下命令中将其替换为驱动器的实际路径。
sudo umount /media/test/external-drive
- 您需要将现有的、已解密的 LVM 物理卷克隆到外部设备。在以下命令中,将其替换
sdX
为外部硬盘驱动器的设备。就我而言,我会写成... of=/dev/sdb...
。同时将其替换sda3_crypt
为 LUKS 分区的名称。这将需要很长时间。我花了 35 分钟才完成一个仅 16GB LUKS 分区的测试。
sudo dd if=/dev/mapper/sda3_crypt of=/dev/sdX bs=4M status=progress
- 从现在起,请注意,您在系统上所做的任何更改在恢复时都可能不复存在。事实上,在备份时最好不要使用计算机。
- 备份完成后,使用实时 Ubuntu USB 重新启动计算机,并选择无需安装即可尝试 Ubuntu 的选项。
- 系统启动后,打开终端并恢复为根用户。
sudo -i
- 在此终端中,在旧分区上创建一个新的 LUKS 分区。在我的示例中,LUKS 分区位于。在下面的命令中
sda3
,用系统中的正确数字替换。sdaN
cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 /dev/sdaN
- 按照提示输入您永远不会忘记的密码。
- 完成后,您需要解锁 LUKS 分区。在下一个命令中将数字更改为与您的系统匹配,将数字替换
3
为您的设备的适当数字。
cryptsetup luksOpen /dev/sda3 sda3_crypt
- 现在,解密后的 LUKS 分区已打开,可以重新转储 LVM 物理卷(下一个命令)。将
X
in替换sdX
为外部驱动器的设备。将3
in替换sda3_crypt
为分区的相应编号。dd if=/dev/sdX of=/dev/mapper/sda3_crypt
- 再次强调,你需要等待很长时间才能恢复一切。等待期间,可以找点别的事情做。
- 恢复完成后,继续移除外部驱动器并重新启动。我们希望确保在恢复系统以完成更新内部驱动器上的启动文件时没有 LVM 冲突。在没有外部驱动器的情况下重新启动后,打开终端并按照步骤 7 中的步骤恢复到 root 权限。
- 现在我们需要再次解密 LUKS 分区。在 root 终端中,运行以下命令,将数字替换
3
为分区的正确数字。出现提示时,输入您创建的永远不会忘记的密码。
cryptsetup /dev/sda3 sda3_crypt
- 接下来让我们设置一些变量来简化以下步骤中的命令。运行以下每个命令。您将看不到输出,因为它将保存到变量中
vg=$(pvscan | grep PV | tr -s ' ' | cut -f 5 -d ' ')
<- 将卷组名称保存到$vgexport uuid=$(blkid | grep LUKS | grep -oP "\bUUID=\".*?\"" | tr -d '"' | cut -f 2 -d '=')
<- 将 LUKS UUID 保存到 $uuid (仅一行)
- 只剩一件事要做,那就是更新启动文件,为此我们需要挂载一些东西。在 root 终端中运行以下命令来挂载所有内容。我将使用示例中的分区信息。相应地更改您的命令。
mount /dev/mapper/${vg/-/--}-root /mnt
mount /dev/sda2 /mnt/boot
mount /dev/sda1 /mnt/boot/efi
<- 仅适用于 UEFI 系统mount --bind /dev /mnt/dev
mount --bind /run/lvm /mnt/run/lvm
- 现在我们需要 chroot 到你的实际系统。
chroot /mnt
确保以下命令在这个 chroot 终端内运行! - 现在我们进入了您的系统,我们需要安装一些东西,然后才能更新启动文件。
mount -t proc proc /proc
mount -t sysfs sys /sys
mount -t devpts devpts /dev/pts
- 接下来,我们必须
/etc/crypttab
使用新的 LUKS 分区的 UUID 更新文件。
sed -i "s/UUID=\([0-9a-f\-]\+\)/UUID=$uuid/" /etc/crypttab
- 最后,我们更新启动文件。
update-initramfs -k all -c
update-grub