Mount

訪問特定文件時出現分區錯誤並以只讀方式重新掛載

  • May 12, 2016

我有一個執行 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)

所以我明白髮生了什麼……一些壞塊導致錯誤並且正在以只讀方式重新安裝驅動器以防止進一步損壞。我知道是這些特定文件,因為我可以通過

  1. 以 root 身份登錄
  2. 跑步sync
  3. 停止lightdm(和所有子流程)
  4. /home通過找到它們來停止所有剩餘的打開文件lsof | grep /home
  5. 解除安裝/home
  6. 執行fsck /home(修復錯誤)
  7. 重新安裝/home

一切都很好,讀寫,直到我再次嘗試訪問相同的文件,然後重複整個過程以再次修復它。

我嘗試訪問文件的方式是執行ls /home/path/to/broken/folderand rm -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

對於遇到此問題的其他人,我發現我的壞 inodefind在壞掛載上使用,然後檢查dmesg壞 inode 上的錯誤。

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