❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.
Khi thuê VPS, bạn sẽ được cấp một lượng disk nhất định, ví dụ 40GB hay 80GB. Nhưng disk trên VPS không giống ổ cứng vật lý bạn cắm vào máy tính. Hiểu cách Linux quản lý disk sẽ giúp bạn biết lúc nào disk sắp đầy, cách mount thêm ổ, mở rộng dung lượng, và xử lý khi hết chỗ.

Bài này mình sẽ đi từ cơ bản (xem disk, kiểm tra dung lượng) đến thực tế (tạo partition, mở rộng disk, dọn dẹp), đủ để bạn tự tin quản lý storage trên VPS.
🚨 Lưu ý: Các lệnh quản lý disk rất nhạy cảm và hãy thao tác trên một máy ảo trên máy tính của bạn nếu là người mới.
Disk trên VPS khác gì máy thật?
Trên máy tính vật lý, bạn có ổ cứng thật (SSD, HDD) với tên thiết bị thường là sda, sdb,… Trên VPS, bạn dùng virtual disk, là một phần disk của máy chủ vật lý được ảo hóa và gán cho VPS của bạn.
Tên thiết bị trên VPS phụ thuộc vào công nghệ ảo hóa:
vda,vdb,…, VPS dùng VirtIO (phổ biến nhất, KVM/QEMU)sda,sdb,…, VPS dùng SCSI hoặc SATA ảoxvda,xvdb,…, VPS trên Xen (AWS EC2 cũ)nvme0n1,…, VPS dùng NVMe (AWS EC2 mới, một số cloud khác)
Về mặt sử dụng thì không có gì khác. Các lệnh quản lý disk hoạt động giống nhau bất kể tên thiết bị là gì. Trong bài này mình sẽ dùng vda làm ví dụ chính vì đây là dạng phổ biến nhất trên VPS KVM.
Xem thông tin disk với lsblk, fdisk, blkid
Trước khi làm bất cứ điều gì với disk, bạn cần biết VPS đang có những disk nào, chia partition ra sao, và mount ở đâu.
lsblk, xem cấu trúc disk dạng cây
Lệnh lsblk (list block devices) hiển thị tất cả disk và partition dưới dạng tree, rất trực quan:
lsblk
Kết quả sẽ trông như thế này:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 252:0 0 40G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 39G 0 part /
vdb 252:16 0 20G 0 disk
Ở đây bạn thấy VPS có 2 disk: vda (40GB, đã chia 2 partition và mount) và vdb (20GB, chưa mount). Cột TYPE cho biết đó là disk hay partition (part).
Nếu muốn xem thêm thông tin filesystem, thêm flag -f:
lsblk -f
Flag này sẽ hiển thị thêm cột filesystem type (ext4, xfs,…), UUID, và phần trăm dung lượng đã dùng.
fdisk -l, xem chi tiết partition table
Lệnh fdisk -l cho thông tin chi tiết hơn về partition, bao gồm sector, kích thước chính xác, và kiểu partition table (GPT hay MBR):
sudo fdisk -l
Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors
...
Device Boot Start End Sectors Size Id Type
/dev/vda1 * 2048 2099199 2097152 1G 83 Linux
/dev/vda2 2099200 83886079 81786880 39G 83 Linux
Bạn có thể chỉ định disk cụ thể thay vì liệt kê tất cả:
sudo fdisk -l /dev/vda
blkid, xem UUID và filesystem type
Lệnh blkid hiển thị UUID (mã định danh duy nhất) và loại filesystem của mỗi partition:
sudo blkid
/dev/vda1: UUID="a1b2c3d4-..." TYPE="ext4" PARTUUID="..."
/dev/vda2: UUID="e5f6g7h8-..." TYPE="ext4" PARTUUID="..."
UUID rất quan trọng khi bạn cấu hình auto mount trong /etc/fstab, vì tên thiết bị (/dev/vda1) có thể thay đổi sau khi reboot, nhưng UUID thì không.
Kiểm tra dung lượng với df và du
Biết disk có bao nhiêu là một chuyện, biết đã dùng bao nhiêu lại là chuyện khác. Đây là 2 lệnh bạn sẽ dùng thường xuyên nhất.
df -h, dung lượng các mount point
Lệnh df (disk free) cho biết dung lượng tổng, đã dùng, còn trống của từng filesystem đang mount:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda2 39G 12G 25G 33% /
/dev/vda1 976M 130M 780M 15% /boot
tmpfs 994M 0 994M 0% /dev/shm
Flag -h giúp hiển thị dung lượng dạng dễ đọc (GB, MB thay vì block). Bạn chỉ cần quan tâm các dòng có mount point thật (/, /boot, /mnt/...), bỏ qua tmpfs vì đó là RAM disk.
Ngoài dung lượng, filesystem còn giới hạn số lượng file (inode). Nếu inode hết, bạn không tạo được file mới dù còn trống dung lượng. Kiểm tra inode bằng:
df -i
Trường hợp hết inode không phổ biến, nhưng có thể xảy ra nếu ứng dụng tạo rất nhiều file nhỏ (cache, session files,…).
du, dung lượng từng thư mục
Khi df báo disk gần đầy, bạn cần biết thư mục nào đang chiếm nhiều nhất. Lệnh du (disk usage) giúp việc này:
# Xem dung lượng một thư mục cụ thể
du -sh /var/log
# Xem dung lượng các thư mục con (1 cấp)
du -h --max-depth=1 /var
# Sắp xếp theo dung lượng, lớn nhất lên đầu
du -h --max-depth=1 /var | sort -hr
Flag -s là summary (chỉ hiện tổng), -h là human-readable. Kết hợp --max-depth=1 với sort -hr là cách nhanh nhất để tìm thư mục “ăn” disk.
Nếu muốn giao diện trực quan hơn, bạn có thể cài ncdu, một công cụ interactive giúp duyệt qua các thư mục và xem dung lượng theo kiểu file manager:
# Ubuntu/Debian
sudo apt install ncdu -y
# AlmaLinux/Rocky
sudo dnf install ncdu -y
Chạy ncdu / để scan toàn bộ disk, sau đó dùng phím mũi tên để duyệt. Nhấn d để xóa, q để thoát.
Mount và Unmount
Trên Linux, muốn sử dụng một partition hay disk, bạn phải mount nó vào một thư mục. Thư mục đó gọi là mount point. Ví dụ partition /dev/vda2 mount vào / nghĩa là toàn bộ dữ liệu gốc của hệ thống nằm trên partition đó.
Mount thủ công
Giả sử VPS có thêm disk /dev/vdb đã tạo partition /dev/vdb1 và format xong, bạn mount nó vào /mnt/data như sau:
# Tạo thư mục mount point
sudo mkdir -p /mnt/data
# Mount partition vào thư mục
sudo mount /dev/vdb1 /mnt/data
# Kiểm tra
df -h /mnt/data
Sau khi mount, mọi file bạn ghi vào /mnt/data sẽ nằm trên partition /dev/vdb1.
Unmount
Khi cần tháo partition ra (trước khi resize, format lại, hoặc tháo disk), dùng umount:
sudo umount /mnt/data
Lưu ý lệnh là umount chứ không phải unmount. Nếu báo lỗi “target is busy”, nghĩa là có process đang dùng thư mục đó. Bạn cần thoát ra khỏi thư mục hoặc tắt process đang truy cập trước khi unmount.
Auto mount với /etc/fstab
Mount thủ công chỉ tồn tại đến khi reboot. Để partition tự động mount khi VPS khởi động, bạn thêm dòng vào /etc/fstab:
# Lấy UUID của partition
sudo blkid /dev/vdb1
Kết quả sẽ hiện UUID, bạn copy UUID đó rồi thêm vào cuối file /etc/fstab:
sudo nano /etc/fstab
Thêm dòng:
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /mnt/data ext4 defaults 0 2
Giải thích các trường:
- UUID=…, định danh partition (dùng UUID thay vì
/dev/vdb1để tránh lỗi khi tên thiết bị thay đổi) - /mnt/data, mount point
- ext4, loại filesystem
- defaults, các option mặc định (rw, suid, dev, exec, auto, nouser, async)
- 0, dump (backup), thường để 0
- 2, fsck order (0 = không check, 1 = root, 2 = các partition khác)
Sau khi thêm, test bằng cách mount tất cả những gì trong fstab chưa mount:
sudo mount -a
Nếu không có lỗi gì thì fstab đã đúng. Lần reboot sau, partition sẽ tự mount.
Cẩn thận khi sửa /etc/fstab. Nếu cấu hình sai (UUID không đúng, mount point không tồn tại), VPS có thể không boot được. Luôn test bằng mount -a trước khi reboot.
Filesystem: ext4 vs xfs
Khi format một partition, bạn phải chọn filesystem. Hai loại phổ biến nhất trên Linux server là ext4 và xfs.
- ext4, filesystem mặc định trên Ubuntu/Debian. Ổn định, hỗ trợ tốt, có thể shrink (thu nhỏ) partition. Phù hợp đa số trường hợp.
- xfs, filesystem mặc định trên AlmaLinux/Rocky/RHEL. Hiệu suất tốt với file lớn và workload nặng I/O. Không thể shrink, chỉ có thể mở rộng.
Với VPS thông thường (web server, database, ứng dụng), cả hai đều hoạt động tốt. Bạn không cần phải thay đổi filesystem mặc định mà distro đã chọn, trừ khi có lý do cụ thể.
Kiểm tra filesystem đang dùng bằng:
df -Th
Cột Type sẽ hiển thị ext4, xfs, hoặc loại filesystem khác.
Tạo partition mới
Khi nhà cung cấp gắn thêm disk cho VPS (ví dụ /dev/vdb), disk đó thường ở trạng thái trống, chưa có partition và chưa format. Bạn cần tạo partition, format, rồi mount.
Kiểm tra disk mới:
lsblk
Nếu thấy vdb không có partition con, nghĩa là disk chưa được chia.
Bước 1: Tạo partition bằng fdisk
sudo fdisk /dev/vdb
Sau khi vào giao diện fdisk, nhập lần lượt:
n, tạo partition mớip, chọn primary partition1, partition number (nhấn Enter để chọn mặc định)- First sector, nhấn Enter (mặc định)
- Last sector, nhấn Enter (dùng toàn bộ disk)
w, ghi thay đổi và thoát
Kiểm tra lại:
lsblk
Bạn sẽ thấy vdb1 xuất hiện dưới vdb.
Bước 2: Format partition
# Format ext4 (Ubuntu/Debian)
sudo mkfs.ext4 /dev/vdb1
# Hoặc format xfs (AlmaLinux/Rocky)
sudo mkfs.xfs /dev/vdb1
Bước 3: Mount và cấu hình fstab
# Tạo mount point
sudo mkdir -p /mnt/data
# Mount
sudo mount /dev/vdb1 /mnt/data
# Lấy UUID
sudo blkid /dev/vdb1
# Thêm vào fstab (thay UUID bằng giá trị thật)
echo 'UUID=your-uuid-here /mnt/data ext4 defaults 0 2' | sudo tee -a /etc/fstab
# Test fstab
sudo mount -a
Mở rộng disk (resize)
Đây là tình huống rất phổ biến: bạn nâng cấp gói VPS hoặc yêu cầu nhà cung cấp tăng dung lượng disk. Sau khi họ tăng xong, bạn sẽ thấy disk lớn hơn nhưng partition vẫn giữ kích thước cũ. Lúc này bạn cần mở rộng partition và filesystem.
Ví dụ: disk vda được tăng từ 40GB lên 80GB, nhưng vda2 vẫn chỉ 39GB.
lsblk
# vda 80G
# ├─vda1 1G /boot
# └─vda2 39G / ← chưa dùng hết 80GB
Bước 1: Cài growpart
# Ubuntu/Debian
sudo apt install cloud-guest-utils -y
# AlmaLinux/Rocky
sudo dnf install cloud-utils-growpart -y
Bước 2: Mở rộng partition
# Mở rộng partition 2 trên disk vda
sudo growpart /dev/vda 2
Lệnh này mở rộng partition vda2 để chiếm hết phần trống còn lại trên disk. Lưu ý có khoảng trắng giữa /dev/vda và 2.
Bước 3: Mở rộng filesystem
Partition đã lớn hơn, nhưng filesystem bên trong vẫn chưa biết. Bạn cần resize filesystem tùy loại:
# Nếu dùng ext4
sudo resize2fs /dev/vda2
# Nếu dùng xfs
sudo xfs_growfs /
Với ext4, resize2fs nhận tham số là partition (/dev/vda2). Với xfs, xfs_growfs nhận tham số là mount point (/), không phải partition. Cả hai lệnh đều có thể chạy khi filesystem đang mount (online resize).
Kiểm tra kết quả:
df -h /
Bạn sẽ thấy dung lượng đã tăng lên đúng với kích thước mới.
LVM cơ bản
Một số VPS (đặc biệt cài từ image CentOS/AlmaLinux) dùng LVM (Logical Volume Manager) thay vì partition thông thường. Khi chạy lsblk, bạn sẽ thấy dạng như thế này:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 252:0 0 40G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 39G 0 part
├─almalinux-root 253:0 0 37G 0 lvm /
└─almalinux-swap 253:1 0 2G 0 lvm [SWAP]
LVM thêm một lớp trung gian giữa disk vật lý và filesystem, gồm 3 khái niệm:
- PV (Physical Volume), disk hoặc partition vật lý được đăng ký vào LVM
- VG (Volume Group), nhóm các PV lại thành một “pool” dung lượng
- LV (Logical Volume), chia từ VG, đây là thứ bạn format và mount (tương đương partition)
Kiểm tra LVM trên VPS:
# Xem Physical Volumes
sudo pvs
# Xem Volume Groups
sudo vgs
# Xem Logical Volumes
sudo lvs
LVM hữu ích khi bạn cần linh hoạt: gộp nhiều disk thành một, resize volume mà không cần reboot, tạo snapshot. Tuy nhiên với VPS đơn giản chỉ có 1 disk, LVM thêm phức tạp mà không mang lại nhiều lợi ích.
Nếu VPS của bạn dùng LVM và cần mở rộng sau khi tăng disk, quy trình sẽ khác một chút:
# Mở rộng partition chứa PV
sudo growpart /dev/vda 2
# Mở rộng Physical Volume
sudo pvresize /dev/vda2
# Mở rộng Logical Volume (dùng hết free space)
sudo lvextend -l +100%FREE /dev/mapper/almalinux-root
# Resize filesystem
sudo resize2fs /dev/mapper/almalinux-root # ext4
# hoặc
sudo xfs_growfs / # xfs
Tạo và quản lý Swap
Swap là vùng trên disk dùng làm “RAM mở rộng”. Khi RAM thật hết, Linux sẽ chuyển một phần dữ liệu ít dùng từ RAM sang swap để giải phóng bộ nhớ. Swap chậm hơn RAM rất nhiều, nhưng giúp VPS không bị crash khi hết RAM.
Nhiều VPS giá rẻ chỉ có 1GB RAM và không có swap sẵn. Trong trường hợp đó, tạo swap file là một việc nên làm.
Kiểm tra swap hiện tại
# Xem swap đang dùng
free -h
# Hoặc chi tiết hơn
swapon --show
Nếu swapon --show không hiển thị gì, nghĩa là VPS chưa có swap.
Tạo swap file
# Tạo file 2GB (điều chỉnh theo nhu cầu)
sudo fallocate -l 2G /swapfile
# Phân quyền (chỉ root đọc/ghi)
sudo chmod 600 /swapfile
# Format thành swap
sudo mkswap /swapfile
# Bật swap
sudo swapon /swapfile
# Kiểm tra
free -h
Nếu filesystem là xfs và fallocate không hoạt động, dùng dd thay thế: sudo dd if=/dev/zero of=/swapfile bs=1M count=2048. Lệnh này chậm hơn nhưng tương thích mọi filesystem.
Auto mount swap khi boot
Thêm dòng sau vào /etc/fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Khi nào cần swap trên VPS?
- VPS RAM thấp (1-2GB), swap giúp tránh OOM killer (hệ thống tự kill process khi hết RAM)
- Chạy nhiều service, web server + database + cache trên cùng VPS
- Build/compile, quá trình compile có thể ngốn nhiều RAM tạm thời
Quy tắc đơn giản: VPS dưới 4GB RAM nên có swap. Kích thước swap bằng RAM hoặc 2GB (lấy giá trị nhỏ hơn) là đủ cho hầu hết trường hợp.
Dọn dẹp disk
Disk đầy là vấn đề bạn sẽ gặp sớm hay muộn. Dưới đây là các cách dọn dẹp phổ biến, sắp xếp theo mức độ an toàn.
Dọn cache package manager
# Ubuntu/Debian — xóa cache apt
sudo apt clean
sudo apt autoremove -y
# AlmaLinux/Rocky — xóa cache dnf
sudo dnf clean all
sudo dnf autoremove -y
Lệnh clean xóa các file .deb/.rpm đã tải về. Lệnh autoremove gỡ các package không còn được phụ thuộc bởi package nào khác.
Dọn Docker (nếu có)
Docker là một trong những “thủ phạm” chiếm disk nhiều nhất nếu bạn không dọn định kỳ:
# Xem Docker đang chiếm bao nhiêu
docker system df
# Dọn tất cả: images không dùng, containers đã dừng, networks, build cache
docker system prune -a -f
# Nếu muốn dọn cả volumes không dùng (cẩn thận, có thể mất data)
docker system prune -a -f --volumes
Flag --volumes sẽ xóa cả volumes không gắn với container nào. Nếu bạn có database chạy bằng Docker, hãy chắc chắn volume của nó đang được dùng trước khi chạy lệnh này.
Tìm file lớn
# Tìm file lớn hơn 100MB
sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
# Hoặc dùng du để tìm thư mục lớn nhất
sudo du -h --max-depth=2 / 2>/dev/null | sort -hr | head -20
Truncate log files
Log files trong /var/log có thể phình to theo thời gian. Thay vì xóa (vì service có thể tạo lại), bạn nên truncate (giữ file nhưng xóa nội dung):
# Truncate một log file cụ thể
sudo truncate -s 0 /var/log/syslog
# Xóa journal logs cũ hơn 3 ngày
sudo journalctl --vacuum-time=3d
# Xem journal đang chiếm bao nhiêu
sudo journalctl --disk-usage
Nếu muốn giới hạn kích thước journal vĩnh viễn, sửa file /etc/systemd/journald.conf:
# Thêm hoặc sửa dòng:
SystemMaxUse=100M
Sau đó restart journald:
sudo systemctl restart systemd-journald
Checkpoint: Tự kiểm tra
Sau khi đọc xong bài này, bạn thử thực hành các bài tập sau trên VPS:
Bài 1: Xem thông tin disk
# Chạy 3 lệnh và đọc hiểu output
lsblk
df -h
sudo blkid
Trả lời được: VPS có bao nhiêu disk? Mỗi disk bao nhiêu GB? Filesystem gì? Mount ở đâu? Còn trống bao nhiêu?
Bài 2: Tạo swap file
# Kiểm tra swap hiện tại
free -h
swapon --show
# Nếu chưa có, tạo swap 1GB
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# Thêm vào fstab
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# Kiểm tra lại
free -h
Bài 3: Dọn dẹp disk
# Xem dung lượng trước khi dọn
df -h /
# Dọn cache
sudo apt clean # Ubuntu/Debian
sudo dnf clean all # AlmaLinux/Rocky
# Dọn journal
sudo journalctl --vacuum-time=3d
# Tìm file lớn
sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
# Xem dung lượng sau khi dọn
df -h /
Bài 4: Kiểm tra toàn diện
Chạy script này để có bức tranh tổng quan về disk trên VPS:
echo "=== Disk Layout ==="
lsblk -f
echo ""
echo "=== Disk Usage ==="
df -h
echo ""
echo "=== Swap ==="
free -h | grep -i swap
echo ""
echo "=== Top 10 thư mục lớn nhất ==="
sudo du -h --max-depth=1 / 2>/dev/null | sort -hr | head -10
Nếu bạn chạy qua được tất cả các bài tập trên mà hiểu output, bạn đã nắm vững cách quản lý disk trên Linux VPS rồi.
Có thể bạn cần xem thêm
- Cấu trúc thư mục Linux - Mọi thứ nằm ở đâu trên VPS
- Troubleshooting VPS Linux - Cách xủ lý sự cố VPS phổ biến
- Các lệnh kiểm tra tập tin/thư mục lớn trong Linux
- Shell Scripting cơ bản trên Linux - Tự động hóa tác vụ VPS
- Hướng dẫn kích hoạt Swap trên Linux
- NFS là gì? hướng dẫn cài đặt và sử dụng NFS trên Linux
Về tác giả
Trần Thắng
Chuyên gia tại AZDIGI với nhiều năm kinh nghiệm trong lĩnh vực web hosting và quản trị hệ thống.