无法用我的两个 Linux 分区重写我的分区表,尽管它们之间没有重叠

无法用我的两个 Linux 分区重写我的分区表,尽管它们之间没有重叠

由于 Windows 10 产生的错误,我尝试使用 TestDisk 重写硬盘的分区表。我有一个双启动环境(Windows / Ubuntu),并且有两个 Linux 分区(分区类型 83)。一个分区是 Ubuntu 13,另一个是 Ubuntu 15.04。

没有重叠,因此,我不明白 TestDisk 拒绝任何包含我的两个 Linux 分区的结构的原因:在“快速搜索”屏幕中,如果我只选择两个 Linux 分区中的一个,它会告诉我“结构正常”,但我尝试选择两个 Linux 分区,它会告诉我“结构不好”。你能帮帮我吗?

当我尝试选择我的两个 Linux 分区时:

TestDisk 6.14, Data Recovery Utility, July 2013
Christophe GRENIER <[email protected]>
http://www.cgsecurity.org

Disk /dev/sda - 750 GB / 698 GiB - CHS 91201 255 63
     Partition               Start        End    Size in sectors
 P FAT32 LBA                0  32 33  3263 170 43   52428800 [RECOVERY]
 * HPFS - NTFS           3263 170 44 39744  19 19  586057728 [OS]
 P HPFS - NTFS          39744  19 20 51954 195 57  196164776 [DATA]
   HPFS - NTFS          39744  19 20 51954 209 31  196165632 [DATA]
>L Linux                51954 209 32 70244 108  8  293822464
 L Linux                70244 108  9 90445 190 49  324534272
 L Linux Swap           90446 195 54 91201  52 51   12120064

Structure: Bad. Use Up/Down Arrow keys to select partition.
Use Left/Right Arrow keys to CHANGE partition characteristics:
*=Primary bootable  P=Primary  L=Logical  E=Extended  D=Deleted
Keys A: add partition, L: load backup, T: change type, P: list files,
     Enter: to continueubuntu@ubuntu:~$
ext4 blocksize=4096 Large file Sparse superblock, 150 GB / 140 GiB

当我尝试仅选择我的第一个 Linux 分区时:

Disk /dev/sda - 750 GB / 698 GiB - CHS 91201 255 63
     Partition               Start        End    Size in sectors
 P FAT32 LBA                0  32 33  3263 170 43   52428800 [RECOVERY]
 * HPFS - NTFS           3263 170 44 39744  19 19  586057728 [OS]
 P HPFS - NTFS          39744  19 20 51954 195 57  196164776 [DATA]
   HPFS - NTFS          39744  19 20 51954 209 31  196165632 [DATA]
 L Linux                51954 209 32 70244 108  8  293822464
   Linux                70244 108  9 90445 190 49  324534272
>L Linux Swap           90446 195 54 91201  52 51   12120064

Structure: Ok.  Use Up/Down Arrow keys to select partition.
Use Left/Right Arrow keys to CHANGE partition characteristics:
*=Primary bootable  P=Primary  L=Logical  E=Extended  D=Deleted
Keys A: add partition, L: load backup, T: change type,
     Enter: to continue
SWAP2 version 1, pagesize=4096, 6205 MB / 5918 MiB

当我尝试仅选择第二个 Linux 分区时:

Disk /dev/sda - 750 GB / 698 GiB - CHS 91201 255 63
     Partition               Start        End    Size in sectors
 P FAT32 LBA                0  32 33  3263 170 43   52428800 [RECOVERY]
 * HPFS - NTFS           3263 170 44 39744  19 19  586057728 [OS]
 P HPFS - NTFS          39744  19 20 51954 195 57  196164776 [DATA]
   HPFS - NTFS          39744  19 20 51954 209 31  196165632 [DATA]
   Linux                51954 209 32 70244 108  8  293822464
>L Linux                70244 108  9 90445 190 49  324534272
 L Linux Swap           90446 195 54 91201  52 51   12120064

Structure: Ok.  Use Up/Down Arrow keys to select partition.
Use Left/Right Arrow keys to CHANGE partition characteristics:
*=Primary bootable  P=Primary  L=Logical  E=Extended  D=Deleted

答案1

TestDisk 是最后手段。Windows 分区工具造成的问题通常可以用不太激烈的措施来解决。对于专家来说,使用fdisk或可以创造奇迹sfdisk。对于中等技能的人,我自己的 FixParts(gdiskUbuntu 软件包的一部分)可以修复许多问题。请参阅FixParts 文档以获取有关如何使用它的信息。此 Ubuntu 论坛主题包含一些有关如何使用来修复问题的基本信息sfdisk。也就是说,除非我误读了您的输出,否则我认为 FixParts 无法恢复所有分区 - 至少不能单独恢复。sfdisk可能可以做到,但这需要更多的专业知识。

不幸的是,由于您没有提供任何有关分区表当前情况的信息,因此我只能盲目地处理一些关键细节。我建议您阅读我提供的链接(尤其是我的 FixParts 页面),将其与您已有的内容进行比较,也许还可以看看这些工具对您的磁盘做了什么。如果您需要更多帮助,请编辑您的问题以包含输出sudo fdisk -l /dev/sda并向此答案添加评论以引起我的注意。

至于您面临的问题,我怀疑原因是您试图将两个分区恢复为逻辑分区,但这两个分区之间没有空闲扇区。MBR 磁盘的通常结构要求两个逻辑分区之间至少有一个空闲扇区,因此您尝试执行的操作将不起作用。(某些工具(例如)可以sfdisk绕过此限制,但大多数工具都会因此而受阻。)考虑到您的磁盘布局,除非先调整一个或两个分区的大小,否则可能无法将所有分区都包含在 MBR 设置中。根据当前分区状态,这可能是一个极其危险的提议。

另一种可能性是转换为 GPT。(或者磁盘最初(现在可能仍然是)是 GPT 格式,而您只是告诉 TestDisk 您想使用 MBR?)GPT 没有 MBR 的分区间间隙问题,因此您应该能够以这种格式包含所有分区。缺点是如果如果磁盘当前使用 MBR 并成功启动 Windows,则您必须完成一些步骤才能让 Windows 以 EFI 模式启动。(您还需要一台具有 EFI/UEFI 固件的计算机。)即使磁盘当前使用 MBR,转换为 GPT 也可能使您能够调整分区大小。然后您可以转换回 MBR 以再次启动 Windows。任何此类转换(即使是临时转换)都可能需要您重新安装引导加载程序。

不管你做什么,不要更改分区表直到您完全了解发生了什么。许多与您情况类似的人由于对问题了解不足而仓促行事,从而对其数据造成了无法挽回的损害。此外,如果您还没有做好备份,请进行备份。即使是一个有能力的人也很容易在试图解决您的问题时丢失数据。


编辑:

根据您提供的新信息,Windows 似乎已从您的分区表中完全删除了两个分区。好消息是,您获得了有关文件系统起点和终点的出色数据,因此您应该能够恢复。(TestDisk 找到文件系统这一事实意味着您的数据可能完好无损,只是无法访问。)

无论你怎么做,我强烈建议您首先对磁盘进行完整的低级备份。如果我的计算正确,您的磁盘大小为 700GiB,因此您应该能够使用以下命令将备份到至少具有那么多可用空间的磁盘上:

sudo dd if=/dev/sda of=/path/to/lots/of/space/backup-sda.img bs=4096

此操作可能需要几个小时才能完成。非常小心使用此命令,尤其是if=of=选项,它们分别指定输入和输出文件。完成后......

IIRC,sfdisk可以创建一个扩展分区,其中的逻辑分区之间没有空格,因此您可以尝试通过首先使用sfdisk以下命令创建一个文本文件来恢复:

sfdisk -d /dev/sda > partitions-sda.txt

的内容partitions-sda.txt应该类似于电子表格上的第一个输出块。然后,您可以将该文件加载到文本编辑器中,并添加有关两个丢失分区的信息。棘手的部分是起始值和大小值,但您似乎已经计算了它们,因此您只需为它们创建适当的行并指定正确的值即可。您还需要调整扩展分区的起始点,使其包含两个“新”(恢复)分区。完成后,您可以将结果写回磁盘:

sfdisk -f /dev/sda < partitions-sda.txt

应该工作。但如果没有,那么你可能犯了一个错误,或者我误解了sfdisk的功能,或者可能sfdisk已经发生了变化。

完成此操作后,我建议检查您的文件系统。您可能还想缩小第一个 Ubuntu 分区的末尾,以便它与下一个分区之间有一个小间隙。您可能可以使用 GParted 执行此操作 - 尽管 GParted 可能会因为此问题而拒绝在磁盘上工作。在这种情况下,您可能需要备份分区,删除它,在其位置创建一个新分区,然后恢复数据。

此过程的替代方法是购买新磁盘并一次复制一个分区。您甚至可以使用选项ddskip磁盘读取“丢失”的文件系统,而无需在其周围重新创建分区——但在指定起点时必须非常精确。

另一个选择是使用 TestDisk 恢复第一个 Linux 分区,使用 GParted 稍微缩小它,然后再次运行 TestDisk 来恢复第二个 Linux 分区。这应该可行,但 TestDisk 或 GParted 有可能会将某些内容写入第二个文件系统占用的区域(虽然该区域尚未正式分配),从而损坏该区域。

告诉 TestDisk 将磁盘恢复为 GPT 是另一种选择,但这会导致 Windows 无法启动,至少在您完成更多步骤之前是这样。如果您的计算机是基于 BIOS 的(而不是基于 EFI 的,大多数 2011 年后的计算机都是这样),您将无法从 GPT 启动 Windows。如果您选择此选项,则需要将新的引导加载程序写入磁盘。


编辑2:

回答您最新的问题:

  • 是的,您可以撤销该dd命令来恢复备份。
  • sfdisk请注意,我提出的第一个命令使用了一个-d选项,第二个命令也使用了一个-f选项。
  • 使用它的意义sfdisk在于,如果我没记错的话,它是少数可以创建两个逻辑分区且中间没有空格的程序之一。它通过在任一逻辑分区之前连续地在磁盘上写入 EBR 来实现这一点。尽管 EBR 是重要的磁盘数据结构,但您通常不应该尝试手动修改它们;只需让sfdisk(或 GParted 或其他)处理它们即可。
  • 我的猜测是,您的 Linux 分区最初是主分区,而 Windows 删除了它们;但也许它们是由sfdisk其他东西创建的逻辑分区,这些分区可以创建两个相邻的逻辑分区,而当 Windows 分区程序发现它阻塞并删除它们,而不是尝试创建它无法创建的东西。

答案2

任务完成!我使用 TestDisk 成功恢复了所有分区。话虽如此,我不得不承认我有点幸运。昨天,我启动了几天没使用的 TestDisk。由于未知原因,该应用程序的行为与以前不同:事实上,TestDisk 至少需要一分钟才能显示“快速搜索”屏幕,而我以前使用它时它会立即显示。在这一分钟内,TestDisk 屏幕显示每个分区的起始点和结束点的值。然而,在这一分钟内,第一个 Linux 分区的结束点值是任何其他 TestDisk 屏幕或任何其他命令或应用程序从未给出的值。我感觉这些临时显示的值是正确的:关键是这些值允许在两个 Linux/逻辑分区之间留出空间。

然后,我编辑了一个 TestDisk 日志文件,这是一个简单的 ASCII 文件。我向这个文本文件添加了两行新内容:这两行是关于两个缺失的逻辑分区的。当然,对于第一个 Linux 分区,我输入了刚刚在“快速搜索”屏幕之前神秘出现的端点值。下一步是在 TestDisk 中加载更新的日志文件。应用程序立即接受了磁盘结构。然后,我只需要要求 TestDisk 根据日志文件给出的值重写分区表。之后,我只需重新启动计算机,从 Ubuntu Live-CD 会话启动 Boot-Repair,再次重新启动计算机,最后使用正常工作的 GRUB,启动 Ubuntu 并享受 Ubuntu,它又恢复了活力!

供参考:最终用于使用 TestDisk 成功重写分区表的值位于第一张表(“Feuil1”)的最末尾:https://docs.google.com/spreadsheets/d/16bOgee0CIObZORWjyKw7l7do8czfdfB5PEGZj6OhWjc/edit?usp=sharing

答案3

请查看屏幕截图中的起始和结束扇区。在第一个屏幕截图中,您选择了第一个 Linux 分区,其结构显然有问题。在第二个屏幕截图中,您选择了 Linux 交换文件,它结构良好。在第三个屏幕截图中,您选择了第二个 Linux 分区,它结构也正常。根据您的屏幕截图,您从不会同时选择两个分区。据我所知,不可能同时选择两个分区,所以您甚至不能这样做。因此,您只能修复第一个 Linux 分区。顺便说一句:在第三个屏幕截图中,一些重要信息被剪掉了。

相关内容