我刚刚不小心格式化了我的 2TB 硬盘,可能丢失了所有文件
该硬盘上有:
- ~1.7TB 加密 LVM-LUKS 容器
- ~250GB 分区 NTFS
我不关心未加密的 NTFS 分区中的数据,但另一个分区中的数据真的真的对我很重要。
我使用 Gnome“磁盘”实用程序,并使用“GPT 分区表”和“覆盖现有数据”(完全擦除)选项对其进行了格式化。启动后几秒钟,我注意到我选择了错误的磁盘,然后立即拔掉了它。
Testdisk 产生以下输出:
The following partition can't be recovered:
MS Data 3906963422 4395241404 488277983
NTFS, blocksize=4096, 249 GB / 232 GiB
Results
MS Data 2046 3906963413 3906961368
ext4 blocksize=4096 Large_file Sparse_SB Backup_SB, 2000 GB / 1862 GiB
MS Data 2048 6143 4096
LUKS 1 (Data size unknown), 2097 KB / 2048 KiB
MS Data 3418685440 3906963422 488277983
NTFS found using backup sector, blocksize=4096, 249 GB / 232 GiB
Hint for advanced users. dmsetup may be used if you prefer to avoid to rewrite the partition table for the moment:
echo "0 3906961368 linear /dev/sda 2046" | dmsetup create test0
echo "0 4096 linear /dev/sda 2048" | dmsetup create test1
echo "0 488277983 linear /dev/sda 3418685440" | dmsetup create test2
interface_write()
No partition found or selected for recovery
显然仍存在 LUKS 标头。此线程说我应该从 LUKS 分区的开头开始创建一个新分区,但我不确定它在哪里以及我应该如何执行此操作?
编辑:显然 LUKS 标头仍然存在:
$ sudo dd if=/dev/sda skip=8 count=2500 | hexdump -C | less
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000ff000 4c 55 4b 53 ba be 00 01 61 65 73 00 00 00 00 00 |LUKS....aes.....|
000ff010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000ff020 00 00 00 00 00 00 00 00 78 74 73 2d 70 6c 61 69 |........xts-plai|
000ff030 6e 36 34 00 00 00 00 00 00 00 00 00 00 00 00 00 |n64.............|
000ff040 00 00 00 00 00 00 00 00 73 68 61 32 35 36 00 00 |........sha256..|
000ff050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000ff060 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 20 |............... |
000ff070 d8 70 6f 0c 41 d7 4c 84 42 8d 5f 9c fd 80 67 6d |.po.A.L.B._...gm|
000ff080 dd d0 b8 8c 91 90 08 01 27 21 05 6f 4e 54 97 70 |........'!.oNT.p|
000ff090 68 02 57 c5 68 55 de 02 87 0e e3 74 b1 c7 81 90 |h.W.hU.....t....|
000ff0a0 b0 5d 3e 78 00 05 98 9e 39 36 38 66 63 64 65 32 |.]>x....968fcde2|
000ff0b0 2d 31 32 66 32 2d 34 65 31 35 2d 61 64 62 32 2d |-12f2-4e15-adb2-|
000ff0c0 63 35 38 65 34 38 36 32 63 64 66 35 00 00 00 00 |c58e4862cdf5....|
000ff0d0 00 ac 71 f3 00 2d 7c d4 a6 04 45 07 34 26 ac 52 |..q..-|...E.4&.R|
000ff0e0 13 2b 26 99 4a 6d 54 88 e4 20 47 33 89 62 83 12 |.+&.JmT.. G3.b..|
000ff0f0 94 ed 22 ef 26 38 9c 63 00 00 00 08 00 00 0f a0 |..".&8.c........|
000ff100 00 00 de ad 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000ff110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000ff120 00 00 00 00 00 00 00 00 00 00 01 08 00 00 0f a0 |................|
000ff130 00 00 de ad 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000ff140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
答案1
假设有 512b 个扇区,则 LUKS 分区从扇区 2048(默认起始位置)开始,NTFS 分区从扇区 3418685440 开始。
testdisk 无法自动恢复分区,因为 LUKS 不存储固定的“数据大小”——它总是使用分区的其余部分作为加密数据。但由于您知道第二个分区从哪里开始,所以无论如何它都会告诉您第一个分区在哪里结束。因此,这会为您提供以下分区:
START SIZE END
1 2048 +3418683391 3418685439 LUKS partition
2 3418685440 +488277983 3906963423 NTFS partition
如果需要,请先使用之前建议的命令进行设置暂时的块设备并查看偏移量是否正确:
使用设备映射器:
echo "0 <size> linear /dev/sda <start>" | dmsetup create test1 file -s /dev/mapper/test1 dmsetup remove test1
使用 addpart:
addpart /dev/sda 1 <start> <size> file -s /dev/sda1 delpart /dev/sda 1
如果起始偏移量正确,file -s ...
将会识别 LUKS 或 NTFS 标头。
要重建真实的分区表:
- 运行
fdisk /dev/sda
。按g
创建GPT分区表。 - 按下
n
创建第一个分区。 - 输入 2048 作为第一个扇区。
- 输入 3418685439 作为最后一个扇区。
- 如果询问是否删除找到的标题/签名,一定 回答
n
. - 再次按下
n
以创建第二个分区。 - 输入 3418685440 作为第一个扇区。
- 接受默认的最后一个扇区。
n
对找到签名的提示再次回答“否” 。- 输入
w
写入分区表。