df -h 顯示磁碟使用率僅 70%,但 df -hi 卻顯示某分區 IUse% 達 100% —— 經典的 inode 耗盡導致「無法建立新檔案」。本文提供兩階段定位異常目錄的指令組合,並說明監控與根因消除策略。

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 14G 5.2G 73% /
# df -hi
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 1.3M 1.3M 0 100% /
磁碟容量充足,但 inode 已滿,無法建立新檔案(含目錄、Socket、Pipe 等)。
find / -type d -size +10M
列出佔用超過 10 MB 的目錄(目錄本身佔用大通常意味包含極多檔案)。
若階段一無明顯異常目錄,改用統計各一級目錄檔案總數:
cd /
find */ ! -type l | cut -d/ -f1 | uniq -c | sort -rn
find */ ! -type l:列出所有一級子目錄下的所有檔案(排除符號連結)cut -d/ -f1:取一級目錄名uniq -c | sort -rn:統計數量並由大到小排序若發現 /data 佔用最多,繼續深入:
cd /data
find */ ! -type l | cut -d/ -f1 | uniq -c | sort -rn
層層遞進,直至鎖定具體目錄。
| 根因 | 典型路徑 | 清理建議 |
|---|---|---|
| PHP Session 檔案堆積 | /var/lib/php/session/ | 調整 session.gc_maxlifetime、啟用 session.gc_probability、定期 cron 清理 |
| 郵件佇列卡住 | /var/spool/postfix/maildrop/ | 檢查 Postfix 配置、清理郵件佇列 postsuper -d ALL |
| 快取/暫存檔未清理 | /tmp、/var/cache、應用自定義快取目錄 | 設定 tmpwatch/systemd-tmpfiles、應用層面定期清理 |
| 大量小日誌檔 | /var/log、應用日誌目錄 | 啟用 logrotate、合併為單一檔案、限制檔案數量 |
| 容器/虛擬機映像層 | /var/lib/docker、/var/lib/libvirt/images | 清理未使用映像 docker image prune、精簡層數 |
# 納入監控系統(Prometheus + node_exporter)
# 告警規則範例
- alert: InodeUsageHigh
expr: (node_filesystem_files{mountpoint="/"} / node_filesystem_files_total{mountpoint="/"}) > 0.85
for: 10m
labels:
severity: warning
annotations:
summary: "Inode usage > 85% on {{ $labels.instance }}"
description: "Mount point {{ $labels.mountpoint }} inode usage is {{ $value | humanizePercentage }}"
收到告警後,依本文兩階段指令快速定位、清理、並回報開發/應用團隊從源頭修正(如調整 Session GC、啟用 logrotate),避免復發。
Linux 環境變數 PATH 修改完全指南:臨時、永久、用戶級、系統級四種場景
Linux 安裝配置 NetPas 遊戲加速器:VirtualBox + Windows XP + NAT32 完整方案
Linux 進程核心知識體系:從 fork/exec 到僵屍/孤兒進程全解析
Linux Apache 解決 GBK/GB2312 網頁亂碼:httpd.conf AddDefaultCharset 五種修正方案
Linux tail 指令完整指南:即時追蹤日誌、顯示末 N 行、從第 N 行開始、多檔案監控