❤️ 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ỗ.

linux b13 disk

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 ảo
  • xvda, 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à ext4xfs.

  • 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ới
  • p, chọn primary partition
  • 1, 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/vda2.

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.

Chia sẻ:
Bài viết đã được kiểm duyệt bởi AZDIGI Team

Về tác giả

Trần Thắng

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.

Hơn 10 năm phục vụ 80.000+ khách hàng

Bắt đầu dự án web của bạn với AZDIGI