Khi Linux báo No space left on device, xóa ngay vài file lớn chưa chắc là cách đúng. Filesystem có thể hết block dữ liệu, hết inode, bị log tăng đột biến, chứa image Docker cũ hoặc vẫn giữ dung lượng của một file đã xóa. Quy trình an toàn là xác định đúng filesystem, đo nguyên nhân, giải phóng có kiểm soát rồi ngăn sự cố lặp lại.
1. Xác định filesystem nào đang đầy
Bắt đầu bằng hai góc nhìn: dung lượng và inode.
df -hT
df -ih
df -hT hiển thị loại filesystem, tổng dung lượng, đã dùng, còn trống và mount point. df -ih kiểm tra inode. Nếu IUse% đạt 100%, hệ thống không thể tạo file mới dù vẫn còn GB trống; nguyên nhân thường là hàng triệu file nhỏ.
Đừng chỉ nhìn dòng /dev/sda.... Hãy xác định mount point chứa đường dẫn đang lỗi:
df -hT /var/lib/mysql
findmnt -T /var/lib/mysql
Luôn dọn trên đúng filesystem. Xóa 10 GB trong/homekhông giúp gì nếu mount/varmới là nơi đã đầy.
2. Kiểm tra trước khi thay đổi
Ghi lại trạng thái để có thể đối chiếu sau xử lý:
date
df -hT
df -ih
lsblk -f
findmnt
sudo dmesg -T | tail -n 50
Nếu kernel báo lỗi I/O, filesystem read-only hoặc thiết bị lưu trữ bất thường, ưu tiên bảo toàn dữ liệu và kiểm tra phần cứng. Dọn file không giải quyết được ổ đĩa đang hỏng.
3. Tìm thư mục chiếm dung lượng
Dùng du trên cùng filesystem để tránh đi vào mount mạng, volume container hoặc ổ khác:
sudo du -xhd1 / | sort -h
sudo du -xhd1 /var | sort -h
sudo du -xhd1 /var/lib | sort -h
Đi từ mount point xuống từng cấp cho đến khi thấy nhánh tăng bất thường. -x giữ phép đo trong một filesystem; -d1 chỉ xem một cấp, tránh tạo đầu ra quá lớn. Trên máy đang tải cao, chạy du vào giờ thấp điểm vì quét nhiều inode có thể gây I/O đáng kể.
Tìm file lớn gần đây:
sudo find /var -xdev -type f -size +500M \
-printf '%s %TY-%Tm-%Td %TH:%TM %p\n' \
| sort -n | tail -n 30
Không xóa chỉ vì file lớn. Hãy xác định owner, tiến trình sử dụng, chính sách lưu giữ và khả năng khôi phục.
4. Vì sao df và du không khớp?
df đọc mức sử dụng của toàn filesystem, còn du cộng dung lượng các file còn xuất hiện trong cây thư mục. Hai số có thể lệch vì reserved blocks, snapshot, hard link, mount bị che hoặc file đã bị unlink nhưng tiến trình vẫn mở.
Trường hợp phổ biến là log lớn đã được xóa nhưng web server hoặc database vẫn giữ file descriptor:
sudo lsof +L1
sudo lsof +L1 /var
Tìm các dòng có NLINK bằng 0 hoặc tên chứa (deleted). Cách giải phóng đúng thường là yêu cầu ứng dụng reopen log hoặc restart đúng service sau khi đánh giá ảnh hưởng:
sudo systemctl reload nginx
sudo systemctl restart my-application.service
Không tự ý ghi rỗng qua /proc/PID/fd/N với database hoặc ứng dụng không rõ hành vi; thao tác này có thể làm hỏng dữ liệu hay che mất bằng chứng sự cố.
5. Kiểm tra systemd journal và log ứng dụng
Đo journal trước khi dọn:
journalctl --disk-usage
sudo du -sh /var/log/* 2>/dev/null | sort -h
Có thể xóa journal đã archive theo dung lượng hoặc tuổi:
sudo journalctl --rotate
sudo journalctl --vacuum-size=500M
# Hoặc:
sudo journalctl --vacuum-time=14days
--vacuum-size chỉ tác động trực tiếp đến journal đã archive, vì vậy --rotate giúp file active trở thành archive trước khi dọn. Sau đó cấu hình giới hạn bền vững trong /etc/systemd/journald.conf, chẳng hạn SystemMaxUse và SystemKeepFree, rồi kiểm tra cấu hình trước khi restart.
Với log trong /var/log, ưu tiên sửa logrotate hoặc cấu hình ứng dụng. Xóa log đang mở bằng rm có thể tạo chính tình huống df và du lệch nhau.
6. Kiểm tra Docker và container runtime
Docker có thể giữ image, layer, build cache, volume và JSON log:
docker system df
docker system df -v
sudo du -sh /var/lib/docker/* 2>/dev/null | sort -h
Xem kỹ đối tượng nào đang được container sử dụng trước khi prune. Các lệnh docker system prune và đặc biệt docker volume prune có thể xóa dữ liệu không còn gắn với container hiện tại nhưng vẫn cần cho khôi phục hoặc lần chạy sau.
Đặt giới hạn log cho Docker daemon hoặc từng service, ví dụ dùng driver local hay cấu hình xoay json-file. Sau khi đổi daemon config, kiểm tra JSON hợp lệ và lên kế hoạch restart vì thay đổi không tự áp dụng cho mọi container cũ.
7. Khi filesystem hết inode
Nếu df -i đầy nhưng dung lượng byte còn nhiều, tìm thư mục có số file lớn:
sudo find /var -xdev -printf '%h\n' \
| sort | uniq -c | sort -n | tail -n 30
Các thủ phạm thường gặp gồm session file, cache, mail queue, thumbnail, thư mục tạm và job tạo file nhưng không dọn. Không dùng wildcard xóa hàng triệu file trong một lệnh nếu shell có thể vượt giới hạn đối số. Dùng find với điều kiện tuổi và kiểm tra mẫu trước:
find /path/to/cache -xdev -type f -mtime +7 -print | head
find /path/to/cache -xdev -type f -mtime +7 -delete
Chỉ chạy lệnh xóa sau khi danh sách mẫu đúng và có xác nhận rằng dữ liệu là cache có thể tái tạo.
8. Package cache, kernel cũ và file tạm
Trên Debian/Ubuntu, có thể đo và dọn package cache bằng công cụ quản lý gói:
sudo du -sh /var/cache/apt/archives
sudo apt clean
sudo apt autoremove --purge
Đọc kỹ danh sách của autoremove trước khi đồng ý, đặc biệt trên máy có kernel, driver hoặc package được cài thủ công. Với /tmp, dùng chính sách systemd-tmpfiles hoặc điều kiện tuổi; không xóa toàn bộ trong khi ứng dụng đang hoạt động.
9. Giải phóng khẩn cấp theo thứ tự rủi ro thấp
- Tạm dừng tác vụ đang tạo dữ liệu nhanh nếu biết rõ nguồn.
- Xoay và vacuum journal đã archive.
- Dọn package cache và artifact có thể tải lại.
- Xử lý log theo đúng cơ chế reload hoặc logrotate.
- Thu hồi image/build cache container đã xác minh không dùng.
- Restart service đang giữ file đã xóa, theo kế hoạch ảnh hưởng.
- Mở rộng filesystem hoặc volume nếu dữ liệu hợp lệ thực sự tăng.
Giữ một khoảng trống tối thiểu trước khi database hoặc service hoạt động lại. Việc giải phóng vài MB có thể chỉ đủ để hệ thống ghi thêm log rồi đầy ngay lần nữa.
10. Mở rộng dung lượng khi dữ liệu tăng hợp lệ
Nếu workload cần toàn bộ dữ liệu hiện có, dọn file chỉ trì hoãn sự cố. Xác định storage là partition, LVM, cloud volume hay filesystem độc lập. Quy trình thường gồm mở rộng thiết bị hoặc logical volume, sau đó mở rộng filesystem bằng công cụ phù hợp như resize2fs cho ext4 hoặc xfs_growfs cho XFS.
Chụp backup hoặc snapshot đã kiểm thử, xác nhận đúng device và đọc tài liệu của nền tảng trước khi sửa partition hay volume. Không sao chép lệnh mở rộng từ một máy khác rồi chạy nguyên trạng.
11. Ngăn ổ đĩa đầy lần nữa
- Cảnh báo theo cả phần trăm và dung lượng còn trống; 10% của ổ 10 TB khác 10% của ổ 20 GB.
- Theo dõi inode, tốc độ tăng, thời gian dự kiến chạm ngưỡng và filesystem read-only.
- Giới hạn journal, log ứng dụng và log container.
- Đặt retention cho backup, artifact, upload, cache và snapshot.
- Tách dữ liệu tăng nhanh khỏi root filesystem khi kiến trúc cho phép.
- Kiểm thử cảnh báo và quy trình dọn trên staging.
- Ghi lại nguyên nhân gốc, không chỉ dung lượng đã xóa.
Checklist xử lý sự cố
- Dùng
df -hTvàdf -ihđể phân biệt block với inode. - Xác định đúng mount bằng
findmnt -T. - Dùng
du -xđi từng cấp, tránh vượt filesystem. - Nếu
dflớn hơn nhiều so vớidu, kiểm tralsof +L1. - Đo journal, log và container trước khi dọn.
- Không xóa database, volume, snapshot hay log đang mở theo phỏng đoán.
- Đo lại sau mỗi thay đổi và xác minh dịch vụ.
- Thêm giới hạn, retention và cảnh báo để ngăn tái diễn.
Kết luận
Sự cố đầy ổ đĩa trên Linux cần được xử lý như một bài toán chẩn đoán, không phải cuộc thi xóa file. df cho biết filesystem, du tìm dữ liệu trong cây thư mục, lsof phát hiện file đã xóa nhưng còn mở, còn công cụ journal và container giải thích các nguồn tăng thường gặp. Khi nguyên nhân đã rõ, hãy dọn có kiểm soát hoặc mở rộng storage và bổ sung cảnh báo để lần sau hệ thống báo sớm hơn.




Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.