幫助中心

伺服器、網路和帳戶的分步教程。

Linux 伺服器

Linux 硬碟空間已滿怎麼辦?VPS 找出並釋放磁碟空間教程

Linux 硬碟空間已滿怎麼辦?VPS 找出並釋放磁碟空間教程

“No space left on device”幾乎會讓伺服器上所有東西出問題:資料庫無法寫入、網站返回錯誤、軟體包更新失敗,有時甚至無法正常登入。本文一步步說明如何排除 Linux 硬碟空間已滿:先確認是資料塊還是 inode 用完,再用 du 與 ncdu 找出佔用空間的元兇,最後從 systemd 日誌、apt/dnf 快取、Docker、過大的日誌檔案,以及已刪除但仍被開啟的檔案中釋放磁碟空間。命令涵蓋 Debian、Ubuntu、CentOS 7 與 Rocky Linux / AlmaLinux 8、9。

步驟 1:用 df -hT 與 df -i 檢查磁碟使用量

先找出是哪個檔案系統滿了。即使還有好幾 GB 空間,只要 inode 用完,磁碟同樣會顯示“已滿”——應用程式產生數百萬個小檔案時就會發生。

df -hT          # space per file system, with type
df -i           # inodes: IUse% at 100% also means "No space left on device"

若 Use% 達到 100%,請繼續步驟 2;若只有 IUse% 偏高,請直接跳到步驟 9。

步驟 2:用 du 找出大型目錄與檔案

du 會統計每個目錄的大小。-x 引數只計算同一個檔案系統,避免掛載的硬碟與虛擬檔案系統干擾結果。請一層一層往下追查。

# Largest top-level directories on the root file system
du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -n 15
# Drill down into the biggest one, for example /var
du -xh --max-depth=1 /var 2>/dev/null | sort -h | tail -n 15

# Single files larger than 200 MB
find / -xdev -type f -size +200M -exec ls -lh {} + 2>/dev/null | sort -k5 -h

步驟 3:用 ncdu 互動式瀏覽磁碟使用量

ncdu 只掃描一次,就能用方向鍵瀏覽整個目錄樹,比反覆執行 du 快得多。若磁碟完全滿到無法安裝,請先用步驟 4 或步驟 5 釋放一點空間。

# Debian / Ubuntu
apt install -y ncdu
# Rocky Linux / AlmaLinux / CentOS (from EPEL)
dnf install -y epel-release && dnf install -y ncdu

ncdu -x /       # arrows to browse, d = delete, q = quit

步驟 4:縮減 systemd 日誌(journalctl --vacuum)

啟用持久化日誌的系統,/var/log/journal 可能長到好幾 GB。vacuum 會安全地刪除最舊的歸檔日誌,設定大小上限則能避免問題再次發生。

journalctl --disk-usage
journalctl --vacuum-size=200M      # or: journalctl --vacuum-time=14d

# Cap the journal permanently
mkdir -p /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/size.conf <<'EOF'
[Journal]
SystemMaxUse=200M
EOF
systemctl restart systemd-journald

步驟 5:清理 apt / dnf 快取與舊核心

已下載的軟體包與舊核心是最快見效的清理目標,在小容量的雲伺服器硬碟上尤其明顯。

# Debian / Ubuntu
apt clean
apt autoremove --purge

# Rocky Linux / AlmaLinux 8, 9
dnf clean all
dnf remove $(dnf repoquery --installonly --latest-limit=-2 -q)   # keep 2 newest kernels

# CentOS 7
yum clean all
yum install -y yum-utils && package-cleanup --oldkernels --count=2

步驟 6:安全處理大型日誌檔案

/var/log 或網站目錄中的應用程式日誌,是硬碟被塞滿的常見原因。不要直接 rm 仍在被服務寫入的日誌,空間並不會釋放(見步驟 8)。請改用 truncate 清空,再修正日誌輪轉設定。

# Log files larger than 100 MB
find /var/log -type f -size +100M -exec ls -lh {} +

# Empty a live log WITHOUT deleting it (the service keeps writing)
truncate -s 0 /var/log/nginx/access.log

# Remove compressed rotated logs older than 14 days
find /var/log -type f -name '*.gz' -mtime +14 -delete

# Dry-run logrotate to see why a log is not rotating
logrotate -d /etc/logrotate.conf

步驟 7:清理 Docker 佔用的空間(docker system prune)

舊映象、已停止的容器與構建快取會在 /var/lib/docker 快速累積。先檢查,再清理。

docker system df                   # what Docker is using
docker system prune                 # stopped containers, unused networks,
                                    # dangling images and build cache
docker system prune -a              # also ALL images not used by a container

# Container logs live here and can grow without limit
du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail
除非非常確定,否則不要加上 --volumes:它會永久刪除未使用的 Docker volume,裡面常常存放著資料庫資料。

為了避免容器日誌再次塞滿硬碟,請設定大小上限:

# /etc/docker/daemon.json - limit future container logs
{
  "log-driver": "json-file",
  "log-opts": { "max-size": "50m", "max-file": "3" }
}
# then: systemctl restart docker  (applies to newly created containers)

步驟 8:用 lsof +L1 找出已刪除但仍開啟的檔案

當 df 顯示硬碟已滿,du 卻找不到空間去哪裡時,通常是某個程式仍開著一個已被刪除的檔案。要等該程式關閉檔案,空間才會釋放。

# Debian / Ubuntu: apt install -y lsof   |   Rocky / AlmaLinux: dnf install -y lsof
lsof +L1
# COMMAND  PID  ...  SIZE/OFF  NLINK  NAME
# php-fpm  1234 ...  4.2G      0      /var/log/app/debug.log (deleted)

# Fix 1: restart the service holding the file
systemctl restart php-fpm
# Fix 2: truncate it through /proc (PID 1234, file descriptor 7 from "ls -l /proc/1234/fd")
: > /proc/1234/fd/7

步驟 9:處理 inode 用盡造成的“No space left”

當 df -i 顯示 100% 時,請找出含有大量小檔案的目錄,例如 PHP session 資料夾、郵件佇列、快取目錄或臨時上傳檔案。

# Directories that contain the most files
find / -xdev -type f 2>/dev/null | cut -d/ -f2-4 | sort | uniq -c | sort -n | tail -n 10

清理對應的目錄,並設定應用程式自動清除舊檔案。

常見問題

為什麼 df 與 du 顯示的數字不同?

多半是已刪除但仍被開啟的檔案(步驟 8)。此外,被掛載點遮住的檔案,以及 ext4 為 root 保留的空間(預設 5%)也會造成差異。

可以把 /var/log 裡的東西全部刪掉嗎?

不建議。請刪除舊的 .gz 輪轉檔案、清空過大的使用中日誌,但保留目錄結構;部分服務在日誌目錄不存在時會無法啟動。

硬碟一直被塞滿,可以加大空間嗎?

請先依上述步驟找出根本原因。若資料確實需要更多空間,可以在客戶中心的服務詳情頁把 JUSTG 雲伺服器升級到 SSD 更大的套餐。

如 Linux 伺服器的硬碟空間問題仍未解決,請至 https://www.justg.com/submitticket.php 提交工單,JUSTG 技術支援團隊會協助您處理。

這篇文章有幫助嗎?
幫助中心
Linux 伺服器 Linux SSH 金鑰登入教程:設定 ed25519 金鑰並禁用密碼登入 只要伺服器有公網 IPv4,上線幾分鐘內就會遇到 SSH 暴力破解機器人,而密碼登入正是它們的首要目標。本文說明如何用較新的 ed25519 金鑰完成 Linux SSH 金鑰登入,再禁用 SSH 密碼登入,全程避免把自己鎖在門外。步驟適用於 Debian… Linux 伺服器 Linux VPS 修改 SSH 連接埠與 root 密碼教程(安全不斷線) 把 SSH 從 22 連接埠移走雖然擋不住有心的攻擊者,卻能讓日誌裡大部分自動掃描消失;而任何新伺服器的第一件事,就是換一組新的 root 密碼。本文說明如何在 Linux VPS 修改 SSH 連接埠與 root 密碼且不斷線:修改 sshd_config、在 Rocky… Linux 伺服器 Linux 防火牆設定教程:VPS 使用 UFW 與 firewalld(含 IPv6) 新安裝的 Linux 伺服器,任何服務開啟的連接埠都會直接對外響應,因此主機防火牆是最先要設定的專案之一。本文說明如何在 Debian / Ubuntu 用 UFW 設定 Linux 防火牆,以及在 CentOS、Rocky Linux、AlmaLinux 使用… Linux 伺服器 Linux VPS 新增 Swap 交換空間教程(適合 512MB / 1GB 小記憶體套餐) 在 512 MB 或 1 GB 的雲伺服器上,資料庫、PHP-FPM 加上一次軟體包更新,很容易在同一時間用光記憶體。這時核心的 OOM killer 會強制終止程序,最常被犧牲的就是 MySQL 或 MariaDB。在 Linux VPS 新增 Swap… Linux 伺服器 VPS 安裝 aaPanel 教程:aaPanel(寶塔國際版)安裝與安全設定 aaPanel 是寶塔面板的國際版,透過網頁介面即可管理網站、資料庫、PHP 版本、SSL 證書與備份。本文說明如何在 JUSTG VPS 安裝 aaPanel(東京、首爾、莫斯科的雲伺服器或 JUSTG 獨立伺服器,系統支援…
AlipayUnionPayVISAMastercardPayPalUSDTstripe