Server add thêm disk, log đầy /, partition /var hết chỗ — những tình huống này xảy ra thường xuyên hơn bạn nghĩ. Trên con server CentOS 7 cũ của công ty, mình đã phải xử lý disk management khá nhiều lần, và không phải lần nào cũng suôn sẻ. Bài này ghi lại những gì thực sự có ích sau gần 2 năm vật lộn với ổ đĩa trên Linux production.
Hiểu đúng về “mount” trong Linux
Khác với Windows dùng ký tự ổ đĩa (C:, D:, E:), Linux dùng một cây thư mục duy nhất bắt đầu từ /. Mọi thiết bị lưu trữ — SSD, HDD, USB, network drive — đều được “gắn” vào một điểm trong cây thư mục này. Đó gọi là mount point.
Cắm thêm ổ cứng vào server, Linux nhận ra nó như một block device (thường là /dev/sdb, /dev/nvme1n1…) nhưng bạn chưa thể dùng ngay. Cần 4 bước theo đúng thứ tự:
- Tạo partition trên ổ đó (nếu chưa có)
- Format partition với filesystem phù hợp
- Mount vào một thư mục
- Cấu hình để tự mount khi reboot
Khái niệm cốt lõi trước khi bắt tay
Tên thiết bị block device
Linux đặt tên thiết bị theo quy tắc nhất quán:
/dev/sda,/dev/sdb— SATA/SCSI disk (a = đầu tiên, b = thứ hai…)/dev/sda1,/dev/sda2— partition 1, 2 của/dev/sda/dev/nvme0n1,/dev/nvme0n1p1— NVMe SSD/dev/vda— virtual disk (KVM, VPS)
Quan trọng: Tên /dev/sdb có thể thay đổi sau mỗi lần reboot nếu thứ tự nhận diện thiết bị thay đổi. Luôn dùng UUID trong fstab, không bao giờ dùng tên thiết bị — mình học được điều này sau một lần server không boot vì disk swap thứ tự.
Các filesystem phổ biến
- ext4: Mặc định trên Ubuntu/Debian, ổn định, phù hợp hầu hết use case
- xfs: Mặc định trên RHEL/CentOS, tốt cho file lớn và I/O cao
- btrfs: Hỗ trợ snapshot, copy-on-write, nhưng cần cân nhắc kỹ trước khi dùng production
Thực hành chi tiết từng bước
Bước 1: Xem danh sách ổ đĩa hiện tại
Lệnh đầu tiên mình chạy khi vào bất kỳ server nào là lsblk:
lsblk
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# sda 8:0 0 50G 0 disk
# ├─sda1 8:1 0 1G 0 part /boot
# └─sda2 8:2 0 49G 0 part /
# sdb 8:16 0 200G 0 disk ← ổ mới, chưa mount
Muốn xem thêm thông tin filesystem và UUID:
lsblk -f
# Hiển thị FSTYPE, UUID, LABEL, MOUNTPOINTS
Hoặc dùng fdisk -l để xem chi tiết partition table:
sudo fdisk -l /dev/sdb
Bước 2: Tạo partition
Mình thích dùng parted hơn fdisk vì hỗ trợ GPT và ổ lớn hơn 2TB:
sudo parted /dev/sdb
# Trong parted interactive mode:
(parted) mklabel gpt # Tạo partition table GPT
(parted) mkpart primary ext4 0% 100% # 1 partition dùng toàn bộ ổ
(parted) print # Kiểm tra lại
(parted) quit
Với ổ nhỏ hơn 2TB dùng MBR truyền thống:
sudo fdisk /dev/sdb
# Nhấn: n → p → 1 → Enter → Enter → w
Bước 3: Format filesystem
Format partition vừa tạo (ví dụ /dev/sdb1):
# ext4 — lựa chọn phổ biến nhất
sudo mkfs.ext4 /dev/sdb1
# xfs — dùng cho RHEL/CentOS hoặc khi cần throughput cao
sudo mkfs.xfs /dev/sdb1
# Thêm label để dễ nhận dạng về sau
sudo mkfs.ext4 -L "data-disk" /dev/sdb1
Trên server CentOS 7 của công ty, mình chọn xfs vì nó handle concurrent writes tốt hơn ext4 — quan trọng khi nginx, PHP-FPM và MySQL cùng ghi log một lúc. Sau khi chuyển /var/log sang xfs, I/O wait vào giờ cao điểm giảm rõ, đặc biệt với log rotation chạy mỗi đêm lúc nửa đêm.
Bước 4: Mount thủ công
Tạo mount point trước, sau đó mount vào:
# Tạo thư mục làm mount point
sudo mkdir -p /mnt/data
# Mount
sudo mount /dev/sdb1 /mnt/data
# Kiểm tra
df -h /mnt/data
# Filesystem Size Used Avail Use% Mounted on
# /dev/sdb1 197G 28M 197G 1% /mnt/data
Mount này chỉ tồn tại đến khi reboot. Để persistent thì phải cấu hình /etc/fstab.
Bước 5: Cấu hình fstab với UUID
Sai một chữ ở đây là server không boot được — hỏi mình biết. Trước tiên lấy UUID của partition:
sudo blkid /dev/sdb1
# /dev/sdb1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"
# Hoặc dùng lsblk:
lsblk -f /dev/sdb1
Sau đó thêm vào /etc/fstab:
sudo nano /etc/fstab
Thêm dòng này vào cuối file:
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /mnt/data ext4 defaults 0 2
Giải thích 6 trường trong fstab:
- Device: UUID=… (khuyến nghị) hoặc /dev/sdb1
- Mount point: /mnt/data
- Filesystem type: ext4, xfs, btrfs…
- Options: defaults (rw, suid, exec, auto, nouser, async)
- Dump: 0 = không backup bằng dump utility
- Pass: 0 = skip fsck, 1 = root partition, 2 = các partition khác
Kiểm tra fstab trước khi reboot — bước này mình không bao giờ bỏ qua sau một lần fstab sai khiến server không boot được:
sudo mount -a # Mount tất cả entries trong fstab
# Không báo lỗi là ổn
Bước 6: Thao tác quản lý thường dùng
Unmount ổ đĩa:
sudo umount /mnt/data
# Nếu báo "target is busy", kiểm tra process đang dùng:
sudo lsof /mnt/data
# Hoặc:
sudo fuser -m /mnt/data
Mount với options nâng cao:
# Mount read-only
sudo mount -o ro /dev/sdb1 /mnt/data
# noexec, nosuid — tốt cho partition chứa data upload
sudo mount -o noexec,nosuid /dev/sdb1 /mnt/data
# Remount on-the-fly không cần umount
sudo mount -o remount,rw /mnt/data
Kiểm tra disk usage:
# Xem tổng quan tất cả partition
df -hT # -T hiển thị filesystem type
# Kiểm tra inode usage (đôi khi disk "đầy" vì hết inode, không phải hết space)
df -i
# Tìm thư mục chiếm nhiều space nhất
du -sh /* 2>/dev/null | sort -rh | head -20
Xử lý lỗi thường gặp
Lỗi “wrong fs type” khi mount: Xảy ra khi filesystem type không khớp. Dùng lsblk -f xem đúng type rồi chỉ định tường minh:
sudo mount -t xfs /dev/sdb1 /mnt/data
Filesystem bị lỗi sau crash: Chạy fsck khi partition chưa được mount:
sudo umount /dev/sdb1
sudo fsck -y /dev/sdb1 # -y tự động answer yes
Kết luận
Sau gần 2 năm và không dưới 20 lần xử lý disk trên production, mình có mấy nguyên tắc lần nào cũng áp dụng:
- Luôn dùng UUID trong fstab, không bao giờ dùng tên thiết bị như
/dev/sdb1 - Test bằng
mount -atrước khi reboot — một lần fstab sai là nhớ mãi - Đặt label cho partition khi format để dễ nhận dạng khi có nhiều ổ
- Monitor disk usage định kỳ, đặt alert khi đạt 80% để còn thời gian xử lý trước khi đầy
Nhìn lại, điều mình ước biết sớm hơn không phải là lệnh — mà là cái luồng: nhận diện thiết bị → partition → format → mount → fstab. Nắm được luồng đó, gặp server nào cũng xử lý được. Kể cả tình huống cần thêm data disk 200GB vào production lúc 2 giờ sáng, không downtime, không panic.
