我正在尝试使用 ddrescue 从出现故障的 USB 硬盘恢复数据。我运行了 ddrescue 大约 4 天,最后它完成了第 1 步。在第 2 步开始后的某个时候,我中断了该过程,让笔记本电脑和硬盘休息一下,因为它们正在变热。当我重新启动 ddrescue 时,我发现它已在之前离开的位置恢复,但第 1 步再次向上计数,而不是第 2 步(向下计数)。此外,第二遍的速度慢得令人痛苦,在接下来的两天里仅覆盖了 5 GB。当前状态显示 0 个错误,errsize 为 0B,挽救的大小为 769755 MB,这大约是我记得驱动器上的数据量。我的问题是,我是否可以假设 ddrescue 已经恢复了要恢复的数据,并且可以安全地将映像文件的内容提取到另一个 USB 驱动器?或者是否有必要/强制让 ddrescue 也运行剩余的两遍?
PS Chkdsk 对 USB 硬盘失败,并显示“发生未指定的错误”消息。我希望将映像文件提取到新硬盘并再次运行 chkdsk 以查看是否可以修复它。尝试在 Linux 中挂载映像文件,但返回时缺少 NTFS 签名。
答案1
您是否向 提供了日志/映射文件ddrescue
?例如:
# ddrescue /dev/sdc file.img map.txt
如果您提供了地图文件,则应ddrescue
从中断处继续。这意味着它不会尝试重新挽救最初挽救的所有数据,而只会重试出现问题的位。然而,据我所知,通过与重新启动无关。使用映射文件ddrescue
可以知道它已经覆盖了哪些数据,哪里出了问题,以及当前正在运行算法的哪个阶段。然而,passs只计算一个阶段通过磁盘的次数ddrescue
,但似乎没有记录在mapfile中。如果您在“pass 2”中间中断它,然后再次运行它,它将有效地运行一个全新的“pass 3”,它将称为“pass 1”,但它不会重做任何事情已经在 pass 1 或部分 pass 2 中覆盖。在这种情况下,预计它将具有较低的吞吐量:原始 pass 1 之外的所有内容都在尝试读取故障点。ddrescue
其工作原理是首先尝试尽快恢复驱动器中所有易于读取的位,然后返回并再次尝试无法读取的部分。重新启动后,您应该会发现“rescued”值与上次运行时停止的值相同。
如果你没有提供映射文件,那么就无法从你离开的地方恢复 - 停止ddrescue
并重新启动它基本上相当于从头开始,因为它无法知道它已经处理或没有处理哪些数据。从故障磁盘中拯救数据时,应始终使用映射文件。
总而言之,ddrescue
当完成恢复 100% 的驱动器或放弃重试恢复数据时,将退出。您应该让ddrescue
运行完成,除非您愿意放弃它尚未读取的任何剩余数据。您应该始终允许至少完成一次完整的传递,否则您将错过完美的数据(如果您允许完成第一遍,则将被覆盖)。恢复的数据量与驱动器的总大小有关,而不是其上实际的文件量,因此,如果它从 1000000MB 驱动器中恢复了 769755MB,则意味着ddrescue
已恢复了总扇区的约 77%/驱动器上的块,但它无法知道这 77% 是否对应于正在使用的块或空闲块。如果驱动器已满 77%,在最好的情况下,您已经恢复了 100% 的数据和文件系统结构(如果您运气不太好的话)。在最坏的情况下,您已经恢复了所有无用的 23% 的驱动器(即空白空间)和另外 77-23=54% 的驱动器数据。如果驱动器已满 77%,则 0.54/.77 = 大约 70% 的数据。平均而言,如果恢复的数据部分是随机的,则您将拥有大约 77% 的数据。如果运气不好,它可能会错过重要的文件系统结构,从而使其余数据很难恢复。
答案2
ddrescue
适用于块而不是文件。在拥有 60Gb 数据的 100Gb 驱动器上,您可以将块恢复到 60Gb,但这只能确保已恢复 20Gb 的数据。 60Gb 的块完全覆盖数据的可能性很小。
在我看来,您应该让ddrescue
运行(同时重新考虑从备份恢复是否更具成本效益,即使您丢失了备份和崩溃之间发生的几个小时的数据更改)