Triệu chứng chính: app báo No space left on device, df -h thấy 100%, hoặc df còn trống mà vẫn không ghi được file (hết inode), hoặc đã xoá file lớn mà df không giảm.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách xử lý |
|---|---|---|
df -h 100% ở / |
Log, backup, core dump, image Docker | Tìm bằng du/ncdu (xem bên dưới) |
df -h còn chỗ nhưng ghi lỗi |
Hết inode (hàng triệu file nhỏ: cache, session, mail queue) | df -i, tìm thư mục nhiều file, xoá bớt |
Đã rm file lớn mà df không giảm |
Process vẫn mở file (log đang ghi) | lsof +L1, restart process hoặc truncate qua /proc/<pid>/fd/<n> |
du tổng nhỏ hơn nhiều so với df |
File đã xoá còn mở, hoặc dữ liệu bị che dưới mount point | lsof +L1; bind-mount / ra chỗ khác để xem |
/var/log/journal vài GB |
Journal không giới hạn | journalctl --vacuum-size=500M, đặt SystemMaxUse= |
/var/lib/docker phình to |
Image cũ, build cache, container log *-json.log |
docker system df, prune, giới hạn log |
/boot đầy, apt lỗi |
Nhiều kernel cũ | apt autoremove --purge |
| Root không bị chặn nhưng user bị | ext4 giữ 5% block cho root | Bình thường; trên ổ data có thể tune2fs -m 1 /dev/sdX |
/var/lib/snapd lớn |
Giữ nhiều revision snap | snap set system refresh.retain=2 |
Các bước khoanh vùng
flowchart TD A["No space left on device"] --> B{"df -h đầy?"} B -->|Không| C["df -i: hết inode"] B -->|Có| D["du -xh --max-depth=1 / hoặc ncdu -x /"] D --> E{"du khớp df?"} E -->|Không| F["lsof +L1: file đã xoá còn mở"] E -->|Có| G["Xử lý thư mục lớn: log, journal, docker"]
1. Partition nào đầy
df -hT -x tmpfs -x devtmpfs -x squashfs # dung lượng theo filesystem
df -i # inode2. Thư mục nào lớn
sudo du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -15 # -x: không đi sang filesystem khác
sudo du -xh --max-depth=1 /var 2>/dev/null | sort -h | tail
sudo find / -xdev -type f -size +1G -exec ls -lh {} + 2>/dev/null
sudo ncdu -x / # giao diện tương tác (apt install ncdu)Hết inode thì đếm số file theo thư mục:
sudo du -x --inodes --max-depth=2 / 2>/dev/null | sort -n | tail -153. File đã xoá nhưng vẫn bị giữ
sudo lsof -nP +L1 # cột NLINK = 0, SIZE lớn
# Giải phóng mà không restart: truncate qua file descriptor
sudo truncate -s 0 /proc/<pid>/fd/<fd>
# Hoặc restart service đang giữ file
sudo systemctl restart <service>4. Dọn an toàn
# journal
journalctl --disk-usage
sudo journalctl --vacuum-size=500M
# apt
sudo apt-get clean
sudo apt-get autoremove --purge
# Docker: xem trước rồi mới xoá
docker system df
docker container prune # container đã dừng
docker image prune -a # image không có container dùng
docker builder prune # build cache
docker system prune # gộp: container dừng, network thừa, dangling image, build cache
sudo du -h /var/lib/docker/containers/*/*-json.log | sort -h | taildocker system prune -a --volumes xoá luôn volume không có container nào gắn, tức có thể là dữ liệu database. Chỉ thêm --volumes khi đã chắc chắn. Không rm trực tiếp trong /var/lib/docker.
Cấu hình đúng
Giới hạn log container (áp dụng cho container tạo mới sau khi restart dockerd):
{
"log-driver": "json-file",
"log-opts": { "max-size": "50m", "max-file": "3" }
}Giới hạn journal:
[Journal]
SystemMaxUse=1GLog ứng dụng tự ghi file: dùng logrotate với copytruncate nếu app không tự mở lại file khi nhận tín hiệu.
Kiểm tra nhanh
df -hT -x tmpfs -x devtmpfs -x squashfs; df -i /
sudo du -xh --max-depth=1 / 2>/dev/null | sort -h | tail
sudo lsof -nP +L1 | sort -k7 -n | tail
journalctl --disk-usage; docker system df 2>/dev/nullXem thêm: journalctl cheatsheet, Docker cheatsheet.