Logical Volume Manager là gì?
Logical Volume Manager (LVM) là một công cụ quản lý phân vùng đĩa trên hệ thống Linux. Nó cho phép quản lý phân vùng đĩa một cách linh hoạt và hiệu quả hơn so với phương pháp truyền thống sử dụng phân vùng đĩa trực tiếp.
LVM hoạt động bằng cách tạo ra các layer trừu tượng trên phân vùng đĩa cứng, bao gồm physical volume (PV), volume group (VG) và logical volume (LV). Các PV là các phân vùng vật lý trên ổ đĩa cứng, được đăng ký và sử dụng bởi LVM. VG là một tập hợp các PV đã được kết nối lại với nhau để tạo thành một không gian lưu trữ lớn hơn. Cuối cùng, các LV được tạo ra trên VG và được sử dụng để tạo các phân vùng ảo cho các hệ thống tập tin hoặc swap.
LVM cung cấp nhiều lợi ích, bao gồm khả năng mở rộng phân vùng đĩa, tạo snapshot để sao lưu dữ liệu, thay đổi kích thước phân vùng một cách linh hoạt, di chuyển dữ liệu giữa các PV, tách và ghép các LV. Với LVM, người dùng có thể quản lý phân vùng đĩa một cách hiệu quả và tùy chỉnh theo nhu cầu của họ.
Physical volume (PV) là gì?
Physical volume (PV) là một đơn vị lưu trữ trong hệ thống quản lý phân vùng đĩa Logic Volume Manager (LVM) trên Linux. PV là một phân vùng trên đĩa cứng hoặc một thiết bị lưu trữ khác được sử dụng để tạo thành volume group (VG). Mỗi PV được định danh bằng một định danh duy nhất trên hệ thống, thường là một đường dẫn đến thiết bị lưu trữ.
Sau khi các PV được tạo, chúng được gộp lại để tạo thành volume group (VG), là một phần của không gian lưu trữ được quản lý bởi LVM. Các LV (logical volume) sử dụng không gian lưu trữ của VG bằng cách được tạo ra từ các PE (physical extent) trên các PV có trong VG. PV có thể được thêm hoặc xóa khỏi VG, và kích thước của PV cũng có thể thay đổi.
Volume group (VGs) là gì?
Volume group (VG) là một đơn vị lưu trữ trong hệ thống quản lý phân vùng đĩa Logical Volume Manager (LVM) trên Linux. VG là một nhóm các physical volume (PVs) được tổng hợp lại để tạo thành một không gian lưu trữ lớn hơn.
Khi một PV được thêm vào VG, dung lượng của PV được thêm vào dung lượng khả dụng của VG. Dung lượng của VG có thể được chia thành nhiều logical volume (LVs), mỗi LV sử dụng một phần của không gian lưu trữ của VG. Việc sử dụng LV cho phép quản lý tập trung hơn so với việc sử dụng các phân vùng thông thường.
VGs cung cấp nhiều tính năng hữu ích cho quản lý lưu trữ trên hệ thống Linux, bao gồm khả năng mở rộng kích thước của phân vùng, chuyển đổi dung lượng lưu trữ giữa các phân vùng và tạo snapshot của các phân vùng.
Logical volume (LVs) là gì?
Logical volume (LV) là một đơn vị lưu trữ trong hệ thống quản lý phân vùng đĩa Logical Volume Manager (LVM) trên Linux. LV là một phân vùng ảo, được tạo ra bằng cách sử dụng không gian lưu trữ từ các physical volume (PVs) đã được gộp lại trong volume group (VG).
Khi tạo LV, người dùng có thể tùy chỉnh dung lượng, kích thước, định dạng và tên cho phân vùng này. LV có thể được phân bổ cho các hệ thống tập tin hoặc dùng làm phân vùng swap. Các LV có thể được tạo ra hoặc xóa khỏi VG một cách dễ dàng và dung lượng của chúng có thể được thay đổi mà không cần phải di chuyển dữ liệu.
Một trong những ưu điểm của LV là nó cung cấp tính năng snapshot, cho phép tạo bản sao dữ liệu của một LV tại một thời điểm cụ thể để phục hồi khi cần thiết. Ngoài ra, LV cũng có thể được tăng kích thước hoặc giảm kích thước một cách linh hoạt mà không cần phải sửa đổi cấu trúc phân vùng vật lý.
Hướng dẫn cách để thay đổi kích cỡ volume.
Ví dụ mình có một máy chủ Centos 7 với thông tin disk như sau:
[root@vz ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 448M 0 448M 0% /dev
tmpfs 484M 12K 484M 1% /dev/shm
tmpfs 484M 1.8M 482M 1% /run
tmpfs 484M 0 484M 0% /sys/fs/cgroup
/dev/mapper/vhs-root 28G 2.8G 24G 11% /
tmpfs 484M 4.0K 484M 1% /tmp
/dev/sda2 976M 173M 736M 20% /boot
/dev/mapper/vhs-vz 69G 340M 65G 1% /vz
/dev/ploop17962p1 9.8G 37M 9.2G 1% /vz/pfcache
tmpfs 97M 0 97M 0% /run/user/0
Bạn để ý mình có 2 phân vùng như sau:
- Phân vùng / (root).
/dev/mapper/vhs-root 28G 2.8G 24G 11% /
Phân vùng /vz.
/dev/mapper/vhs-vz 69G 340M 65G 1% /vz
Với mong muốn giữ lại 30G cho phân vùng /vz và dung lượng còn lại của phân vùng này mình sẽ gộp vào / (root), các bước làm của mình như sau:
Bước 1: Mình dùng lệnh pvs
để hiển thị các physical volume (PVs) hiện có trên hệ thống.
[root@vz ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda4 vhs lvm2 a-- 96.99g 0
Trong trường hợp này, đầu ra của lệnh cho thấy hệ thống chỉ có một PV với tên /dev/sda4 và được sử dụng bởi volume group (VG) có tên vhs. Định dạng của PV là lvm2, có thuộc tính “a–” và có kích thước tổng cộng là 96.99GB.
Thuộc tính “a–” được mã hoá như sau:
- a: PV được đánh dấu là hoạt động và có sẵn cho LVM
- -: PV không được đánh dấu là PV bootable
- -: PV không được đánh dấu là PV root
Khi PFree bằng 0, nghĩa là không còn dung lượng trống trên PV này, tức là tất cả dung lượng đã được sử dụng.
Bước 2: Sử dụng lệnhvgs
để hiển thị các volume group (VGs) hiện có trên hệ thống.
[root@vz ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vhs 1 2 0 wz--n- 96.99g 0
Kết quả lệnh “vgs” hiển thị thông tin về các volume group (VG) hiện có trên hệ thống. Trong trường hợp này, đầu ra của lệnh cho thấy hệ thống có một VG có tên là vhs. VG này bao gồm một physical volume (PV) và có thuộc tính “wz–n-“, có kích thước tổng cộng là 96.99GB.
- #PV: số lượng physical volume được sử dụng trong VG này
- #LV: số lượng logical volume (LV) được tạo trong VG này
- #SN: số lượng snapshot LV được tạo trong VG này
- Attr: thuộc tính của VG, trong đó:
- w: VG được ghi vào ổ đĩa cứng (writable)
- z: VG được sử dụng bởi LVM
- -: VG không được đánh dấu là VG bootable
- n: VG không được đánh dấu là VG root
- -: VG không được đánh dấu là VG read-only
- VSize: tổng dung lượng của VG
- VFree: dung lượng trống của VG
Trong trường hợp này, VG “vhs” chỉ bao gồm một PV và không có dung lượng trống nào, có hai LV được tạo trong VG này.
Bước 3: Dùng lệnh lvs
để hiển thị các logical volume (LVs) hiện có trên hệ thống.
[root@vz ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root vhs -wi-ao---- 27.71g
vz vhs -wi-ao---- 69.28g
Kết quả lệnh “lvs” hiển thị thông tin về các logical volume (LV) hiện có trên hệ thống. Trong trường hợp này, đầu ra của lệnh cho thấy hệ thống có hai LV được tạo trong volume group (VG) có tên “vhs”.
- LV: tên của logical volume
- VG: tên của volume group mà LV đó thuộc về
- Attr: thuộc tính của LV, trong đó:
- w: LV được ghi vào ổ đĩa cứng (writable)
- i: LV đang được sử dụng
- a: LV là active (được sử dụng)
- o: LV có thể được mở (open)
- : LV không được đánh dấu là LV bootable
- LSize: kích thước của LV
- Pool: tên của pool nếu LV là thin volume
- Origin: tên của snapshot origin nếu LV là một snapshot
- Data%: tỉ lệ sử dụng dung lượng dữ liệu trên LV
- Meta%: tỉ lệ sử dụng metadata trên LV
- Move: trạng thái của việc di chuyển dữ liệu giữa các LV
- Log: trạng thái của logical volume log (nếu có)
- Cpy%Sync: tỉ lệ sao chép và đồng bộ hóa trên LV
- Convert: trạng thái của việc chuyển đổi LV giữa các loại dữ liệu khác nhau
Trong trường hợp này, LV “root” có kích thước 27.71GB và LV “vz” có kích thước 69.28GB, đều thuộc về VG “vhs”. Cả hai LV đều có thuộc tính “wi-ao—-” (writable, active, open), nghĩa là đang được sử dụng và có thể ghi dữ liệu vào đó.
Bước 4: Dùng lệnhpvscan
để quét các physical volume trên hệ thống và hiển thị tất cả các PVs có thể sử dụng.
[root@vz ~]# pvscan
PV /dev/sda4 VG vhs lvm2 [96.99 GiB / 0 free]
Total: 1 [96.99 GiB] / in use: 1 [96.99 GiB] / in no VG: 0 [0 ]
Kết quả trả về bao gồm:
- PV: Tên và đường dẫn của các physical volume được tìm thấy trong hệ thống.
- VG: Tên của volume group (VG) mà PV đó đang sử dụng.
- lvm2: Định dạng của physical volume đó.
- [96.99 GiB / 0 free]: Kích thước và dung lượng trống của physical volume đó.
- Total: Tổng số physical volume được tìm thấy trong hệ thống.
- in use: Số lượng physical volume đang được sử dụng để tạo volume group.
- in no VG: Số lượng physical volume không được sử dụng để tạo volume group.
Tóm lại, pvscan
được sử dụng để kiểm tra trạng thái của các physical volume trong hệ thống và thông tin liên quan đến các volume group được tạo từ chúng.
Bước 5: Dùng lệnhlvdisplay
để hiển thị thông tin chi tiết về logical volume hiện có.
[root@vz ~]# lvdisplay
--- Logical volume ---
LV Path /dev/vhs/vz
LV Name vz
VG Name vhs
LV UUID webrPv-Cr31-VDRS-fLQv-O9Uj-Rpu4-eEs7Vq
LV Write Access read/write
LV Creation host, time vz.local, 2023-04-20 20:18:40 +0700
LV Status available
# open 1
LV Size 69.28 GiB
Current LE 17736
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
--- Logical volume ---
LV Path /dev/vhs/root
LV Name root
VG Name vhs
LV UUID I9joVV-cJMh-UkxS-AErG-V3Qa-3678-3Dmp0c
LV Write Access read/write
LV Creation host, time vz.local, 2023-04-20 20:18:41 +0700
LV Status available
# open 1
LV Size 27.71 GiB
Current LE 7094
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
Nó giúp hiển thị thông tin chi tiết của Logical Volume (LV) hiện tại. Cụ thể, nó hiển thị các thông tin sau:
- LV Path: đường dẫn của Logical Volume.
- LV Name: tên của Logical Volume.
- VG Name: tên của Volume Group (VG) mà Logical Volume này thuộc về.
- LV UUID: Unique Identifier của Logical Volume.
- LV Write Access: quyền truy cập ghi/đọc của Logical Volume.
- LV Creation host, time: máy chủ tạo ra Logical Volume này và thời gian tạo ra.
- LV Status: trạng thái của Logical Volume.
- open: số lượng file đang mở đến Logical Volume.
- LV Size: dung lượng của Logical Volume.
- Current LE: số lượng Logical Extent (LE) hiện tại của Logical Volume.
- Segments: số lượng Segment hiện tại của Logical Volume.
- Allocation: phương thức phân bổ khối của Logical Volume.
- Read ahead sectors: số lượng sector được đọc trước khi đọc dữ liệu từ Logical Volume.
- Block device: thiết bị khối của Logical Volume.
Như vậy khi chúng ta sử dụng lệnh lvdisplay để list các logical volume, bạn đã thấy hiện tại có 2 logical volume đó là /dev/vhs/vz (69.28 GiB) và /dev/vhs/root (27.71 GiB). Theo mong muốn như mình đề cập ở trên thì mình thu gọn /dev/vhs/vz từ dùng lượng 69.28 GiB xuống còn 30.00GiB và dồn số dung lượng còn lại của /dev/vhs/vz sang cho /dev/vhs/root.
Chúng ta hãy tải gparted-live-1.2.0-1-amd64.iso về và bằng cách nào đó bạn hãy làm cho máy ảo hoặc máy vật lý của bạn khởi động từ file iso này.
wget https://downloads.sourceforge.net/gparted/gparted-live-1.2.0-1-amd64.iso
Hãy chọn Parted Live (Default settings).
Chọn Don’t touch keymap bấm ok.
Mình chọn ngôn ngữ tiếng anh [US English] nên mình bấm 33.
Mình sẽ khởi động với giao điện command line, với lựa chọn là Enter command line prompt nên mình sẽ bấm 2 và bấm tiếp Enter.
Hãy sử dụng lệnh sudo e2fsck -ff /dev/mapper/vhs-vz
để kiểm tra và sửa chữa các lỗi trên hệ thống tập tin của phân vùng /dev/virtuozzo_vz7/vz bằng công cụ e2fsck.
Chạy lệnh sudo lvreduce -r -L 30G /dev/mapper/vhs-vz để resize từ 70G xuống 30G cho volume này.
Và đây là kết quả kiểm tra lại ở đĩa vz bằng lệnh sudo lvdisplay /dev/vhs/vz, bạn thấy volume này chỉ còn 30G.
Volume /dev/vhs/root do chưa tác động nên nó vẫn giữ nguyên 27.71 GiB.
Kết quả khi bạn dùng lệnh vgs để kiểm tra, bạn thấy PFree bằng 39.28g, nghĩa là dung lượng trống trên PV này đang còn 39.28g.
Kết quả khi show bằng lệnh lvs bạn sẽ thấy phân vùng vz mới thu nhỏ dung lượng đang là 30.00g, phân vùng root chưa tác động nên nó vẫn giữ nguyên là 27.71g.
Tương tự khi bạn dùng lệnh pvscan bạn cũng thấy dung lượng trống của physical volume này đang trống 39.28 GiB.
Bây giờ bạn có thể chạy lệnh lvextend -l +100%FREE –autobackup=y /dev/mapper/vhs-root
Tương tự bạn hãy kiểm tra lại kết quả bằng các lệnh pvs, lvs hay pvscan bạn sẽ có thông tin như dưới.
Khi bạn dùng lệnh lvdisplay /dev/vhs/root bạn nhận kết quả volume này sau khi tăng dung lượng thì nó đang có 66.99GiB.
Khi bạn dùng lệnh lvdisplay /dev/vhs/vz bạn nhận kết quả volume này sau khi hạ dung lượng thì nó chỉ còn có 30.00GiB.
Khởi động lại server và đây là kết quả khi show bằng lệnh lsblk, kết quả hiển thị đúng dung lượng sau khi thay đổi dung lượng, cụ thể vhs-root đang hiển thị đúng với 67G.
[root@vz ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
├─sda3 8:3 0 2G 0 part [SWAP]
└─sda4 8:4 0 97G 0 part
├─vhs-root 253:0 0 67G 0 lvm /
└─vhs-vz 253:1 0 30G 0 lvm /vz
sdb 8:16 0 100G 0 disk
sr0 11:0 1 387M 0 rom
ploop32769 182:524304 0 10G 0 disk
└─ploop32769p1 182:524305 0 10G 0 part /vz/pfcache
Nếu bạ kiểm tra dung lượng bằng lệnh df -h, có thể bạn sẽ nhận được kết quả bị sai như dưới, như bạn có thể thấy dung lượng phân vùng /dev/mapper/vhs-root đã được tăng lên từ 28G lên 67G rồi nhưng khi kiểm tra kết quả thì nó vẫn hiển thị là 28G.
[root@vz ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 448M 0 448M 0% /dev
tmpfs 484M 12K 484M 1% /dev/shm
tmpfs 484M 1.8M 482M 1% /run
tmpfs 484M 0 484M 0% /sys/fs/cgroup
/dev/mapper/vhs-root 28G 2.8G 24G 11% /
tmpfs 484M 4.0K 484M 1% /tmp
/dev/sda2 976M 173M 736M 20% /boot
/dev/mapper/vhs-vz 30G 332M 28G 2% /vz
/dev/ploop10146p1 9.8G 37M 9.2G 1% /vz/pfcache
tmpfs 97M 0 97M 0% /run/user/0
Tại sao lại như vậy? Việc sử dụng lệnh df -h
để hiển thị thông tin về dung lượng đĩa sử dụng hiện tại không thể chính xác với các file hệ thống được sử dụng để quản lý các kích thước file trên đĩa.
Trong khi đó, lệnh lsblk
sẽ hiển thị thông tin về dung lượng thực tế của phân vùng, không phụ thuộc vào các file hệ thống được sử dụng để theo dõi kích thước của phân vùng.
Vì vậy, việc hiển thị dung lượng bằng lệnh df -h
có thể không chính xác và bạn nên sử dụng lệnh lsblk
để xác định dung lượng thực tế của phân vùng.
Có thể có một số lý do dẫn đến việc df -h
không hiển thị dung lượng đúng của phân vùng. Một trong số đó là do hệ điều hành Linux sử dụng một số phần dung lượng của phân vùng để lưu trữ metadata. Nếu metadata chiếm nhiều dung lượng thì df -h
sẽ hiển thị dung lượng thấp hơn so với dung lượng thực tế của phân vùng.
Để đồng bộ hóa thông tin về dung lượng giữa df -h
và lsblk
, bạn có thể thực hiện một số bước sau:
Chạy lệnh resize2fs
để thay đổi kích thước của hệ thống tập tin ext4 được sử dụng trên phân vùng:
sudo resize2fs /dev/mapper/vhs-root
Chạy lệnh xfs_growfs
để thay đổi kích thước của hệ thống tập tin XFS được sử dụng trên phân vùng:
sudo xfs_growfs /dev/mapper/vhs-root
Sau khi thực hiện các bước trên, bạn hãy chạy lại lệnh df -h
để kiểm tra xem dung lượng đã được hiển thị đúng chưa. Và đây là kết quả.
[root@vz ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 448M 0 448M 0% /dev
tmpfs 484M 12K 484M 1% /dev/shm
tmpfs 484M 1.8M 482M 1% /run
tmpfs 484M 0 484M 0% /sys/fs/cgroup
/dev/mapper/vhs-root 66G 2.8G 61G 5% /
tmpfs 484M 4.0K 484M 1% /tmp
/dev/sda2 976M 173M 736M 20% /boot
/dev/mapper/vhs-vz 30G 332M 28G 2% /vz
/dev/ploop10146p1 9.8G 37M 9.2G 1% /vz/pfcache
tmpfs 97M 0 97M 0% /run/user/0
Lưu ý 2 lệnh trên bạn có thể chạy trực tiếp từ OS Centos nhé.