LVM trên Linux: Quản Lý Đĩa Linh Hoạt, Không Còn Đau Đầu

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

Vấn Đề Dung Lượng Đĩa Cứ Quay Đi Quay Lại

Bạn cấp phát một VPS, phân bổ 20GB cho /var, rồi sáu tháng sau log và database đã lấp đầy hoàn toàn. Cách xử lý truyền thống? Boot vào rescue mode, resize phân vùng bằng fdisk, rồi cầu nguyện không có gì hỏng. Tôi đã trải qua vòng lặp đó hai lần trong năm đầu quản lý server — và qua hơn 10 server trong ba năm, nó chưa bao giờ hết làm tôi bực bội.

Điều tôi cuối cùng nhận ra: quyết định phân vùng đĩa lúc cài đặt ban đầu rồi sẽ sai vào một thời điểm nào đó. Hoặc bạn phân bổ quá nhiều và lãng phí dung lượng, hoặc phân bổ quá ít rồi phải chạy vạy sau này. LVM (Logical Volume Manager) sinh ra để phá vỡ vòng lặp đó. Nó tách biệt cấu trúc đĩa vật lý khỏi các phân vùng logic mà hệ điều hành nhìn thấy, và chính khoảng cách đó mang lại cho bạn sự linh hoạt thực sự sau khi đã triển khai xong.

Các Khái Niệm Cốt Lõi: LVM Hoạt Động Như Thế Nào

LVM thêm một lớp trừu tượng mỏng giữa các đĩa vật lý và các mount point. Ba khái niệm bao quát toàn bộ mô hình:

Physical Volume (PV)

PV là một đĩa thô hoặc phân vùng được giao cho LVM quản lý. Có thể là /dev/sdb, /dev/sdc1, hay thậm chí một mảng RAID. LVM ghi metadata của riêng nó lên PV để theo dõi dung lượng khả dụng.

Volume Group (VG)

Hãy coi VG như một kho lưu trữ tổng hợp. Bạn thêm nhiều PV vào một VG, và LVM xem không gian kết hợp đó như một bucket lớn, linh hoạt. Cần thêm dung lượng cho kho sau này? Thêm ổ đĩa mới — không cần reboot, không cần di chuyển dữ liệu, không có rắc rối gì.

Logical Volume (LV)

LV là thứ mà hệ điều hành của bạn thực sự mount. Nó được cắt ra từ kho VG. Cần 10GB cho /var? Tạo một LV 10GB, format nó, mount nó. Cần 15GB vào tháng tới? Mở rộng bằng một lệnh. Filesystem nằm trên LV và không quan tâm đến các đĩa vật lý bên dưới.

Về mặt trực quan, stack trông như thế này:

Đĩa Vật Lý  → Physical Volumes → Volume Group → Logical Volumes → Filesystems
/dev/sdb     → PV               → pool_vg      → lv_var (10G)   → ext4 tại /var
/dev/sdc     → PV               →              → lv_home (20G)  → xfs tại /home

Thực Hành: Thiết Lập LVM Từ Đầu

Bước 1: Cài Đặt Công Cụ LVM

Trên Debian/Ubuntu:

sudo apt update && sudo apt install lvm2 -y

Trên RHEL/AlmaLinux/Rocky:

sudo dnf install lvm2 -y

Bước 2: Tạo Physical Volumes

Giả sử bạn đã thêm hai ổ đĩa mới (/dev/sdb/dev/sdc):

sudo pvcreate /dev/sdb /dev/sdc
sudo pvs  # xác minh

Kết quả pvs sẽ hiển thị cả hai ổ đĩa, dung lượng của chúng và VG mà chúng thuộc về (để trống vì chưa có).

Bước 3: Tạo Volume Group

sudo vgcreate data_vg /dev/sdb /dev/sdc
sudo vgs  # xác minh

Xong. data_vg bây giờ chứa dung lượng kết hợp của cả hai ổ đĩa thành một kho duy nhất.

Bước 4: Tạo Logical Volumes

# Tạo LV 15GB cho /var
sudo lvcreate -L 15G -n lv_var data_vg

# Tạo LV 25GB cho /home
sudo lvcreate -L 25G -n lv_home data_vg

# Dùng toàn bộ dung lượng còn lại cho data volume
sudo lvcreate -l 100%FREE -n lv_data data_vg

sudo lvs  # xác minh cả ba

Bước 5: Format và Mount

sudo mkfs.ext4 /dev/data_vg/lv_var
sudo mkfs.ext4 /dev/data_vg/lv_home
sudo mkfs.xfs /dev/data_vg/lv_data

sudo mkdir -p /var/lvm_var /home/lvm_home /data
sudo mount /dev/data_vg/lv_var /var/lvm_var
sudo mount /dev/data_vg/lv_home /home/lvm_home
sudo mount /dev/data_vg/lv_data /data

Để mount tự động sau mỗi lần reboot, thêm các dòng này vào /etc/fstab:

/dev/data_vg/lv_var   /var/lvm_var   ext4  defaults  0 2
/dev/data_vg/lv_home  /home/lvm_home ext4  defaults  0 2
/dev/data_vg/lv_data  /data          xfs   defaults  0 2

Các Thao Tác Thực Sự Cứu Bạn

Mở Rộng Logical Volume (Trực Tiếp)

Lệnh này chính là lý do cốt lõi để dùng LVM. Mở rộng lv_var thêm 5GB trong khi đang được mount và sử dụng:

# Mở rộng LV
sudo lvextend -L +5G /dev/data_vg/lv_var

# Resize filesystem để sử dụng dung lượng mới (ext4)
sudo resize2fs /dev/data_vg/lv_var

# Với XFS (chỉ có thể tăng, không thể thu nhỏ)
sudo xfs_growfs /var/lvm_var

Không cần downtime. Không cần reboot. Filesystem vẫn hoạt động bình thường trong suốt quá trình.

Thêm Ổ Đĩa Mới vào VG Hiện Có

Kho của bạn sắp hết và bạn vừa gắn thêm ổ đĩa mới (/dev/sdd):

sudo pvcreate /dev/sdd
sudo vgextend data_vg /dev/sdd
sudo vgs  # xác nhận tổng dung lượng mới

Dung lượng đó lập tức có sẵn để mở rộng LV. Trên một server production tôi từng bấm giờ thao tác này — từ đầu đến cuối, chưa đến 30 giây.

Thu Nhỏ Logical Volume

Thu nhỏ rủi ro hơn và cần thận trọng hơn. Luôn unmount trước, luôn backup dữ liệu. XFS không thể thu nhỏ — thao tác này chỉ áp dụng cho ext4.

# Unmount trước
sudo umount /var/lvm_var

# Kiểm tra filesystem
sudo e2fsck -f /dev/data_vg/lv_var

# Thu nhỏ filesystem TRƯỚC KHI thu nhỏ LV
sudo resize2fs /dev/data_vg/lv_var 10G

# Sau đó mới thu nhỏ LV
sudo lvreduce -L 10G /dev/data_vg/lv_var

# Mount lại
sudo mount /dev/data_vg/lv_var /var/lvm_var

Nguyên tắc bắt buộc: resize filesystem xuống kích thước nhỏ hơn kích thước LV mục tiêu, sau đó mới thu nhỏ LV. Làm ngược lại là mất dữ liệu. Hãy thực hành trên một VM thử nghiệm trước khi đụng vào production — tôi đã mắc sai lầm đó trên một dev server lúc 2 giờ sáng, đau lắm.

LVM Snapshot để Backup

Snapshot chụp lại trạng thái của LV tại một thời điểm nhất định. Hữu ích nhất ngay trước một thao tác rủi ro — nâng cấp package lớn, thay đổi cấu hình toàn bộ, bất cứ thứ gì bạn có thể muốn rollback:

# Tạo snapshot 2GB của lv_var
sudo lvcreate -L 2G -s -n lv_var_snap /dev/data_vg/lv_var

# Mount snapshot ở chế độ chỉ đọc
sudo mount -o ro /dev/data_vg/lv_var_snap /mnt/snapshot

# Xóa snapshot khi dùng xong
sudo umount /mnt/snapshot
sudo lvremove /dev/data_vg/lv_var_snap

Snapshot dùng cơ chế copy-on-write — chỉ các block thay đổi sau khi tạo mới được ghi vào snapshot volume, không phải toàn bộ bản sao. Hãy giữ snapshot tồn tại trong thời gian ngắn. Khi snapshot đầy dung lượng được cấp phát, LVM tự động đánh dấu nó là không hợp lệ và vô hiệu hóa. Bạn mất điểm phục hồi và dung lượng đã cấp phát bị lãng phí. Nếu LV nguồn đang được ghi tích cực, hãy cấp phát ít nhất 15–20% dung lượng của nó cho snapshot.

Các Lệnh Kiểm Tra Hữu Ích

Các lệnh nên chạy thường xuyên khi kiểm tra thiết lập LVM:

  • pvdisplay — thông tin chi tiết về physical volumes
  • vgdisplay — kích thước VG, dung lượng trống, số PE
  • lvdisplay — đường dẫn LV, kích thước, trạng thái snapshot
  • lsblk — hiển thị dạng cây tất cả block device bao gồm LV
  • df -h — mức sử dụng filesystem (các mount point)
# Tóm tắt nhanh toàn bộ LVM
sudo pvs && sudo vgs && sudo lvs

LVM Trong Thực Tế: Điều Thực Sự Quan Trọng

LVM giải quyết vấn đề cốt lõi của cách phân vùng đĩa truyền thống: bạn không còn phải làm đúng ngay từ lúc cài đặt. Bắt đầu với mức phân bổ hợp lý, rồi resize theo pattern sử dụng thực tế khi nó xuất hiện — không cần downtime production.

Ba lệnh đáng nhớ thuộc lòng: lvextend + resize2fs để resize trực tiếp, pvcreate + vgextend để thêm ổ đĩa vào kho, và lvcreate -s để snapshot trước các thay đổi rủi ro. Ba lệnh đó bao phủ 90% công việc LVM trong thực tế.

Server mới? Thiết lập LVM ngay từ đầu, dù bạn chắc chắn rằng mình sẽ không bao giờ cần resize. Chi phí thiết lập gần như bằng không. Lợi ích, khi bạn cuối cùng cần đến nó, là rất lớn.

Share: