将文件(cp 和 rsync)复制到外部 HDD 会导致目标上的 I/O 错误和数据丢失

将文件(cp 和 rsync)复制到外部 HDD 会导致目标上的 I/O 错误和数据丢失

我正在尝试通过 USB3.0 将数据(230 GB,160k 文件)备份到新购买的 4 TB 外部希捷扩展便携式硬盘,格式为 NTFS。我正在运行 Ubuntu 18.04.3 LTS。

我首先尝试在终端中使用简单的 cp 命令,但仅复制了百分之几后,复制就开始卡顿并变得缓慢。一段时间后,磁盘变得没有响应。重新挂载磁盘无效。我尝试将磁盘连接到另一台计算机,首先无法挂载它,然后经过几次尝试后,它可以挂载,但读/写速度非常慢。

一旦 cp 开始失败,我会在 dmesg 中收到以下错误(所有这些消息都重复多次,但数字不同):

[67598.098118] sd 4:0:0:0: [sdb] tag#18 uas_zap_pending 0 uas-tag 19 inflight: CMD 
[67598.098122] sd 4:0:0:0: [sdb] tag#18 CDB: Write(16) 8a 00 00 00 00 01 1c 75 24 18 00 00 04 00 00 00
[67598.225621] usb 1-9: reset high-speed USB device number 5 using xhci_hcd
[67598.378202] scsi host4: uas_eh_device_reset_handler success
[67598.378466] sd 4:0:0:0: [sdb] tag#14 FAILED Result: hostbyte=DID_RESET driverbyte=DRIVER_OK
[67598.378468] sd 4:0:0:0: [sdb] tag#14 CDB: Write(16) 8a 00 00 00 00 01 1c 74 d0 18 00 00 04 00 00 00
[67598.378470] blk_update_request: I/O error, dev sdb, sector 4772384792 op 0x1:(WRITE) flags 0x104000 phys_seg 128 prio class 0
[67598.378473] buffer_io_error: 246 callbacks suppressed
[67598.378474] Buffer I/O error on dev sdb2, logical block 596515075, lost async page write
[67635.212662] scsi host4: uas_eh_device_reset_handler start
[67635.213657] sd 4:0:0:0: [sdb] tag#28 uas_zap_pending 0 uas-tag 10 inflight: CMD 
[67635.213658] sd 4:0:0:0: [sdb] tag#28 CDB: Write(16) 8a 00 00 00 00 01 1c 75 e8 18 00 00 04 00 00 00
[67635.340988] usb 1-9: reset high-speed USB device number 5 using xhci_hcd
[67635.490335] scsi host4: uas_eh_device_reset_handler success

我将磁盘放置一周,然后使用 Seagate Bootable Tool 进行了 SMART 扫描,没有显示任何问题。

因此,我尝试再次复制数据。磁盘现在可以正确安装,并且我可以毫无问题地读取/写入,因此我启动了 rsync 命令。首先我做了

rsync -avh source dest

虽然速度很慢,但它只传输了大约 20% 的数据,然后开始出现卡顿,所以我停止了传输。我使用重新启动传输

rsync -avhW source dest --inplace

尝试让它更快。它运行得很好,比第一次尝试快得多,但几分钟后,我收到错误:

rsync: recv_generator: failed to stat "..." : Input/output error (5)
rsync: write failed on "...": Input/output error (5)
rsync error: error in file IO (code 11) at receiver.c(393) [receiver=3.1.2]

在 dmesg 中我看到以下内容:

[ 6772.890553] buffer_io_error: 1092735 callbacks suppressed
[ 6772.890556] Buffer I/O error on dev sdb2, logical block 874428, async page read

一旦发生这种情况,磁盘就会变得无响应。几分钟后,我可以重新安装它,并检查我将数据复制到的文件夹完全是空的,包括在我第一次 rsync 尝试期间正确复制的文件。我没有尝试恢复任何数据来查看数据是否仍然完好无损,我想只是文件表已损坏。

失败时复制的文件类型为 .mat.gz,每个文件大小约为 1 MB。

顺便说一句,最近当我在这台计算机上复制少量数据时,一块旧的希捷外置硬盘坏了(臭名昭著的死亡咔嗒声……),这也是我第一个坏掉的硬盘。

如果问题出在复制数据的方式上(复制数据会损坏磁盘吗?),如果问题出在硬件(计算机、HDD、USB-SATA 转换器等)上,或者如果它与 Ubuntu 有关...通常我只运行 Manjaro 并且我从未遇到过此类问题。

答案1

谢谢你的帮助。

我现在已经解决了这个问题。我将驱动器重新格式化为 ext4,之后我使用了命令

rsync -avhW source dest --inplace --exclude=".*/"

在哪里

-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, to see what is happening
-h is for human-readable, so the transfer rate and file sizes are easier to read 
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--inplace tells rsync to not create a temporary copy of the file to be transferred, which is then copied to the destination. This should speed up the process.
--exclude=".*/" is for excluding all hidden folders

392 GB 的平均数据速率为 81.3 MB/s,这比我重新格式化驱动器之前所达到的速度要快得多。

这次 dmesg 没有错误。

请注意,我并没有尝试在驱动器上创建一个新的 NTFS 分区来查看是否是出厂时的特定 NTFS 分区存在问题,或者是否是 NTFS 本身导致了问题。不幸的是,这意味着我对问题所在没有完整的答案。我也没有尝试增加超时阈值,但鉴于这次数据速率更快,我想说增加超时阈值充其量只是一种解决方法,而不是解决方案。

相关内容