Hướng dẫn sử dụng ncdu và duf trên Linux: Phân tích và giải phóng dung lượng ổ đĩa trực quan từ dòng lệnh

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Bối cảnh & Tại sao cần

Ổ đĩa chạm mốc 95% lúc 2 giờ sáng. Chuông PagerDuty réo liên hồi. Đây là ác mộng quen thuộc với bất kỳ sysadmin nào. Theo phản xạ, lệnh đầu tiên bạn gõ vào terminal sẽ là df -h để xem phân vùng nào đang kẹt. Tiếp theo là chuỗi lệnh mệt mỏi: du -sh /* 2>/dev/null | sort -hr.

Cách làm cũ này bộc lộ hai điểm yếu chí mạng. Thứ nhất, lệnh du càn quét I/O rất nặng. Trên ổ HDD hoặc phân vùng lưu trữ lớn (hàng TB), lệnh này dễ làm server nghẽn cổ chai. Thứ hai, terminal trả về một danh sách text rối mắt. Muốn kiểm tra thư mục con bên trong, bạn phải liên tục gõ lại lệnh.

Hồi mới vào nghề, mình từng dính quả đắng với con máy chủ MySQL. Phân vùng /var báo đỏ 100%. Vì cuống và loay hoay với mớ output lộn xộn từ du, mình xóa nhầm file socket mysql.sock thay vì file nhị phân log (binlog) đang phình 40GB. Database sập, kéo theo hơn 45 phút downtime oan uổng.

Sau sự cố đó, mình đưa ngay duf và ncdu vào cấu hình chuẩn cho toàn bộ cụm server production:

  • duf (Disk Usage/Free Utility): Thay thế hoàn hảo cho df. Nó tự động gom nhóm ổ cứng vật lý, ổ đĩa mạng NFS và phân vùng ảo (tmpfs). Giao diện hiển thị dạng bảng màu kèm thanh tiến trình (progress bar) cực kỳ trực quan.
  • ncdu (NCurses Disk Usage): Bản nâng cấp đáng giá của du với giao diện tương tác TUI (Text User Interface). Bạn duyệt cây thư mục bằng phím mũi tên, xem tỷ lệ chiếm dụng dung lượng theo thời gian thực và xóa file rác ngay tại chỗ.

Cài đặt

Cả hai công cụ đều viết bằng ngôn ngữ tối ưu (ncdu bằng C/Zig, duf bằng Go). Chúng ngốn rất ít RAM và có sẵn trên hầu hết repo chính thức.

1. Trên Ubuntu / Debian

sudo apt update
sudo apt install -y ncdu duf

Nếu dùng Ubuntu đời cũ (như 20.04 LTS chưa có sẵn package duf trong kho apt), bạn hãy kéo trực tiếp bản binary từ GitHub release:

curl -LO https://github.com/muesli/duf/releases/download/v0.8.0/duf_0.8.0_linux_amd64.deb
sudo dpkg -i duf_0.8.0_linux_amd64.deb
rm -f duf_0.8.0_linux_amd64.deb

2. Trên RHEL / Rocky Linux / AlmaLinux

Với hệ sinh thái RHEL, hãy bật kho EPEL trước khi cài ncdu:

sudo dnf install -y epel-release
sudo dnf install -y ncdu

Cài đặt duf qua gói RPM chính thức:

sudo dnf install -y https://github.com/muesli/duf/releases/download/v0.8.0/duf_0.8.0_linux_amd64.rpm

3. Trên Arch Linux

sudo pacman -S ncdu duf

Cấu hình chi tiết và mẹo thực chiến

Cài đặt xong rồi, giờ là lúc đưa chúng vào xử lý sự cố thực tế.

1. Quan sát toàn cảnh hệ thống với duf

Chỉ cần gõ duf, terminal sẽ hiện đầy đủ các phân vùng: Local Devices, Inaccessible Devices và Special Devices. Tuy nhiên, trên máy chủ thực tế, bạn chỉ nên tập trung vào các ổ đĩa vật lý lưu trữ dữ liệu thật.

Lọc bỏ các phân vùng ảo (như squashfs từ snap, tmpfs):

duf --only local

Sắp xếp danh sách phân vùng theo dung lượng đã dùng giảm dần để phát hiện ngay điểm nóng:

duf --sort used

Kiểm tra tình trạng Inode:

duf --inodes

Cờ này cứu nguy trong tình huống oái oăm: Ổ đĩa báo đầy 100% nhưng df vẫn báo dung lượng byte còn trống hàng chục GB. Nguyên nhân thường do ứng dụng tạo ra hàng triệu file session hoặc cache kích thước 0 byte làm cạn kiệt bảng chỉ mục inode.

Mẹo nhỏ: Mình hay tạo alias cố định trong ~/.bashrc để tiện dùng mỗi ngày:

echo 'alias df="duf --only local"' >> ~/.bashrc
source ~/.bashrc

2. Dò tìm và dọn dẹp điểm nghẽn với ncdu

Khi duf đã chỉ ra phân vùng đang bị nghẽn, hãy dùng ncdu để tìm chính xác thư mục hoặc file thủ phạm.

Quét an toàn trên phân vùng Root:

sudo ncdu -x /

Cực kỳ lưu ý cờ -x (one filesystem): Cờ này giữ cho ncdu chỉ quét trong đúng phân vùng gốc. Nó không quét tràn qua các mount point khác như ổ cứng ngoài, ổ mạng NFS, hoặc các thư mục ảo /proc, /sys. Thiếu cờ này, tiến trình quét dễ bị loop vô tận hoặc gây áp lực RAM không cần thiết.

Tăng tốc độ quét bằng cách bỏ qua các thư mục dữ liệu container lớn:

sudo ncdu -x --exclude /var/lib/docker/overlay2 /

3. Phím tắt thiết yếu khi dùng ncdu

Trong giao diện TUI của ncdu, bạn hoàn toàn làm chủ hệ thống qua bàn phím:

  • Mũi tên lên / xuống (hoặc j / k): Di chuyển giữa các dòng file và folder.
  • Enter (hoặc mũi tên phải): Mở thư mục đang chọn.
  • Mũi tên trái: Lùi lại thư mục cha.
  • d: Xóa file hoặc thư mục. Màn hình sẽ hiện popup cảnh báo xác nhận trước khi xóa vĩnh viễn.
  • g: Chuyển đổi hiển thị đồ họa thanh dung lượng (Graph): phần trăm (percentage), biểu đồ thanh (bar), hoặc tắt hẳn.
  • i: Mở bảng thông tin chi tiết: đường dẫn tuyệt đối, số inode, quyền sở hữu (permission).
  • n: Sắp xếp theo tên file.
  • s: Sắp xếp theo dung lượng (mặc định từ lớn nhất đến nhỏ nhất).
  • q: Thoát chương trình.

4. Quét offline cho server chịu tải cao (High Load)

Duyệt thư mục trực tiếp trên server production có thể giữ I/O đĩa quá lâu. Với hệ thống đang gánh tải hàng nghìn request mỗi giây, hãy quét một lần duy nhất rồi xuất ra file nén để đọc lại:

# Quét 1 lần và xuất file nén gzip (cờ -1 quét nhanh và thoát ngay)
sudo ncdu -1xo- /var/log | gzip > /tmp/ncdu_var_log.json.gz

# Đọc và điều hướng dữ liệu mà không tốn thêm 1 lượt đọc đĩa nào
zcat /tmp/ncdu_var_log.json.gz | ncdu -f -

Kiểm tra & Monitoring sau dọn dẹp

Xóa xong vài chục GB log cũ, đừng vội ngắt SSH. Bạn cần kiểm tra lại xem dung lượng đĩa đã thực sự được hệ điều hành thu hồi hay chưa.

1. Xác nhận lại dung lượng khả dụng

Chạy nhanh duf để kiểm tra con số tổng quan:

duf --only local

2. Bẫy tiến trình giữ file đã xóa (Deleted Open Files)

Bạn vừa xóa file access.log dung lượng 30GB bằng ncdu, nhưng duf vẫn báo dung lượng không giảm dù chỉ một byte? Đừng hoảng. Tiến trình Nginx vẫn đang mở file descriptor này. Linux sẽ chỉ thực sự giải phóng các block dữ liệu vật lý khi tiến trình đó nhả file.

Tìm nhanh tiến trình nào đang giữ các file đã bị xóa:

sudo lsof +L1 | grep '(deleted)'

Lệnh trên sẽ in ra PID của dịch vụ liên quan. Bạn chỉ cần yêu cầu dịch vụ giải phóng file handle:

sudo systemctl reload nginx

Chạy lại duf, bạn sẽ thấy hàng chục GB dung lượng trống lập tức quay trở lại.

3. Tích hợp cảnh báo tự động qua JSON

Điểm rất hay của duf là nó hỗ trợ cờ --json. Nhờ đó, việc viết script bash cảnh báo định kỳ qua Slack hoặc Telegram trở nên vô cùng gọn gàng:

#!/usr/bin/env bash
set -euo pipefail

# Lấy % đã dùng của phân vùng root (/)
USAGE=$(duf --json | jq '.[] | select(.mount_point=="/") | .used_percent')

if (( $(echo "$USAGE > 90" | bc -l) )); then
    echo "Cảnh báo: Phân vùng / đã dùng chạm ngưỡng ${USAGE}% trên $(hostname)!" | mail -s "[Disk Alert] $(hostname) sắp đầy ổ" [email protected]
fi

Chỉ cần kết hợp duf để nắm tổng quan và ncdu để xử lý chi tiết, bạn sẽ tiết kiệm hàng giờ thao tác lệnh thủ công mỗi khi server gặp sự cố đầy ổ đĩa.

Share: