Sổ tay kỹ thuật

Ổ đĩa đầy – khoanh vùng và giải phóng

troubleshooting#linux#disk#docker· cập nhật 2026-11-06

Dùng khi gặp lỗi No space left on device: tìm thư mục/file lớn, hết inode, file đã xoá vẫn bị giữ, journal và Docker chiếm chỗ.

Sửa trang này
Mục lục

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                                        # inode

2. 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 -15

3. 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 | tail

docker 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):

/etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": { "max-size": "50m", "max-file": "3" }
}

Giới hạn journal:

/etc/systemd/journald.conf.d/size.conf
[Journal]
SystemMaxUse=1G

Log ứ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/null

Xem thêm: journalctl cheatsheet, Docker cheatsheet.