![将文件(cp 和 rsync)复制到外部 HDD 会导致目标上的 I/O 错误和数据丢失](https://linux22.com/image/186057/%E5%B0%86%E6%96%87%E4%BB%B6%EF%BC%88cp%20%E5%92%8C%20rsync%EF%BC%89%E5%A4%8D%E5%88%B6%E5%88%B0%E5%A4%96%E9%83%A8%20HDD%20%E4%BC%9A%E5%AF%BC%E8%87%B4%E7%9B%AE%E6%A0%87%E4%B8%8A%E7%9A%84%20I%2FO%20%E9%94%99%E8%AF%AF%E5%92%8C%E6%95%B0%E6%8D%AE%E4%B8%A2%E5%A4%B1.png)
我正在尝试通过 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 本身导致了问题。不幸的是,这意味着我对问题所在没有完整的答案。我也没有尝试增加超时阈值,但鉴于这次数据速率更快,我想说增加超时阈值充其量只是一种解决方法,而不是解决方案。