Ổ Đĩa và Dung Lượng: df, du, lsblk, mount

K
Kai··4 min read

"No space left on device" — hết đĩa là một trong những sự cố server hay gặp nhất, và làm dịch vụ chết hàng loạt (không ghi được log, database, file tạm). Bài này dạy quy trình tìm và xử lý: từ "filesystem nào đầy" tới "cái gì ngốn chỗ".

df: filesystem nào còn bao nhiêu chỗ

df (disk free) cho cái nhìn tổng quan dung lượng các filesystem:

df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          59G   22G   34G  40% /
tmpfs            64M     0   64M   0% /dev
/dev/vda1        59G   22G   34G  40% /etc/hosts

-h (human-readable) hiện G/M thay vì số block khó đọc. Cột quan trọng nhất là Use%Mounted on: nó cho biết filesystem nào sắp đầy và nó được gắn ở đâu trong cây thư mục. Khi báo hết đĩa, đây là lệnh đầu tiên — để biết cái nào đầy (đầy / khác hẳn đầy một phân vùng riêng như /var).

Bẫy "df nói còn chỗ mà vẫn báo hết đĩa": có thể bạn cạn inode (số lượng file), không phải dung lượng. Mỗi file tốn một inode; quá nhiều file nhỏ làm cạn inode dù còn GB trống. Kiểm tra bằng df -i (xem cột IUse%).

du: thư mục nào đang ngốn chỗ

df cho biết filesystem nào đầy; du (disk usage) truy ra thư mục nào trong đó ngốn chỗ:

du -sh /usr           # tổng dung lượng /usr (-s tóm tắt, -h human)
du -sh /etc
100M  /usr
672K  /etc

Để tìm "thủ phạm", liệt kê dung lượng từng thư mục con rồi sắp giảm dần:

du -sh /usr/* | sort -rh | head
62M   /usr/lib
25M   /usr/bin
7.7M  /usr/sbin
5.8M  /usr/share

sort -rh sắp theo số human-readable, giảm dần (-r); head lấy vài cái đầu. Đây là pipeline (Bài 6) bạn sẽ gõ rất nhiều khi truy đĩa đầy: chạy du -sh */ | sort -rh | head ở thư mục nghi ngờ, vào thư mục lớn nhất, lặp lại — đào dần tới chỗ ngốn chỗ.

Tìm file lớn

Khi muốn nhắm thẳng file lớn (Bài 3 — find -size):

find / -type f -size +100M 2>/dev/null    # file lớn hơn 100MB

2>/dev/null (Bài 6) vứt các lỗi "Permission denied" khi quét toàn hệ thống cho gọn. Thủ phạm hết đĩa thường là log phình to (/var/log/*.log), file tạm, hoặc dump database bị quên.

Quy trình xử lý "disk full"

Ghép lại thành một quy trình bạn có thể làm theo khi server báo hết đĩa:

1. df -h                      → filesystem nào Use% cao? gắn ở đâu?
        │
2. cd <mount point đó>
   du -sh */ | sort -rh | head → thư mục nào lớn nhất?
        │  (lặp lại, đào sâu dần)
3. find . -type f -size +100M → file cụ thể nào lớn?
        │
4. xử lý: xóa/nén log cũ, dọn file tạm, tăng dung lượng

Hai chỗ hay ngốn đĩa nhất trên server: /var/log (log không xoay vòng) và file tạm/cache. Với log của systemd, dọn bằng journalctl --vacuum-size=200M (Bài 15). Với log thường, nén/xóa bản cũ — nhưng đừng rm file log đang được tiến trình ghi (nó vẫn giữ chỗ); nên cắt rỗng bằng truncate -s 0 file.log hoặc cấu hình logrotate.

lsblk: xem thiết bị lưu trữ

df xem filesystem; lsblk xem thiết bị block (ổ đĩa vật lý và phân vùng):

lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
vda    ...          59G    0 disk
└─vda1 ...          59G    0 part /

Nó cho thấy các ổ (disk) và phân vùng (part) của chúng, kèm điểm gắn (mountpoint). Hữu ích khi gắn thêm ổ mới (ví dụ thêm EBS volume trên cloud) — bạn thấy ổ mới xuất hiện ở đây trước khi mount.

mount: gắn filesystem vào cây thư mục

Nhớ Bài 2: Linux có một cây thư mục duy nhất. Một ổ đĩa/phân vùng chỉ dùng được khi được mount (gắn) vào một thư mục trong cây đó:

mount                              # liệt kê mọi thứ đang được mount
mount /dev/vdb1 /mnt/data          # gắn phân vùng vào /mnt/data (cần root)
umount /mnt/data                   # tháo ra

Sau khi mount, mọi thứ bạn ghi vào /mnt/data thực ra nằm trên ổ đó. Để mount tự động khi khởi động, thêm dòng vào file /etc/fstab. Việc mount thủ công ít gặp hằng ngày, nhưng cần khi gắn thêm ổ cho server.

Lưu ý môi trường: trong container, lsblk/mount phản ánh thiết bị của host (VM Linux của Docker Desktop) chứ không phải máy Mac của bạn — nhớ Bài 1 của series Docker. Để thực hành mount đầy đủ, một VM Linux trực quan hơn.

🧹 Dọn dẹp

Bài này chủ yếu là lệnh xem, không tạo gì cần dọn.

Tổng kết

Khi đĩa đầy: dùng df -h xem filesystem nào đầy (để ý Use% và mount point; df -i cho inode), rồi du -sh */ | sort -rh đào dần tìm thư mục ngốn chỗ, và find -size nhắm file lớn — thủ phạm thường là log ở /var/log. lsblk xem thiết bị/phân vùng, mount gắn ổ vào cây thư mục. Quy trình df → du → find là bài bản chuẩn để xử lý "No space left on device".

Tới giờ ta dùng các công cụ có sẵn. Bài 11 học cách thêm phần mềm: trình quản lý gói (apt, dnf, apk) — cài, cập nhật, gỡ.