[Linux实用命令]-10-逻辑卷(LVM)管理实例详解

引言

这篇文章使用CentOS7实例演示LVM的创建更改和删除,LVM(Logical Volume Manager)是Linux环境下对硬盘分区进行管理的一种机制,可以实现多块硬盘空间的动态划分和调整,跨硬盘储存文件等功能。常用于装备大量硬盘并随时需要增加或删除硬盘的环境,也同样适于仅有一、两块硬盘的环境。

文章目录

0×1.LVM基本术语与实验环境介绍

下面是LVM需要了解的基本术语:

物理卷(PV physical volume): 它可以是物理硬盘上的分区,也可以是整块物理硬盘;
卷组(VG volume group): 建立在物理卷之上,一个卷组至少包括一个物理卷,可以动态增删物理卷;
逻辑卷(LV logical volume):建立在卷组之上,卷组中未分配的空间可以用来建立逻辑卷,并且可以动态调整大小直到用完卷组空间,系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同卷组(卷组是物理卷容器,它又被不同逻辑卷动态占用着,就好像一块物理硬盘被分割成不同的区域一样);
物理区域(PE physical extend): PE是PV中可以用于分配的最小储存单元,一旦确定大小不能更改,同一VG中的所有PV的PE大小要一致;
逻辑区域(LE logical extend): LE是LV中可以用来分配的最小存储单元,LE的大小取决于LV所在卷中的PE大小;
卷组描述区域(VGDA volume group descriptor area):VGDA在建立物理卷时建立,用于描述PV本身,所属VG,VG中的LV,以及LV中的PE大小等等;

试验环境介绍:

操作系统:CentOS7;
硬盘:/dev/sda(系统所在硬盘)、/dev/sdb(20G)、/dev/sdc(20G) ;
使用/dev/sdb、/dev/sdc这两块硬盘完成下面的实验;

0×2.如何创建LVM

创建LVM步骤:创建物理卷(PV)->将物理卷加入卷组(VG)->使用卷组创建逻辑卷(LV)->格式化逻辑卷->挂载使用

a.如何创建PV

					#LVM的创建必须使用root权限,如果没有给硬盘分区,可以直接使用硬盘号将其创建为PV,将sdb和sdc这两块硬盘创建成PV
					qing@qingsword.com:~$ sudo pvcreate /dev/sd[b-c] 

					#如果硬盘已经被分区,请携带分区号,例如,sdb和sdc都划分了一个分区,如果使用分区的形式添加,最好在fdisk创建分区时,使用t将分区类型改成8e(LVM)
					qing@qingsword.com:~$ sudo pvcreate /dev/sdb1 /dev/sdc1 

					#查看刚创建好的PV
					qing@qingsword.com:~$ sudo pvs
					PV       VG   Fmt  Attr PSize  PFree 
					/dev/sdb lvm2 ---  20.00g 20.00g
					/dev/sdc lvm2 ---  20.00g 20.00g
					

PV创建好了就可以创建VG了。

Ps:若使用fdisk分区后提示找不到分区,可以执行partprobe命令刷新分区表。

b.如何创建VG

					#将sdb和sdc这两块已经创建成PV的硬盘划分到vg0这个卷组池中,vg0是自定义的名称,代表一个卷组池(同样,如果硬盘已经分区,请携带分区号)
					qing@qingsword.com:~$ sudo vgcreate vg0 /dev/sd[b-c]
 					 Volume group "vg0" successfully created

 					#查看VG池
					qing@qingsword.com:~$ sudo vgs
					VG #PV #LV #SN Attr   VSize  VFree 
					vg0 2  0   0  wz--n- 39.99g 39.99g

					#查看PV列表,b和c的VG列都属于vg0这个卷组池了
					qing@qingsword.com:~$ sudo pvs
					PV       VG   Fmt  Attr PSize  PFree 
					/dev/sdb vg0 ---  20.00g 20.00g
					/dev/sdc vg0 ---  20.00g 20.00g
					

创建好卷组池就能从池中划分容量给逻辑卷(LV)了。

c.如何创建LV

					#从卷组vg0中拿出10G,分配给lv0,其中-n后面是lv自定义名称,-L后面跟需要从vg0中分配给lv0的大小以及从哪个VG分配
					qing@qingsword.com:~$ sudo lvcreate -n lv0 -L 10G vg0

					#查看lv,可以看到lv0大小10G,并且属于vg0这个卷组池(这就像是从vg0这块硬盘上划分了一个10G的分区,分区号lv0)
					qing@qingsword.com:~$ sudo lvs
					LV  VG  Attr     LSize  
					lv0 vg0 -wi-a--- 10.00g                                           
					

创建好lv后就可以格式化它。

d.文件系统格式化

					#创建好的lv所在目录是"/dev/卷组名称/逻辑卷名称",所以本例就是/dev/vg0/lv0,将它格式化成ext4文件系统
					qing@qingsword.com:~$ sudo mkfs.ext4 /dev/vg0/lv0
					

格式化完成后就能挂载使用它了。

e.挂载和使用

					#将lv0挂载到/mnt目录下(不一定非要挂载到/mnt才能使用,请根据实际情况挂载到其他目录)
					qing@qingsword.com:~$ sudo mount /dev/vg0/lv0 /mnt
					

0×3.如何扩充和缩小LVM

只要卷组(VG)中有空余空间,就能将其增加到对应逻辑卷(LV)中;或将对应逻辑卷(LV)中的某些分区删除,让其成为卷组(VG)中的空余空间。

a.如何扩充LV

					#首先确保VG池中有足够的VFree空间可供使用(VSize是这个VG的总大小,VFree是还剩下多少空间可以划分,PV是这个VG包含多少个物理卷,LV是这个VG以及划分了多少个逻辑卷) 
					qing@qingsword.com:~$ sudo vgs
					VG #PV #LV #SN Attr   VSize  VFree 
					vg0 2   1   0  wz--n- 39.99g 29.99g

					#给lv0增加5G的大小
					qing@qingsword.com:~$ sudo lvextend -L +5G /dev/vg0/lv0

					#更新lv0大小(必须)
					qing@qingsword.com:~$ sudo resize2fs /dev/vg0/lv0

					#如果是xfs文件系统,上一条命令会报错,必须使用xfs_growfs来刷新磁盘大小,如下
					qing@qingsword.com:~$ sudo xfs_growfs /dev/vg0/lv0

					#查看,lv0被扩充到了15G
					qing@qingsword.com:~$ df -h
					文件系统             容量  已用  可用 已用% 挂载点
					/dev/mapper/vg0-lv0 15G  25M   14G  1% /mnt
					

b.如何扩充VG

如果此时我们的VG池容量不够,可以给计算机添加一块物理硬盘,先将它创建成PV,之后将它放入VG池即可,请看下面的实例:

					#新增加一块硬盘sdd(20G),将它创建成PV后划分到vg0下,此时vg0的容量将增加sdd硬盘的大小
					qing@qingsword.com:~$ sudo pvcreate /dev/sdd
					qing@qingsword.com:~$ sudo vgextend vg0 /dev/sdd

					#vg0的总大小扩充了20G
					qing@qingsword.com:~$ sudo vgs
					VG #PV #LV #SN Attr   VSize  VFree 
					vg0 3  1    0  wz--n- 59.99g 44.99g
					

c.如何缩小LV

注意:缩小LV大小有一定风险,可能造成数据丢失,如果不是必要,最好不要缩小它:

					#缩小逻辑卷之前,如果此逻辑卷已经挂载,必须先卸载,以lv0为例
					qing@qingsword.com:~$ sudo umount /dev/vg0/lv0

					#首先对lv0进行检查
					qing@qingsword.com:~$ sudo e2fsck -f /dev/vg0/lv0

					#然后缩小文件系统,本例将lv0从15G缩小到10G大小
					qing@qingsword.com:~$ sudo resize2fs /dev/vg0/lv0 10G

					#最后将lv0缩小到10G(一定要和上面resize2fs命令中的大小相同),缩小有风险,请慎用
					qing@qingsword.com:~$ sudo lvreduce -L 10G /dev/vg0/lv0 
					  WARNING: Reducing active logical volume to 10.00 GiB
					  THIS MAY DESTROY YOUR DATA (filesystem etc.)
					Do you really want to reduce lv0? [y/n]: y

					#重新挂载使用
					qing@qingsword.com:~$ sudo mount /dev/vg0/lv0 /mnt
					

Ps:因为xfs文件系统自带了扩充和缩小的特性,所以xfs文件系统并不需要使用LVM技术,以上缩小的实验仅适用于ext文件系统。

d.如何缩小VG

缩小VG比缩小LV稍微安全一点,确保这个要被移除的分区或者硬盘没有被使用后,可以用下面的命令将它从VG池中去除:

					#将sdc这块硬盘从vg0中移除
					qing@qingsword.com:~$ sudo vgreduce vg0 /dev/sdc
					

0×4.如何创建LVM备份(快照)

注意:逻辑卷的备份是放在和逻辑卷同一个卷组中的,也需要占用卷组的大小,所以卷组的大小不够备份就不会成功:

					#以前面创建的lv0距离,首先lvs查看一下lv0的大小,使用相同大小创建备份
					qing@qingsword.com:~$ sudo lvs
					LV  VG   Attr       LSize
					lv0 vg0  -wi-a----- 10.00g

					#-L后面填写的大小和lv0大小一致,-s -n后面跟自定义的备份名称,再跟需要备份的逻辑卷完整路径
					qing@qingsword.com:~$ sudo lvcreate -L 10G -s -n lv0bk /dev/vg0/lv0

					#快照保存了创建时,对应逻辑卷所有数据,路径"/dev/vg0/lv0back"
					qing@qingsword.com:~$ sudo lvs
					LV    VG   Attr       LSize  Pool Origin
					lv0   vg0  owi-a-s--- 10.00g                                                    
					lv0bk vg0  swi-a-s--- 10.00g   lv0

					#如果逻辑卷出了问题,可以用快照恢复,快照恢复一次后,会自删除(注意:恢复前一定要将被恢复的分区先umount卸载,否则可能出现无法恢复的错误)
					qing@qingsword.com:~$ sudo lvconvert --merge /dev/vg0/lv0bk
					qing@qingsword.com:~$ sudo lvs
					LV    VG   Attr       LSize  Pool Origin
					lv0   vg0  owi-a-s--- 10.00g 
					

0×5.如何删除LVM

删除LVM的步骤:如果逻辑卷已挂载,需要先卸载->删除逻辑卷(LV)->删除卷组(VG)->删除物理卷(PV)。

a.如何删除LV

					#卸载lv0
					qing@qingsword.com:~$ sudo umount /dev/vg0/lv0

					#删除lv0,如果lv0存在快照,会询问是否删除快照
					qing@qingsword.com:~$ sudo lvremove /dev/vg0/lv0 
					Do you really want to remove active logical volume lv0? [y/n]: y
					

b.如何删除VG

					#删除vg0
					qing@qingsword.com:~$ sudo vgremove vg0
					

c.如何删除PV

					#删除两块pv硬盘,删除前请确保这个pv没有被添加到vg中,否则应该先使用vgreduce移除vg中的pv
					qing@qingsword.com:~$ sudo pvremove /dev/sd[b-c]