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 và /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 đầydf -i— kiểm tra inode cạn kiệtdu -sh /* | sort -rh— tìm thư mục ngốn dung lượnglsof | grep deleted— file bị giữ mở bởi tiến trìnhjournalctl --vacuum-size=100M— thu gọn log systemdapt clean && apt autoremove— cache package (Debian/Ubuntu)docker system prune -a— nếu có dùng Docker

