跳到主內容

Linux 磁碟空間排查與清理標準作業流程 (SOP)

Linux 磁碟空間排查與清理標準作業流程 (SOP)

階段一:快速定位受影響磁碟分割區 (Filesystem)

Bash
# 1. 檢視各磁碟掛載點空間使用率 (以人類可讀單位顯示)
df -h

# 2. 檢查 Inode 使用率 (避免容量未滿但 Inode 耗盡導致無法寫入)
df -i

階段二:由大到小逐層定位目錄與檔案 (Drill-Down)

1. 檢查根目錄或特定目錄下各子目錄大小

Bash
# 檢查第一層目錄容量並排序 (排除 proc/sys 等虛擬檔案系統報錯)
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -n 20

# 包含隱藏目錄/檔案 (適用於家目錄排查,如 /home/user)
du -sh /home/tomcat/{.[!.],}* 2>/dev/null | sort -hr | head -n 15

2. 跨層級搜尋超大檔案 (Top Large Files)

Bash
# 列出指定目錄下最大的前 10 個檔案
find /path/to/target -type f -exec du -h {} + 2>/dev/null | sort -hr | head -n 10

# 搜尋大於 500MB 或 1GB 的單一檔案
find / -type f -size +500M -exec ls -lh {} + 2>/dev/null

階段三:常見高佔用項目清理語法

1. 應用程式快取與依賴套件

  • NPM Cache:

    Bash
    # 透過 npm 工具清空
    npm cache clean --force
    
    # 若無指令或強制刪除實體檔案
    rm -rf ~/.npm/_cacache/*
    
  • Yarn / Pnpm Cache:

    Bash
    yarn cache clean
    pnpm store prune
    

2. 日誌檔案 (Logs)

重要原則:運作中的服務日誌切勿直接 rm,否則因 Process 持有 File Descriptor,磁碟空間不會釋放(見階段五)。應使用 truncate 清空內容。

  • PM2 Logs:

    Bash
    pm2 flush
    
  • 傳統 Application / Nginx / Tomcat 日誌:

    Bash
    # 將日誌內容清空為 0-byte (安全作法)
    truncate -s 0 /path/to/logfile.log
    # 或使用 shell 重導向
    : > /path/to/logfile.log
    
  • Systemd Journal 日誌:

    Bash
    # 僅保留最近 7 天的 journal
    journalctl --vacuum-time=7d
    
    # 或限制 journal 總量上限在 500MB
    journalctl --vacuum-size=500M
    

3. 容器與 CI/CD 建置暫存 (Docker / GitLab Runner)

  • Docker 清理:

    Bash
    # 清理停止的容器、未使用的網路與 Dangling 映像檔
    docker system prune -f
    
    # 深度清理:包含未使用的 Volumes 與 Build Cache
    docker system prune -a --volumes -f
    
    # 單獨清理 Buildx 建置快取
    docker builder prune -a -f
    
  • GitLab Runner 快取:

    Bash
    # 清空 runner 的 builds 與 cache 目錄
    rm -rf /home/gitlab-runner/cache/*
    rm -rf /home/gitlab-runner/builds/*
    

4. 系統套件庫快取 (OS Package Manager)

  • Debian / Ubuntu (APT):

    Bash
    sudo apt-get clean
    sudo apt-get autoremove -y
    
  • RHEL / CentOS / Rocky Linux (YUM / DNF):

    Bash
    sudo dnf clean all
    # 或
    sudo yum clean all
    

階段四:清理命令誤觸留下的異常檔案 (0-Byte 殘留)

常見於 curl 或 wget 語法錯誤時產生的 HTTP Header 檔名:

Bash
rm -f ./Accept: ./GET ./Host: ./User-Agent: ./--header

階段五:特殊狀況排查(刪了檔案空間卻未釋放)

若 rm 刪除大檔後 df -h 空間依然未釋放,表示該檔案仍被運行中的行程開啟中(Deleted Handle)。
Bash
# 1. 查詢處於 deleted 狀態但被行程佔用的檔案
lsof +L1
# 或
lsof | grep '(deleted)'

# 2. 解決方式:
# A. 重啟持有該檔案的服務 (最佳實踐)
systemctl restart <service_name>

# B. 若無法中斷服務,直接對該 Process 的 File Descriptor 進行清空
# 假設 PID 為 12345,FD 為 3
: > /proc/12345/fd/3

階段六:驗證結果

Bash
# 再次檢視掛載點容量是否下降
df -h

# 驗證特定目錄清理後的容量
du -sh /path/to/target