ESC

開始輸入,可搜尋發票、服務、域名、工單,以及 更多...

搜尋... Ctrl+K
Linux 伺服器

Linux 磁碟空間不足怎麼辦:檢視與清理磁碟空間、查詢大檔案

7 個步驟 7 分鐘閱讀 1620 次閱讀 52
本文目錄

網站打不開、資料庫寫入失敗、日誌提示“No space left on device”,往往是磁碟被佔滿了。本文介紹 Linux 檢視與清理磁碟空間的實用方法:用 df -h 和 du 定位佔用,用 ncdu 互動式分析,用 find 查詢大檔案,再針對系統日誌、軟體快取和 Docker 進行安全清理。命令適用於 Debian/Ubuntu 與 CentOS/Rocky/AlmaLinux,建議以 root 執行。

步驟 1:用 df -h 檢視磁碟空間使用情況

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")

步驟 2:用 du 逐級定位佔用空間的目錄

從根目錄開始統計各一級目錄的大小,按大小排序後進入最大的目錄繼續查詢。-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

步驟 3:使用 ncdu 互動式分析磁碟

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 /

步驟 4:用 find 查詢 Linux 大檔案

直接列出超過 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

步驟 5:清理系統日誌與軟體包快取

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

步驟 6:Docker 磁碟空間清理

使用 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 的清理會刪除所有未被容器使用的資料卷,其中可能包含資料庫資料。執行前請確認不需要這些資料卷。

步驟 7:處理已刪除但未釋放空間的檔案

如果刪除了大檔案但 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

常見問題

du 統計的總量和 df 顯示的已用空間不一致?

常見原因有兩種:一是存在已刪除但仍被程序佔用的檔案(見步驟 7);二是有檔案藏在掛載點下面,被後來掛載的磁碟“蓋住”了。前者重啟程序即可,後者需解除安裝掛載點後檢查。

/var/log 下哪些日誌可以刪?

帶日期或 .gz 字尾的歷史輪轉日誌一般可以刪除;當前正在寫入的日誌建議用 truncate 清空。長期方案是配置 logrotate 定期輪轉與壓縮。

清理後空間仍然不夠怎麼辦?

可以考慮把網站、資料庫或備份遷移到資料盤,或升級磁碟容量後按照 LVM/growpart 擴容教程擴充套件分割槽。

如按以上步驟操作後仍無法解決,歡迎提交工單聯絡 IMIDC 7×24 技術支援。提交時請註明伺服器 IP、作業系統、已執行的命令和報錯截圖,工程師可以更快定位問題。

這篇文章有幫助嗎?

相關教程