Ext4

還原許多文件時出現文件系統錯誤

  • July 10, 2016

我有一個內部安裝的外部硬碟驅動器。它是用 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 6umount會導致另一個掛起的終端。我必須按住電源按鈕。剛才我嘗試在沒有明確解除安裝的情況下重新啟動,它掛起黑屏(顯示器進入睡眠狀態),並且通過 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=...具有適當大小參數的簡單可能足以重現錯誤。

我不確定您的驅動器的保修是否適用,因為它最初是外部驅動器…

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