開始輸入,可搜尋發票、服務、域名、工單,以及 更多...
網站打不開、資料庫寫入失敗、日誌提示“No space left on device”,往往是磁碟被佔滿了。本文介紹 Linux 檢視與清理磁碟空間的實用方法:用 df -h 和 du 定位佔用,用 ncdu 互動式分析,用 find 查詢大檔案,再針對系統日誌、軟體快取和 Docker 進行安全清理。命令適用於 Debian/Ubuntu 與 CentOS/Rocky/AlmaLinux,建議以 root 執行。
df -hT 顯示每個檔案系統的總容量、已用空間和使用率,先找出哪個掛載點接近 100%。同時用 df -i 檢查 inode:如果小檔案數量過多導致 inode 用盡,即使還有空間也會報磁碟已滿,常見於大量快取或 session 檔案。
df -hT # space usage per filesystem
df -i # inode usage (100% also means "No space left on device")
從根目錄開始統計各一級目錄的大小,按大小排序後進入最大的目錄繼續查詢。-x 引數保證只統計當前檔案系統,避免把掛載的資料盤也算進去。常見的“空間大戶”有 /var/log、/var/lib/docker、/var/lib/mysql、網站目錄和備份目錄。
# Size of each top-level directory on the root filesystem, largest last
du -xh --max-depth=1 / 2>/dev/null | sort -h
# Drill down, e.g. into /var
du -xh --max-depth=1 /var 2>/dev/null | sort -h
ncdu 是基於終端的磁碟分析工具,掃描後可以用方向鍵進入目錄、按 d 刪除檔案,比反覆執行 du 方便得多。
# Debian / Ubuntu
apt install -y ncdu
# CentOS / Rocky / AlmaLinux (ncdu is in EPEL)
dnf install -y epel-release && dnf install -y ncdu
ncdu -x /
直接列出超過 500 MB 的檔案,通常能快速發現遺忘的備份包、匯出的資料庫或異常膨脹的日誌。刪除前請確認檔案用途,不確定的檔案可以先移動到其他磁碟。
# Files larger than 500 MB on the root filesystem
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h
systemd 日誌(journal)長期執行後可能佔用數 GB,可以用 journalctl 按大小或時間清理。正在被程式寫入的大日誌不要直接 rm,而是用 truncate 清空,否則空間不會釋放。軟體包快取也可以放心清理。
journalctl --disk-usage
journalctl --vacuum-size=200M
journalctl --vacuum-time=7d
# Empty a large log file that a running program still writes to (do not rm it)
truncate -s 0 /var/log/nginx/access.log
# Package manager caches
apt clean # Debian / Ubuntu
dnf clean all # CentOS / Rocky / AlmaLinux
為防止日誌再次膨脹,可以給 journald 設定上限:
# Permanently cap the journal size
mkdir -p /etc/systemd/journald.conf.d
printf '[Journal]\nSystemMaxUse=500M\n' > /etc/systemd/journald.conf.d/size.conf
systemctl restart systemd-journald
使用 Docker 的伺服器中,停止的容器、無用映象和構建快取會持續累積在 /var/lib/docker。先用 docker system df 檢視佔用,再按需清理。
docker system df
docker container prune -f
docker image prune -a -f
docker builder prune -f
# Removes everything unused, including volumes - check first!
docker system prune -a --volumes
--volumes 的清理會刪除所有未被容器使用的資料卷,其中可能包含資料庫資料。執行前請確認不需要這些資料卷。如果刪除了大檔案但 df 顯示空間沒有減少,說明仍有程序開啟著該檔案。用 lsof 找出這些程序並重啟對應服務,空間就會被釋放。
# Deleted files still held open by a process
lsof +L1 2>/dev/null | head -n 20
# Restart the process that holds them, e.g.
systemctl restart nginx
常見原因有兩種:一是存在已刪除但仍被程序佔用的檔案(見步驟 7);二是有檔案藏在掛載點下面,被後來掛載的磁碟“蓋住”了。前者重啟程序即可,後者需解除安裝掛載點後檢查。
帶日期或 .gz 字尾的歷史輪轉日誌一般可以刪除;當前正在寫入的日誌建議用 truncate 清空。長期方案是配置 logrotate 定期輪轉與壓縮。
可以考慮把網站、資料庫或備份遷移到資料盤,或升級磁碟容量後按照 LVM/growpart 擴容教程擴充套件分割槽。
如按以上步驟操作後仍無法解決,歡迎提交工單聯絡 IMIDC 7×24 技術支援。提交時請註明伺服器 IP、作業系統、已執行的命令和報錯截圖,工程師可以更快定位問題。