7 lệnh Linux xử lý nhanh lỗi VPS bị đầy ổ cứng (Update 2025)
Bạn vừa truy cập website và nhận được lỗi “Error establishing a database connection” (Lỗi kết nối cơ sở dữ liệu)? Bạn cố gắng SSH vào máy chủ thì nhận thông báo “Connection timed out” hoặc đăng nhập được nhưng cực kỳ chậm chạp?
Đây là những dấu hiệu kinh điển cho thấy máy chủ của bạn đang “kêu cứu”. Và một trong những nguyên nhân phổ biến nhất, gây ra vô số vấn đề nghiêm trọng, chính là lỗi VPS bị đầy ổ cứng.
Khi ổ cứng đạt 100% dung lượng, hệ thống không thể ghi thêm bất kỳ dữ liệu nào. Điều này đồng nghĩa với việc database không thể tạo bản ghi mới, Nginx/Apache không thể viết log, và thậm chí bạn không thể thực thi các lệnh cơ bản.
Nhưng đừng quá lo lắng. Đây là một lỗi phổ biến và hoàn toàn có thể được giải quyết. Bài viết này sẽ cung cấp cho bạn 7 lệnh Linux thiết yếu để “cấp cứu” máy chủ, từ việc chẩn đoán tổng quan đến truy tìm và tiêu diệt an toàn các file “khổng lồ” đang chiếm dụng không gian.
Tóm tắt nhanh 7 lệnh xử lý VPS đầy ổ cứng:
df -h: Kiểm tra tổng quan dung lượng các phân vùng.du -h --max-depth=1 / | sort -hr: Tìm thư mục lớn nhất.ncdu: Phân tích dung lượng trực quan (dễ sử dụng hơndu).find / -type f -size +500M: Tìm các file lớn hơn 500MB.truncate -s 0 /path/to/file.log: Làm rỗng file log (an toàn nhất).journalctl --vacuum-size=100M: Dọn dẹp log hệ thống (systemd).apt clean/yum clean all: Xóa cache gói cài đặt.
Dấu hiệu và 3 “thủ phạm” chính khiến VPS bị đầy ổ cứng
Trước khi đi vào các lệnh, hãy đảm bảo bạn đã “bắt đúng bệnh”.
Dấu hiệu rõ ràng VPS của bạn đang đầy
- Không thể SSH: Đây là dấu hiệu nặng nhất, khi hệ thống không đủ dung lượng để tạo phiên đăng nhập mới.
- Website/Ứng dụng báo lỗi 500: Các ứng dụng web thường xuyên ghi file session hoặc cache. Khi không thể ghi, chúng sẽ sập.
- Lỗi kết nối cơ sở dữ liệu: MySQL/PostgreSQL cần không gian để ghi vào “transaction logs” hoặc các file tạm. Khi đầy, mọi kết nối mới sẽ bị từ chối.
- Không thể ghi file: Lệnh
touch test.txtđơn giản cũng sẽ báo lỗi “No space left on device”. - Cảnh báo từ Monitoring: Nếu bạn có sử dụng dịch vụ giám sát (như Zabbix, Grafana, hoặc dịch vụ của nhà cung cấp VPS), bạn sẽ nhận được email cảnh báo disk usage đạt 90-95%.
3 “thủ phạm” hàng đầu gây đầy ổ cứng VPS
Khi một VPS bị đầy ổ cứng, thủ phạm thường không phải là một file duy nhất mà bạn vừa upload, mà là sự tích tụ âm thầm theo thời gian.
- Log file phình to không kiểm soát: Đây là nguyên nhân số 1. Các dịch vụ như Nginx, Apache, hay chính hệ thống (systemd journal) liên tục tạo ra log. Nếu không được cấu hình
logrotate(xoay vòng log), các fileaccess.loghoặcerror.logcó thể lớn đến vài chục GB chỉ sau vài tháng. - File rác, cache và file tạm (tmp): Các trình quản lý gói như
apt(Ubuntu/Debian) hoặcyum(CentOS) lưu trữ các gói đã tải về trong/var/cache/. Các ứng dụng web cũng tạo ra hàng tấn file cache. Đáng sợ hơn, thư mục/tmpđôi khi chứa các file tạm được tạo ra từ một tiến trình lỗi và không bao giờ được xóa. - Các bản backups cũ lưu cục bộ: Rất nhiều người dùng thiết lập cronjob để backup database hoặc code hàng ngày nhưng lại… lưu trữ ngay trên chính VPS đó. Theo thời gian, bạn sẽ có hàng trăm file
.sql.gzhoặc.tar.gzcũ nằm trong/home,/roothoặc/var/wwwmà không hề hay biết.
Cảnh báo an toàn: 3 điều không thể quên
Trước khi bạn gõ bất kỳ lệnh xóa nào, hãy dừng lại 3 giây và đọc kỹ các cảnh báo sau:
- Tuyệt đối không chạy
rm -rf /: Lệnh này sẽ xóa TOÀN BỘ hệ thống của bạn. Không có ngoại lệ. Hãy luôn kiểm tra kỹ đường dẫn trước khi nhấn Enter. - Backup trước khi hành động: Nếu bạn tìm thấy một thư mục log khổng lồ và muốn dọn dẹp, hãy cân nhắc nén (tar) thư mục đó lại trước khi xóa, phòng trường hợp bạn cần log đó để gỡ lỗi sau này. (Tham khảo lệnh Tar trong Linux: Cách nén và giải nén tệp của chúng tôi).
- Ưu tiên
truncatehơnrmcho file log: Sẽ được giải thích chi tiết ở Lệnh 6. Nếu bạnrmmột file log đang được Nginx sử dụng, dung lượng sẽ không giảm cho đến khi bạn restart Nginx.
Giờ thì, hãy bắt đầu “dọn dẹp”!
7 lệnh Linux xử lý nhanh lỗi VPS bị đầy ổ cứng
Chúng ta sẽ đi theo quy trình 3 bước: Kiểm tra tổng quan (Lệnh 1-3) -> Tìm chi tiết (Lệnh 4) -> Xử lý an toàn (Lệnh 5-7).
1. Lệnh df – Kiểm tra tổng quan (Bác sĩ tổng quát)
Lệnh đầu tiên bạn luôn phải chạy là df (Disk Free). Nó cho bạn bức tranh toàn cảnh về tất cả các ổ đĩa (phân vùng) được gắn trên hệ thống.
- Lệnh:
df -h - Cờ
-h(Human-readable): Giúp hiển thị dung lượng dưới dạng GB, MB thay vì các khối (block) khó hiểu.
Cách đọc kết quả:
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 50G 50G 0B 100% /
udev 1.9G 0 1.9G 0% /dev
tmpfs 393M 1.1M 392M 1% /run
Ngay lập tức, bạn sẽ thấy vấn đề. Trong ví dụ trên, phân vùng /dev/vda1 (được gắn vào thư mục gốc /) đã sử dụng 100%. Đây chính là “bệnh nhân” của chúng ta.
Mẹo nâng cao (Kiểm tra Inodes): Đôi khi, ổ cứng của bạn còn dung lượng (ví dụ
Use%chỉ 60%) nhưng vẫn báo “No space left on device”. Đây là lỗi đầy inodes (mỗi file/thư mục chiếm 1 inode).
- Kiểm tra:
df -i- Cách đọc: Nếu cột
IUse%báo 100%, bạn đã bị đầy inode. Thủ phạm thường là các thư mục cache (như của WordPress) tạo ra hàng triệu file nhỏ.
2. Lệnh du – Truy tìm thư mục “ăn” dung lượng
Khi đã biết phân vùng gốc / bị đầy, chúng ta cần biết thư mục nào trong đó đang là “thủ phạm”. Lệnh du (Disk Usage) sẽ làm việc này.
- Lệnh:
du -h --max-depth=1 / | sort -hr - Giải thích:
du -h: Tính dung lượng (dễ đọc).--max-depth=1: Chỉ hiển thị dung lượng của các thư mục ở cấp 1 (ngay bên trong thư mục/)./: Thư mục gốc chúng ta muốn kiểm tra (vì nó đang đầy 100%).| sort -hr: Chuyển kết quả sang lệnh sort. Cờ-h(human numeric sort) và-r(reverse) sẽ sắp xếp các thư mục từ lớn nhất đến nhỏ nhất.
Cách đọc kết quả:
40G /
25G /var
10G /home
4G /usr
1.1G /root
...
Kết quả này cho thấy:
- Tổng dung lượng
/là 40G. - Trong đó,
/varđang chiếm tới 25G. - Tiếp theo là
/homechiếm 10G.
Chúng ta đã tìm ra thủ phạm chính là /var. Bây giờ, chúng ta “lặn” sâu hơn bằng cách lặp lại lệnh trên với thư mục /var:
- Lệnh:
du -h --max-depth=1 /var | sort -hr
Kết quả có thể là:
25G /var
22G /var/log
2G /var/lib
1G /var/cache
...
Aha! Vậy vấn đề thực sự nằm ở /var/log đang chiếm 22G.
Mẹo nhanh: Nếu kết quả quá dài, bạn có thể thêm
| head -n 5vào cuối để chỉ xem 5 thư mục lớn nhất.du -h --max-depth=1 / | sort -hr | head -n 5
3. Lệnh ncdu – “Phiên bản đồ họa” của du
Nếu bạn thấy các lệnh du và sort ở trên quá rắc rối, ncdu là cứu cánh của bạn. Nó là một công cụ phân tích dung lượng với giao diện trực quan (trong terminal).
- Cài đặt:
- Ubuntu/Debian:
apt install ncdu - CentOS/RHEL:
yum install ncdu
- Ubuntu/Debian:
- Sử dụng: Gõ
ncdu /(hoặcncdu /varnếu bạn đã khoanh vùng).
ncdu sẽ quét toàn bộ thư mục và hiển thị một danh sách tương tác, được sắp xếp sẵn từ lớn đến nhỏ. Bạn có thể dùng phím mũi tên để di chuyển, Enter để đi vào thư mục, và phím d để xóa file/thư mục (hết sức cẩn thận!).
4. Lệnh find và ls – “Thợ săn” file khổng lồ và file rác
Giờ chúng ta đã biết /var/log là thủ phạm. Nhưng có thể bạn muốn tìm các file “khổng lồ” ở bất cứ đâu, hoặc tìm các loại file rác cụ thể.
Cách 1: Dùng ls (Đơn giản nhất)
Khi đã dùng du đến được thư mục thủ phạm (ví dụ cd /var/log/nginx), bạn có thể dùng lệnh ls “thần thánh” này để sắp xếp file theo kích thước:
ls -larSh
- Kết quả sẽ liệt kê file với kích thước lớn nhất nằm ở dưới cùng, giúp bạn thấy ngay “thủ phạm”.
Cách 2: Dùng find (Mạnh mẽ nhất)
find cho phép bạn tìm kiếm trên toàn hệ thống với các điều kiện phức tạp.
- Tìm tất cả file lớn hơn 500MB trong thư mục
/:
find / -type f -size +500M - Tìm và xóa các file log cũ đã nén (An toàn):
logrotatethường nén log cũ thành file.gz. Chúng an toàn để xóa. Lệnh này tìm và xóa các file.gztrong/var/logcũ hơn 7 ngày.find /var/log -name "*.gz" -mtime +7 -delete - Tìm và xóa file tạm (tmp) không ai dùng: Lệnh này xóa các file trong
/tmpkhông được truy cập (access) trong 10 ngày qua.find /tmp -type f -atime +10 -delete - Tìm các “hung thần” ngốn dung lượng khác: Đôi khi VPS bị spam và hàng đợi mail đầy ắp. Hãy kiểm tra:
find /var/spool/exim/input -type f | wc -l(Đếm số lượng file)
Hoặc các file backup của Control Panel cũ:find /home/admin/admin_backups -name "*.tar.gz" -mtime +30(Tìm backup cũ hơn 30 ngày)
5. Lệnh rm – Xóa file và thư mục
Sau khi find ra các file rác, bạn dùng rm để xóa.
- Xóa file:
rm /var/log/ten_file_rac.log - Xóa thư mục rỗng:
rmdir /thu_muc/rong(Tham khảo lệnh rmdir: Cách để xóa thư mục trống trong VPS Linux) - Xóa thư mục và toàn bộ nội dung (CỰC KỲ CẨN THẬN):
rm -rf /var/cache/myapp/- Luôn kiểm tra lại đường dẫn 3 lần trước khi chạy
rm -rf.
- Luôn kiểm tra lại đường dẫn 3 lần trước khi chạy
Chuyên gia mách nước: Đã rm file log nhưng dung lượng không giảm?
Đây là một “cú lừa” kinh điển mà người mới nào cũng gặp.
- Tình huống: Bạn thấy file
/var/log/nginx/access.lognặng 20GB. Bạn chạy lệnhrm /var/log/nginx/access.log. Bạn gõdf -hvà… ổ cứng vẫn đầy 100%! - Tại sao? Khi bạn xóa file, Linux chỉ gỡ bỏ “con trỏ” trỏ đến file đó. Nhưng nếu một dịch vụ (như Nginx) vẫn đang “giữ” file đó mở để ghi log, hệ thống sẽ không thực sự giải phóng dung lượng cho đến khi dịch vụ đó được khởi động lại. File của bạn đã bị xóa nhưng vẫn bị “giữ” (deleted-but-open).
- Cách kiểm tra (Nâng cao): Lệnh
lsof(List Open Files) giúp bạn tìm các file đã bị xóa nhưng vẫn bị giữ.lsof +L1 | grep deleted - Cách xử lý:
- Cách 1 (Gián đoạn): Khởi động lại (restart) dịch vụ. Ví dụ:
systemctl restart nginx. - Cách 2 (Tốt nhất): Đừng dùng
rm. Hãy dùng lệnh số 6 dưới đây.
- Cách 1 (Gián đoạn): Khởi động lại (restart) dịch vụ. Ví dụ:
6. Lệnh truncate – Làm rỗng file log (Cách an toàn nhất)
Đây chính là “vũ khí bí mật” để xử lý các file log đang phình to mà không cần restart dịch vụ. Lệnh truncate sẽ làm rỗng nội dung file (đưa về 0 byte) nhưng vẫn giữ nguyên file đó.
- Lệnh:
truncate -s 0 /var/log/nginx/access.log - Giải thích:
truncate -s 0: Đặt kích thước (-s) của file về 0./var/log/nginx/access.log: File mục tiêu.- Tại sao là
-s 0(làm rỗng) mà không phải-s 100M(giữ lại 100MB)?
Đây là một điểm kỹ thuật rất quan trọng. Nhiều người dùng lầm tưởngtruncate -s 100Msẽ giữ lại 100MB log mới nhất (tương tự lệnhtail). Trên thực tế, lệnh này sẽ giữ lại 100MB đầu tiên (tức là log cũ nhất) và xóa phần còn lại, điều này hoàn toàn vô dụng. Trong tình huống “chữa cháy” khi VPS bị đầy ổ cứng, mục tiêu của chúng ta là giải phóng dung lượng ngay lập tức để hệ thống “thở”.truncate -s 0là cách duy nhất làm điều này một cách an toàn mà không cần khởi động lại dịch vụ.
- Cách thay thế nhanh: Một số người dùng cũng thích dùng lệnh
echo > /var/log/file.log. Về cơ bản nó cũng làm rỗng file, nhưngtruncateđược coi là “chuẩn” và an toàn hơn. - Để hiểu rõ hơn về cách
truncatehoạt động, hãy đọc bài Lệnh truncate trong Linux: Cách để xóa hoặc cắt bớt nội dung tệp của chúng tôi.
7. Lệnh journalctl – Quản lý log của Systemd
Trên các hệ thống Linux hiện đại (Ubuntu 18.04+, CentOS 7+), rất nhiều log hệ thống được quản lý bởi systemd-journald và lưu trong /var/log/journal. Đây cũng là một nguồn gây đầy ổ cứng.
Đừng dùng rm để xóa các file trong thư mục này. Hãy dùng chính journalctl.
- Kiểm tra dung lượng log journal:
journalctl --disk-usage - Cách 1: Chữa cháy (Xóa ngay lập tức) Xóa log cũ, chỉ giữ lại 100MB gần nhất:
journalctl --vacuum-size=100MHoặc xóa log cũ, chỉ giữ lại log trong 7 ngày gần nhất:journalctl --vacuum-time=7d - Cách 2: Phòng bệnh (Thiết lập vĩnh viễn) Để ngăn
journaldtích lũy log vô hạn, bạn hãy mở file cấu hình của nó:nano /etc/systemd/journald.conf. Tìm đến dòng#SystemMaxUse=(đang bị vô hiệu hóa), bỏ dấu#và đặt một giới hạn cứng, ví dụ:SystemMaxUse=500M. Lưu file và khởi động lại dịch vụ:systemctl restart systemd-journald. Từ giờ, log hệ thống sẽ không bao giờ vượt quá 500MB.
Chỉ với 7 lệnh này, bạn đã có thể xử lý 99% các trường hợp VPS bị đầy ổ cứng.
Phòng bệnh hơn chữa bệnh: 5 cách ngăn lỗi tái diễn
“Chữa cháy” xong, giờ là lúc “phòng cháy”. Bạn cần thiết lập các cơ chế tự động để không bao giờ gặp lại lỗi này.
1. Cấu hình logrotate (Giải pháp bắt buộc)
logrotate là công cụ tự động xoay vòng, nén, và xóa log cũ. Hầu hết các dịch vụ (Nginx, Apache) đã có sẵn file cấu hình trong /etc/logrotate.d/. Bạn cần kiểm tra (ví dụ: cat /etc/logrotate.d/nginx) và đảm bảo chúng có các tùy chọn rotate (để giới hạn số lượng) và compress (để nén log).
2. Dọn dẹp các phiên bản snap cũ (Dành cho Ubuntu)
Nếu bạn đang sử dụng VPS Ubuntu, rất có thể bạn đang dùng các gói snap. Snap tự động giữ lại nhiều phiên bản cũ của một ứng dụng (để rollback), chiếm hàng GB dung lượng vô ích.
- Kiểm tra:
snap list --all(Bạn sẽ thấy nhiều mục có trạng thái “disabled”). - Phòng ngừa: Giới hạn số bản lưu lại là 2:
sudo snap set system refresh.retain=2 - Dọn dẹp: Chạy đoạn script an toàn sau để xóa tất cả các bản “disabled” hiện có:
#!/bin/bash # Script để xóa tất cả các phiên bản snap cũ (disabled) set -eu snap list --all | awk '/disabled/{print $1, $3}' | while read snapname revision; do snap remove "$snapname" --revision="$revision" doneChỉ cần copy và dán toàn bộ 6 dòng trên vào terminal và Enter.
3. Dọn dẹp cache hệ thống (Bảo trì định kỳ)
Bạn nên chạy các lệnh này định kỳ 1 tháng/lần để xóa các gói cài đặt đã tải về nhưng không còn dùng đến.
- Với Ubuntu/Debian (dùng
apt):apt autoremove(Xóa các gói không còn cần thiết)apt clean(Xóa cache các gói đã tải về trong/var/cache/apt/archives/) - Với CentOS/RHEL (dùng
yum/dnf):yum clean all(hoặcdnf clean all)
4. Xóa các kernel cũ (Đặc biệt cho CentOS/RHEL)
Mỗi lần cập nhật hệ thống (kernel), CentOS thường giữ lại các bản kernel cũ, chiếm dụng dung lượng trong /boot.
- Cài đặt công cụ (nếu chưa có):
yum install yum-utils - Lệnh dọn dẹp:
package-cleanup --oldkernels --count=2. Lệnh này sẽ chỉ giữ lại 2 bản kernel mới nhất (bản đang chạy và 1 bản dự phòng) và xóa tất cả các bản cũ hơn.
5. Giải pháp cuối cùng: Nâng cấp ổ cứng
Nếu bạn đã làm tất cả các bước trên, nhưng chỉ sau 1-2 tuần ổ cứng lại đầy, thì vấn đề không còn là “file rác”. Vấn đề là ứng dụng của bạn đã phát triển và gói VPS hiện tại đã thực sự quá nhỏ so với nhu cầu.
Lúc này, đừng tốn thời gian dọn dẹp mỗi ngày. Giải pháp duy nhất và đúng đắn nhất là nâng cấp VPS của bạn lên một gói có dung lượng ổ cứng (Disk) lớn hơn.
Kết luận
VPS bị đầy ổ cứng là một trong những lỗi gây hoảng sợ nhất, nhưng hoàn toàn có thể kiểm soát được. Với 7 lệnh Linux (df, du, ncdu, find, rm, truncate, journalctl), bạn đã có đủ bộ công cụ để “bắt bệnh” và “chữa bệnh” một cách nhanh chóng và an toàn.
Hãy nhớ rằng, giải pháp lâu dài không phải là đi dọn dẹp hàng ngày, mà là thiết lập các cơ chế phòng bệnh tự động như logrotate, giới hạn journald và snap.
Nếu sau khi giải phóng dung lượng mà VPS của bạn vẫn gặp vấn đề, có thể nguyên nhân nằm ở nơi khác. Hãy tham khảo các bài viết khác trong chuỗi gỡ rối của chúng tôi để tìm hiểu thêm:
- VPS 100% CPU? Nguyên nhân & hướng dẫn xử lý triệt để từ A-Z
- VPS bị chậm, lag? Hướng dẫn toàn tập tối ưu hiệu năng từ A-Z
- VPS mất kết nối? Hướng dẫn chẩn đoán và khắc phục lỗi mạng từ A-Z
- VPS bị treo hoặc tự reboot? Hướng dẫn chẩn đoán và khắc phục từ A-Z
Chúc bạn thành công và máy chủ của bạn luôn “khỏe mạnh”!







