Hết dung lượng đĩa
Cách nhanh chóng tìm ra thứ đang ăn hết đĩa, giải phóng gigabyte một cách an toàn và hiểu các cạm bẫy: tệp đã xóa nhưng còn mở và inode cạn kiệt.
Cập nhật 23 tháng 8, 2026
Đầy đĩa làm mọi thứ sụp đổ cùng lúc: cơ sở dữ liệu ngừng nhận ghi, site trả về lỗi, journalctl từ chối hoạt động, và đôi khi cả SSH cũng không cho bạn vào, vì không còn chỗ để ghi nhật ký phiên. Bạn cần hành động nhanh và đúng thứ tự.
Kiểm tra
df -h
df -i
Lệnh đầu tiên hiển thị dung lượng, lệnh thứ hai hiển thị inode. Inode đầy cũng tạo ra lỗi "No space left on device" y hệt dù còn hàng gigabyte trống: điều này xảy ra khi một thư mục đã tích lũy hàng triệu tệp nhỏ (phiên PHP, cache, hàng đợi).
Bạn cũng có thể xem dung lượng đã dùng trong bảng điều khiển tại /hosting/vds/m/<id> — vòng tròn ở tab "Overview". Nó được lấp đầy từ dữ liệu do qemu-guest-agent báo cáo; nếu agent đã bị gỡ, vòng tròn vẫn trống và bảng điều khiển hiển thị lệnh cài đặt thay thế.
Tìm thủ phạm
du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -15
du -xh --max-depth=1 /var 2>/dev/null | sort -h | tail -15
ncdu -x / # apt install ncdu, interactive
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null
Cờ -x giữ phạm vi tìm kiếm trong một hệ thống tệp duy nhất và ngăn nó lang thang vào /proc và các thư mục được gắn kết.
Những thủ phạm điển hình: log trong /var/log, cache gói trong /var/cache, image và volume Docker trong /var/lib/docker, bản dump cơ sở dữ liệu, các tệp lưu trữ bị bỏ quên trong /root và /tmp, tệp từ các bản phát hành ứng dụng cũ.
Giải phóng dung lượng
journalctl --vacuum-size=200M
apt clean # Debian, Ubuntu
dnf clean all # AlmaLinux, CentOS Stream
docker system prune -af --volumes # careful: will remove unused volumes
find /tmp -type f -mtime +7 -delete
Để giới hạn journal vĩnh viễn, hãy sửa /etc/systemd/journald.conf (SystemMaxUse=300M); xem bài viết systemd journals để biết chi tiết. Với tệp ứng dụng, hãy thiết lập logrotate: nếu không xoay vòng, một tệp app.log duy nhất có thể dễ dàng phình lên hàng chục gigabyte.
Cái bẫy: tệp đã xóa nhưng vẫn đang mở
Bạn đã xóa một log khổng lồ, nhưng df vẫn hiển thị con số y cũ. Chừng nào một tiến trình còn giữ tệp đang mở, dung lượng sẽ không được trả lại.
lsof +L1 | head -20
Cách khắc phục đúng là khởi động lại dịch vụ đang giữ tệp (systemctl restart nginx), hoặc cắt ngắn tệp mà không xóa nó:
: > /var/log/nginx/access.log
Cái bẫy: hết inode
df -i
find /var/www -xdev -type d -printf '%h\n' | sort | uniq -c | sort -rn | head
Hãy tìm một thư mục có hàng trăm nghìn tệp và dọn dẹp theo từng phần để không làm sập máy:
find /var/lib/php/sessions -type f -mtime +2 -delete
Nếu hoàn toàn không còn dung lượng
Khi đĩa đầy 100% và hệ thống gần như đứng yên, hãy đăng nhập qua tab "Console" trong bảng điều khiển, giải phóng ít nhất một trăm megabyte (journalctl --vacuum-size=50M gần như luôn hiệu quả), rồi tiếp tục xử lý sự cố bình thường. Trong trường hợp thực sự tồi tệ, đĩa cứu hộ sẽ giúp ích: máy khởi động vào SystemRescue, đĩa của bạn hiện ra dưới dạng /dev/sda, và bạn gắn kết nó rồi dọn dẹp từ bên ngoài.
Để ngăn chuyện này tái diễn
- Cảnh báo ở ngưỡng 85% — xem Cảnh báo site ngừng hoạt động.
- Xoay vòng tất cả log ứng dụng, không chỉ log hệ thống.
- Gửi bản dump cơ sở dữ liệu và tệp lưu trữ ra khỏi máy chủ ngay lập tức, thay vì giữ chúng trong
/root. - Nếu không còn gì để dọn và dữ liệu của bạn cứ tăng mãi, hãy nâng lên gói có đĩa lớn hơn: 40, 80, 120, 160, 200 và 250 GB. Chỉ nâng cấp: không thể thu nhỏ đĩa, và không hỗ trợ hạ cấp.
Đừng xóa tệp trong
/var/libvà/usrmột cách tùy tiện: đó là nơi chứa dữ liệu cơ sở dữ liệu và các gói hệ thống. Trước tiên hãy xác định một thư mục thuộc về cái gì, rồi mới dọn dẹp nó.