Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 磁碟空間分析實戰:df 與 du 指令進階用法與差異解析

編輯:Linux 教學

前言

Linux 系統管理中,df(Disk Free)與 du(Disk Usage)是磁碟空間分析的雙核心工具。df 掌握檔案系統整體容量,du 深入檔案與目錄實際佔用。兩者配合使用,能快速定位空間異常根因。本文詳細解析進階用法、常見參數、差異成因與實務排查流程。

一、df 指令:檔案系統級視角

核心輸出欄位

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       3.9G  300M  3.4G   8%  /
/dev/sda7       100G  188M   95G   1%  /data0
/dev/sdb1       133G   80G   47G  64%  /data1
  • Filesystem:區塊裝置或遠端掛載來源
  • Size/Used/Avail:總量/已用/可用(含保留給 root 的空間)
  • Use%:使用率(FreeBSD 可能超過 100%,因保留 root 空間)
  • Mounted on:掛載點

進階參數

  • df -h:人類可讀單位(K/M/G)
  • df -H:SI 單位(1000 進位)
  • df -T:顯示檔案系統類型(ext4、xfs、vfat、nfs...)
  • df -i:顯示 inode 使用量(關鍵:inode 耗盡導致無法建檔)
  • df -x 檔案系統類型:排除特定類型(如 df -x tmpfs -x devtmpfs)
  • df --output=source,size,used,avail,pcent,target:自訂輸出欄位(適合腳本解析)

二、du 指令:檔案/目錄級視角

核心參數

  • du -h:人類可讀單位
  • du -s / --summarize:僅顯示總計
  • du -d 深度 / --max-depth=深度:限制遞迴層數(極實用)
  • du -a / --all:包含檔案(預設僅目錄)
  • du -c / --total:顯示總計
  • du -x / --one-file-system:不跨越檔案系統邊界
  • du --exclude=模式:排除特定檔案/目錄
  • du -b / --bytes:以 bytes 為單位

實戰範例

# 查看當前目錄下一級子目錄大小(含檔案)
du -h --max-depth=1

# 查看當前目錄下所有檔案與一級子目錄大小
du -h --max-depth=1 *

# 找出 /var/log 下佔用空間最大的 10 個檔案/目錄
du -h /var/log | sort -hr | head -10

# 排除特定目錄(如快照、備份)
du -h --max-depth=1 --exclude='*snapshot*' --exclude='*backup*'

# 僅統計特定檔案類型
find . -name "*.log" -exec du -ch {} + | tail -1

注意:FreeBSD du 指定深度參數為 -d,Linux 為 --max-depth。

三、核心差異:為何 df 與 du 數值不一致?

維度dudf
統計對象檔案與目錄實際資料區塊檔案系統區塊分配圖
包含中繼資料否是(inode、superblock、bitmap、journal...)
已刪除但開啟的檔案不計入(目錄項已移除)計入(區塊未釋放)
稀疏檔案統計實際佔用區塊統計邏輯大小(視檔案系統)
硬連結重複計算每個連結僅計算一次實體區塊

經典場景:大檔案被刪除但進程仍持有

# 現象:df 顯示空間未釋放,du 顯示已釋放
# 定位佔用進程
lsof | grep deleted
# 或
lsof +L1

# 輸出範例:
# java    1234 user  4u   REG  253,0  10G  12 /var/log/app.log (deleted)

# 解決:重啟該進程或發送信號觸發日誌輪轉
kill -USR1 1234  # 視應用支援度

四、實務排查流程:從「磁碟滿」到「根因定位」

  1. 宏觀檢視:df -hT 找出使用率 > 80% 的掛載點
  2. Inode 檢查:df -i 確認 inode 是否耗盡(大量小檔案常見)
  3. 微觀定位:進入高使用率掛載點,du -h --max-depth=1 找出大目錄
  4. 深入剖析:du -h --max-depth=1 大目錄/* 定位到檔案層級
  5. 差異診斷:若 df >> du,檢查 lsof | grep deleted、journalctl --disk-usage、snap list --all(snap 佔用)
  6. 清理行動:清理日誌、臨時檔、舊核心、Docker 垃圾(docker system prune -a)、snap 版本

五、進階技巧與工具推薦

1. ncdu:互動式磁碟分析神器

# 安裝
yum install ncdu  # 或 apt-get install ncdu
# 使用
ncdu /var  # 互動式瀏覽、排序、刪除

2. 找出大檔案

# 找出系統中大於 100MB 的檔案
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -hr

# 找出 /var/log 下大於 50MB 的日誌檔
find /var/log -type f -name "*.log" -size +50M -ls

3. 清理系統日誌

# systemd journal 限制大小
echo "SystemMaxUse=500M" >> /etc/systemd/journald.conf
systemctl restart systemd-journald

# 手動清理
journalctl --vacuum-size=500M
journalctl --vacuum-time=30d

4. Docker 空間清理

docker system df          # 查看 Docker 空間佔用
docker system prune -a    # 清理未使用的映像、容器、網路、建構快取
docker builder prune -a   # 清理建構快取

結語

掌握 df 與 du 的統計視角差異,配合 lsof、find、ncdu 等工具,能將磁碟空間排查效率提升數倍。關鍵心法:宏觀用 df、微觀用 du、異常查 lsof、清理要有策略。建立定期巡檢腳本(含 df -h、df -i、關鍵目錄 du 告警),將空間風險消滅在萌芽狀態。

Copyright © Windows教程網 All Rights Reserved