Sửa lỗi "No space left on device" trên Linux

beginner🐧 Linux2026-03-17| Linux (Ubuntu, Debian, CentOS, RHEL, mọi distro)

Error Message

No space left on device
#disk#df#du#cleanup

Tình huống xảy ra

Đang deploy. Đang build. Đang restart. Rồi mọi thứ dừng lại:

No space left on device

Không thể ghi file. Log im bặt. Database sập. Tin tốt là — khi bạn biết cần tìm ở đâu, thường chỉ mất 5 phút để khắc phục.

Phân tích — Xác định phần nào bị đầy

Bước 1: Kiểm tra dung lượng ổ đĩa tổng quan

df -h

Nhìn vào cột Use%. Phân vùng nào đạt hoặc gần 100% là thủ phạm. Chín lần trong mười đó là phân vùng / (root).

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   50G     0 100% /
tmpfs           2.0G  1.2G  800M  60% /dev/shm

Bước 2: Kiểm tra inode — cái này hay bị bỏ qua

Dung lượng ổ đĩa có thể còn vài GB trống trong khi inode đã cạn kiệt hoàn toàn. File session PHP, hàng đợi mail, và thư mục cache Node.js rất hay gây ra tình trạng này — một ứng dụng có thể tạo ra hàng triệu file nhỏ.

df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda1      3276800 3276800       0  100% /

IUse% đạt 100%? Bạn cần xóa rất nhiều file nhỏ, không phải đi tìm file lớn.

Bước 3: Truy tìm thư mục ngốn dung lượng

Bắt đầu từ root và đào sâu dần cho đến khi tìm ra thủ phạm:

# Cấp cao nhất — xem phần lớn dung lượng nằm ở đâu
du -sh /* 2>/dev/null | sort -rh | head -20

# Thu hẹp phạm vi
du -sh /var/* 2>/dev/null | sort -rh | head -20
du -sh /var/log/* 2>/dev/null | sort -rh | head -20

Trên server bận rộn, /var/log tăng lên 20–30 GB chỉ sau một đêm là chuyện bình thường.

Sửa nhanh — Giải phóng dung lượng ngay

Xóa log cũ

# Xóa trắng các file log nặng nhất mà không ảnh hưởng tiến trình đang chạy
> /var/log/syslog
> /var/log/auth.log

# Giới hạn log systemd journal còn 100 MB
journalctl --vacuum-size=100M

# Hoặc xóa log cũ hơn 7 ngày
journalctl --vacuum-time=7d

Dọn cache package cũ

# Debian/Ubuntu — thường giải phóng được 500 MB đến 2 GB
apt clean
apt autoremove -y

# RHEL/CentOS
yum clean all
dnf clean all

Xóa kernel image cũ (Ubuntu/Debian)

Kernel cũ tích lũy sau mỗi lần cập nhật. Mỗi cái chiếm ~200–400 MB. Kiểm tra những gì đang cài, rồi để apt dọn dẹp:

dpkg --list | grep linux-image

# Xóa kernel cũ tự động (giữ lại kernel hiện tại + một phiên bản trước)
apt autoremove --purge

Tìm thủ công các file lớn

# Các file trên 100 MB
find / -type f -size +100M 2>/dev/null

# Core dump — mỗi file có thể nặng vài GB
find / -name "core" -type f 2>/dev/null
find /var/crash -type f 2>/dev/null

Docker đang chiếm dụng dung lượng?

# Xóa image không dùng, container đã dừng, và volume treo
docker system prune -a --volumes

Trên máy dev đang hoạt động, Docker có thể âm thầm chiếm 20–40 GB. Nên kiểm tra cái này trước.

Trường hợp ẩn: file đã xóa nhưng vẫn bị giữ mở

Một tiến trình có thể vẫn giữ file descriptor mở dù file đã bị xóa. Dung lượng sẽ không được giải phóng cho đến khi tiến trình đó khởi động lại. Chạy lệnh này để phát hiện:

lsof | grep deleted | sort -k7 -rn | head -20

Cột thứ 7 hiển thị kích thước file. Khởi động lại service xuất hiện ở đầu danh sách:

systemctl restart nginx   # thay bằng tên service thực tế

Sửa triệt để — Ngăn lỗi tái diễn

Cấu hình log rotation cho ứng dụng

Kiểm tra /etc/logrotate.conf/etc/logrotate.d/. Nếu ứng dụng của bạn tự ghi log, thêm cấu hình như sau:

/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    delaycompress
}

Giới hạn journald trước khi nó phình to mất kiểm soát

Chỉnh sửa /etc/systemd/journald.conf:

[Journal]
SystemMaxUse=500M
SystemKeepFree=1G
systemctl restart systemd-journald

Thiết lập cảnh báo ổ đĩa trước khi thành sự cố

# Gửi email khi ổ đĩa đạt 80%
*/10 * * * * root df -h / | awk 'NR==2 {gsub("%","",$5); if($5>80) print "Disk usage: "$5"%" | "mail -s \"Disk Alert\" admin@example.com"}'

Nhận cảnh báo lúc 80% còn có thời gian xử lý. Nhận cảnh báo lúc 100% là bạn đang ở trong đám cháy rồi.

Mở rộng phân vùng nếu đã vượt giới hạn

Trên VM và cloud instance, resize volume trong bảng điều khiển của nhà cung cấp trước, rồi mới mở rộng filesystem:

# ext4
resize2fs /dev/sda1

# xfs
xfs_growfs /

# Kiểm tra lại
df -h /

Xác nhận đã sửa xong

# Dung lượng đã được giải phóng chưa?
df -h

# Inode đã ổn chưa?
df -i

# Kiểm tra ghi file — exit code 0 là thành công
dd if=/dev/zero of=/tmp/test_write bs=1M count=10 && rm /tmp/test_write
echo $?

Ghi file thành công, df -h hiển thị dung lượng trống — xong rồi đó.

Checklist tham khảo nhanh

  • df -h — phân vùng nào đang đầy
  • df -i — kiểm tra inode cạn kiệt
  • du -sh /* | sort -rh — tìm thư mục ngốn dung lượng
  • lsof | grep deleted — file bị giữ mở bởi tiến trình
  • journalctl --vacuum-size=100M — thu gọn log systemd
  • apt clean && apt autoremove — cache package (Debian/Ubuntu)
  • docker system prune -a — nếu có dùng Docker

Related Error Notes