ddrescue 后持续出现“输入/输出错误”

ddrescue 后持续出现“输入/输出错误”

我有一个 2TB 外部 HDD ( /dev/sda),格式为 NTFS。最近,在将文件和奇怪的输出移动到命令时,它开始给我“输入/输出错误” ls,例如

...
??????????? folder_1
?   ?   ?   folder_2
ls: cannot access 'folder_3': Input/output error
ls: cannot open directory 'folder_3': Input/output error
...

我有一个新的 4TB HDD ( /dev/sdb),因此我尝试ddrescue在磁盘出现故障之前使用以下命令复制文件

ddrescue -f -r3 /dev/sda /dev/sdb mapfile

据报道这里这里

该命令在大约 6 小时内完成,没有报告任何错误,但“输入/输出错误”仍然存在于新驱动器中,即当我尝试ls在新驱动器上运行时,它仍然给出与以前相同的输出。

我尝试从 Windows 打开新驱动器,它警告我外部驱动器上有一些“需要修复”的东西(尽管它对旧驱动器做了同样的事情),我尝试给他一个机会。在Windows中“修复”新驱动器后,不再有“输入/输出错误”消息,但文件夹消失了,即新驱动器上没有folder_1,folder_2和。folder_3

这是输出smartctl -a /dev/sda

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   100   100   050    Pre-fail  Always       -       0
  2 Throughput_Performance  0x0005   100   100   050    Pre-fail  Offline      -       0
  3 Spin_Up_Time            0x0027   100   100   001    Pre-fail  Always       -       2107
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       320
  5 Reallocated_Sector_Ct   0x0033   100   100   050    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000b   100   100   050    Pre-fail  Always       -       0
  8 Seek_Time_Performance   0x0005   100   100   050    Pre-fail  Offline      -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       103
 10 Spin_Retry_Count        0x0033   106   100   030    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       189
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       19
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       105
193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       1166
194 Temperature_Celsius     0x0022   100   100   000    Old_age   Always       -       15 (Min/Max 13/46)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   253   000    Old_age   Always       -       0
220 Disk_Shift              0x0002   100   100   000    Old_age   Always       -       0
222 Loaded_Hours            0x0032   100   100   000    Old_age   Always       -       53
223 Load_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
224 Load_Friction           0x0022   100   100   000    Old_age   Always       -       0
226 Load-in_Time            0x0026   100   100   000    Old_age   Always       -       181
240 Head_Flying_Hours       0x0001   100   100   001    Pre-fail  Offline      -       0

根据这张桌子,看起来“很好”(我猜)。

所以,我的问题是:

  1. 有没有办法从旧驱动器恢复“所有”数据?
  2. 如果 1. 的答案是“否”。我应该采取什么“下一步”?因为ddrescue仅使用在新驱动器上查找相同的错误似乎不是一个解决方案。
  3. rsync我应该使用特定的文件系统(例如 exFAT)格式化新驱动器,然后将旧驱动器中的所有文件(例如 )复制到新驱动器中吗?

答案1

从您收集的提示来看,问题似乎不在磁盘物理级别,而是在文件系统结构级别。某些数据结构(可能是目录)已损坏。我可以猜测 I/O 错误来自于目录结构中的杂散指针,它指示内核文件系统在不可能的位置访问磁盘,或者类似的东西。

我会像你一样开始(ddrescue 到单独的磁盘)。当您尝试从另一份恢复时,我会将两份副本中的一份保留为只读备份。

然后我会将可访问的文件复制到新分区(无论是 ntfs 还是其他分区,都没关系)。

然后我会尝试通过一些低级工具来恢复其余部分。我不知道有什么特定于 ntfs 的工具,但我敢打赌它们是存在的。如果数据价值很高,您可以尝试专业服务:他们肯定能够恢复任何可以恢复的数据。

如果您想自己尝试一下,recoverjpeg并且recovermov即使包含这些文件的目录已损坏,也能够挽救您的 .jpeg 和 .mov 文件,假设数据文件本身没有损坏并且它们在磁盘上是连续的。

恢复其他数据文件需要黑魔法。它涉及找到一些特定于 ntfs 的工具或大文件二进制编辑器来搜索文件签名(命令使用的签名file)并浏览数据以识别它们并找到文件的开头和结尾(假设它们在磁盘)。

相关内容