Xử Lý Tình Trạng Full Inode Trên VPS/Server Linux – Chẩn Đoán, Dọn Dẹp & Phòng Ngừa Từ A-Z

Xử lý tình trạng full inode là việc cần làm ngay khi website báo lỗi 500, không upload được file hoặc dịch vụ không khởi động, trong khi df -h vẫn báo ổ cứng còn hàng chục GB trống. Vấn đề không nằm ở dung lượng lưu trữ mà ở inode đã cạn. Phần dưới đây đi từ cách chẩn đoán, dọn dẹp đến phòng ngừa trên VPS Linux. Nếu cần môi trường root đầy đủ để thực hành, InterData cung cấp VPS và Cloud Server với toàn quyền quản trị.

Inode là gì? Vì sao đầy inode lại gây lỗi?

Inode (index node) là cấu trúc dữ liệu mà filesystem dùng để lưu metadata của mỗi file hoặc thư mục: quyền truy cập, chủ sở hữu, kích thước, thời gian tạo/sửa và con trỏ đến các block dữ liệu trên đĩa. Mỗi file hoặc thư mục bạn tạo ra tiêu tốn đúng một inode, bất kể file nặng 1 KB hay 100 MB. Khi filesystem được format, số lượng inode đã được cố định. Bạn không thể thêm inode vào một phân vùng ext4 đang chạy mà không format lại.

Vì vậy mới có chuyện ổ cứng còn trống nhưng không tạo được file. df -h đo dung lượng block, còn df -i đo số lượng inode. Một thư mục chứa hàng triệu file session nhỏ vài chục byte có thể chiếm chưa đến 1 GB nhưng đã ngốn sạch inode của phân vùng. Kernel trả về lỗi No space left on devicedf -h vẫn báo còn trống.

inode là gì

Cần phân biệt full disk và full inode. Full disk là hết dung lượng block; bạn xóa file lớn là giải phóng được. Full inode là hết slot metadata; bạn phải xóa nhiều file nhỏ, có khi hàng trăm nghìn đến hàng triệu file. Nếu chưa quen quản trị VPS qua dòng lệnh, bạn có thể xem tài liệu hướng dẫn sử dụng VPS trước khi thực hành phần dọn inode bên dưới. Trường hợp full disk thuần túy, tức block hết nhưng inode vẫn thoải mái, được xử lý theo quy trình khác. Bạn xem bài xử lý lỗi VPS bị full disk để so sánh.

VPS InterData

Filesystem lớn – Inode thoải mái – Root toàn quyền

VPS cấu hình thấp dễ hết inode chỉ sau vài tháng?

Đừng để website sập vì filesystem bé. VPS InterData cấp root đầy đủ trên SSD NVMe U.2, CPU thế hệ mới – bạn chạy ngay df -i, find, cấu hình logrotate để kiểm soát inode ngay từ đầu:

  • Filesystem phân bổ inode rộng, không lo hết slot metadata
  • Toàn quyền root – chạy mọi lệnh trong bài không giới hạn
  • Hỗ trợ kỹ thuật 24/7 khi bạn cần gỡ lỗi khẩn

Xem Bảng Giá Thuê VPS ⟶

Kích hoạt trong 5 phút – Không phí ẩn – Hoàn tiền 7 ngày

Cách kiểm tra và chẩn đoán inode bị đầy

Bạn cần kết nối SSH vào server với quyền root hoặc user có sudo. Nếu chưa quen thao tác kết nối, bài đăng nhập VPS qua SSH trên Windows, macOS và Linux sẽ giúp bạn thiết lập phiên làm việc trước khi chạy các lệnh bên dưới.

Bước 1: Kiểm tra tổng quan inode bằng df -i

Lệnh df -i hiển thị số inode đã dùng, còn trống và phần trăm sử dụng cho từng phân vùng. Đây là lệnh đầu tiên bạn nên chạy khi nghi ngờ full inode.

df -i -h

Kết quả trả về có dạng:

Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/vda1      2621440 2621440       0  100% /
tmpfs           502344      12  502332    1% /dev/shm

Cột IUse% cho biết mức sử dụng inode. Khi giá trị này đạt 100% hoặc gần 95%, bạn cần dọn ngay. Cột IFree bằng 0 là dấu hiệu rõ ràng nhất rằng filesystem đã hết inode. So sánh với df -h cùng phân vùng: nếu dung lượng block vẫn còn nhiều GB nhưng inode đã 100%, bạn đang đối mặt với full inode thuần túy, không phải full disk.

Kiểm tra tổng quan inode bằng df -i

Bước 2: Xác định thư mục chiếm nhiều inode nhất

Sau khi xác nhận phân vùng nào đầy inode, bạn cần tìm thư mục nào đang chứa lượng file lớn nhất. Có hai cách tiếp cận: đếm số file trong từng thư mục cấp một, hoặc dùng du --inodes để liệt kê trực tiếp theo số inode tiêu thụ.

Cách 1: Đếm file trong từng thư mục gốc

for d in /*; do
  echo -n "$d: "
  find "$d" -xdev -type f 2>/dev/null | wc -l
done

Lệnh này duyệt từng thư mục cấp một dưới root, đếm số file bên trong và in ra kết quả. Thư mục có số lượng file lớn nhất là mục tiêu cần điều tra tiếp. Sau khi xác định được thư mục cấp một, bạn lặp lại quy trình với các thư mục con bên trong để khoanh vùng chính xác.

Cách 2: Dùng du –inodes để xếp hạng

du --inodes --max-depth=1 / 2>/dev/null | sort -n -r | head -20

Kết quả liệt kê 20 thư mục tiêu thụ nhiều inode nhất, sắp xếp giảm dần. Bạn tiếp tục chạy lệnh này trên thư mục đứng đầu để đi sâu vào các cấp con.

Cách 3: Tìm nhanh thư mục chứa nhiều file trong một cây cụ thể

find /var -xdev -type d -exec sh -c \
  'echo "$(find "$1" -maxdepth 1 -type f | wc -l) $1"' _ {} \; 2>/dev/null \
  | sort -rn | head -20

Lệnh này đếm số file trực tiếp bên trong mỗi thư mục con của /var, giúp bạn phát hiện nhanh thư mục nào đang phình to bất thường mà không cần duyệt toàn bộ filesystem.

Xử lý theo từng nguyên nhân

Mỗi nguồn gây full inode có đặc điểm nhận dạng và cách dọn riêng. Xóa sai thư mục có thể làm hỏng ứng dụng, nên bạn cần xác định đúng nguyên nhân trước khi chạy lệnh xóa.

Xử lý inode bị đầy

1. File session PHP tích tụ trong /var/lib/php/sessions

Đây là nguyên nhân phổ biến nhất trên các server chạy PHP-FPM. Mỗi phiên truy cập tạo một file sess_* trong /var/lib/php/sessions (Ubuntu/Debian) hoặc /var/lib/php/session (CentOS/RHEL). Khi garbage collector của PHP không chạy đúng cách hoặc session.gc_probability bị đặt về 0, hàng trăm nghìn file session cũ sẽ tích tụ và đốt sạch inode.

Kiểm tra số lượng file session hiện tại:

find /var/lib/php/sessions -type f | wc -l

Xóa an toàn các file session cũ hơn 2 ngày, giữ lại session đang hoạt động trong 48 giờ gần nhất:

find /var/lib/php/sessions -type f -name 'sess_*' -mtime +2 -delete

Nếu thư mục chứa hàng triệu file và lệnh rm * báo lỗi Argument list too long, cách trên vẫn hoạt động vì find -delete xử lý từng file tuần tự, không bị giới hạn bởi shell argument list.

2. File cache WordPress phình to trong wp-content/cache

Các plugin cache như W3 Total Cache, LiteSpeed Cache hay WP Rocket tạo ra hàng trăm nghìn file nhỏ trong wp-content/cache, wp-content/cache/objectwp-content/cache/page_enhanced. Cơ chế page cache lưu từng phiên bản HTML theo URL, kết hợp object cache lưu từng key riêng lẻ. Số file tăng theo cấp số nhân nếu không có giới hạn dung lượng cache.

Kiểm tra dung lượng inode của thư mục cache:

du --inodes -sh /home/*/public_html/wp-content/cache/ 2>/dev/null
find /home/*/public_html/wp-content/cache/ -type f 2>/dev/null | wc -l

Xóa toàn bộ cache cũ hơn 7 ngày:

find /home/*/public_html/wp-content/cache/ -type f -mtime +7 -delete

Nếu muốn xóa sạch và để plugin tái tạo cache mới, dùng:

rm -rf /home/*/public_html/wp-content/cache/*

Sau khi xóa cache, truy cập lại website để plugin tái tạo cache. Lưu ý rằng một số plugin có cài đặt giới hạn số file cache tối đa. Bạn nên bật tùy chọn đó nếu có.

3. Mail queue bị kẹt trong /var/spool/postfix

Postfix tạo một file riêng cho mỗi email trong queue. Khi có sự cố gửi mail, ví dụ script bị lỗi gửi hàng nghìn email thông báo hoặc server bị lợi dụng để spam, deferred queue có thể tích tụ hàng trăm nghìn file nhỏ. Phân vùng chứa /var/spool/postfix sẽ hết inode trước khi hết dung lượng byte.

Kiểm tra số lượng file trong từng queue:

for d in maildrop incoming active deferred bounce defer hold corrupt; do
  count=$(find /var/spool/postfix/$d -type f 2>/dev/null | wc -l)
  echo "$d: $count files"
done

Xóa các file trong deferred queue cũ hơn 3 ngày. Cách này an toàn cho hầu hết trường hợp, vì mail cũ thường không còn giá trị gửi lại:

find /var/spool/postfix/deferred -type f -mtime +3 -delete

Nếu muốn xóa sạch toàn bộ queue để giải phóng inode ngay lập tức và chấp nhận mất các email đang chờ, dùng:

postsuper -d ALL deferred

Sau khi dọn queue, kiểm tra lại bằng mailq để xác nhận số lượng email đã giảm.

4. Log hệ thống trong /var/log không được xoay vòng

Khi logrotate bị lỗi cấu hình hoặc không chạy, các file log như syslog, auth.log, messages có thể phình to. Nghiêm trọng hơn, systemd journal trong /var/log/journal lưu từng entry dưới dạng file riêng, và hàng triệu file journal nhỏ sẽ đốt sạch inode nhanh chóng.

Kiểm tra dung lượng và số file trong /var/log:

du --inodes -sh /var/log/*
journalctl --disk-usage

Giới hạn journal systemd chỉ giữ log trong 7 ngày gần nhất và tối đa 500 MB:

journalctl --vacuum-time=7d
journalctl --vacuum-size=500M

Lệnh journalctl --vacuum-size chỉ xóa các file journal đã archive, không ảnh hưởng đến journal đang hoạt động, nên an toàn để chạy trên server production.

Xóa các file log cũ hơn 30 ngày trong /var/log, trừ các file đang được ghi:

find /var/log -type f \( -name "*.log.*" -o -name "*.gz" -o -name "*.old" \) -mtime +30 -delete

Sau khi dọn log, bạn nên thiết lập cấu hình Logrotate để tự động xoay vòng log nhằm ngăn vấn đề tái diễn.

5. File tạm trong /tmp và systemd-private

Thư mục /tmp và các thư mục con /tmp/systemd-private-* chứa file tạm từ các dịch vụ hệ thống. Một số ứng dụng không tự dọn file tạm, dẫn đến tích tụ hàng trăm nghìn file rác theo thời gian. Trên các server chạy nhiều phiên bản PHP khác nhau, mỗi phiên bản có thể ghi session vào một thư mục /tmp/systemd-private-*/tmp/ riêng.

Liệt kê các file tạm cũ hơn 3 ngày:

find /tmp -type f -mtime +3 2>/dev/null | wc -l

Xóa file tạm cũ hơn 3 ngày trong /tmp, không xóa thư mục systemd-private để tránh ảnh hưởng dịch vụ đang chạy:

find /tmp -maxdepth 1 -type f -mtime +3 -delete

Dọn file session trong các thư mục systemd-private:

find /tmp/systemd-private-*/tmp/ -type f -name 'sess_*' -mtime +2 -delete 2>/dev/null

Nguồn gây đầy inode và cách xử lý

Nguồn gây ra Thư mục thường gặp Lệnh kiểm tra nhanh Cách xử lý
PHP session /var/lib/php/sessions find /var/lib/php/sessions -type f | wc -l find ... -mtime +2 -delete + tăng session.gc_probability
WordPress cache wp-content/cache/ du --inodes -sh wp-content/cache/ find ... -mtime +7 -delete + giới hạn cache trong plugin
Mail queue /var/spool/postfix/deferred find /var/spool/postfix/deferred -type f | wc -l postsuper -d ALL deferred hoặc xóa file cũ hơn 3 ngày
Log hệ thống /var/log, /var/log/journal journalctl --disk-usage journalctl --vacuum-size=500M + logrotate
File tạm /tmp, /tmp/systemd-private-*/tmp/ find /tmp -type f -mtime +3 | wc -l find /tmp -maxdepth 1 -type f -mtime +3 -delete

Dọn inode xong rồi nhưng tháng sau có lặp lại?

Đừng để mất thêm vài tiếng gỡ lỗi 500 lúc nửa đêm. Canh Me tổng hợp khuyến mãi, mã giảm giá và Hot Deals VPS/Cloud Server mới nhất từ InterData – chọn cấu hình đủ lớn để không chạm trần inode, với chi phí tiết kiệm.

Tiết kiệm 30–50%
Cập nhật hàng ngày
Chọn đúng cấu hình

Săn Ưu Đãi VPS Tại Canh Me ⟶

Cập nhật liên tục – Không cần đăng ký – Xem là chọn được ngay

Xử lý trên control panel phổ biến

Mỗi control panel có đường dẫn session và cơ chế quản lý inode riêng. Dưới đây là cách làm với CyberPanel, DirectAdmin và cPanel, ba panel phổ biến nhất trên VPS Việt Nam.

CyberPanel: session nằm trong /var/lib/lsphp/session

CyberPanel dùng LiteSpeed PHP (lsphp) thay vì PHP-FPM tiêu chuẩn, nên session được lưu trong /var/lib/lsphp/session/. Đây là nguyên nhân full inode phổ biến nhất trên CyberPanel nếu garbage collector không chạy đúng.

Kiểm tra số lượng file session:

find /var/lib/lsphp/session/ -type f -name 'sess_*' | wc -l

Xóa file session cũ hơn 2 ngày:

find /var/lib/lsphp/session/ -type f -name 'sess_*' -mtime +2 -delete

Sau khi dọn, kiểm tra lại inode và khởi động lại lsphp nếu cần:

df -i
systemctl restart lsws

DirectAdmin: kiểm tra qua dashboard và SSH

DirectAdmin hiển thị mức sử dụng inode theo từng user account trên dashboard chính (Admin Level → Show All Users). Trên shared hosting, giới hạn inode thường được đặt theo gói hosting, và user vượt ngưỡng sẽ không tạo được file mới.

Kiểm tra inode toàn server qua SSH:

df -i

Tìm user hoặc thư mục chiếm nhiều inode nhất trong /home:

for user in /home/*; do
  echo -n "$(basename $user): "
  find "$user" -xdev -type f 2>/dev/null | wc -l
done | sort -t: -k2 -rn | head -10

DirectAdmin thường gặp full inode do Message System ticket và backup cũ tích tụ trong thư mục user. Dọn ticket cũ:

find /usr/local/directadmin/data/tickets -type f -mtime +30 -delete 2>/dev/null

Dọn backup cũ trong /home/admin/admin_backups nếu có:

find /home/admin/admin_backups -name '*.tar.gz' -mtime +7 -delete 2>/dev/null

cPanel: kiểm tra File Usage và dọn qua SSH

cPanel hiển thị số inode đang dùng so với giới hạn trong mục Statistics → File Usage trên trang chủ tài khoản. Nếu con số này chạm trần trong khi Disk Usage vẫn thấp, bạn đang bị full inode do tài khoản, không phải do toàn server.

Kiểm tra inode toàn server:

df -i

cPanel dùng MultiPHP và session có thể nằm ở nhiều vị trí khác nhau tùy phiên bản PHP. Kiểm tra tất cả thư mục session có thể có:

ls -d /var/cpanel/php/sessions/*/ 2>/dev/null
ls -d /tmp/systemd-private-*/tmp/ 2>/dev/null

Xóa session cũ trong từng thư mục tương ứng. Thay ea-php81 bằng phiên bản PHP thực tế đang dùng:

find /var/cpanel/php/sessions/ea-php81/ -type f -name 'sess_*' -mtime +2 -delete 2>/dev/null

Nếu server dùng CloudLinux với giới hạn inode theo package, bạn cần điều chỉnh giới hạn trong WHM → Packages → Feature Manager hoặc tăng giới hạn trong gói tương ứng.

Phòng ngừa inode bị đầy trở lại

Dọn inode chỉ giải quyết triệu chứng. Để không phải xử lý tình trạng full inode lặp lại mỗi vài tuần, bạn cần thiết lập cơ chế tự động dọn dẹp và giám sát định kỳ.

Cấu hình logrotate cho /var/log

Logrotate là công cụ tiêu chuẩn trên hầu hết bản phân phối Linux, chạy hàng ngày qua cron để xoay vòng, nén và xóa log cũ theo cấu hình trong /etc/logrotate.conf/etc/logrotate.d/. Kiểm tra logrotate có đang chạy đúng không:

systemctl status logrotate.timer
cat /etc/logrotate.conf | grep -E 'rotate|weekly|daily'

Một cấu hình logrotate điển hình cho syslog và auth.log giới hạn 4 bản archive và nén lại để tiết kiệm inode:

/var/log/syslog {
    rotate 4
    weekly
    missingok
    notifempty
    compress
    delaycompress
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

Chi tiết đầy đủ về cấu hình logrotate cho từng loại log trên VPS bạn xem trong bài cấu hình Logrotate để tự động xoay vòng log.

Cronjob tự động dọn PHP session

Thay vì chờ garbage collector của PHP chạy ngẫu nhiên theo tỉ lệ gc_probability/gc_divisor, bạn nên tạo cronjob dọn session cũ mỗi ngày. Điều này đặc biệt quan trọng trên server có lưu lượng truy cập cao, nơi GC mặc định có thể không đủ nhanh để theo kịp tốc độ tạo session mới.

Mở crontab của root:

crontab -e

Thêm dòng sau để dọn session cũ hơn 1 ngày vào 3 giờ sáng mỗi ngày. Điều chỉnh đường dẫn cho phù hợp với PHP-FPM hoặc lsphp:

0 3 * * * find /var/lib/php/sessions -type f -name 'sess_*' -mtime +1 -delete 2>/dev/null

Hướng dẫn chi tiết cách viết cronjob, cú pháp thời gian và các tùy chọn nâng cao có trong bài thiết lập cron job tự động dọn dẹp file.

Điều chỉnh session.gc_maxlifetime và session.gc_probability trong php.ini

Hai tham số quyết định tốc độ dọn session tự động của PHP:

  • session.gc_maxlifetime = 1440: session được coi là rác sau 1440 giây (24 phút). Với website có người dùng đăng nhập lâu, bạn có thể tăng lên 3600 hoặc 7200 để tránh đăng xuất quá sớm, nhưng đừng để quá cao vì session cũ sẽ tích tụ lâu hơn.
  • session.gc_probability = 1session.gc_divisor = 1000: mỗi request có 0.1% cơ hội kích hoạt garbage collector. Nếu gc_probability = 0, GC không bao giờ chạy tự động và session sẽ tích tụ vô hạn.

Tìm file php.ini đang được PHP-FPM sử dụng và kiểm tra giá trị hiện tại:

php -i | grep -E 'session.gc_maxlifetime|session.gc_probability|Loaded Configuration File'

Chỉnh sửa trực tiếp trong file php.ini. Đường dẫn có thể khác nhau tùy phiên bản PHP:

sed -i 's/^session.gc_probability = 0/session.gc_probability = 1/' /etc/php/*/fpm/php.ini
systemctl restart php*-fpm

Giám sát inode định kỳ và bảo mật server

Thiết lập cronjob kiểm tra inode mỗi giờ và gửi cảnh báo khi vượt ngưỡng 85%. Script đơn giản dùng df -iawk:

#!/bin/bash
THRESHOLD=85
df -i --output=pcent / | tail -1 | tr -d '%' | while read pct; do
  if [ "$pct" -ge "$THRESHOLD" ]; then
    echo "CANH BAO: Inode tren / da dat ${pct}%" | mail -s "Inode Alert" [email protected]
  fi
done

Lưu script vào /usr/local/bin/check-inode.sh, cấp quyền thực thi bằng chmod +x, và thêm vào crontab chạy mỗi giờ:

0 * * * * /usr/local/bin/check-inode.sh

Song song với giám sát, bạn nên rà soát các biện pháp bảo mật tổng thể để ngăn kẻ tấn công lợi dụng form mail hoặc upload file để làm đầy inode. Các bước như giới hạn tỉ lệ request, cấu hình firewall và tắt các dịch vụ không cần thiết được tổng hợp trong bài các bước bảo mật VPS Linux.

Cloud Server

Nâng tài nguyên tức thì – Không rebuild

Website đang lớn – Đừng để filesystem chặn đà tăng trưởng

Khi lượng người dùng và file tăng liên tục, VPS cố định sẽ sớm chạm trần inode. Cloud Server InterData cho phép nâng dung lượng lưu trữ và tài nguyên ngay lập tức – không cần rebuild, không downtime, không lo full inode trở lại:

  • Mở rộng filesystem linh hoạt – thêm inode khi cần
  • Nâng RAM/CPU ngay lập tức, không gián đoạn dịch vụ
  • SSD NVMe U.2 – hiệu năng cao cho production
  • Hỗ trợ 24/7 – đồng hành khi server cao điểm

Xem Bảng Giá Cloud Server ⟶

Trả theo tài nguyên thực dùng – Nâng cấp không phí ẩn

Một số lỗi bất thường sau khi dọn inode

1. Đã xóa file nhưng df -i vẫn báo 100%

Triệu chứng: Bạn đã xóa hàng loạt file session hoặc log, nhưng df -i vẫn hiển thị IUse% 100%. Dung lượng không được giải phóng dù ls không còn thấy file.

Nguyên nhân: Một tiến trình vẫn đang giữ file descriptor mở trên file đã bị xóa. Trong Linux, khi bạn rm một file, directory entry bị xóa nhưng inode và data block chỉ được giải phóng khi tất cả tiến trình đóng file descriptor. Nếu PHP-FPM, Postfix hoặc rsyslog vẫn đang giữ file, inode không được trả về filesystem.

Kiểm tra: Liệt kê các file đã bị xóa nhưng vẫn được tiến trình giữ mở:

lsof +L1 2>/dev/null | grep -i deleted
lsof | grep deleted | head -20

Cách xử lý: Restart dịch vụ đang giữ file. Thay php8.1-fpm bằng tên dịch vụ thực tế:

systemctl restart php8.1-fpm
systemctl restart postfix

Sau khi restart, chạy lại df -i để xác nhận inode đã được giải phóng. Nếu không thể restart dịch vụ ngay, ví dụ đang trong giờ cao điểm, bạn có thể dùng kill -HUP để tiến trình đóng file descriptor mà không ngắt kết nối hoàn toàn.

2. rm báo lỗi “Argument list too long”

Triệu chứng: Bạn chạy rm * hoặc rm -rf * trong thư mục chứa hàng trăm nghìn file và nhận lỗi -bash: /bin/rm: Argument list too long. Shell không thể mở rộng wildcard thành danh sách đối số đủ lớn để truyền cho rm.

Nguyên nhân: Giới hạn ARG_MAX của kernel, thường khoảng 2 MB trên Linux, khiến shell không thể truyền hàng trăm nghìn tên file cùng lúc cho một lệnh duy nhất.

Cách xử lý: Dùng find -delete thay vì rm wildcard. Lệnh này xử lý từng file tuần tự, không bị giới hạn argument list:

find /var/lib/php/sessions -type f -name 'sess_*' -delete

Nếu muốn theo dõi tiến độ xóa, bạn có thể pipe qua pv nếu đã cài, hoặc đếm số file còn lại trước và sau:

find /var/lib/php/sessions -type f -name 'sess_*' | wc -l

Phương án thay thế khi cần xóa nhanh hơn: tạo một thư mục mới, di chuyển các file cần giữ sang đó, xóa cả thư mục cũ bằng rm -rf, rồi đổi tên thư mục mới về tên cũ. Cách này nhanh hơn nhưng cần cẩn thận để không mất dữ liệu quan trọng.

3. Dịch vụ vẫn lỗi sau khi đã dọn inode

Triệu chứng: df -i đã về mức bình thường dưới 50%, nhưng website vẫn trả lỗi 500, PHP-FPM không khởi động hoặc database không kết nối được.

Nguyên nhân: Khi inode đầy, nhiều dịch vụ ghi log hoặc ghi file trạng thái thất bại và có thể đã crash hoặc rơi vào trạng thái không ổn định. PHP-FPM có thể đã dừng worker pool, MySQL/MariaDB có thể không mở được file tạm, hoặc web server không ghi được access log.

Kiểm tra: Kiểm tra trạng thái các dịch vụ chính:

systemctl status nginx php8.1-fpm mariadb
journalctl -xe --since "10 minutes ago" | grep -i "no space\|error\|failed"

Cách xử lý: Restart tuần tự các dịch vụ liên quan:

systemctl restart php8.1-fpm
systemctl restart nginx
systemctl restart mariadb

Kiểm tra lại log ứng dụng để xác nhận không còn lỗi ghi file. Nếu dịch vụ vẫn không khởi động sau khi restart, kiểm tra cấu hình của dịch vụ đó có tham chiếu đến đường dẫn file không tồn tại hoặc quyền truy cập sai.

Trường hợp hệ thống bị hỏng nặng, filesystem có lỗi sau khi hết inode đột ngột, hoặc bạn không thể khôi phục dịch vụ sau nhiều lần restart, giải pháp cuối cùng là cài lại hệ điều hành VPS từ snapshot hoặc backup gần nhất. Trước khi thực hiện, hãy đảm bảo bạn đã sao lưu toàn bộ dữ liệu quan trọng.

Sau khi khắc phục xong sự cố, đây là thời điểm phù hợp để rà soát lại cấu hình bảo mật. Nếu server chưa có firewall, bạn nên cấu hình UFW firewall để giới hạn cổng truy cập và giảm bề mặt tấn công, đặc biệt quan trọng nếu sự cố full inode có nguyên nhân từ hoạt động bất thường bên ngoài.

Câu hỏi thường gặp về full inode

Tại sao ổ cứng còn trống nhưng server vẫn báo “No space left on device”?

Lỗi này xảy ra khi filesystem hết inode chứ không phải hết dung lượng block. Mỗi file và thư mục tiêu tốn một inode cố định khi format. Nếu có hàng triệu file nhỏ, inode cạn trước khi dung lượng byte đầy. Lệnh df -i sẽ xác nhận cột IUse% đạt 100%.

Làm thế nào để kiểm tra nhanh phân vùng nào đang bị full inode?

Chạy df -i -h để xem tất cả phân vùng cùng lúc. Cột IUse% cho biết mức sử dụng. Phân vùng nào có IFree bằng 0 hoặc IUse% trên 95% là mục tiêu cần dọn. Thường gặp nhất là phân vùng root / hoặc phân vùng chứa /var.

File session PHP tích tụ bao nhiêu thì gây đầy inode?

Không có ngưỡng cố định, vì còn tùy số inode của filesystem. Trên phân vùng mặc định 2,6 triệu inode, khoảng 500.000 đến 1 triệu file session là có thể gây full. Dấu hiệu rõ nhất là df -i báo IUse% trên 90% và website bắt đầu lỗi tạo file.

Có thể tăng số lượng inode trên ext4 mà không format lại không?

Không. Với filesystem ext4, số inode được cố định khi tạo filesystem và không thể thay đổi nếu không format lại. Muốn tăng inode, bạn phải backup dữ liệu, format lại với tỉ lệ -i thấp hơn, ví dụ mkfs.ext4 -i 8192, rồi restore dữ liệu.

Dọn inode xong website vẫn lỗi, phải kiểm tra thêm điều gì?

Kiểm tra xem tiến trình nào vẫn giữ file descriptor trên file đã xóa bằng lsof | grep deleted, sau đó restart dịch vụ tương ứng. Đồng thời kiểm tra trạng thái PHP-FPM, web server và database xem có dịch vụ nào crash trong thời gian inode đầy hay không.

Lời kết

Xử lý tình trạng full inode không khó nếu bạn đi đúng trình tự: kiểm tra bằng df -i để xác định phân vùng và mức độ, dọn dẹp đúng nguồn gây ra như session PHP, cache WordPress, mail queue, log, file tạm, và phòng ngừa bằng logrotate, cronjob dọn session tự động cùng script giám sát inode định kỳ. Đừng chờ đến khi website sập mới xử lý. Thiết lập giám sát từ hôm nay.

Nếu server hiện tại thường xuyên chạm ngưỡng inode dù đã dọn dẹp, có thể bạn cần một môi trường có tài nguyên lưu trữ linh hoạt hơn. Tham khảo các gói VPS InterData hoặc Cloud Server để có filesystem lớn hơn, SSD NVMe U.2 và toàn quyền root cho việc cấu hình.

Nội dung mang tính tham khảo. Lệnh, cú pháp, đường dẫn file và tùy chọn cấu hình có thể thay đổi theo phiên bản hệ điều hành, phiên bản phần mềm và môi trường cụ thể. Nên kiểm thử, sao lưu dữ liệu và đánh giá rủi ro trước khi áp dụng lên server production.