答案1
我們先通俗地理解一下inode
透過這樣做...我們為本次演示選擇的檔案系統將是外部2因為它沒有寫日記機制,因此為了示範一些與 inode 相關的問題,很容易被破壞。
讓我們建立一個「磁碟」映像檔:
$ truncate -s 10M myfilesystem
並格式化它
$ mkfs.ext2 myfilesystem
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 2560 4k blocks and 2560 inodes
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
注意 inode 的數量... and 2560 inodes
...這是該磁碟分割區上該檔案系統的永久最大數量...您可以建立盡可能多的檔案(包括目錄在內的所有類型)作為該數字(減去檔案系統的特殊 inode)但在此檔案系統上不超過該數字。
讓我們建立一個掛載點並掛載該檔案系統:
$ mkdir mymount
$
$ mount myfilesystem mymount/
$
$ ls -la mymount/
total 24
drwxr-xr-x 3 root root 4096 May 8 14:24 .
drwxr-xr-x 3 ubuntu ubuntu 4096 May 8 14:29 ..
drwx------ 2 root root 16384 May 8 14:24 lost+found
$
$ df -ih mymount/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/loop1 2.5K 11 2.5K 1% /home/ubuntu/test/mymount
注意使用的索引節點的數量11
...這些稱為特殊索引節點,預設為檔案系統特殊預定義目的保留/使用...讓我們使用更多的索引節點:
$ touch mymount/file{1..2}
$
$ ls -lai mymount/
total 24
2 drwxr-xr-x 3 root root 4096 May 8 14:33 .
2552 drwxr-xr-x 3 ubuntu ubuntu 4096 May 8 14:29 ..
12 -rw-r--r-- 1 root root 0 May 8 14:33 file1
13 -rw-r--r-- 1 root root 0 May 8 14:33 file2
11 drwx------ 2 root root 16384 May 8 14:24 lost+found
$
$ df -ih mymount/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/loop1 2.5K 13 2.5K 1% /home/ubuntu/test/mymount
我們創建了兩個文件並使用了另外兩個 inode,最終得到了11 + 2 = 13
.
讓我們釋放其中之一:
$ rm mymount/file1
$
$ df -ih mymount/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/loop1 2.5K 12 2.5K 1% /home/ubuntu/test/mymount
這是正常13 - 1 = 12
使用的索引節點,我們剛剛釋放的索引節點將在需要時重新使用…索引節點是可回收的。
這是在正常情況下......但是,如果我們在另一個殼裡連續開啟並使用檔案:
$ tail -f mymount/file2
-
然後返回到我們原來的 shell 刪除該文件,然後立即不正常地卸載文件系統:
$ rm mymount/file2 && umount -l myfilesystem
$
$ ls -lai mymount/
total 8
6425 drwxr-xr-x 2 root root 4096 May 8 14:29 .
2552 drwxr-xr-x 3 ubuntu ubuntu 4096 May 8 14:29 ..
然後,再次安裝:
$ mount myfilesystem mymount/
$
$ ls -lai mymount/
total 24
2 drwxr-xr-x 3 root root 4096 May 8 14:44 .
2552 drwxr-xr-x 3 ubuntu ubuntu 4096 May 8 14:29 ..
11 drwx------ 2 root root 16384 May 8 14:24 lost+found
$
$ df -ih mymount/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/loop1 2.5K 12 2.5K 1% /home/ubuntu/test/mymount
請注意,雖然檔案實際上已被刪除,但它的 inode 並未被釋放...這是一個檔案系統損壞「模擬」...讓我們卸載並檢查:
$ umount myfilesystem
$
$ e2fsck myfilesystem
e2fsck 1.46.5 (30-Dec-2021)
myfilesystem was not cleanly unmounted, check forced.
Pass 1: Checking inodes, blocks, and sizes
Deleted inode 13 has zero dtime. Fix<y>? yes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Inode bitmap differences: -13
Fix<y>? yes
Free inodes count wrong for group #0 (2548, counted=2549).
Fix<y>? yes
myfilesystem: ***** FILE SYSTEM WAS MODIFIED *****
myfilesystem: 11/2560 files (0.0% non-contiguous), 170/2560 blocks
讓我們關閉另一個 shell 並再次掛載並檢查:
$ mount myfilesystem mymount/
$
$ df -ih mymount/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/loop1 2.5K 11 2.5K 1% /home/ubuntu/test/mymount
現在您了解如何使用inode 的基礎知識...以及它們可能會出現一些問題以觸發文件系統檢查以及如何...在插入/拔出磁碟或系統突然斷電時也會發生同樣的情況,如下所示文件(特別是系統文件)由系統程序不斷創建/刪除/更新...對於目錄來說有點少,因為通常不可能保持進程打開的目錄,因為它們沒有像普通文件那樣的句柄,但會損壞如果在更新/修改目錄索引節點的元資料時發生上述情況,則目錄索引節點可能會發生這種情況,而且,雖然很少見,但當檔案系統由於磁碟機故障/惡化而失去對某些區塊的存取權限時,也可能會發生這種情況。
但是,大多數 inode 問題都可以透過檔案系統檢查實用程式輕鬆自動修復。
回到你的問題
然而,有時,這些實用程式會遺失路徑,並且不知道如何修復 inode 問題,特別是對於沒有有效可讀元資料的目錄,因為這些工具用於修復 inode 損壞的方法實際上是元資料識別目錄內容、父目錄等的資料。
您包含的螢幕截圖使我很難閱讀和複製文字......但是,您似乎擁有的是索引節點4732284
(在下面/usr/src/linux ... /net/ ...
),它被標記為文件系統中的一個目錄,但是,缺乏描述它與其父級的關係的通常元數據,這使得它成為孤立的,並且它不佔用通常的一個塊空間,例如,4k
而是佔用0
空間,因此NULL
......大多數檔案系統檔案的大小允許為 null/0,目錄則不允許,請參閱這個帖子和這個帖子更多細節。
這類問題,如果它沒有顯著增加,則可能表示磁碟機故障/損壞和損壞的區塊,不是一個大問題,應該是無害的...要以簡單的方式擺脫它,您只需要使用它...即在該目錄中創建一個文件,然後刪除它以更新其元信息,以便它繼續回到使用完整的檔案系統區塊大小並且看起來有點正常...該目錄應該很容易發現,因為它將0
在eg的輸出中顯示大小ls -la
,並且在使用它之後,它應該4k
像其他目錄一樣顯示通常的區塊大小eg在同一個檔案系統上...如果這還不足以使其恢復正常,則可以透過設定其所有權(例如)chown root:root
或更改其權限(例如)來進一步調整它,chmod 755
直到顯示除該目錄ls -la
之外的某個大小。0
然後卸載包含的檔案系統並再次運行檔案系統檢查實用程序,這次應該可以修復它。
這應該可行,但如果不起作用,那麼你有兩個選項...任何一個使用檔案系統調試器,例如debugfs
手動修復/刪除該 inode 條目或者或備份資料並重新格式化該磁碟分割區。