意外启动了我的多启动笔记本电脑的 Acer Recovery 分区,尽管在选择是否要恢复任何内容时选择了 EXIT,但我的一个分区还是损坏了。现在我真的需要一些关于重写分区表和恢复文件系统的建议。
我已经克隆了整个驱动器(dd if=... | ssh me@desktop -of=...)并且专门在克隆的驱动器上工作。
我试过 gpart、parted、testdisk(以及 gparted)。目前还没成功。
我的驱动器布局是:
/dev/sda1 ntfs 12GB
/dev/sda2 ntfs 100MB
/dev/sda3 ntfs 72.17GB
/dev/sda4 extended 213.82GB
unallocated 27.93GB
/dev/sda5 ext4 148.98GB
/dev/sda6 ext4 29.33GB
/dev/sda7 swap 7.58GB
unallocated 2.49MB
损坏的分区是~30GB未分配分区(扩展分区中的第一个逻辑分区)。
可惜 Acer Recovery 恰好击中了那个分区。我不会费心尝试恢复其他分区(我不使用的 Windows、用于测试的 Linux、也用于测试的 Linux 替代发行版)。不过,这个分区包含我想恢复的数据真的喜欢恢复。
我知道分区的确切边界,我知道底层(ext4)文件系统的细节。
但是,通常推荐的恢复工具不起作用。testdisk 的深度扫描表明,Acer Recovery 工具显然决定复制主 Windows 分区的分区表,导致大小不匹配的投诉。gpart、parted 和 testdisk 无法找到文件系统。testdisk 找到了一个“无法恢复”的 ntfs 文件系统。
我怀疑超级块也被摧毁了,但搜索后发现存在多个备份超级块。
最好的选择是什么?我想尝试重写分区表并恢复文件系统,大概是使用备份超级块的 e2fsck。
什么工具可以让我重写分区表而不对数据做任何处理?设置文件系统怎么样?在尝试从备份中恢复超级块之前,我需要这样做吗?怎么做?
短暂性脑缺血发作,
费约
答案1
如果你问的是是否可以恢复 30GB 未分配分区,我认为你无法恢复。据我所知,未分配分区无法恢复。如果我错了,请纠正我。
答案2
既然你说你知道分区边界,我会使用带有选项的 losetup -o offset
和--sizelimit size
这将允许您创建可操作的 30GB 分区的回送设备。如果该分区未被覆盖,则 Testdisk 搜索回送设备应该会找到一些东西。
您还可以使用 Photorec 根据文件扩展名搜索文件,以验证您的数据是否仍然存在。
答案3
终于解决了,一切都恢复正常了。有几个奇怪的事情可能值得其他人借鉴,下面是详细信息:
一切都是在驱动器的克隆上完成的。在开始乱搞任何事情之前,请先克隆您的驱动器(或至少是分区),最好是从实时 CD 克隆。
在常用工具无法产生结果(根据 OP)后,我的第一步就是使用十六进制编辑器(十六进制编辑)编辑整个分区,跳到我应该存放东西的未分配空间的第一个字节。
将十六进制编辑器中的结果与 Ext4 磁盘布局进行比较: https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout
一切都很清楚。所有工具都报告为坏的超级块都在那里,而且看起来完好无损。数据也在那里。可能唯一被弄坏的东西就是分区表。
然而,超级块偏移 2048 字节,而不是规范规定的 1024 字节。这显然导致许多工具失败。
了解了这些知识后,我再次启动 testdisk,开始将 CHS 三元组转换为扇区,看看到底发生了什么。正如最初提到的,testdisk 确实找到了可能是我的分区,但它无法恢复它。在检查了所有分区的扇区边界后,原因就很清楚了:
Testdisk 显示我的两个分区比实际的要大(原帖中的 sda3 和 sda5)。我不知道为什么。当前分区表显示了正确的大小,sda5 中的 ext4 文件系统显示了正确的块数。对于 sda5,testdisk 发现该分区与 sda6 重叠,因此它不允许我在修改后的分区列表中同时选择这两个分区。对于 sda3,分区没有重叠,但 testdisk 仍然不允许我恢复丢失的分区和 sda3。无论出于什么原因,它们之间的差距可能比 testdisk 希望的要小。
使用 GParted 在未分配空间中创建分区不起作用,因为 GParted 坚持要求 sda3 和新分区之间有 1MB 的间隙。即使 sda3 大小正确,这也会导致超级块(以及更多)被擦除,所以这是行不通的。有点奇怪,因为我的所有分区(两个 Windows 还原分区除外)都是使用各种版本的 GParted 创建的。
解决方案是使用 parted 并手动输入正确的边界,这些边界实际上被 testdisk 正确检测到(并通过 hexedit 验证,因为 testdisk 没有准确检测到其他边界)。
呼。