我有一个 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. 的答案是“否”。我应该采取什么“下一步”?因为
ddrescue
仅使用在新驱动器上查找相同的错误似乎不是一个解决方案。 rsync
我应该使用特定的文件系统(例如 exFAT)格式化新驱动器,然后将旧驱动器中的所有文件(例如 )复制到新驱动器中吗?
答案1
从您收集的提示来看,问题似乎不在磁盘物理级别,而是在文件系统结构级别。某些数据结构(可能是目录)已损坏。我可以猜测 I/O 错误来自于目录结构中的杂散指针,它指示内核文件系统在不可能的位置访问磁盘,或者类似的东西。
我会像你一样开始(ddrescue 到单独的磁盘)。当您尝试从另一份恢复时,我会将两份副本中的一份保留为只读备份。
然后我会将可访问的文件复制到新分区(无论是 ntfs 还是其他分区,都没关系)。
然后我会尝试通过一些低级工具来恢复其余部分。我不知道有什么特定于 ntfs 的工具,但我敢打赌它们是存在的。如果数据价值很高,您可以尝试专业服务:他们肯定能够恢复任何可以恢复的数据。
如果您想自己尝试一下,recoverjpeg
并且recovermov
即使包含这些文件的目录已损坏,也能够挽救您的 .jpeg 和 .mov 文件,假设数据文件本身没有损坏并且它们在磁盘上是连续的。
恢复其他数据文件需要黑魔法。它涉及找到一些特定于 ntfs 的工具或大文件二进制编辑器来搜索文件签名(命令使用的签名file
)并浏览数据以识别它们并找到文件的开头和结尾(假设它们在磁盘)。