LVM
lvm
一、基础概念
LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制。
是一种将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的 分区加入其中,这样可以实现一种磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性。LVM还能通过快照在备份的过程中保证日志文件和表空间文件在同一时间点的一致性。
-
PE(Physical Extend):卷的最小单位,可配置,默认4M大小,就像我们的数据是以页的形式存储一样,也可以类比为raid的chunk,文件系统的block,卷就是以PE的形式存储。
-
PV(Physical Volume):物理卷,如果要使用逻辑卷,首先第一步操作就是将磁盘格式化成PV,从上图可以看出PV是保护PE的,PV内PE的数量取决于这块磁盘的容量/4M.
-
VG(Volume Group):卷组,VG就是将很多PE组合在一起生成一个卷组,当然这里的PE是可以跨磁盘的,如果当前服务器磁盘空间不足就可以增加一个新磁盘对当前系统不会产生任何影响。
-
LV(Logical Volume):逻辑卷,逻辑卷最终是给用户使用的,前面几个都是为创建逻辑卷做的准备,创建逻辑卷的大小只要不超过VG剩余空间就可以。
二、创建LVM
2.1pv管理
pvcreate # 创建pv
pvscan # 扫描并列出所有的pv
pvs # 与pvscan相似
pvdisplay # 列出pv属性信息
pvremove # 移除pv
pvmove # 移除pv中的数据
pvcreate /dev/sdc1 /dev/sdd1 /dev/sdb1 /dev/sdc2 -y # 对已经划分好的几块分区创建pv;-y选项用于自动回答yes
Wiping ext4 signature on /dev/sdc1.
Physical volume "/dev/sdc1" successfully created.
Physical volume "/dev/sdd1" successfully created.
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc2" successfully created.
pvscan # 扫描并列出所有的pv
PV /dev/sdc2 lvm2 [10.00 GiB]
PV /dev/sdd1 lvm2 [15.00 GiB]
PV /dev/sdb1 lvm2 [15.00 GiB]
PV /dev/sdc1 lvm2 [15.00 GiB]
Total: 4 [55.00 GiB] / in use: 0 [0 ] / in no VG: 4 [55.00 GiB] #
pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 lvm2 --- 15.00g 15.00g
/dev/sdc1 lvm2 --- 15.00g 15.00g
/dev/sdc2 lvm2 --- 10.00g 10.00g
/dev/sdd1 lvm2 --- 15.00g 15.00g
pvdisplay /dev/sdb1 # pvdisplay 可以列出更详细的pv信息
"/dev/sdb1" is a new physical volume of "15.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 15.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID OBSoTj-YcyL-XPGh-wsTt-9zcj-qXSp-YC9YZY
# 以上命令都可以看见pv的大小,数量,剩余空间等信息
2.2 管理vg
vgcreate # 创建VG
vgscan # 扫描并列出所有的vg
vgdisplay # 列出vg属性信息
vgremove # 移除vg,即删除vg
vgreduce # 从vg中移除pv,vg减小
vgextend # 将pv添加到vg中,vg扩容
vgchange # 修改vg属性,
vgcreate -s 6M vggroup /dev/sdb1 /dev/sdc1 /dev/sdc2 /dev/sdd1 # -s设定pe大小,默认为4M;vggroup为设置的vg名称;后边跟的4个文件为要创建vg的组员
Volume group "vggroup" successfully created
[root@CentOS7 ~]#vgscan
Reading volume groups from cache.
Found volume group "vggroup" using metadata type lvm2
[root@CentOS7 ~]#vgdisplay
--- Volume group ---
VG Name vggroup
System ID
Format lvm2 # 格式分为lvm1 和lvm2
Metadata Areas 4
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 4
Act PV 4
VG Size <54.98 GiB
PE Size 6.00 MiB
Total PE 9383
Alloc PE / Size 0 / 0
Free PE / Size 9383 / <54.98 GiB
VG UUID flmx2S-0LT9-hgCZ-HcfL-TT6n-jkna-jSIWbp
[root@CentOS7 ~]#vgreduce vggroup /dev/sdd1
Removed "/dev/sdd1" from volume group "vggroup"
[root@CentOS7 ~]#vgdisplay
--- Volume group ---
VG Name vggroup
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size 39.98 GiB
PE Size 6.00 MiB
Total PE 6824
Alloc PE / Size 0 / 0
Free PE / Size 6824 / 39.98 GiB
VG UUID flmx2S-0LT9-hgCZ-HcfL-TT6n-jkna-jSIWbp
# 可见,减掉sdd1后vg里的数量变为3,容量也减少了;
[root@CentOS7 ~]#vgextend vggroup /dev/sdd1 # 在vggroup中再添加一块pv;
Volume group "vggroup" successfully extended
vgchange用于设置卷组的活动状态,卷组的激活状态主要影响的是lv。使用-a选项来设置。
vgchange -a y vggroup # 将vggroup设置为活动状态(active yes)
vgchange -a y vggroup # 将vggroup设置为非激活状态(active no)
2.3 管理lv
lvcreate # 创建lv
lvscan # 扫描并列出所有的lv
lvdisplay # 列出lv属性信息
lvremove # 移除lv,即删除lv
lvreduce(lvresize) # 缩小lv容量
lvextend(lvresize) # 增大lv容量
lvresize # 改变lv容量
lvcreate {-L size(M/G) | -l PEnum} -n lv_name vg_name
选项说明:
-L:根据大小来创建lv,即分配多大空间给此lv
-l:根据PE的数量来创建lv,即分配多少个pe给此lv
-n:指定lv的名称
示例:
[root@CentOS7 ~]#lvcreate -L 20G -n lv1 vggroup
Rounding up size to full physical extent 20.00 GiB
Logical volume "lv1" created.
[root@CentOS7 ~]#lvscan
ACTIVE '/dev/vggroup/lv1' [20.00 GiB] inherit
[root@CentOS7 ~]#lvdisplay # 一般后边跟lv1的绝对流经,/dev/vggroup/lv1
--- Logical volume ---
LV Path /dev/vggroup/lv1
LV Name lv1
VG Name vggroup
LV UUID 4Wnt9z-T8OP-cJL3-ViL8-QIAE-2vMC-UzNaOf
LV Write Access read/write
LV Creation host, time CentOS7.songtai, 2018-12-19 18:41:23 +0800
LV Status available
# open 0
LV Size 20.00 GiB
Current LE 3414
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
注意:创建lv后,将在/dev/vggroup目录中创建对应lv名称的软链接文件,同时也在/dev/mapper目录下创建链接文件,它们都指向/dev/dm设备。
[root@CentOS7 ~]#ll /dev/vggroup/lv1 /dev/mapper/vggroup-lv1
lrwxrwxrwx. 1 root root 7 Dec 19 18:41 /dev/mapper/vggroup-lv1 -> ../dm-0
lrwxrwxrwx. 1 root root 7 Dec 19 18:41 /dev/vggroup/lv1 -> ../dm-0
[root@CentOS7 ~]#ll -d /dev/dm-0
brw-rw----. 1 root disk 253, 0 Dec 19 18:41 /dev/dm-0
2.4 格式化lv;挂载
mke2fs -t ext4 /dev/vggroup/lv1
mount /dev/vggroup/lv1 /data/lvmnt/ # 也可以
mount /dev/mapper/vggroup-lv1 /data/lvmnt
三、扩容lvm
在对LV(逻辑卷)进行容量扩充之前先查看VG(卷组)中剩余空间有多少,扩充的大小不能超过VG剩余的空间大小;即使vg中没有空余的空间,也可以往vg中添加pv来扩容。
扩容的两个关键步骤如下:
(1).使用lvextend或者lvresize添加更多的pe或容量到lv中
(2).使用resize2fs命令(xfs则使用xfs_growfs)将lv增加后的容量增加到对应的文件系统中(此过程是修改文件系统而非LVM内容)
注意:扩容前须将挂载的逻辑卷卸载在进行扩容!
扩容前先看看还有多少空心啊的pe可以扩充:
vgdisplay # 查看有多少空闲空间或空闲pe
vgdisplay | grep -i pe # 精确查找
PE Size 4.00 MiB
Total PE 15364
Alloc PE / Size 6400 / 25.00 GiB
Free PE / Size 8964 / 35.02 GiB # 还有8964个pe,35.02G的空间未使用
lvextend -L +10g /dev/vg1/lv1 # 按大小扩容10G
lvextend -l +2500 /dev/vg1/lv1 # 按pe数量扩容2500个pe
lvresize -L +10G /dev/vg1/lv1
lvreduce -L -10G /dev/vg1/lv1 # 缩小容量
lvresize -L -10G /dev/vg1/lv1
将扩容好的lv重新挂载后,df -h
发现容量并未变化,还需要resize2fs
工具来改变ext文件系统的大小.(xfs_growfs
)
resize2fs /dev/vg1/lv1
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 48G 4.9G 41G 11% /
/dev/sda1 976M 40M 886M 5% /boot
/dev/sda3 29G 113M 28G 1% /data
/dev/mapper/vg1-lv1 34G 48M 32G 1% /data/lvmnt # 总容量已变化
实验:不卸载直接扩容全部剩余空间
lvresize -l +100%FREE /dev/vg1/lv1 # 将vg1剩余的全部pe扩容至lv1
vgdisplay | grep -i pe
Open LV 1
PE Size 4.00 MiB
Total PE 15364
Alloc PE / Size 15364 / 60.02 GiB
Free PE / Size 0 / 0 # 已全部扩容,无空闲空间
resize2fs /dev/vg1/lv1
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 48G 4.9G 41G 11% /
/dev/sda1 976M 40M 886M 5% /boot
/dev/sda3 29G 113M 28G 1% /data
/dev/mapper/vg1-lv1 59G 52M 56G 1% /data/lvmnt # 在未卸载逻辑卷的情况下,resize2fs这个命令也成功了
四、缩减lvm
与扩容的步骤相反,我们倒着来一步一步操作,先卸载挂载点,具体全部操作如下:
umount /data/lvmnt # 卸载挂载点
[root@CentOS6 ~]#resize2fs /dev/vg1/lv1 45G # 现将文件系统直接缩减至45G,但提示要先e2fsck 检查
resize2fs 1.41.12 (17-May-2010)
Please run 'e2fsck -f /dev/vg1/lv1' first. # 提示 先运行 'e2fsck -f /dev/vg1/lv1' 保障数据安全完整
[root@CentOS6 ~]#e2fsck -f /dev/vg1/lv1
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg1/lv1: 11/3940352 files (0.0% non-contiguous), 293333/15732736 blocks
resize2fs /dev/vg1/lv1 45G
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/vg1/lv1 to 11796480 (4k) blocks.
The filesystem on /dev/vg1/lv1 is now 11796480 blocks long. # 成功将lvm的文件系统的容量缩减至45G
lvresize -L 45G /dev/vg1/lv1 # 将lv的容量缩减至45G
WARNING: Reducing active logical volume to 45.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg1/lv1? [y/n]: y
Size of logical volume vg1/lv1 changed from 60.02 GiB (15364 extents) to 45.00 GiB (11520 extents).
Logical volume lv1 successfully resized. # 会有提示减少lvm容量会摧毁数据,y 同意缩减。
此时已经成功将lvm由60G缩减至45G ,至于减少的这15G是属于哪块设备的,我们通过检查pv来判断,毕竟PE --> PV --> VG --> LV ,哪些PE空闲直接查看PV即可。
[root@CentOS6 ~]#pvdisplay
--- Physical volume ---
PV Name /dev/sdd1
VG Name vg1
PV Size 15.01 GiB / not usable 2.83 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 3841
Free PE 3
Allocated PE 3838
PV UUID 7xbtSO-sJ5P-F8h3-xPcd-FT5d-D9Zt-bHGp34
--- Physical volume ---
PV Name /dev/sde1
VG Name vg1
PV Size 15.01 GiB / not usable 2.83 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 3841
Free PE 3841
Allocated PE 0
PV UUID bZsiMZ-ZhbM-szh1-EDBZ-YyOP-xfQX-S12UDH
# 可见 dev/sde1这块设备是完全空闲的,sdd1上空闲3个PE
补充:如果lvm有dev/sd{a,b,c,d,e}5块磁盘组成,我们在缩减容量是要指定空出sdb磁盘,怎么操作?
上面的操作完成后,已经空出了一块sde,那么我们只需将sdb中的数据(即PE)全部挪进sde即可,操作如下
pvdisplay /dev/sdb # 可见全部的PE都占用了
PV Name /dev/sdb1
VG Name vg1
PV Size 15.01 GiB / not usable 2.83 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 3841
Free PE 0
Allocated PE 3841
PV UUID mdC964-Odex-JZKg-AiV0-4l2u-I3e4-ixWvtR
pvmove /dev/sdb1:0-3841 /dev/sde # 将/dev/sdb上0-3841编号的PE全部移动到/dev/sde
然后,再将这个空出的pv从vg中移出,最后再移出该pv即可,操作如下:
vgreduce vg1 /dev/sde1 # 从vg1 中移出/dev/sde1;注意不是vgremove,该命令是删除vg的。
pvremove /dev/sde1 # 移出该pv
pvdisplay # 列表中已经没有了/dev/sde1