恢复许多文件时出现文件系统错误

恢复许多文件时出现文件系统错误

我有一个内部安装的外部硬盘驱动器。它采用 NTFS 格式,我想迁移到 ext4。因此,我将想要保留的所有内容复制到其他驱动器上,使用单个 ext4 分区创建了一个全新的分区表 (GPT),现在我尝试将所有内容复制回来。我用于rsync -a --info=progress2大多数复制操作。

我的问题是,在 100 GB 左右之后,我往往会遇到奇怪的错误:

rsync:“somepath”上写入失败:只读文件系统 (30)
rsync 错误:receiver.c(389) [receiver=3.1.0] 处的文件 IO(代码 11)中出现错误

如果我尝试列出 rsync 失败时正在处理的目录,我会看到奇怪的结果:

drwx------ 3 pdaddy pdaddy 4096 2011 年 8 月 28 日子目录1
drwx------ 3 pdaddy pdaddy 4096 2014年3月12日子目录2
d??????? ? ? ? ? ?子目录3
d??????? ? ? ? ? ?子目录4

尝试列出列表中带有问号的目录,甚至其中一些没有问号的目录,给我:

ls:读取目录子目录3:输入/输出错误
总计 0

甚至 fdisk 也有错误:

〜%fdisk / dev / sde   
fdisk:无法读取 /dev/sde:输入/输出错误

如果我尝试卸载驱动器,该umount命令将挂起。我跑了一下htop,发现 umount 正在使用 100% 的一个 CPU 核心。我以为它正在提交日志或类似的东西,所以我有一次放了一整夜,但早上它处于同样的状态。发出sudo reboot或挂起sudo init 6umount会导致另一个挂起的终端。我必须按住电源按钮。刚才我尝试在没有明确卸载的情况下重新启动,并且它挂起并显示黑屏(显示器进入睡眠状态),并且通过 ssh 或键盘没有响应。

硬重启后,我卸载了磁盘并执行了操作sudo fsck.ext4 -f /dev/sde1,并且没有错误。我检查了文件,它们似乎都在那里,并且其中的样本是正确的。

我认为这些错误与日志太大有关(也许它限制了最大大小?),所以我重新安装了-o data=writeback.我认为在恢复数 TB 的文件时暂时以这种方式挂载是个好主意。

这有助于稍微加快复制速度,但对解决错误没有帮助。又两次,我陷入了同样的状态。硬重启是我唯一能做的事情,之后磁盘检查显示没有错误,文件看起来没问题,我可以再复制 100 GB 左右的文件。

这是怎么回事?我认为磁盘本身是健康的。在重新格式化之前我没有遇到任何问题。我应该对磁盘进行扇区扫描吗?它是 5 TB,所以我对此犹豫不决。


按照 Stephen Kitt 的建议,我恢复了更多文件,观察内核日志。在失败之前rsync,我开始看到一些奇怪的错误:

[8807.572286]ata4.00:异常Emask 0x0 SAct 0x7fffffff SErr 0x0操作0x6冻结
[8807.572290]ata4.00:命令失败:写入FPDMA队列
[8807.572293]ata4.00:cmd 61/40:00:c0:57:b6/05:00:b7:00:00/40标签0 ncq 688128出
[8807.572293]资源40/00:00:00:4f:c2/00:00:00:00:00/40 Emask 0x4(超时)
[8807.572295]ata4.00:状态:{DRDY}

最后三个消息重复多次,然后我得到:

[8807.572412]ata4:硬重置链接
[8808.060464]ata4:SATA链接3.0Gbps(SStatus 123 SControl 300)
[8808.062462]ata4.00:配置为UDMA/133
[8808.076459]ata4.00:设备报告无效的CHS扇区0

最后一条消息重复了 20 次左右,然后我得到:

[8808.076526]ata4:EH完成

47 秒后,这个过程又重演了。又过了 81 秒,又过了 120 秒,除了这一次,它的开头是:

[9160.779935]ata4.00:NCQ由于错误过多而被禁用

下一次,情况就不一样了。一开始是一样的,但后来我看到:

[9235.819291]ata4:硬重置链接
[ 9241.181501] ata4:链接响应较慢,请耐心等待(ready=0)
[9245.839449]ata4:COMRESET失败(errno = -16)

这会重复几次,然后:

[9290.922301]ata4:将SATA链接速度限制为1.5 Gbps
[9290.922303]ata4:硬重置链接
[9295.948393]ata4:COMRESET失败(errno = -16)
[9295.948400]ata4:重置失败,放弃
[9295.948401]ata4.00:禁用

有一些新错误:

[9295.948522] sd 3:0:0:0:[sdf]失败结果:hostbyte = DID_BAD_TARGET driverbyte = DRIVER_OK
[ 9295.948524] sd 3:0:0:0: [sdf] CDB:
[9295.948525]写入(16):8a 00 00 00 00 00 b9 0c fd 00 00 00 40 00 00 00
[9295.948538]blk_update_request:I/O错误,dev sdf,扇区3104636160
[9295.948542]EXT4-fs警告(设备sdf1):ext4_end_bio:317:I / O错误-5写入inode 49807774(偏移量155189248大小4194304起始块388079688)
[9295.948543]设备sdf1上的缓冲区I/O错误,逻辑块388079264

(请注意,自从我开始这篇文章以来,我已经对一些驱动器进行了洗牌,并且该驱动器现在是 sdf 而不是 sde。)

最后一个错误使用不同的逻辑块重复多次,然后我得到相同的次数:

[9295.948585]EXT4-fs警告(设备sdf1):ext4_end_bio:317:I / O错误-5写入inode 49807774(偏移量155189248大小4194304起始块388079856)

还有更多相同的内容,并且副本仍在继续,没有任何抱怨。最后我得到:

[ 9295.950321] 正在中止设备 sdf1-8 上的日志。
[9295.950345]dev sdf1上的缓冲区I/O错误,逻辑块610304000,丢失同步页写入
[9295.950361]EXT4-fs(sdf1):逻辑偏移量0处的inode 49807775的延迟块分配失败,最大块数为1024,错误为30
[9295.950362]dev sdf1上的缓冲区I/O错误,逻辑块0,丢失同步页写入
[9295.950365]EXT4-fs(sdf1):这不应该发生!数据将会丢失
[9295.950365]
[9295.950366]ext4_writepages中的EXT4-fs错误(设备sdf1):2421:日志已中止
[9295.950368]EXT4-fs错误(设备sdf1):ext4_journal_check_start:56:检测到中止日志
[9295.950370] JBD2:更新 sdf1-8 的日志超级块时检测到错误 -5。
[9295.950371]EXT4-fs(sdf1):重新挂载只读文件系统
[9295.950372]EXT4-fs(sdf1):检测到超级块的先前I/O错误
[9295.950379]dev sdf1上的缓冲区I/O错误,逻辑块0,丢失同步页写入
[9295.950394]dev sdf1上的缓冲区I/O错误,逻辑块0,丢失同步页写入
[9326.009002]scsi_io_completion:抑制10个回调
[9326.009007] sd 3:0:0:0:[sdf]失败结果:hostbyte = DID_BAD_TARGET driverbyte = DRIVER_OK
[ 9326.009009] sd 3:0:0:0: [sdf] CDB:
[9326.009011]写入(16):8a 00 00 00 00 00 00 00 0f b8 00 00 00 08 00 00
[9326.009018]blk_update_request:抑制10个回调
[9326.009020]blk_update_request:I/O错误,dev sdf,扇区4024
[9326.009023]dev sdf1上的缓冲区I/O错误,逻辑块247,丢失异步页写入

(请注意,这次我没有使用 data=writeback 卸载并重新安装,因此它正在执行默认日志记录。)

此后,rsync 失败,可能是因为文件系统被重新挂载为只读。

我对日志转储感到抱歉。我已经尝试将其精简到必要的内容,但恐怕我对这里发生的事情还不够熟悉,无法进一步精简。

答案1

这看起来像是硬件问题,而不是内核错误。您可以尝试以下操作:

  • 重新安装 SATA 电缆
  • 使用另一条 SATA 电缆
  • 运行 SMART 诊断(自检,请参阅smartmontools
  • 运行破坏性badblocks扫描

如果您有备用驱动器或计算机,也可以尝试切换(在同一台计算机上使用另一个驱动器,在另一台计算机上使用有问题的驱动器)来检查主板是否有故障。由于驱动器在负载下似乎存在问题,因此dd if=/dev/zero of=...具有适当大小参数的简单参数可能足以重现错误。

我不确定您的驱动器的保修是否适用,因为它最初是外部驱动器......

相关内容