查找使用 inode 的位置
所以我在我們的一個盒子上收到了來自我們的監控系統的警告,說文件系統上的空閒 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命令的
\n
with\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 答案中的任何答案的關鍵原因是它們都跨越了文件系統邊界。由於我的問題出在根文件系統上,這意味著它將遍歷每個已安裝的文件系統。拋出
-xdev
find 命令甚至無法正常工作。例如,最受好評的答案是這個:
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
所以我們只需要計算重複行的數量。