LVM支持3种LV。
linear LV
striped LV
mirrored LV
线性就是没有RAID功能,直接扩容多个PV。
striped相当于RAID0,数据分片存储到多个PV上,可以提升并发IO能力。
mirrored相当于RAID1。
命令:lvcreate
没有没有指定name,默认为lvol#
使用-L, -l 选项创建,创建线性LV。
-L指定一个数字大小,可以带单位,如10G
-l指定一个百分比,可以是总量(VG)的百分比,也可以是剩余空间(FREE)的百分比,比如60%VG,100%FREE。
# lvcreate -l 30%VG -n lv0 vg0
Logical volume "lv0" created.
# ls -l /dev/vg0/lv0
lrwxrwxrwx 1 root root 7 Sep 11 15:12 /dev/vg0/lv0 -> ../dm-0
# ls /dev/mapper/ -l
total 0
crw------- 1 root root 10, 236 Aug 26 14:42 control
lrwxrwxrwx 1 root root 7 Sep 11 17:25 vg0-lv0 -> ../dm-0
lrwxrwxrwx 1 root root 7 Sep 11 16:47 vg0-lv1_rename -> ../dm-1
创建线性LV的时候,还可以指定使用特定的PV,或者特定PV的某个PE范围。如:
lvcreate -L 1500 -ntestlv testvg /dev/sdg1
lvcreate -l 100 -n testlv testvg /dev/sda1:0-25 /dev/sdb1:50-125
-i选项指定分成几个片,-I选项指定分片的大小,一般是4-512KB
创建10个PE的lv1,类型是striped,分成2个片,一个片16K:
# lvcreate -l 10 -i2 -I16 -n lv1 vg0
Logical volume "lv1" created.
-m选项,指定mirror几份,-m1,表示有两个copy。
创建10个PE的lv2,类型是mirror,复制1份
# lvcreate -l 10 -m1 -n lv2 vg0
Logical volume "lv2" created.
-R选项,可以指定regions的大小,默认是512KB。
LVM维护一个很小的log,用来追踪哪个regions用来同步mirror。默认情况下,这个log保存在磁盘。
使用--corelog可以用来保存到内存。但是重启后,整个mirror需要重新同步。
mirrored和linear可以互相转换。使用lvconvert命令,-m1转成mirrored,-m0转成linear。
比如
# lvconvert -m0 vg0/lv2
Are you sure you want to convert raid1 LV vg0/lv2 to type linear losing all resilience? [y/n]: y
Logical volume vg0/lv2 successfully converted.
和pv/vg一样,lv也有3个命令显示:lvs, lvdisplay, lvscan
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv0 vg0 -wi-a----- 80.00m lv1 vg0 -wi-a----- 40.00m lv2 vg0 -wi-a----- 40.00m # lvscan ACTIVE '/dev/vg0/lv0' [80.00 MiB] inherit ACTIVE '/dev/vg0/lv1' [40.00 MiB] inherit ACTIVE '/dev/vg0/lv2' [40.00 MiB] inherit # lvdisplay vg0/lv0 --- Logical volume --- LV Path /dev/vg0/lv0 LV Name lv0 VG Name vg0 LV UUID Sxcs1Y-8OJO-MBHh-73Vu-7cfz-qPz6-xC0Bdt LV Write Access read/write LV Creation host, time yuan-vm, 2024-09-11 15:12:43 +0800 LV Status available # open 0 LV Size 80.00 MiB Current LE 20 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0 |
使用lvremove命令移除logical volume。
# lvremove vg0/lv2
Do you really want to remove and DISCARD active logical volume vg0/lv2? [y/n]: y
Logical volume "lv2" successfully removed
使用lvname命令,重命名一个lv
# lvrename vg0 lv1 lv1_rename
Renamed "lv1" to "lv1_rename" in volume group "vg0"
使用lvchange命令,可以设置lv的一些属性。具体见lvchange的manual。
使用lvreduce命令可以缩小一个lv的大小。
首先需要注意的是,如果lv已经挂载了文件系统,首先需要收缩文件系统。否则存在文件丢失的风险。
有一个选项 --resize-fs 可以帮我们一条命令缩小,也不用umount。
# lvreduce -l -5 --resize-fs vg0/lv0
Do you want to unmount "/work/lvm/lv0" ? [Y|n] y
fsck from util-linux 2.34
/dev/mapper/vg0-lv0: 12/20480 files (8.3% non-contiguous), 1684/20480 blocks
resize2fs 1.45.5 (07-Jan-2020)
Resizing the filesystem on /dev/mapper/vg0-lv0 to 15360 (4k) blocks.
The filesystem on /dev/mapper/vg0-lv0 is now 15360 (4k) blocks long.
Size of logical volume vg0/lv0 changed from 80.00 MiB (20 extents) to 60.00 MiB (15 extents).
Logical volume vg0/lv0 successfully resized.
上面这条命令,将lv0缩小5个LE。挂载的前后大小,可以看到变小了20M。
# df -h lv0
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg0-lv0 74M 28K 68M 1% /work/lvm/lv0
# df -h lv0
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg0-lv0 54M 28K 50M 1% /work/lvm/lv0
使用lvextend命令,可以扩大一个lv的大小。扩大之后,还需要扩大关联的文件系统的大小。
# lvextend -l +5 --resize-fs vg0/lv0
Size of logical volume vg0/lv0 changed from 60.00 MiB (15 extents) to 80.00 MiB (20 extents).
Logical volume vg0/lv0 successfully resized.
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/mapper/vg0-lv0 is mounted on /work/lvm/lv0; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mapper/vg0-lv0 is now 20480 (4k) blocks long.