我一直在将相当有价值的数据(拥有它很好,如果丢失的话也不是世界末日)从一堆旧 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
很可能重新尝试了某些读取。这可以在软件的多个层面上完成。还有一件事:预读。内核可能(应该)请求更多它实际需要的信息,因此错误可能会被报告并被遗忘。并且缓存无法满足后续请求,因此会再次进行读取。 (最重要的是,磁盘本身可能读取超出请求的数据,或者进行一些健全性检查并将其报告给内核?)