我将一个装有 LUKS 容器的 HDD 插入 Windows,然后打开磁盘管理器。出现一个对话框,我点击“格式化为 GPT”,但不知道我在做什么。显然 Windows 无法读取现有的 LUKS 分区,所以直接覆盖了它。
现在 cryptsetup 不再识别该容器,我的硬盘看起来像这样:
输出fdisk -l /dev/sda
:
Disk /dev/sda: 3,64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: ST4000DM004-2CV1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: A149A5A1-E9D1-4DA3-AE90-8EFD1DB81F44
Device Start End Sectors Size Type
/dev/sda1 34 32767 32734 16M Microsoft reserved
Partition 1 does not start on physical sector boundary.
有什么办法可以再次恢复容器,还是我必须告别我的数据?
答案1
您的案例描述缺少事件发生前的磁盘布局。
如果相关磁盘上有一个未损坏的 LUKS 标头,并且至少有一个未损坏的密钥槽,并且您有该密钥槽的关键字,则可能可以恢复。如果不是这种情况,您必须拥有 LUKS 标头的外部副本(包括密钥材料)。此外,可能需要它在磁盘上的旧位置(我不确定),并且需要旧分区方案(MBR 或 GPT)的详细信息。
没有“格式化为 GPT”。您要么对磁盘进行了分区,要么格式化了其中一个分区。您的 Windows 可能要求将磁盘分区(而不是格式化)为 GPT,这是因为您可能将整个磁盘用作 Linux 下的 LUKS 分区,而没有对该磁盘进行分区。然后 Windows 找不到任何分区方案,无论是 MBR 还是 GPT。
答案2
有什么方法可以恢复容器
嗯,也许吧……如果你幸运的话。
我插入了一个装有 LUKS 容器的硬盘
这不能正确描述屠杀发生之前的磁盘状态。
旧磁盘内容的一些选项:
- 占据整个磁盘的分区中的 MS-DOS 分区表和 LUKS。
- GPT 分区表和 LUKS 位于占据整个磁盘的分区中。
- LUKS 占据整个磁盘。
如果 1 或 3...游戏结束。
如果为 2,则可用于分区的磁盘区域可能没有改变。(GPT 的大小可能有所不同,但实际上大小几乎总是相同的。)
问题是 Windows 创建了一个 16MB 的分区。这个分区可能被 Windows 清空了,或者那个区域中的数据被保留了下来。
如果该区域被清空...游戏结束。这是因为 LUKS 标头和密钥材料存储在 LUKS1 卷的开头,该卷已被覆盖,如果没有密钥材料,您将永远无法解密数据。(LUKS1 磁盘格式:https://mirrors.edge.kernel.org/pub/linux/utils/cryptsetup/LUKS_docs/on-disk-format.pdf)
(请注意,LUKS2 有两个元数据副本,但您可能正在使用 LUKS1。)
不幸的是,我认为 Windows 可能已经删除了这宝贵的 16MB。但无论如何,还是值得检查一下:
sudo hexdump -C /dev/sda1
如果标题仍然存在,它应该以 magic 开头LUKS
。否则它将全为零。(请告诉我们。)
如果上帝对你微笑并且数据仍然存在,你可以从以下开始重新创建分区:
sudo gdisk /dev/sda
并按照菜单操作。我很确定 gdisk 可以修改 GPT(例如:删除和创建分区)而无需触及数据区...但请再检查一下!因此,您可以删除当前的 sda1 分区,然后创建一个覆盖整个磁盘的新 sda1,并将其键入为 LUKS。然后检查 sda1 是否仍然从第 34 扇区开始将新的分区表写回磁盘之前。
最后写入新的 GPT 并退出,执行sudo partprobe /dev/sda
强制内核重新读取分区表,然后仔细检查 sda1 是否仍然以 开头LUKS
。
当然,您可能希望在处理 GPT 之前对磁盘进行完整备份...如果您有地方存储备份的话。
祝你好运!