Filesystems

查找使用 inode 的位置

  • August 2, 2021

所以我在我們的一個盒子上收到了來自我們的監控系統的警告,說文件系統上的空閒 inode 數量越來越少。

df -i輸出顯示:

Filesystem       Inodes  IUsed    IFree IUse% Mounted on
/dev/xvda1       524288 422613   101675   81% /

如您所見,根分區使用了 81% 的 inode。

我懷疑它們都在一個目錄中使用。但是我怎樣才能找到它在哪裡呢?

我在 stackoverflow 上看到了這個問題,但我不喜歡任何答案,而且這確實是一個應該在 U&L 上出現的問題。

基本上,文件系統上的每個文件都使用一個 inode。因此,用完 inode 通常意味著您有很多小文件。所以問題真的變成了,“哪個目錄有大量文件?”

在這種情況下,我們關心的文件系統是根文件系統/,所以我們可以使用以下命令:

{ find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n; } 2>/dev/null

這將轉儲文件系統上每個目錄的列表,前綴為該目錄中的文件(和子目錄)數。因此,文件數量最多的目錄將位於底部。

就我而言,這會出現以下情況:

  1202 /usr/share/man/man1
  2714 /usr/share/man/man3
  2826 /var/lib/dpkg/info
306588 /var/spool/postfix/maildrop

所以基本上/var/spool/postfix/maildrop是消耗所有的inode。

*注意,這個答案確實有我能想到的三個警告。它不能正確處理路徑中帶有換行符的任何內容。我知道我的文件系統沒有帶有換行符的文件,並且由於這僅用於人類消費,因此潛在的問題不值得解決,並且始終可以替換上述and命令的\nwith\0和 use-z選項,如下所示:sort``uniq

{ find / -xdev -printf '%h\0' |sort -z |uniq -zc |sort -zk1rn; } 2>/dev/null

或者,您可以添加head -zn10到命令中以獲取前 10 個最常用的 inode。

如果文件分佈在大量目錄中,它也無法處理。不過這不太可能,所以我認為風險是可以接受的。它還會多次計算指向同一個文件的硬連結(因此只使用一個 inode)。同樣,不太可能給出誤報*


我不喜歡 stackoverflow 答案中的任何答案的關鍵原因是它們都跨越了文件系統邊界。由於我的問題出在根文件系統上,這意味著它將遍歷每個已安裝的文件系統。拋出-xdevfind 命令甚至無法正常工作。

例如,最受好評的答案是這個:

for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n

如果我們將其改為

for i in `find . -xdev -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n

即使/mnt/foo是一個掛載,它也是根文件系統上的一個目錄,所以它會出現在 中find . -xdev -type d,然後它會被傳遞給ls -a $i,它將潛入掛載。

我的find答案中列出了掛載上每個文件的目錄。所以基本上具有文件結構,例如:

/foo/bar
/foo/baz
/pop/tart

我們最終得到

/foo
/foo
/pop

所以我們只需要計算重複行的數量。

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