Ubuntu

將文件(cp 和 rsync)複製到外部 HDD 會導致 i/o 錯誤和目標數據失去

  • February 5, 2021

我正在嘗試通過 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。

作為旁注,最近我在這台電腦上從它複製少量數據時,一個舊的外部希捷磁碟壞了(臭名昭著的死亡點擊……),這也是我第一個死掉的硬碟。

我不知道該怎麼做,如果問題出在我如何複製數據(複製數據會破壞磁碟嗎?),如果問題出在硬體(電腦、硬碟、USB-SATA 轉換器……)或如果它與 Ubuntu 有關…通常我只執行 Manjaro,我從未遇到過此類問題。

謝謝你的幫助。

我現在已經解決了這個問題。我將驅動器重新格式化為 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 本身導致了問題。不幸的是,這意味著我對問題所在沒有完整的答案。我也沒有嘗試增加超時門檻值,但考慮到這次更快的數據速率,我會說增加超時門檻值充其量只是一種解決方法,而不是解決方案。

引用自:https://unix.stackexchange.com/questions/627940