訪問特定文件時出現分區錯誤並以只讀方式重新掛載
我有一個執行 Ubuntu 16.04 的非常基本的系統(這個問題不是特定於 Ubuntu,而是
ext4
分區),1 個 HDD,執行幾個分區:sda1 - EXT4 - 100G - / sda2 - EXT4 - 723.5G - /home sda3 - NTFS - 100G - (windows) sda5 - 交換 - 8G
每當我嘗試訪問
/home
分區中特定目錄中的 3-4 個文件之一時(導致問題的特定文件夾是/home/path/to/broken/folder
),/home
分區將出錯並以只讀方式重新掛載。dmesg
顯示以下錯誤:EXT4-fs 錯誤(設備 sda2):ext4_ext_check_inode:497:inode **#1415**:comm rm:pblk 0 錯誤標頭/範圍:無效魔法 - 魔法 0,條目 0,最大值 0(0),深度 0(0) 正在中止設備 sda2-8 上的日誌。 EXT4-fs (sda2):以只讀方式重新掛載文件系統 EXT4-fs 錯誤 (設備 sda2): ext4_ext_check_inode:497: inode **#1417** : comm rm: pblk 0 bad header/extent: invalid magic - magic 0, entries 0, max 0(0), depth 0(0) EXT4-fs 錯誤 (設備 sda2): ext4_ext_check_inode:497: inode **#1416** : comm rm: pblk 0 bad header/extent: invalid magic - magic 0, entries 0, max 0(0), depth 0(0)
所以我明白髮生了什麼……一些壞塊導致錯誤並且正在以只讀方式重新安裝驅動器以防止進一步損壞。我知道是這些特定文件,因為我可以通過
- 以 root 身份登錄
- 跑步
sync
- 停止
lightdm
(和所有子流程)/home
通過找到它們來停止所有剩餘的打開文件lsof | grep /home
- 解除安裝
/home
- 執行
fsck /home
(修復錯誤)- 重新安裝
/home
一切都很好,讀寫,直到我再次嘗試訪問相同的文件,然後重複整個過程以再次修復它。
我嘗試訪問文件的方式是執行
ls /home/path/to/broken/folder
andrm -r /home/path/to/broken/folder
,因此似乎對驅動器的該部分進行任何類型的 HDD 操作都會出錯並再次將其變為只讀狀態。老實說,我不在乎這些文件,我只是希望它們消失。我願意刪除整個
/home/path/to/broken/folder
文件夾,但每次我嘗試這個時,它都會失敗並進入只讀狀態。我
badblocks -v /dev/sda2
在我的硬碟上執行,但結果很乾淨,沒有壞塊。任何幫助仍將不勝感激。仍在尋找解決此問題的方法。以下可能有用的一些資訊:
$ debugfs -R 'stat <1415>' /dev/sda2 調試文件 1.42.13(2015 年 5 月 17 日) 索引節點:1415 類型:正常模式:0644 標誌:0x80000 世代:0 版本:0x00000000 使用者:0 組:0 大小:0 文件 ACL:0 目錄 ACL:0 連結:1 塊數:0 片段: 地址:0 數量:0 大小:0 ctime: 0x5639ad86 -- 2015 年 11 月 4 日星期三 01:02:30 atime: 0x5639ad86 -- 2015 年 11 月 4 日星期三 01:02:30 mtime: 0x5639ad86 -- 2015 年 11 月 4 日星期三 01:02:30 額外 inode 欄位的大小:0 範圍:
現在我自己查看了這個並將其與我懷疑是未損壞的 inode 進行了比較:
$ debugfs -R 'stat <1410>' /dev/sda2 調試文件 1.42.13(2015 年 5 月 17 日) 索引節點:1410 類型:正常模式:0644 標誌:0x80000 世代:0 版本:0x00000000 使用者:0 組:0 大小:**996** 文件 ACL:0 目錄 ACL:0 連結:1 塊數:0 片段: 地址:0 數量:0 大小:0 ctime: 0x5639ad31 -- 2015 年 11 月 4 日星期三 01:01:05 atime: 0x5639ad31 -- 2015 年 11 月 4 日星期三 01:01:05 mtime: 0x5639ad31 -- 2015 年 11 月 4 日星期三 01:01:05 額外 inode 欄位的大小:0 範圍: **(0):46679378**
我用粗體表示了我認為這裡的主要區別。我查看了其他未損壞的 inode,它們顯示的內容與
1410
具有非零大小和範圍的類似。錯誤的標題/範圍在這裡有意義……它沒有範圍……如何在不重新格式化整個
/home
分區的情況下解決這個問題?我真的覺得我已經把這個問題放在銀盤上交給比我聰明的人了,我只是不知道這頓飯(答案)是什麼!
終於在另一個站點上從其他人那裡找到了答案,只是將 inode 歸零並重新檢查了系統,僅此而已!
debugfs -w /dev/sda2 :clri <1415> :clri <1416> :clri <1417> :q fsck -y /dev/sda2
對於遇到此問題的其他人,我發現我的壞 inode
find
在壞掛載上使用,然後檢查dmesg
壞 inode 上的錯誤。