恢复(部分?)格式化的 LUKS 驱动器

恢复(部分?)格式化的 LUKS 驱动器

我刚刚不小心格式化了我的 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 标头。

要重建真实的分区表:

  1. 运行fdisk /dev/sda。按g创建GPT分区表。
  2. 按下n创建第一个分区。
  3. 输入 2048 作为第一个扇区。
  4. 输入 3418685439 作为最后一个扇区。
  5. 如果询问是否删除找到的标题/签名,一定 回答n.
  6. 再次按下n以创建第二个分区。
  7. 输入 3418685440 作为第一个扇区。
  8. 接受默认的最后一个扇区。
  9. n对找到签名的提示再次回答“否” 。
  10. 输入w写入分区表。

相关内容