我有一个 1.5 TB 的数据分区,由于以下拼写错误,我在开始时不小心覆盖了一些字节:
ssh somewhere command | dd of=/dev/sda3 // should have used quotes here, dd was executed locally by mistake!
/dev/sda3 包含一个 LUKS 容器,用于存放包含重要数据的 1.5 TB ext4 分区。
当我注意到这个问题时,我暂停并杀死了 dd;它应该覆盖小于 4K 的内容。
有办法恢复数据吗?从那以后计算机就没有重新启动过,所以丢失的数据可能仍然在 RAM 中? LUKS 容器的前(例如)4k 包含什么?
分区仍已安装,但显示错误,例如
[1157706.786897] EXT4-fs error (device dm-4): htree_dirblock_to_tree:896: inode #2: block 9249: comm ls: bad entry in directory: rec_len % 4 != 0 - offset=0(0), inode=2791782547, rec_len=44529, name_len=90
当尝试访问它时。
请帮忙!
谢谢!
PS:我做了更多测试,似乎有更多数据被覆盖,而不仅仅是 4K :-( 但 1.5 TB 数据的比例仍然非常小!我是否仍然可以从未受污染的区域转储数据 - 也许可以使用 ext4 恢复工具进行搜索(如果存在一个好的)在 /dev/mapper/cr_sda3 的转储中 - 这仍然有效吗?
答案1
第一次运行dmsetup table --showkeys
。将其输出保存在安全的地方 - 它显示的大长十六进制字符串是实际的加密密钥(主密钥)用于保护您的数据。 LUKS 的工作原理是(此处简化)使用您的密码加密该密钥,因此请记住,该密钥的泄露意味着游戏结束 - 更改密码将无济于事。您必须擦除并重新创建 LUKS 分区。但是,相同的属性意味着即使 LUKS 标头完全损坏,您也可以使用该“表”(包括密钥)来读取数据。
你正在寻找的行(可能有很多行,LVM也使用Device Mapper)看起来像这样。除了不是一堆 0 之外,您将拥有随机的十六进制数字(0 是没有 --showkey 时得到的):
Zia-swap_crypt: 0 11714560 crypt aes-xts-plain64 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 253:1 0
(您先执行上述操作,因为它很快。如果断电、机器崩溃等情况,您可以使用它来恢复您的数据。没有它,您的数据将无法恢复。)
你想保留整条线。更好的是,整个输出。您可以将该行返回以dmsetup
恢复表,从而恢复对数据的访问,即使没有 LUKS 标头)。
接下来,复制图像解密的设备某处。解密的设备是您在上面的输出中看到的名称dmsetup
;就我而言/dev/mapper/Zia-swap_crypt
。它与您放入/etc/fstab
或传递给 的那个相同mount
。
现在,您可以从正在运行的系统复制数据(例如,使用tar
),或者如果失败,请尝试fsck
修复文件系统。 (然后复制数据)。
您可以使用该密钥创建一个新的 LUKS 标头,这应该可以工作,或者只是重新初始化它并重新开始。
今后,请多多利用cryptsetup luksHeaderBackup
。