還原許多文件時出現文件系統錯誤
我有一個內部安裝的外部硬碟驅動器。它是用 NTFS 格式化的,我想轉移到 ext4。所以我將我想要保留的所有內容複製到其他驅動器上,創建了一個帶有單個 ext4 分區的全新分區表 (GPT),現在我正在嘗試將所有內容複製回來。我
rsync -a --info=progress2
用於大多數複製操作。我的問題是,在 100 GB 左右之後,我往往會遇到奇怪的錯誤:
rsync:在“somepath”上寫入失敗:只讀文件系統(30) rsync 錯誤:receiver.c(389) [receiver=3.1.0] 處的文件 IO(程式碼 11)錯誤
如果我嘗試列出 rsync 在失敗時正在處理的目錄,我會看到奇怪的結果:
drwx------ 3 pdaddy pdaddy 4096 2011 年 8 月 28 日子目錄 1 drwx------ 3 pdaddy pdaddy 4096 2014 年 3 月 12 日子目錄 2 d????????? ? ? ? ? ? 子目錄3 d????????? ? ? ? ? ? 子目錄4
嘗試在列表中列出帶有問號的目錄,甚至其中一些沒有,給了我:
ls: 讀取目錄 subdirectory3: 輸入/輸出錯誤 共 0
甚至 fdisk 也有錯誤:
~ % fdisk /dev/sde fdisk:無法讀取 /dev/sde:輸入/輸出錯誤
如果我嘗試解除安裝驅動器,該
umount
命令將掛起。我跑了htop
,看到 umount 正在使用一個 CPU 核心的 100%。我以為它是在寫日記之類的,所以我放了它一整夜,但它在早上處於同樣的狀態。發出sudo reboot
或掛起sudo init 6
時umount
會導致另一個掛起的終端。我必須按住電源按鈕。剛才我嘗試在沒有明確解除安裝的情況下重新啟動,它掛起黑屏(顯示器進入睡眠狀態),並且通過 ssh 或鍵盤沒有響應。硬重啟後,我解除安裝了磁碟並做了
sudo fsck.ext4 -f /dev/sde1
,沒有錯誤。我檢查了文件,它們似乎都在那裡,其中的一個樣本是正確的。我認為錯誤與日誌太大有關(也許它被限制為最大尺寸?),所以我重新安裝了
-o data=writeback
. 我認為在恢復 TB 級文件的同時臨時以這種方式掛載是個好主意。這有助於稍微加快複製速度,但對錯誤沒有幫助。再過兩次,我就進入了同樣的狀態。硬重啟是我唯一能做的事情,然後,磁碟檢查顯示沒有錯誤,文件看起來還不錯,我可以再复制 100 GB 左右。
這是怎麼回事?我認為磁碟本身是健康的。在重新格式化之前我沒有遇到任何問題。我應該對磁碟進行扇區掃描嗎?它是 5 TB,所以我猶豫要不要這樣做。
根據 Stephen Kitt 的建議,我已經恢復了更多文件,查看核心日誌。在
rsync
失敗之前,我開始看到一些時髦的錯誤:[8807.572286]ata4.00:異常Emask 0x0 SAct 0x7fffffff SErr 0x0動作0x6凍結 [8807.572290]ata4.00:命令失敗:寫入 FPDMA 隊列 [8807.572293] ata4.00: cmd 61/40:00:c0:57:b6/05:00:b7:00:00/40 標籤 0 ncq 688128 出 [8807.572293] res 40/00:00:00:4f:c2/00:00:00:00:00/40 Emask 0x4(超時) [8807.572295]ata4.00:狀態:{ DRDY }
最後三個消息重複多次,然後我得到:
[8807.572412]ata4:硬重置連結 [8808.060464] ata4: SATA 連結 3.0 Gbps (SStatus 123 SControl 300) [8808.062462]ata4.00:為 UDMA/133 配置 [8808.076459]ata4.00:設備報告無效的 CHS 扇區 0
最後一條消息重複了 20 次左右,然後我得到:
[8808.076526]ata4:EH 完成
47 秒後,序列重複。又過了 81 秒,又過了 120 秒,除了這一次,它開始於:
[9160.779935]ata4.00:NCQ 因錯誤過多而被禁用
下一次,就不一樣了。它開始相同,但後來我看到:
[9235.819291]ata4:硬重置連結 [ 9241.181501] ata4:連結響應緩慢,請耐心等待(準備好=0) [9245.839449] ata4:COMRESET 失敗(errno=-16)
這重複了幾次,然後:
[9290.922301]ata4:將 SATA 連結速度限制為 1.5 Gbps [9290.922303]ata4:硬重置連結 [9295.948393] ata4:COMRESET 失敗(errno=-16) [9295.948400] ata4:重置失敗,放棄 [9295.948401]ata4.00:禁用
有一些新的錯誤:
[9295.948522] sd 3:0:0:0: [sdf] 失敗結果:hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK [9295.948524] sd 3:0:0:0: [sdf] CDB: [9295.948525]寫(16):8a 00 00 00 00 00 b9 0c fd 00 00 00 40 00 00 00 [9295.948538] blk_update_request:I/O 錯誤,開發 sdf,扇區 3104636160 [9295.948542] EXT4-fs 警告(設備 sdf1):ext4_end_bio:317:I/O 錯誤 -5 寫入 inode 49807774(偏移量 155189248 大小 4194304 起始塊 388079688) [9295.948543] 設備 sdf1 上的緩衝區 I/O 錯誤,邏輯塊 388079264
(請注意,自從我開始寫這篇文章以來,我已經改組了一些驅動器,這個驅動器現在是 sdf 而不是 sde。)
最後一個錯誤使用不同的邏輯塊重複多次,然後我得到相同的次數:
[9295.948585] EXT4-fs 警告(設備 sdf1):ext4_end_bio:317:I/O 錯誤 -5 寫入 inode 49807774(偏移量 155189248 大小 4194304 起始塊 388079856)
還有更多相同的內容,而副本仍在繼續進行,沒有抱怨。最後我得到:
[9295.950321] 設備 sdf1-8 中止日誌。 [9295.950345] 開發 sdf1 上的緩衝區 I/O 錯誤,邏輯塊 610304000,失去同步頁面寫入 [9295.950361] EXT4-fs (sdf1):inode 49807775 在邏輯偏移量 0 處的延遲塊分配失敗,最大塊 1024,錯誤 30 [9295.950362] 開發 sdf1 上的緩衝區 I/O 錯誤,邏輯塊 0,失去同步頁面寫入 [9295.950365] EXT4-fs (sdf1):這不應該發生!數據將失去 [ 9295.950365] [9295.950366] ext4_writepages:2421 中的 EXT4-fs 錯誤(設備 sdf1):日誌已中止 [9295.950368] EXT4-fs 錯誤(設備 sdf1):ext4_journal_check_start:56:檢測到中止日誌 [9295.950370] JBD2:更新 sdf1-8 的日誌超級塊時檢測到錯誤 -5。 [9295.950371] EXT4-fs (sdf1): 以只讀方式重新掛載文件系統 [9295.950372] EXT4-fs (sdf1):檢測到超級塊的先前 I/O 錯誤 [9295.950379] 開發 sdf1 上的緩衝區 I/O 錯誤,邏輯塊 0,失去同步頁面寫入 [9295.950394] 開發 sdf1 上的緩衝區 I/O 錯誤,邏輯塊 0,失去同步頁面寫入 [9326.009002] scsi_io_completion: 10 個回調被抑制 [9326.009007] sd 3:0:0:0: [sdf] 失敗結果:hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK [9326.009009] sd 3:0:0:0: [sdf] CDB: [9326.009011]寫(16):8a 00 00 00 00 00 00 00 0f b8 00 00 00 08 00 00 [9326.009018] blk_update_request:10 個回調被抑制 [9326.009020] blk_update_request:I/O 錯誤,開發 sdf,扇區 4024 [9326.009023] 開發 sdf1 上的緩衝區 I/O 錯誤,邏輯塊 247,非同步頁面寫入失去
(請注意,這次我沒有使用 data=writeback 解除安裝和重新安裝,所以它正在執行預設的日誌記錄。)
在此之後,rsync 失敗了,可能是因為文件系統重新以只讀方式掛載。
我很抱歉日誌轉儲。我試圖將其削減到基本要素,但恐怕我對這裡發生的事情還不夠熟悉,無法進一步削減它。
這看起來像是硬體問題,而不是核心錯誤。您可以嘗試以下方法:
- 重新安裝 SATA 電纜
- 使用另一條 SATA 電纜
- 執行 SMART 診斷(自檢,請參閱
smartmontools
)- 執行破壞性
badblocks
掃描如果您有備用驅動器或電腦,也可以嘗試切換(在同一台電腦上使用另一個驅動器,在另一台電腦上使用有問題的驅動器)以檢查主機板是否有故障。由於驅動器在負載下似乎存在問題,因此
dd if=/dev/zero of=...
具有適當大小參數的簡單可能足以重現錯誤。我不確定您的驅動器的保修是否適用,因為它最初是外部驅動器…