inodes過載問題解決 :Free inodes is less than 20% on volume /
一、inode是什麼?
理解inode,要從檔案儲存說起。
檔案儲存在硬碟上,硬碟的最小儲存單位叫做”扇區”(Sector)。每個扇區儲存512位元組(相當於0.5KB)。
作業系統讀取硬碟的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個”塊”(block)。這種由多個扇區組成的”塊”,是檔案存取的最小單位。”塊”的大小,最常見的是4KB,即連續八個 sector組成一個 block。
檔案資料都儲存在”塊”中,那麼很顯然,我們還必須找到一個地方儲存檔案的元資訊,比如檔案的建立者、檔案的建立日期、檔案的大小等等。這種儲存檔案元資訊的區域就叫做inode,中文譯名為”索引節點”。
每一個檔案都有對應的inode,裡面包含了與該檔案有關的一些資訊。
所以當inode用完也會出現No space left on device, 造成磁碟的不可寫入.
二:問題出現場景
今天zabbix報警,一臺伺服器的disk滿了,使用du -sh * 或 du -sh /* 檢視目錄的大小,查詢佔用空間大的目錄/var/spool/clientmqueue….
然後我就想/var/spool/clientmqueue這個目錄幹嘛用的,糾結了半天,谷歌了下,原來/var/spool/clientmqueue是如果系統中有使用者開啟了cron,而cron中執行的程式有輸出內容,輸出內容會以郵件形式發給cron的使用者,而sendmail沒有啟動所以就產生了這些檔案。
伺服器上確實有cron定時執行數十個指令碼,而且都沒有設定輸出定向,日積月累的檔案都被儲存在/var/spool/clientmqueue目錄下面樂 = =.
三:解決
解決方法:在cron的自動執行語句後加上> /dev/null 2>&1
例:
4 3 * * * /usr/bin/w > /dev/null 2>&1
這樣就OK拉,就不會寫到那個目錄下了….
恢復的唯一辦法就是刪除這些檔案, 此方法僅僅用於大量的臨時檔案和快取佔用的inode. 如果資料不可刪除, 就要想辦法增加空間了。這裡只講怎麼找到這些檔案和刪除它們.
檢查inode剩餘
在這裡我的inode用的就很多了。
首先找到這些佔用的無用檔案
for i in /*; do echo $i; find $i |wc -l; done
執行上面的語句後, 會順序從根目錄的子目錄迴圈查詢, 如果有一個目錄卡了很久, 就說明此目錄可能存在很多檔案.
然後到這個目錄下繼續查詢
迴圈這個過程直到找到.
找到後酌情刪除,刪除後inode就會釋放.
在這裡說一點,/var/spool/clientmqueue目錄檔案太多,rm -rf *時候會提示:
“-bash: /bin/rm: Argument list too long“.. 意思是引數太長,rm 幹不了。
可以用ls | xargs rm -f這個命令將/var/spool/clientmqueue目錄下所有檔案刪除。
由於使用aws伺服器,無法直接刪除,特寫刪除指令碼如下:
#!/bin/bash
cd /var/spool/clientmqueue
filelist=`ls /var/spool/clientmqueue/`
for file in $filelist
do
echo $file
sudo chown ec2-user:ec2-user $file
sudo rm -rf $file
#sleep 2;
done