df 顯示磁盤 100%,du 卻沒占多少空間?真正原因就這三種情況!
作者:運維李哥
今天分享一下 df 與 du 的本質區別,并列舉幾個相關的常見磁盤處理案例。
今天分享一下df與du的本質區別,并列舉幾個相關的常見磁盤處理案例。
1. df 與 du 的本質區別
命令 | 工作原理 | 顯示內容 |
df | 讀取 文件系統元數據 | 統計磁盤分區整體使用情況(包含“不可見”文件) |
du | 遍歷 實際目錄樹 | 僅統計當前目錄下用戶可訪問的文件大小 |
也就是說:du 是你能“看見”的,df 是磁盤系統“知道”的!
因為df與du都是為了查看磁盤使用情況,我畫了個磁盤空間整體的排查流程圖:
下面主要講解du顯示與df顯示不一樣可能潛在的三種常見原因。
2. 刪除了文件但空間未釋放
(1) 場景描述:
- 某個大日志文件被 rm 刪除了;
- 但該文件仍被某個服務(如 Nginx、Java、Python 等)占用;
- df 顯示空間沒釋放,而 du 看不到這個文件了!
(2) 如何驗證?
lsof | grep deleted
(3) 解決方案:
# 殺掉占用文件的進程
kill -9 進程ID
# 或者重啟服務(推薦)
systemctl restart 服務名
3. 掛載點覆蓋了原數據
(1) 場景描述:
- 原本寫入 /data 下的大文件;
- 后來你掛載了一個磁盤到 /data,把原來的內容“遮住”了;
- du 只看到掛載后的目錄內容,df 依然計算之前“被遮擋”的那部分。
(2) 如何驗證?
# 檢查當前掛載
mount | grep data
# 查看原始掛載點所在目錄
umount /data
ls -lh /data # 你可能會看到消失的大文件
(3) 解決方案:
- 臨時卸載該目錄;
- 刪除原本隱藏的大文件;
- 或者創建一個新目錄掛載點(避免覆蓋);
- 重新掛載新掛載點上;
- 更新 fstab,設置永久掛載
4. inode 耗盡
(1) 場景描述:
- df 顯示還剩幾 G;
- 但無法創建新文件,提示 No space left on device;
- 原因其實是 inode 用完了!
(2) 檢查 inode 使用情況
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 655360 655360 0 100% /
(3) 排查哪個目錄有大量小文件
find /var -type f | wc -l
(4) 解決方案:
清理緩存目錄,如:
rm -rf /var/cache/*
- 優化程序避免大量小文件;
- 考慮用 xfs 等 inode 更寬裕的文件系統。
責任編輯:趙寧寧
來源:
運維李哥不背鍋