Dmesg 报告了很多“未恢复的读取错误”,但 rsync 复制得很好。为什么?

Dmesg 报告了很多“未恢复的读取错误”,但 rsync 复制得很好。为什么?

我一直在将相当有价值的数据(拥有它很好,如果丢失的话也不是世界末日)从一堆旧 HDD 复制到具有更可靠存储的新 NAS。

在读取过程中,我在输出中收到一堆错误(这并不完全出乎意料,因为磁盘很旧),如下所示dmesg

[88577.880874] sd 38:0:0:0: [sdh] tag#5 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_OK cmd_age=3s
[88577.880889] sd 38:0:0:0: [sdh] tag#5 Sense Key : Medium Error [current] 
[88577.880893] sd 38:0:0:0: [sdh] tag#5 Add. Sense: Unrecovered read error
[88577.880897] sd 38:0:0:0: [sdh] tag#5 CDB: Read(10) 28 00 54 25 88 8f 00 02 00 00
[88577.880900] critical medium error, dev sdh, sector 1411745935 op 0x0:(READ) flags 0x80700 phys_seg 64 prio class 2

从我读到的所有内容来看,这表明磁盘运行得不太好,我对此并不太担心。

但令我惊讶的是,rsync我用来复制数据(主要是磁盘映像、ISO 等大文件……)的数据似乎没有报告大部分错误。

当前rsync调用已运行一个多小时。当时我在dmesg.但一直只rsync报告了 2 个 I/O 错误:

$ rsync -rlt --no-i-r --info=progress2 /mnt/olddisk/somedir /mnt/target
 47,316,611,088   5%   34.36MB/s    0:21:53 (xfr#26, to-chk=754/787)
rsync: [sender] read errors mapping "/mnt/oldisk/somedir/dir1/chunkyfile1.bin": Input/output error (5)
148,137,878,449  15%   49.70MB/s    0:47:22 (xfr#46, to-chk=734/787)
rsync: [sender] read errors mapping "/mnt/olddisk/somedir/dir2/chunkyfile2.bin": Input/output error (5)
206,615,147,043  22%   55.38MB/s    3:32:44  xfr#61, to-chk=719/787)

我想知道的是:那些“未恢复”和“严重”错误是否以某种方式得到纠正?他们重新尝试并成功了吗?内核是否默默地返回错误/损坏/空的读取结果,rsync同时接受发生 I/O 错误的事实?

据我所知,没有其他进程与源驱动器交互。

源磁盘是用无聊的旧 ext4 格式化的,所以我认为该数据中没有嵌入任何纠错代码。

磁盘通过外部 SATA 坞站连接并通过 USB 连接有关系吗?我知道这可能是问题的根源,但鉴于这些错误特别提到“中级错误”,我怀疑它们与磁盘中的实际情况有关,而不是与系统其他部分的通信有关。

答案1

很可能重新尝试了某些读取。这可以在软件的多个层面上完成。还有一件事:预读。内核可能(应该)请求更多它实际需要的信息,因此错误可能会被报告并被遗忘。并且缓存无法满足后续请求,因此会再次进行读取。 (最重要的是,磁盘本身可能读取超出请求的数据,或者进行一些健全性检查并将其报告给内核?)

相关内容