Skip to the content.

Tìm hiểu Logical Volume Manager

I.Giới thiệu về LVM.

1. LVM là gì?

Logical Volume Manager(LVM) là phương pháp cho phép ấn định không gian lưu trữ ổ đĩa cứng thành những logical volume khiến cho việc thay đổi kích thướng dễ dàng hơn. Bạn có thể thay đổi kich thươc mà không cần phải sửa lại table của OS.

2. Vai trò của LVM.

LVM là kỹ thuật quản lý việc thay đổi kích thước của ổ cứng.

3. Các thành phần của LVM.

Mô hình các thành phần trong LVM

Hard Drives

Là các thiết bị lưu trữ vật lý, ví dụ trên hệ thống Linux được nhận diện là /dev/sda,..

Partiton

Là các phân vùng của các hard drive, mỗi ổ cứng có tối đa 4 phân vùng trong đó có từ 0-4 phân vùng primary, và từ 0-1 phân vùng extended. Phân cùng extended là phân vùng để tạo các phân vùng logic.

Physical volume

Là một cách gọi khác của các partition trong kỹ thuật LVM, nó là các thành phần cơ bản được sử dụng bởi LVM. một physical volume không thể mở rộng ra phạm vi của một ổ đĩa.

Volume group

Nhiều physical volunme trên các ổ đĩa khác nhau kết hợp với nhau để tạo thành volume group.

Bootloader không thể đọc được /boot nếu nó nằm trên Volume Group. Do đó không thể sử dụng kỹ thuật LVM với mount point /boot.

Logical volume.

Volume Group được chia nhỏ thành các Logical Volume, mỗi Logical Volume có ý nghĩa tương tự như partition. Nó được dùng cho các mount point và được sử dụng bởi các file system khác nhau : ext3, ext4, xfs,…

Khi dung lượng của Logical Volume được sử dụng hết ta có thể đưa thêm ổ đĩa mới bổ sung cho Volume Group và do đó tăng được dung lượng của Logical Volume

Ví dụ bạn có 4 ổ đĩa mỗi ổ 5GB khi bạn kết hợp nó lại thành 1 volume group 20GB, và bạn có thể tạo ra 2 logical volumes mỗi disk 10GB

II.Sử dụng LVM.

1.Tạo các physical volume, volume group, logical volume.

Tạo máy ảo Centos 7 trên vmware. Thêm hai ổ cứng 20GB:

Kiểm tra ổ cứng có trên hệ thống hay chưa bằng lệnh lsblk:

# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk 
└─sda1   8:1    0   20G  0 part /
sdb      8:16   0   20G  0 disk 
sdc      8:32   0   20G  0 disk 
sr0     11:0    1 1024M  0 rom  

Trong đó, sdb, sdc là ổ cứng mới thêm vào.

Trên các ổ cứng tạo ra các phân vùng LVM bằng lệnh fdisk:

# fdisk /dev/sdb
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-41943039, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +10G
Partition 1 of type Linux and of size 10 GiB is set

Trong đó

Sau Khi tạo xong phân vùng, chuyển đổib định dạng của phân vùng về LVM:

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Trong đó:

Cài đặt gói lvm2 :yum install -y lvm2 (trên ubuntu: apt install -y lvm2)

Tạo các physical volume từ các phân vùng mới tạo bằng lệnh pvcreate: pvcreate <phân vung>

[root@localhost ~]# pvcreate /dev/sdb1
[root@localhost ~]# pvcreate /dev/sdb2
[root@localhost ~]# pvcreate /dev/sdc1
[root@localhost ~]# pvcreate /dev/sdc2
[root@localhost ~]# pvcreate /dev/sdc3
[root@localhost ~]# pvs
  PV         VG Fmt  Attr PSize   PFree  
  /dev/sdb1     lvm2 ---   10,00g  10,00g
  /dev/sdb2     lvm2 ---  <10,00g <10,00g
  /dev/sdc1     lvm2 ---   10,00g  10,00g
  /dev/sdc2     lvm2 ---    5,00g   5,00g
  /dev/sdc3     lvm2 ---   <5,00g  <5,00g
[root@localhost ~]# 

Lệnh pvs hay pvdisplay là lệnh dùng để xem các physical volume.

Tạo Volume group từ các physical volume dùng lệnh vgcreate <tên vg> <phân vùng 1> <phân vùng 2> <...> Ví dụ:

[root@localhost ~]# vgcreate vg-demo1 /dev/sdb1 /dev/sdb2 /dev/sdc1 
  Volume group "vg-demo1" successfully created
[root@localhost ~]# vgs
  VG       #PV #LV #SN Attr   VSize   VFree  
  vg-demo1   3   0   0 wz--n- <29,99g <29,99g

Trong đó tạo volume group vg-demo1 từ 3 phân vùng sdb1, sdb2 và sdc1. Dùng lệnh vgs hoặc vgdisplay để hiển thị thông tin về các volume group.

Tạo các logical volume từ volume group vừa tạo bằng lệnh: lvcreate -L <dung lượng> -n <tên lv> <volume group>

[root@localhost ~]# lvcreate -L 5G -n lv-demo1 vg-demo1
  Logical volume "lv-demo1" created.
[root@localhost ~]# lvs
  LV       VG       Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv-demo1 vg-demo1 -wi-a----- 5,00g            

Tạo filesystem trên logical volume sử dụng mkfs

# mkfs -t ext4 /dev/vg-demo1/lv-demo1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 

[root@localhost ~]# 

Mount logical volume vào hệ thống để có thể sử dụng:

[root@localhost ~]# mkdir /root/demo
[root@localhost ~]# mount /dev/vg-demo1/lv-demo1 /root/demo
[root@localhost ~]# df -Th
Filesystem                      Type      Size  Used Avail Use% Mounted on
/dev/sda1                       xfs        20G  1,2G   19G   6% /
devtmpfs                        devtmpfs  477M     0  477M   0% /dev
tmpfs                           tmpfs     488M     0  488M   0% /dev/shm
tmpfs                           tmpfs     488M  7,7M  480M   2% /run
tmpfs                           tmpfs     488M     0  488M   0% /sys/fs/cgroup
tmpfs                           tmpfs      98M     0   98M   0% /run/user/0
/dev/mapper/vg--demo1-lv--demo1 ext4      4,8G   20M  4,6G   1% /root/demo
[root@localhost ~]# 

2. Thay đổi kích thước logical volume.

Xem lại thông tin các pv, vg, lv:

[root@localhost ~]# pvs
  PV         VG       Fmt  Attr PSize   PFree  
  /dev/sdb1  vg-demo1 lvm2 a--  <10,00g  <5,00g
  /dev/sdb2  vg-demo1 lvm2 a--  <10,00g <10,00g
  /dev/sdc1  vg-demo1 lvm2 a--  <10,00g <10,00g
  /dev/sdc2           lvm2 ---    5,00g   5,00g
  /dev/sdc3           lvm2 ---   <5,00g  <5,00g
[root@localhost ~]# vgs
  VG       #PV #LV #SN Attr   VSize   VFree  
  vg-demo1   3   1   0 wz--n- <29,99g <24,99g
[root@localhost ~]# lvs
  LV       VG       Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv-demo1 vg-demo1 -wi-ao---- 5,00g                                                    
[root@localhost ~]# 

Logical volume lv-demo1 đang có dung lượng là 5GB. Tiến hành tăng kích thước logical volume lv-demo1. Logical volume lv-demo1 được tạo từ vg-demo1, vì vg-demo1 vẫn còn dung lượng chống để cấp phát là 24.9GB nên có thể tăng dung lượng cho lv-demo1. Để tăng kích thước logical volume lv-demo1 dùng lệnh:

[root@localhost ~]# lvextend -L +1G /dev/vg-demo1/lv-demo1
  Size of logical volume vg-demo1/lv-demo1 changed from 5,00 GiB (1280 extents) to 6,00 GiB (1536 extents).
  Logical volume vg-demo1/lv-demo1 successfully resized.
[root@localhost ~]# lvs
  LV       VG       Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv-demo1 vg-demo1 -wi-ao---- 6,00g  
[root@localhost ~]# 

Ta có thể thấy dung lượng lv-demo1 đã tăng từ 5GB lên 6GB tuy nhiên filesystem trên logical volume vẫn không thay đổi kích thước, phải dùng lệnh resize2fs để thay đổi kích thước filesystem:

[root@localhost ~]# df -Th
Filesystem                      Type      Size  Used Avail Use% Mounted on
/dev/sda1                       xfs        20G  1,2G   19G   6% /
devtmpfs                        devtmpfs  477M     0  477M   0% /dev
tmpfs                           tmpfs     488M     0  488M   0% /dev/shm
tmpfs                           tmpfs     488M  7,7M  480M   2% /run
tmpfs                           tmpfs     488M     0  488M   0% /sys/fs/cgroup
tmpfs                           tmpfs      98M     0   98M   0% /run/user/0
/dev/mapper/vg--demo1-lv--demo1 ext4      4,8G   20M  4,6G   1% /root/demo
[root@localhost ~]# resize2fs /dev/vg-demo1/lv-demo1 
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg-demo1/lv-demo1 is mounted on /root/demo; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/vg-demo1/lv-demo1 is now 1572864 blocks long.

[root@localhost ~]# df -Th
Filesystem                      Type      Size  Used Avail Use% Mounted on
/dev/sda1                       xfs        20G  1,2G   19G   6% /
devtmpfs                        devtmpfs  477M     0  477M   0% /dev
tmpfs                           tmpfs     488M     0  488M   0% /dev/shm
tmpfs                           tmpfs     488M  7,7M  480M   2% /run
tmpfs                           tmpfs     488M     0  488M   0% /sys/fs/cgroup
tmpfs                           tmpfs      98M     0   98M   0% /run/user/0
/dev/mapper/vg--demo1-lv--demo1 ext4      5,8G   20M  5,5G   1% /root/demo

Việc tăng dung lượng của logical volume không làm mất sữ liệu trong file system.

Giảm kích thước logical volume Để giảm kích thươc logical volume thì trươc tiên cần phải unmount logical volume đó: # umount /dev/vg-demo1/lv-demo1 Để giảm dung lượng lv sử dung lệnh: # lvreduce -L -3G /dev/vg-demo1/lv-demo1 Sau đó cần tạo lại filesystem và mount lại # mkfs.ext4 /dev/vg-demo1/lv-demo1 # mount /dev/vg-demo1/lv-demo1 demo Kết quả là thay đổi được dung lượng của logical volume như việc mất dữ liệu sẽ sảy ra.

[root@localhost ~]# df -Th
Filesystem                      Type      Size  Used Avail Use% Mounted on
/dev/mapper/vg--demo1-lv--demo1 ext4      2,9G  9,0M  2,8G   1% /root/demo

3. Thay đổi dung lượng Volume group

Việc thay đổ dung lượng volume group chính là thay đổi nhóm các physical volume, gỡ hay thêm physical volume ra khỏi volume group. Kiểm tra các physical volume trên máy:

[root@localhost ~]# pvs
  PV         VG       Fmt  Attr PSize   PFree  
  /dev/sdb1  vg-demo1 lvm2 a--  <10,00g  <7,00g
  /dev/sdb2  vg-demo1 lvm2 a--  <10,00g <10,00g
  /dev/sdc1  vg-demo1 lvm2 a--  <10,00g <10,00g
  /dev/sdc2           lvm2 ---    5,00g   5,00g
  /dev/sdc3           lvm2 ---   <5,00g  <5,00g

Ta thấy có hai physical volume sdc2, sdc3 chưa gán vào volume group nào, Có thể dùng hai physical volume này để tăng kích thước cho volume group sử dụng lệnh vgextend:

[root@localhost ~]# vgs
  VG       #PV #LV #SN Attr   VSize   VFree  
  vg-demo1   3   1   0 wz--n- <29,99g <26,99g
[root@localhost ~]# vgextend /dev/vg-demo1 /dev/sdc2
  Volume group "vg-demo1" successfully extended
[root@localhost ~]# vgs
  VG       #PV #LV #SN Attr   VSize  VFree 
  vg-demo1   4   1   0 wz--n- 34,98g 31,98g

Để gỡ một physical volume ra khỏi một volume group thì ta dùng lệnh vgreduce, chỉ gỡ được nhưng physical volume mà đang không được sử dụng.

[root@localhost ~]# vgs
  VG       #PV #LV #SN Attr   VSize  VFree 
  vg-demo1   4   1   0 wz--n- 34,98g 31,98g
[root@localhost ~]# vgreduce /dev/vg-demo1 /dev/sdc1 /dev/sdc2
  Removed "/dev/sdc1" from volume group "vg-demo1"
  Removed "/dev/sdc2" from volume group "vg-demo1"
[root@localhost ~]# vgs
  VG       #PV #LV #SN Attr   VSize  VFree 
  vg-demo1   2   1   0 wz--n- 19,99g 16,99g

4. Xóa Logical volume, Volume group, Physical Volume.

Xóa logical volume: Để xóa được logical volume thì chúng ta cần unmount nó trước: umount /dev/vg-demo1/lv-demo1 Sau đó có thể xóa logical volume với lệnh lvremove lvremove /dev/vg-demo1/lv-demo1 Xóa volume group Để xóa được volume group thì trước tiên phải xóa hết các logical volume trên nó, sau đó dùng lệnh sau để xóa vg: vgremove /dev/vg-demo1 Xóa physical volume Để xóa được physical volume cần xóa volume group chứa nó trước, hoặc xóa nó khỏi volume group chứa nó, sau đó dùng lệnh pvremove để xóa physical volume: pvremove /dev/sdc1

III. Tìm hiểu bổ sung về LVM.

1 Tính năng Snapshot

LVM Snapshots are space efficient pointing time copies of lvm volumes. It works only with lvm and consume the space only when changes are made to the source logical volume to snapshot volume. If source volume has a huge changes made to sum of 1GB the same changes will be made to the snapshot volume. Snapshots can’t be use for backup option. Backups are Primary Copy of some data’s, so we cant use snapshot as a backup option.

<img src=http://i.imgur.com/w0JRnB5.jpg>

Chuẩn bị

<img src=http://i.imgur.com/2gYdklq.png>

Trên hình ta đã có một logical Volume lv-demo1 được mount tới thư mục rỗng /mnt/demo1 và Volume Group vg-demo1.

1.1 Tạo Snapshot

lv-demo1 thuộc vg-demo1 nên check xem vg-demo1 có còn dung lượng để tạo Snapshot.

Tạo ổ Snapshot

# lvcreate -L 1GB -s -n lv-demo1-snap /dev/vg-demo1/lv-demo1        
      
OR

# lvcreate --size 1G --snapshot --name  lv-demo1-snap /dev/vg-demo1/lv-demo1

-s: Creates Snapshot

-n: Name for snapshot

<img src=http://i.imgur.com/9X5dcsP.png>

Các thành phần câu lệnh:

-L 1GB: Đặt dung lượng cho ổ snapshot
-s: Tạo snapshot
-n: Tạo tên cho snapshot
lv-demo1-snap: Tên snapshot
/dev/vg-demo1/lv-demo1: Volume cần snapshot

Kiểm tra bằng lệnh lvs ta có thêm 1 LV lv-demo1-snap với cột data có % = 0.00

<img src=http://i.imgur.com/lbUNuOh.png>

Nếu muốn xóa snapshot đã tạo

lvremove /dev/vg-demo1/lv-demo1-snap

Ta copy một số file vào thư mục /mnt/demo1

<img src=http://i.imgur.com/Fv7TMdd.png>

Ta có thể thấy 22% dung lượng của snapshot volume đã được dùng. Nếu bạn dùng quá dung lượng thì sẽ có thông báo Input/output error khi kiểm tra lvs

Để có nhiều thông tin hơn ta dùng lệnh lvdisplay vg-demo1/lv-demo1-snap

Mở rộng Snapshot Volume

lvextend -L +1G /dev/vg-demo1/lv-demo1-snap

Mở rộng tự động

Vào file /etc/lvm/lvm.conf và chỉnh sửa

<img src=http://i.imgur.com/Zr1E5yT.png>

Dòng 1: Khi dung lượng đạt tới 100% Dòng 2: Kích thước volume sẽ tăng 20%

1.2 Restoring Snapshot or Merging

Để restore Snapshot chúng ta phải un-mount file system

umount /mnt/demo1

Check bằng lệnh df -h để kiểm tra đã un-mount thành công hay chưa.

Restore snapshot

lvconvert --merge /dev/vg-demo1/lv-demo1-snap

Sau khi quá trình kết thúc thì Snapshot Volume sẽ được xóa.

mount lại Volume và vào thư mục /mnt/demo1. Nếu các file copy đã bị xóa thì quá trình đã hoàn thành.

Chú ý: Dung lượng Snapshot tăng lên đúng bằng dung lượng tạo mới trên LV. Không thể tạo Snapshot mới ghi đè lên Snapshot cũ. Trường hợp bạn có 2 Snapshot cho cùng 1 ổ LV thì dữ liệu mới cũng được ghi cả vào 2 ổ Snapshot.

2 Tính năng Thin Provisioning Volumes

Tính năng này cho phép chúng ta tạo ra số Volume có tổng dung lượng lớn hơn số lượng cho phép.

<img src=http://i.imgur.com/l60cF0T.jpg>

2.1 Setup Thin Pool and Volumes

Ta có 1 Physical Volume sdd1 dùng lệnh vgcreate vg-thin /dev/sdd1 để tạo ra 1 Volume group cho Thin-Pool

<img src=http://i.imgur.com/lS0HDr8.jpg>

Tạo 1 Thin-Pool

lvcreate -L 9GB --thinpool thin-demo vg-thin

–thinpool: Để tạo thinpool

thin-demo: Tên của Thin Pool

vg-thin: Tên Volume Group

Tạo Thin Volume từ Thin-Pool

lvcreate -V 2G --thin -n thin-demo-client1 vg-thin/thin-demo tạo 1 Thin virtual volume với tên thin-demo-client1 trong thin-demo

<img src=http://i.imgur.com/dv9lAEZ.jpg>

Ta sẽ tạo 4 Thin-demo-client 1,2,3,4

Tạo 4 thư mục cient 1,2,3,4 trong /mnt. Tạo File System bằng mkfs và mount các Thin-demo-client vào các thư mục

mkdir /mnt/client1

mkfs.ext4 /dev/vg-thin/thin-demo-client1 

mount /dev/vg-thin/thin-demo-client1 /mnt/client1

Copy file vào các thư mục client để dung lượng ổ tăng lên

<img src=http://i.imgur.com/JrRbRds.jpg>

2.2 Over Provisioning

Bây giờ client5 đến và yêu cầu 2GB nhưng ta đã gán hết 8GB cho 4 client trước. Vậy là trên lý thuyết ta ko thể cho client 2GB nữa. Cách giải quyết là dùng chức năng Over Provisioning. (which means giving the space more than what I have).

Tạo Thin-demo-client5. Tạo thư mục /mnt/client5. Tạo File System và mount thin-demo-client5.

<img src=http://i.imgur.com/VkJwUbj.jpg>

Copy file vào /mnt/client5

<img src=http://i.imgur.com/e626ULh.jpg>

Phần dung lượng của Client đã tăng lên.

Tổng kết lại thì với 1 Thin-Pool 8GB, ta có thể chia ra số Thin Volume Client có tổng dung lượng lớn hơn 8GB nhưng tổng mức dùng của các Thin Volume Client ko lớn hơn 8GB.

3 Tính năng Manage Multiple Logical Volume Management Disks using Striping I/O

LVM Striping là tính năng cho phép ghi dữ liệu lên nhiều ổ thay vì chỉ một ổ Physical volume.

Tính năng của Striping:

3.1 Chuẩn bị

Ta tạo 3 Physical volume, mỗi Volume là 1GB

<img src=http://i.imgur.com/31w4EIj.png>

Tạo Volume Group với tên vg-strip từ 3 Physical volume trên

vgcreate vg-strip /dev/sd[b-d]1

<img src=http://i.imgur.com/lNwSyos.png>

3.2 Logical Volume management using Striping I/O

Ta tạo Logical volume, Cần xác định giá trị strip, bao nhiêu dữ liệu sẽ được ghi.

lvcreate -L 500M -n lv-strip -i3 vg-strip

Ở đây ta tạo Logical volume tên là lv-strip có dung lượng 500M từ Volume Group vg-strip và xác định 3 tripe. stripesize có kích thước là 64KB, Nếu muốn giá trị khác ta dùng thêm thành phần -I

<img src=http://i.imgur.com/62sNtw4.png>

lvdisplay vg-strip/lv-strip -m

ta sẽ thấy được lv-strip sẽ được ghi lên 3 stripe

<img src=http://i.imgur.com/E6NUkJn.png>

Phần dung lượng còn lại của sdb1,sbc1,sbd1 sau khi chia cho Thin-Pool

<img src=http://i.imgur.com/xZlRkgq.png>

4 Tính năng LVM Migration

Tính năng này cho phép di chuyển dữ liệu từ logical volumes sang một ổ mới mà không làm mất dữ liệu hoặc downtime. Có thể áp dụng với disk SATA,SSD,SAN storage iSCSI or FC

4.1 Chuẩn bị

Ta có 1 Logical Volume được tạo ra từ Physical Volume /dev/sdb1. Và các Drive /dev/sdc, /dev/sdd mới gắn thêm.

<img src=http://i.imgur.com/tKSZWu6.png>

Mount lv-migration tới thư mục /mnt/demo và copy file 123.txt có nội dung bất kì vào thư mục.

Tạo Physical Volume /sdc1 và extend vào vg-migration.

<img src=http://i.imgur.com/myOFW7e.png>

4.2 LVM Mirroring Method

Ta dùng ‘lvconvert’ command để migration dữ liệu sang ổ mới

lvconvert -m 1 /dev/vg-migration/lv-migration /dev/sdc1

-m: mirror (Tạo ổ migration) 1: 1 mirror

Quá trình hoàn tất. Dùng lvs -o+devices để kiểm tra thông tin.

<img src=http://i.imgur.com/nRBD535.png>

Khi đã tạo 1 mirror mới thì bạn có thể bỏ /dev/sdb1

lvconvert -m 0 /dev/vg-migration/lv-migration /dev/sdb1

Check lại với lvs -o+devices ta sẽ thấy lv-migration chỉ còn nối với /dev/sdc1

<img src=http://i.imgur.com/LWRZuJ5.png>

Check lại nội dung file 123.txt đã tạo bên trên để đảm bảo dữ liệu ko bị mất.

4.3 LVM pvmove Mirroring Method

Phần này sẽ hướng dẫn dùng ‘pvmove’ thay vì ‘lvconvert’

Các bước chuẩn bị cũng như phần 4.1 tiếp theo ta sẽ dùng command

pvremove -n /dev/vg-migration/lv-migration /dev/sdb1 /dev/sdc1

Đây là cách đơn giản nhưng trong thực tế thì thường sử dụng Mirroring hơn pvmove

Tài liệu tham khảo:

https://github.com/hocchudong/Logical-Volume-Manager-LVM-/edit/master/T%C3%ADnh%20n%C4%83ng%20c%E1%BB%A7a%20LVM.md