問題描述
在雲服務器ECS Linux系統內創建文件時,出現類似如下空間不足提示:
No space left on device …
問題原因
導致該問題的可能原因包括:
- 磁盤分區空間使用率達到百分之百。
- 磁盤分區inode使用率達到百分之百。
- 殭屍文件:已刪除文件因句柄被佔用未釋放導致相應空間未釋放。
- 掛載點覆蓋:在原有文件系統的相應目錄下已經存在大量文件。掛載了新磁盤後,導致使用
df
命令能統計到相關空間使用,而使用su
命令統計不到。
處理辦法
不同的原因需要通過不同的方法解決:
分區容量滿
如果是分區容量滿導致磁盤空間滿,按以下步驟操作:
運行
df -h
查看磁盤使用率。返回結果如下圖所示。注意:
返回結果裏Mounted on
下顯示的是掛載目錄。循環執行如下指令,找到容量比較大的目錄並進入目錄,直到找到最精確的文件或目錄,再結合業務情況等判斷,刪除相關文件或目錄。您也可以購買更大的數據盤來分擔處理。
cd /
du -sh *
inode容量滿
如果是inode容量滿導致磁盤空間滿,按以下步驟操作:
運行以下命令分析根目錄下每個目錄下面有多少個文件。
for i in /*; do echo $i; find $i | wc -l; done
返回結果如下圖所示。
逐層進入inode佔用最高的目錄,繼續執行上述指令,逐步定位佔用過高空間的文件或目錄,最後進行相應清理。
修改inode數量
ECS Linux 實例的inode節點中,記錄了文件的類型、大小、權限、所有者、文件連接的數目、創建時間與更新時間等重要的信息,還有一個比較重要的內容就是指向數據塊的指針。一般情況不需要特殊配置;如果存放文件很多,需要配置。有時磁盤空間有剩餘但是不能存放文件,可能是由於inode耗盡所致。
按以下步驟調整inode節點數量:
注意:
inode的調整需要重新格式化磁盤,請確保您已經備份了數據再執行以下操作。
運行以下命令查詢inode使用情況。
df -i
返回結果如下圖所示。
運行以下命令卸載系統文件。假設卸載的文件系統爲 /home。
umount /home
運行以下命令重新建立文件系統,指定inode節點數。
mkfs.ext3 /dev/xvdb -N 1638400
(可選)運行命令
vim /etc/fstab
修改fstab文件。運行以下命令查看修改後的inode節點數。
dumpe2fs -h /dev/xvdb | grep node
返回結果如下圖所示。
殭屍文件分析刪除
如果磁盤和inode都沒有問題,則需要查看是否存在未被清除句柄的僵死文件。這些文件實際上已經被刪除,但是有服務程序在使用這些文件,導致這些文件一直被佔用,無法釋放磁盤空間。如果這些文件過多,會佔用很大的磁盤空間。
按以下步驟查看並刪除殭屍文件:
運行以下命令安裝lsof。
yum install lsof -y
運行以下命令查看殭屍文件佔用情況。
lsof |grep delete | more
返回結果示例如下圖所示。
採用以下方法釋放句柄,以清除殭屍文件:
- 重啓服務器。
- 正常停止或殺掉佔用這些文件的服務進程。
掛載點覆蓋
先取消磁盤掛載,再檢查原掛載目錄下的空間佔用情況。