爲什麼要管理磁盤空間?

服務器運行久了,磁盤空間可能會不知不覺被佔滿,導致新軟件無法安裝、服務報錯甚至系統崩潰。比如日誌文件越積越多、臨時文件沒人清理、大文件長期不刪,都會讓磁盤告急。合理管理磁盤空間,能讓服務器更穩定,還能避免不必要的停機。

基礎概念:先懂”倉庫”和”身份證”

要管理磁盤,得先理解兩個核心概念:inode塊(block)

  • inode(身份證):每個文件/目錄都有一個inode,像身份證一樣記錄文件的元數據(大小、修改時間、權限等),但不存文件內容。磁盤空間不足時,可能是inode先被用完(即使磁盤空間還有剩餘)。

  • 塊(block):存儲數據的最小單位,比如4KB/塊。文件內容被拆分成多個塊存儲在磁盤上,inode會記錄這些塊的位置。

如何快速查看磁盤空間?

1. 查看整體磁盤使用情況(df命令)

df -h
  • 參數-h:以人類可讀的單位(GB/MB)顯示,避免數字太複雜。
  • 輸出解釋
  • Filesystem:磁盤設備名(如/dev/sda1)
  • Size:磁盤總容量
  • Used:已用空間
  • Avail:可用空間
  • Use%:使用率(超過85%就該警惕了)
  • Mounted on:掛載點(如/、/home)

2. 查看目錄/文件大小(du命令)

du -sh /path/to/dir  # 查看單個目錄總大小(-s=彙總,-h=人類可讀)
du -ah /var | sort -hr | head -10  # 查看/var目錄下最大的10個文件/目錄
  • du -sh /var/log:快速看日誌目錄大小,日誌常是”空間殺手”。

3. 排查inode使用情況(df -i)

df -i
  • 如果 IUse% 接近100%,即使磁盤空間還有,也無法創建新文件(inode用完了)。

常見問題:磁盤空間突然滿了怎麼辦?

1. 日誌文件過大(最常見)

  • 原因:服務日誌(如Nginx、MySQL)不清理,導致單個日誌文件幾十GB。
  • 解決
  • logrotate 自動管理日誌(系統自帶,會按大小/時間分割日誌)。
  • 手動清理:先備份關鍵日誌(如 cp /var/log/messages messages.bak),再用 > /var/log/messages 清空(日誌會自動重新創建)。

2. 臨時文件堆積(/tmp、/var/tmp)

  • 原因:程序產生的臨時文件未及時清理(如緩存、下載殘留)。
  • 解決
  • tmpwatch 定時清理臨時文件:tmpwatch 72 /tmp(72小時內未修改的文件刪除)。
  • 重啓服務器前手動清理:rm -rf /tmp/*(謹慎,避免刪除正在使用的臨時文件)。

3. 大文件未清理(如備份、舊數據)

  • 原因:備份包、舊版本代碼、大日誌等未及時歸檔。
  • 解決
  • find 查找大文件:find / -type f -size +100M -print0 | xargs -0 du -h(找100MB以上的文件)。
  • 確認後刪除:find / -name "*.old" -delete(刪除所有.old後綴的文件)。

4. 分區設計不合理

  • 原因:所有數據都放在根分區(/),導致單個分區滿後影響全局。
  • 解決
  • 調整分區:若用 LVM(邏輯卷管理),可動態擴容(如 lvextend -L +10G /dev/mapper/root)。
  • 分離分區:/var(日誌)、/home(用戶數據)單獨分區,避免互相影響。

長期優化:如何讓磁盤空間”健康”運行?

1. 定期清理+備份

  • 每週用 cron 任務自動清理臨時文件(0 3 * * 0 /usr/sbin/tmpwatch 7 /tmp)。
  • 定期刪除歷史備份包(如 find /backup -name "*.tar.gz" -mtime +30 -delete)。

2. 用外部存儲分擔壓力

  • 掛載NAS/SAN:將用戶數據(/home)或日誌(/var/log)掛載到單獨存儲設備。
  • 示例:mount /dev/sdb1 /mnt/external_data,之後修改 /etc/fstab 永久掛載。

3. 設置告警+監控

  • nagios/zabbix 監控磁盤使用率,超過80%發郵件告警。
  • 或簡單用 df -h | grep -vE 'tmpfs|udev' | awk '{print $5}' | sort -nr | head -1 檢查最高使用率分區。

4. 避免”踩坑”的注意事項

  • 刪除前確認:用 ls/file 確認文件用途,誤刪系統配置文件會導致服務崩潰。
  • 日誌別亂刪:若日誌文件被服務佔用(如 tail -f 正在看),直接 rm 會導致服務寫日誌失敗,需先重啓服務再清理。
  • 小目錄優先刪:若inode滿,優先刪除/tmp、/var/spool等小文件目錄,而非大文件。

總結

磁盤空間管理是Linux服務器運維的基礎,核心是定期檢查+主動清理+長期規劃。記住:別等磁盤滿了才處理,提前發現問題(如告警)、用工具自動化清理(logrotate、tmpwatch)、分離分區/用外部存儲,就能讓服務器存儲一直”夠用”。

小夜