LVM 逻辑卷管理

文章目录[x]
  1. 1:LVM实例
  2. 1.1:第一步,创建PV与删除PV
  3. 1.2:第二步,创建VG与删除VG
  4. 1.3:第三步,创建LV与删除LV
  5. 1.4:第四步,格式化,挂载LV
  6. 1.5:第五步,LV管理,LV的扩容与缩减,文件系统的扩容与缩减
  7. 1.6:第六步,卷组的扩容与缩小
  8. 2:LVM快照

LVM(Logical Volume Manager)逻辑卷管理。
想象这样一种场景:如果使用MBR,GPT这样的分区表对物理磁盘进行分区,然后再在分区上创建文件系统,挂载,的确是常规操作,没有什么问题。但是假如说因为一些疏忽,空间占用的远比想象的多,但是分区却分的太小了,这种情况下怎么办。要么将正在工作的硬盘停掉,然后将数据复制到更大的空间,再重新启用硬盘,且不说这样子耽误的时间,如果是正在运行的服务器,就要把服务停掉,会造成不知多少损失。其实还有一种给快要满的分区扩容,将一个新的大分区挂载到需要空间的目录上,这个目录的文件就不占用原本分区的空间了。但是这样会把磁盘的数据结构打乱,而且要将这个目录的文件复制到新的分区,原本分区也并没有得到实际的扩容。

 

于是为了有“在线扩容”的“磁盘”,LVM就诞生了。
LVM是一个磁盘分区和文件系统之间的逻辑层,为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在这个盘卷上创立文件系统。这样使管理员对文件系统的管理可以跨越物理磁盘,使用LVM可以在不用对磁盘进行重新分区的情况下动态调整文件系统的大小,新加硬盘时不必停掉系统将旧文件进行迁移,而是通过LVM直接扩展文件系统,跨越了物理磁盘的限制
总结,LVM的本质就是,将底层物理磁盘进行打包封装,然后以逻辑卷的形式呈现给上层。对磁盘操作时,不是直接对底层分区进行操作,而是通过管理逻辑卷来间接操作底层磁盘

The Physical Media:物理存储介质,LVM的存储介质,可以是整块磁盘,也可以是某个磁盘的某个分区,也可以是RAID组成的逻辑盘。这些设备必须初始化为LVM卷,才能被LVM使用(旧的系统中必须将分区类型改为Linux LVM(8e),才能划分为LVM的存储介质,新系统已经自动做了这一步)
 
PV,physical volume:物理卷,物理卷是LVM的基本存储逻辑块,使用物理存储介质创建,但是相比物理存储介质包含了LVM相关参数
 
VG,volume group:卷组,一个卷组由一个或多个PV组成,就相当于一块“大硬盘”,如果没有LVM,这就相当于物理磁盘
 
LV,logic volume:逻辑卷,卷组这个“大磁盘”中的“磁盘分区”,把他当作“能自由扩展的普通磁盘分区”就好,在这上面建立文件系统
 
PE,physical extent:物理块,创建VG时从PV中分出的最小单元,默认为4MB
 
LE,logic extent:逻辑块,LV中的最小分配单元,和PV中的PE一一对应,大小一致

 

磁盘操作逻辑对比:
常规磁盘分区:使用分区表分区->创建文件系统->挂载
LVM:使用某些分区/整块磁盘/RAID逻辑盘->创建为多个PV->合并为VG->从VG中划分LV->在LV上创建文件系统->挂载

 

LVM使管理员可以将多个磁盘空间当成一个“大硬盘”,在LVM眼中,VG的磁盘空间都是连续的,不论是否在不同的物理磁盘分区,LVM以此可以跨越多个硬盘分区管理空间,并且实现在线对VG,LV进行空间大小调整,删除新建,对文件系统进行扩容。并且LVM允许使用快照,备份文件系统。LVM一般与RAID配合使用,LVM实现对磁盘空间的弹性利用与调配,RAID对磁盘安全,数据安全,硬盘性能进行保证

 

LVM在对数据进行写入时分为两种模式:线性模式(linear)和交错模式(triped)。假如有sda1和sda2两个分区被划入VG,VG全部创建为一个LV。线性模式的数据会按顺序写入sda1,sda1满了之后再写入sda2。交错模式会将数据拆分,分别写入sda1和sda2,这样子有点像RAID0,理论上可以提高读写速度,但是如果有一个分区出现了问题,所有的数据都会毁掉。把对读写速度的提升交给LVM显然不太合适,所以LVM默认使用线性模式,读写速度什么的就交给RAID吧

 

LVM操作命令
功能                   PV管理命令                  VG管理命令                LV管理命令
scan 扫描           pvscan                          vgscan                          lvscan
create 创建        pvcreate                        vgcreate                       lvcreate
s 快速查看          pvs                               vgs                               lvs
display 显示       pvdisplay                      vgdisplay                      lvdisplay
remove 移除      pvremove                     vgremove                     lvremove
extend 扩展                                            vgextend                      lvextend
reduce 减少                                            vgreduce                      lvreduce

 

LVM实例

主机有以下磁盘与分区。一个SCSI 20GB系统盘~一个SATA 和一个NVMe 5GB盘

	[root@centos8-main ~]# lsblk /dev/{sda,sdb,nvme0n1}
	NAME                  MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
	sda                     8:0    0  20G  0 disk 
	├─sda1                  8:1    0   1G  0 part /boot
	└─sda2                  8:2    0  19G  0 part 
	  ├─cl_initialvm-root 253:0    0  17G  0 lvm  /
	  └─cl_initialvm-swap 253:1    0   2G  0 lvm  [SWAP]
	sdb                     8:16   0   5G  0 disk 
	nvme0n1               259:0    0   5G  0 disk 

第一步,创建PV与删除PV

老系统需要先把分区的标识改为“Linux LVM”才可以,RHEL7及之后已经不需要,但是还是要说一下
使用fdisk或者gdisk都可以更改分区标识,而且操作相同,使用“l”选项列出所有可更改的分区类型以及对应的ID。使用“t”选项进入更改界面,之后也可以使用“L”列出所有可更改的分区类型以及对应的ID
其中,默认的分区ID为“83 Linux”,LVM的分区ID为“8e Linux LVM”,分区ID不管是fdisk还是gdisk都一样,可能描述不太一样
实际新系统在使用LVM时不会更改这些分区的标识,更改了似乎也没有实质作用。但是手动更改有利于管理员分辨分区的实际作用

创建PV与删除PV
使用“pvcreate”命令来创建PV
pvcreate 常用参数:
-u:使用UUID来指定硬盘或分区

首先在sdb硬盘上分出一个1GB的分区

	[root@centos8-main ~]# lsblk /dev/sdb
	NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
	sdb      8:16   0   5G  0 disk 
	└─sdb1   8:17   0   1G  0 part 

然后使用“pvcreate”命令创建为PV

	[root@centos8-main ~]# pvcreate /dev/sdb1 
	  Physical volume "/dev/sdb1" successfully created.

查看一下现在的pv

	[root@centos8-main ~]# pvs
	  PV         VG           Fmt  Attr PSize   PFree
	  /dev/sda2  cl_initialvm lvm2 a--  <19.00g    0 
	  /dev/sdb1               lvm2 ---    1.00g 1.00g
	[root@centos8-main ~]# pvscan
	  PV /dev/sda2   VG cl_initialvm    lvm2 [<19.00 GiB / 0    free]
	  PV /dev/sdb1                      lvm2 [1.00 GiB]
	  Total: 2 [<20.00 GiB] / in use: 1 [<19.00 GiB] / in no VG: 1 [1.00 GiB]

pvs和pvscan命令查看到的信息都差不多,总量和剩余大小什么的。但是pvscan还统计了一下总的pv情况
小区别是,pvs 命令可以指定想要查看的物理分区对应的pv,pvscan 命令则是只能扫描系统中所有pv,这也是所有“**scan”和“**s”命令的相同特性,后面不在赘述

这些查看命令中信息最详细的是“**display”,因为信息很详细,一般都是指定某个详细的分区来使用。使用pvdisplay查看刚新建的分区

	[root@centos8-main ~]# pvdisplay /dev/sdb1
	  "/dev/sdb1" is a new physical volume of "1.00 GiB"
	  --- NEW Physical volume ---
	  PV Name               /dev/sdb1
	  VG Name               
	  PV Size               1.00 GiB
	  Allocatable           NO
	  PE Size               0   
	  Total PE              0
	  Free PE               0
	  Allocated PE          0
	  PV UUID               wqG9w5-PabO-CKZr-wYXf-PLZP-7u8z-NGMbyI

可以显示新获得的UUID呦~~~

删除PV很简单,使用:“pvremove [PV设备文件]”即可

	[root@centos8-main ~]# pvcreate /dev/nvme0n1 
	  Physical volume "/dev/nvme0n1" successfully created.
	[root@centos8-main ~]# pvremove /dev/nvme0n1 
	  Labels on physical volume "/dev/nvme0n1" successfully wiped.

第二步,创建VG与删除VG

创建VG与删除VG
使用“vgcreate“命令创建vg,-s 参数可以指定PE的大小
vgcreate 常用参数:
-s:指定卷组的PE大小,单位为MB,默认为4MB
-p:指定卷组最大可以包含的物理卷数量
-l:指定卷组上最大可以创建的逻辑卷数量

创建VG

	[root@centos8-main ~]# vgcreate shinya_vg /dev/sdb1 
	  Volume group "shinya_vg" successfully created

查看vg

	[root@centos8-main ~]# vgscan
	  Found volume group "shinya_vg" using metadata type lvm2
	  Found volume group "cl_initialvm" using metadata type lvm2
	[root@centos8-main ~]# vgs
	  VG           #PV #LV #SN Attr   VSize    VFree   
	  cl_initialvm   1   2   0 wz--n-  <19.00g       0 
	  shinya_vg      1   0   0 wz--n- 1020.00m 1020.00m

同样,使用vgdisplay查看vg

	[root@centos8-main ~]# vgdisplay shinya_vg 
	  --- Volume group ---
	  VG Name               shinya_vg
	  System ID             
	  Format                lvm2
	  Metadata Areas        1
	  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                1
	  Act PV                1
	  VG Size               1020.00 MiB
	  PE Size               4.00 MiB
	  Total PE              255
	  Alloc PE / Size       0 / 0   
	  Free  PE / Size       255 / 1020.00 MiB
	  VG UUID               UpfqWi-c22E-R2ZI-hoL0-QOq7-bii2-22BGuf

vgdisplay 命令可以查看VG的详细信息,里面可以看到这个VG的PE单个大小和PE使用量(alloc:分配),以及VG的UUID(这里的UUID可就是VG的了)
这里有一点。如果存储的都是大文件,单个PE尽量大一些,读取数据时是以PE为单位,PE大,数量少,读取速度快,但是会不容易调配空间

这里可以看到默认的PE大小是4MB,现在删除这个VG,然后重新创建一个VG,指定PE大小为1MB
删除VG同样简单,使用:“vgremove [VG名称]”即可

	[root@centos8-main ~]# vgremove shinya_vg 
	  Volume group "shinya_vg" successfully removed
	
	[root@centos8-main ~]# vgcreate shinya_vg /dev/sdb1 -s 1
	  Volume group "shinya_vg" successfully created
	[root@centos8-main ~]# vgdisplay shinya_vg 
	……………………
	  VG Size               1023.00 MiB
	  PE Size               1.00 MiB
	  Total PE              1023
	  Alloc PE / Size       0 / 0   
	  Free  PE / Size       1023 / 1023.00 MiB
	  VG UUID               7kUvxe-705E-X8pM-ReWn-L5im-pxOF-8XVj4j

可以看到PE size为1MB,完成~

第三步,创建LV与删除LV

创建LV与删除LV
使用lvcreat 命令创建逻辑卷
格式:lvcreate [参数] [卷组名]
常用参数:
-n/--name:指定逻辑卷的名称
-L:指定逻辑卷的大小,使用存储单位为计量单位,kKmMgMtT字节
-l:指定逻辑卷的大小,使用LE个数作为计量单位

创建两个100MB的LV。这里指定LE为100个,对应上面创建的1MB每个的PE,则会创建一个大小为100MB的LV

	[root@centos8-main ~]# lvcreate -L 100m shinya_vg 
	  Logical volume "lvol0" created.
	[root@centos8-main ~]# lvcreate -l 100 shinya_vg 
	  Logical volume "lvol1" created.

然后查看一下

	[root@centos8-main ~]# lvs shinya_vg
	  LV    VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
	  lvol0 shinya_vg -wi-a----- 100.00m                                                    
	  lvol1 shinya_vg -wi-a----- 100.00m         

两个注意的地方。1.如果不指定LV的名称将会默认自动命名,命名格式为:“lvol[序号]” 2.lvs命令需要制定卷组名来查看对应LV,无法指定单个LV

再来创建两个LV,这次指定LV名称,并用-l参数,百分比的方式指定LV的大小

	[root@centos8-main ~]# vgs shinya_vg
	  VG           #PV #LV #SN Attr   VSize    VFree  
	shinya_vg      1   2   0 wz--n- 1023.00m 823.00m
	[root@centos8-main ~]# lvcreate -n shinya_lv1 -l 20%VG shinya_vg
	  Logical volume "shinya_lv1" created.
	[root@centos8-main ~]# vgs shinya_vg 
	  VG        #PV #LV #SN Attr   VSize    VFree  
	  shinya_vg   1   3   0 wz--n- 1023.00m 619.00m

20%VG表示指定LV大小为所选VG当前总容量的20%,那么算一下,1023*0.2=204.6 。VG减少了204MB,刚好对应这个数字
再来

	[root@centos8-main ~]# lvcreate -n shinya_lv2 -l 20%FREE shinya_vg
	  Logical volume "shinya_lv2" created.
	[root@centos8-main ~]# vgs shinya_vg 
	  VG        #PV #LV #SN Attr   VSize    VFree  
	  shinya_vg   1   4   0 wz--n- 1023.00m 496.00m

20%FREE表示当前VG剩余容量的20%作为LV容量。再来算一下,刚才VG剩了619MB,那么,619*0.2=123.8 。VG减少了123MB,对应~
而且,验证了这个百分比最后是要舍去小数点作为最后计算结果的。

最后验证一下刚才算的对不对

	[root@centos8-main ~]# lvs shinya_vg
	  LV         VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
	  lvol0      shinya_vg -wi-a----- 100.00m                                                    
	  lvol1      shinya_vg -wi-a----- 100.00m                                                    
	  shinya_lv1 shinya_vg -wi-a----- 204.00m                                                    
	  shinya_lv2 shinya_vg -wi-a----- 123.00m     

204MB,123MB,正确

然后删除两个自动命名的LV。删除LV很简单,使用:“lvremove [LV设备文件]”即可

	[root@centos8-main ~]#  lvremove /dev/shinya_vg/lvol{0,1}
	Do you really want to remove active logical volume shinya_vg/lvol0? [y/n]: y
	  Logical volume "lvol0" successfully removed
	Do you really want to remove active logical volume shinya_vg/lvol1? [y/n]: y
	  Logical volume "lvol1" successfully removed

第四步,格式化,挂载LV

上面的操作,一步一步,先后有了PV,VG,LV。最后,就要把创建好的LV格式化然后挂载到系统上使用
其他都好说,但有一个要明确,就是LV设备文件的位置

有关LV的设备文件
LV的设备文件(第一组)存放在:“/dev/[卷组名]/[LV名]”
但是查看一下这些文件的详细信息就可以发现另一件事

	[root@centos8-main ~]# ll /dev/shinya_vg/
	total 0
	lrwxrwxrwx. 1 root root 7 Jul  8 14:28 shinya_lv1 -> ../dm-4
	lrwxrwxrwx. 1 root root 7 Jul  8 14:29 shinya_lv2 -> ../dm-5

这些文件全部是软连接,链接到“/dev/dm-*”
而且LV还不止是这一组设备文件,还有另一组设备文件,也是链接到“/dev/dm-*”,存放在:“/dev/mapper/”目录中

	[root@centos8-main ~]# ll /dev/mapper/
	total 0
	lrwxrwxrwx. 1 root root       7 Jul  7 23:16 cl_initialvm-root -> ../dm-0
	lrwxrwxrwx. 1 root root       7 Jul  7 23:16 cl_initialvm-swap -> ../dm-1
	crw-------. 1 root root 10, 236 Jul  7 23:16 control
	lrwxrwxrwx. 1 root root       7 Jul  8 14:28 shinya_vg-shinya_lv1 -> ../dm-4
	lrwxrwxrwx. 1 root root       7 Jul  8 14:29 shinya_vg-shinya_lv2 -> ../dm-5

其命名格式为:“[卷组名]-[LV名]”

这是Linux中的“设备映射”机制
1.两组文件都映射到“/dev/dm-*”。这个“dm-*”文件其实是“device mapper”的缩写,即“设备映射”。它是从Linux2.6内核以来提供的一种从逻辑设备到物理设备的映射机制。使用户可以通过逻辑卷管理器方便的对存储资源管理,它是一个提供给用户的接口
2.“/dev/[卷组名]/[LV名]”。从这组文件的命名规则不难看出,这是一种易于用户阅读和识别的命名和文件存放规则,这也是LVM提供的,便于用户理解和上手,但是Linux中很多地方并不会使用这组文件来标识和挂载文件系统以及目录
3.Linux中常用的是“/dev/mapper/[卷组名]-[LV名]”,这一组链接文件。可以验证一下,查看一下使用默认分区时的根分区挂载情况

	[root@centos8-main ~]# df -Th /
	Filesystem                    Type  Size  Used Avail Use% Mounted on
	/dev/mapper/cl_initialvm-root xfs    17G  2.3G   15G  14% /

用的就是这组文件。……某种意义上这是一种…老规范

其实两组链接文件挂载时都可以用,没什么差别。而且,挂载逻辑卷不需要使用逻辑卷的UUID挂载,因为逻辑卷并不像硬盘一样,名字什么的硬盘换个插槽换个顺序就会改变。卷组和逻辑卷的命名由于是软件兼容层记录,所以不会改变,逻辑卷只要保证其底层的物理卷挂载信息不变即可保证自身不受影响,所以,物理盘挂载需要指定UUID,LVM并不需要

格式化与挂载LV
正文开始。开始格式化和挂载两个LV。分别格式化为ext4和xfs文件系统

	[root@centos8-main ~]# mkfs.ext4 /dev/shinya_vg/shinya_lv1
	[root@centos8-main ~]# mkfs.xfs /dev/shinya_vg/shinya_lv2

然后新建两个目录挂载LV

	[root@centos8-main ~]# mkdir /data{1,2}
	[root@centos8-main ~]# vim /etc/fstab 
	/dev/shinya_vg/shinya_lv1 /data1 ext4 defaults 0 0 
	/dev/shinya_vg/shinya_lv2 /data2 xfs defaults 0 0 
	[root@centos8-main ~]# mount -a
	[root@centos8-main ~]# df -Th /data{1,2}
	Filesystem                       Type  Size  Used Avail Use% Mounted on
	/dev/mapper/shinya_vg-shinya_lv1 ext4  194M  1.8M  178M   1% /data1
	/dev/mapper/shinya_vg-shinya_lv2 xfs   118M  7.3M  111M   7% /data2

好了~就这样,LV就做完了

以上,走了一整个LVM的创建使用流程了。很简单~~~
接下来就是LVM的管理了

第五步,LV管理,LV的扩容与缩减,文件系统的扩容与缩减

现在对LV进行扩容。
查看LV的大小以及VG的剩余容量

	[root@centos8-main ~]# lvs shinya_vg
	  LV         VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
	  shinya_lv1 shinya_vg -wi-ao---- 204.00m                                                    
	  shinya_lv2 shinya_vg -wi-ao---- 123.00m          
	[root@centos8-main ~]# vgs shinya_vg 
	  VG        #PV #LV #SN Attr   VSize    VFree  
	  shinya_vg   1   2   0 wz--n- 1023.00m 696.00m
使用lvextend 命令对LV进行扩容
lvextend 参数
-L:指定扩展大小,使用存储单位为计量单位,kKmMgMtT字节。直接加大小表示扩展到这个大小的LV,使用“+”跟大小表示新加这个大小的LV
-l:指定扩展大小,使用LE个数作为计量单位,直接加数字表示扩展至这个数量的LE,使用“+”跟数量表示新加多少数量的LE
-r:在调整LV大小时自动调整文件系统大小
-f:不显示提示信息
同样的,-l 参数也可以使用 *%VG和*%FREE
先将两个LV扩容100MB,用最简单的指定“新增多少”

	[root@centos8-main ~]# lvextend -L +100MB /dev/shinya_vg/shinya_lv1
	  Size of logical volume shinya_vg/shinya_lv1 changed from 204.00 MiB (204 extents) to 304.00 MiB (304 extents).
	  Logical volume shinya_vg/shinya_lv1 successfully resized.
	[root@centos8-main ~]# lvextend -l +100 /dev/shinya_vg/shinya_lv2 
	  Size of logical volume shinya_vg/shinya_lv2 changed from 123.00 MiB (123 extents) to 223.00 MiB (223 extents).
	  Logical volume shinya_vg/shinya_lv2 successfully resized.

再将LV1扩展到400MB,指定“扩展到多少”

	[root@centos8-main ~]# lvextend -l 400 /dev/shinya_vg/shinya_lv1
	  Size of logical volume shinya_vg/shinya_lv1 changed from 304.00 MiB (304 extents) to 400.00 MiB (400 extents).
	  Logical volume shinya_vg/shinya_lv1 successfully resized.

再来,给LV2新增VG容量的百分之15

	[root@centos8-main ~]# lvextend -l +15%VG /dev/shinya_vg/shinya_lv2
	  Size of logical volume shinya_vg/shinya_lv2 changed from 223.00 MiB (223 extents) to 377.00 MiB (377 extents).
	  Logical volume shinya_vg/shinya_lv2 successfully resized.

15%算一下,1023*0.15=153.45,新增了377-223=154个LE,对应
给LV1新增VG剩余容量的50%

	[root@centos8-main ~]# lvextend -l +50%FREE /dev/shinya_vg/shinya_lv1
	  Size of logical volume shinya_vg/shinya_lv1 changed from 400.00 MiB (400 extents) to 523.00 MiB (523 extents).
	  Logical volume shinya_vg/shinya_lv1 successfully resized.

刚才VG剩余了:1023-400-377=246个LE,50%即为123个,对应

但是呢,现在查看文件系统的挂载情况

	[root@centos8-main ~]# df -Th /data{1,2}
	Filesystem                       Type  Size  Used Avail Use% Mounted on
	/dev/mapper/shinya_vg-shinya_lv1 ext4  194M  1.8M  178M   1% /data1
	/dev/mapper/shinya_vg-shinya_lv2 xfs   118M  7.3M  111M   7% /data2

可以看到,虽然LV扩大了,但是文件系统没有扩大~
这个也很好理解,硬盘突然变大了,但是文件系统不会变大
硬盘大小是存储的空间,文件系统是组织文件的方式。类比一下,扩展LV就相当于将原本逻辑卷这个房子的“墙”往后推了,房子空间变大了,但是新的空间还没有装修,摆放家具,所以还不能使用。
所以现在要做的就是,扩展文件系统,把新的“毛坯房”装修起来
注意点:xfs文件系统只支持扩大,不支持减小,ext2,3,4都支持扩大和缩小

关于LV扩容时文件系统的扩容
扩展ext文件系统使用resize2fs 命令,扩展xfs文件系统使用xfs_growfs 命令。两者基本使用方法相似,resize2fs [设备文件] [扩展大小],xfs_growfs [设备文件/挂载点] [扩展大小]。其中扩展大小可以不指定,默认扩展至当前设备允许的最大空间
现在来扩展文件系统

	[root@centos8-main ~]# resize2fs /dev/shinya_vg/shinya_lv1
	[root@centos8-main ~]# xfs_growfs /dev/shinya_vg/shinya_lv2
	[root@centos8-main ~]# df -Th /data{1,2}
	Filesystem                       Type  Size  Used Avail Use% Mounted on
	/dev/mapper/shinya_vg-shinya_lv1 ext4  503M  2.3M  474M   1% /data1
	/dev/mapper/shinya_vg-shinya_lv2 xfs   372M  9.5M  363M   3% /data2

这样就好了~

这里lvextend还提供了-r参数。这个参数可以直接在扩展LV时扩展文件系统
为了实验,先还原到扩展LV一开始的状态,LV还原到204MB,123MB,然后按照之前的格式化

	[root@centos8-main ~]# df -Th /data{1,2}
	Filesystem                       Type  Size  Used Avail Use% Mounted on
	/dev/mapper/shinya_vg-shinya_lv1 ext4  194M  1.8M  179M   1% /data1
	/dev/mapper/shinya_vg-shinya_lv2 xfs   118M  7.3M  111M   7% /data2
	[root@centos8-main ~]# lvs shinya_vg
	  LV         VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
	  shinya_lv1 shinya_vg -wi-ao---- 204.00m                                                    
	  shinya_lv2 shinya_vg -wi-ao---- 123.00m  

然后,都扩展LV到400MB的大小,加上-r参数

	[root@centos8-main ~]# lvextend -r -L 400MB /dev/shinya_vg/shinya_lv1
	  Size of logical volume shinya_vg/shinya_lv1 changed from 204.00 MiB (204 extents) to 400.00 MiB (400 extents).
	  Logical volume shinya_vg/shinya_lv1 successfully resized.
	resize2fs 1.45.6 (20-Mar-2020)
	Filesystem at /dev/mapper/shinya_vg-shinya_lv1 is mounted on /data1; on-line resizing required
	old_desc_blocks = 2, new_desc_blocks = 4
	The filesystem on /dev/mapper/shinya_vg-shinya_lv1 is now 409600 (1k) blocks long.
	
	[root@centos8-main ~]# lvextend -r -L 400MB /dev/shinya_vg/shinya_lv2
	  Size of logical volume shinya_vg/shinya_lv2 changed from 123.00 MiB (123 extents) to 400.00 MiB (400 extents).
	  Logical volume shinya_vg/shinya_lv2 successfully resized.
	meta-data=/dev/mapper/shinya_vg-shinya_lv2 isize=512    agcount=4, agsize=7872 blks
	         =                       sectsz=512   attr=2, projid32bit=1
	         =                       crc=1        finobt=1, sparse=1, rmapbt=0
	         =                       reflink=1
	data     =                       bsize=4096   blocks=31488, imaxpct=25
	         =                       sunit=0      swidth=0 blks
	naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
	log      =internal log           bsize=4096   blocks=1368, version=2
	         =                       sectsz=512   sunit=0 blks, lazy-count=1
	realtime =none                   extsz=4096   blocks=0, rtextents=0
	data blocks changed from 31488 to 102400

这里把输出都复制下来了。可以看出,其实-r参数就是自动调用了resize2fs和xfs_growfs

关于LV上EXT4文件系统的安全缩减
总之,不可以随便缩减,务必按照规范进行缩减!!!!
下来讲安全缩减的流程。举例使用LV1,ext4文件系统,目前状况为LV和文件系统大小200MB,填充128MB左右的文件

	[root@centos8-main ~]# df -Th /data1
	Filesystem                       Type  Size  Used Avail Use% Mounted on
	/dev/mapper/shinya_vg-shinya_lv1 ext4  190M  128M   49M  73% /data1

1.首先解除挂载,检查当前文件系统的完整性

	[root@centos8-main ~]# umount -v /data1
	[root@centos8-main ~]# e2fsck -ff /dev/shinya_vg/shinya_lv1
	e2fsck 1.45.6 (20-Mar-2020)
	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/shinya_vg/shinya_lv1: 4943/51200 files (0.1% non-contiguous), 140891/204800 blocks

必须要这5项都没有报错才可以!

2.重新确定文件系统大小。然后检查文件系统完整性
新文件系统大小为150MB。他要是报错不让低于当前文件系统大小就加 -f 强制执行

	[root@centos8-main ~]# resize2fs -f /dev/shinya_vg/shinya_lv1 150M

检查文件系统

	[root@centos8-main ~]# e2fsck -ff /dev/shinya_vg/shinya_lv1

依然检查5项

3.重新确定LV的大小。检查文件系统完整性
直接定位到150MB。
这里直接用“lvresize”,他就是lvextend和lvreduce的结合体,参数也一样,但LVM不推荐用lvresize,因为怕分不清是缩减还是扩大,损坏文件系统

	[root@centos8-main ~]# lvresize -l 200 /dev/shinya_vg/shinya_lv1 
	  New size (200 extents) matches existing size (200 extents).
	[root@centos8-main ~]# e2fsck -ff /dev/shinya_vg/shinya_lv1

4.挂回去,正常,则成功~~~

	[root@centos8-main ~]# mount /dev/shinya_vg/shinya_lv1 /data1
	[root@centos8-main ~]# df -Th /data1
	Filesystem                       Type  Size  Used Avail Use% Mounted on
	/dev/mapper/shinya_vg-shinya_lv1 ext4  142M  128M  3.5M  98% /data1

lvreduce里的-r参数也可以的,直接缩减LV和文件系统,但是不推荐用,他无非是把上面的操作整合了而且不检查文件系统。推荐这样一步一步来

关于LV上XFS文件系统的安全缩减
然后,xfs文件系统不支持直接缩减文件系统~~~xfs不想被这样操作~
但是xfs文件系统支持直接备份整个文件系统,只要将其备份文件保存,即可将其原封不动还原回任何一个可以承载备份的xfs文件系统中(原文件系统里装了100MB文件。只要还原到大于100MB剩余空间的xfs文件系统中即可)
来,用LV2测试。现在LV2状态为,400MB建立xfs文件系统,填充接近140MB文件

	[root@centos8-main ~]# df -Th /data2
	Filesystem                       Type  Size  Used Avail Use% Mounted on
	/dev/mapper/shinya_vg-shinya_lv2 xfs   395M  158M  238M  40% /data2

1.备份前先检查xfs文件系统。
检查需要先解除挂载……那就先解除再来

	[root@centos8-main ~]# xfs_repair -n /dev/shinya_vg/shinya_lv2

会列出来7段检查结果,有问题会报出来。
如果有问题可以使用xfs_repair 不加参数尝试自动修复

2.备份xfs文件系统
要先安装xfs备份工具xfsdump

	[root@centos8-main ~]# yum install xfsdump

然后备份。备份的过程会交互式的问两个问题,第一个是会话标签,描述一下这次的备份。第二个是设备标签,就是描述一下设备。如果想回避交互式,可以直接在shell中指定好这两个东西。-L,指定会话标签,-M指定设备标签。以及需要使用-f 指定输出的备份文件
还要注意……xfs备份必须在文件系统已挂载的情况下进行……所以先把他挂载上再进行吧……

	[root@centos8-main ~]# xfsdump -L "first backup" -M "LV2" -f /root/xfs_backup /dev/shinya_vg/shinya_lv2
	……
	xfsdump: Dump Summary:
	xfsdump:   stream 0 /root/xfs_backup OK (success)
	xfsdump: Dump Status: SUCCESS

备份可以用xfsdump -I 查看
查看一下备份文件

	[root@centos8-main ~]# ll -h /root/xfs_backup 
	-rw-r--r--. 1 root root 127M Jul 14 17:05 /root/xfs_backup

文件127MB,填充了130多MB的文件,相当于文件压缩了,但是大小很接近

3.直接缩减LV到需要的大小,重新建立新的XFS文件系统
这里就根本不需要怜香惜玉,LV直接缩减到想要的大小。因为已经备份了文件系统,不需要担心文件丢失的问题。缩减LV到200MB,然后格式化为XFS文件系统

	[root@centos8-main ~]# lvreduce -L 200MB /dev/shinya_vg/shinya_lv2
	[root@centos8-main ~]# mkfs.xfs -f /dev/shinya_vg/shinya_lv2

4.还原XFS备份文件,并检查XFS文件系统
xfsdump备份的文件只能由xfsrestore来解读和恢复。使用xfsrestore来恢复,-f 指定备份文件。然后后面指定恢复到的目录……所以xfsdump其实就像压缩归档一样,这里做的和把全文件系统的内容压缩归档备份,再解压还原回来差不多。只是xfsdump专用于XFS文件系统,更快,而且压缩率高,更有完备的管理
以及……必须挂载好文件系统才能恢复……备份和恢复都必须在挂载状态完成

	[root@centos8-main ~]# xfsrestore -f /root/xfs_backup /data2

这样就完成了……检查一下文件系统(其实必须性不大),先解除挂载

	[root@centos8-main ~]# xfs_repair -n /dev/shinya_vg/shinya_lv2

ps:XFS是根据UUID来识别文件系统的,所以,不可以备份两个UUID相同的XFS文件系统

第六步,卷组的扩容与缩小

想象一种情况:硬盘太慢了,是个机械硬盘,想升级存储,换个空间大,性能好的固态硬盘。或者A硬盘太老了,服役时间太久了,为了安全考虑,得把A硬盘换下来,换B硬盘接替A硬盘。那我就得把原来的硬盘换下来,数据得放到新的硬盘里。这岂不是非常麻烦!而且考虑到操作对象是服务器,敢把存储拔掉?????业务全停!
这就要讲到LVM的一大究极特性:在线扩容与更换存储
嘛,这个一开始就讲了。LVM能实现这一特性的原因其实就是他做了存储的逻辑分块。在LVM眼中,同样大小的PE,在A硬盘是一个PE,在B硬盘也是一个PE
以及,卷组操作还有一个简单的问题解决,上面扩展LV时需要从VG里面取LE,那如果卷组没有容量了就没法扩展逻辑卷了,所以要扩展卷组

使用vgextend扩展卷组(卷组扩展)
其实没什么常用参数……-f 可以强制执行,用于新加一个已经有文件系统的分区的时候
命令格式:vgextend [VG名] [PV设备文件]
现在的环境是。两个LV各500MB,并且都在某个容量时创建了文件系统,都挂载了,都有数据存储。所以卷组没有多少剩余容量了呦~

	[root@centos8-main ~]# lvs shinya_vg
	  LV         VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
	  shinya_lv1 shinya_vg -wi-ao---- 500.00m                                                    
	  shinya_lv2 shinya_vg -wi-ao---- 500.00m                                                    
	[root@centos8-main ~]# vgs shinya_vg
	  VG        #PV #LV #SN Attr   VSize    VFree 
	  shinya_vg   1   2   0 wz--n- 1023.00m 23.00m
	[root@centos8-main ~]# df -Th /data{1,2}
	Filesystem                       Type  Size  Used Avail Use% Mounted on
	/dev/mapper/shinya_vg-shinya_lv1 ext4  142M  139M     0 100% /data1
	/dev/mapper/shinya_vg-shinya_lv2 xfs   195M  146M   49M  75% /data2

这个时候不管LV,反正卷组没有空间了,需要扩展卷组,那么就要新加入PV给卷组
既然要新加存储……就用NVME硬盘好了。将NVME盘分出两个2GB的分区来作为新加PV

	[root@centos8-main ~]# lsblk /dev/nvme0n1
	NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
	nvme0n1     259:0    0   5G  0 disk 
	├─nvme0n1p1 259:3    0   2G  0 part 
	└─nvme0n1p2 259:4    0   2G  0 part 

然后,用vgextend把他们加进去

	[root@centos8-main ~]# vgextend shinya_vg /dev/nvme0n1p1
	  Physical volume "/dev/nvme0n1p1" successfully created.
	  Volume group "shinya_vg" successfully extended

诶!停!有没有发现我没按规矩来!我把一个还没有划分到PV里面的分区直接加到VG里面了
是这样的,其实创建PV这一步可以省略……输出都复制过来了,可以看出,如果这样直接加,那么LVM会自动先把分区/硬盘划分到PV然后再加入VG
硬来~也是可以的~
然后继续加,这回按规矩来

	[root@centos8-main ~]# pvcreate /dev/nvme0n1p2
	  Physical volume "/dev/nvme0n1p2" successfully created.
	[root@centos8-main ~]# vgextend shinya_vg /dev/nvme0n1p2
	  Volume group "shinya_vg" successfully extended

输出和直接硬来完全一致
最后查看一下现在的卷组

	[root@centos8-main ~]# vgs shinya_vg 
	  VG        #PV #LV #SN Attr   VSize  VFree
	  shinya_vg   3   2   0 wz--n- <5.00g 4.02g

大小已经扩展了

在线转移存储,卸载旧存储设备(VG缩减)
然后就是上面说的,现在就把sdb这个硬盘中创建逻辑卷的部分在线转移到新的NVME高速硬盘上
先看一下目前VG中包含的PV

	[root@centos8-main ~]# pvs
	  PV             VG           Fmt  Attr PSize    PFree 
	  /dev/nvme0n1p1 shinya_vg    lvm2 a--    <2.00g <2.00g
	  /dev/nvme0n1p2 shinya_vg    lvm2 a--    <2.00g <2.00g
	  /dev/sdb1      shinya_vg    lvm2 a--  1023.00m 23.00m

创建的VG中包含三个PV,旧数据在 /dev/sdb1这个PV中
使用“pvmove”命令转移PV中的PE到另一个PV中
这里特别要说,是转移PE,PE/LE是LVM识别存储块的最小单位,正是因为这样,才能实现在线数据迁移
语法格式:pvmove [源PV] [目标PV]
那么开始转移

	[root@centos8-main ~]# pvmove /dev/sdb1 

我这里没有指定目标PV~~~猜猜看他转移到那个PV里面去了呢~~~

	[root@centos8-main ~]# pvs
	  PV             VG           Fmt  Attr PSize    PFree   
	  /dev/nvme0n1p1 shinya_vg    lvm2 a--    <2.00g    1.02g
	  /dev/nvme0n1p2 shinya_vg    lvm2 a--    <2.00g   <2.00g
	  /dev/sdb1      shinya_vg    lvm2 a--  1023.00m 1023.00m

转移到了NVME的第一个分区中……根据反复试验,如果不指定目标PV,他会从pvs这个列表中从上往下找到第一个合适的(剩余空间足够)的PV作为目标,然后如果用户再次对这个目标(这里是nvme0n1p1)转移,那么他会转移回原来的PV(这里是sdb1)……
好吧不玩了,然后把sdb1分区从VG移除,使用vgreduce命令,没什么常用参数……命令格式:vgreduce [VG名] [PV设备文件]

	[root@centos8-main ~]# vgreduce shinya_vg /dev/sdb1 

这里注意,如果这个PV上有LV,或者说这个PV上有PE属于某个LV,会报错,像下面这样

	Physical volume "/dev/sdb1" still in use

LVM还是很聪明的,不会让正在使用的PV被移除(-f 可以强制)
之后把sdb这个旧硬盘拔出来就好了
这样就把原来旧存储中的内容转移到了新的存储中,而且转移过程中是随时都可以访问LV中数据的,服务器业务不会中断,也就是“在线数据迁移”
其中要注意的是,转移过程的快慢取决于存储器读取的快慢,需要转移的数据量,以及当前服务器访问量,虽然可以实现在线数据迁移,但是会影响到当前服务的相应速度,所以这项操作最好在夜深人静……没人访问服务器的时候进行

LVM快照

首先声明,LVM快照最主要的功能不是为了还原逻辑卷,更不是为了备份逻辑卷,这些磁盘上的可靠性和速度上的保证都交给RAID。LVM快照是为了解决LVM备份时的数据一致性问题,这就赋予逻辑卷了另一个很大的优点:精确实时备份

什么是快照
一切开始之前要先明白什么是快照。大部分人首先接触的应该都是桌面版虚拟机系统中的“快照”,用他来备份虚拟机状态,以防初学者一下子玩崩,这一点用到了快照的还原功能。
但是有一个事情,很诡异的事情。每次拍摄快照的时候基本都是瞬间完成的!想想,我的一个虚拟机可能磁盘占用几十个GB,一瞬间就能备份完成?这显然是不可能的
所以,什么是快照?制作快照的时候发生了什么?

要清楚:快照是数据存储的某一时刻的状态记录;备份则是数据存储的某一个时刻的副本。这是截然不同的。
首先,在介质上最简单的数据记录方式应该是这样的。假如说记录数据:“ABCD”

当然,内存或许是这样,硬盘以及外部存储就不会这样的。因为会进行分区然后格式化上一层文件系统,一般不可能直接地址映射数据位置。一般是这样的

这是一个举例,每个逻辑地址单元对应两个物理地址单元。再说具体一点,文件系统的最小单位,Windows上叫做“簇”,Linux上叫做“块(block)”,这个就是逻辑单元,他对应多少的物理地址单元呢,以前的硬盘物理扇区为512KB,现在很多都是4KB,那按现在的4K磁盘来说,一个簇/块大小为8KB,那就是一个逻辑单元对应两个物理单元。

这就是文件系统,他会在最简单的:地址->数据 这种简单映射上再加一层。
然后更复杂的,举个例子就是虚拟机的磁盘文件,虚拟机上硬盘的文件系统以为自己映射的是“物理地址”,实际上可能是物理机文件系统的逻辑地址,甚至虚拟化一般为了安全里面还能再嵌套一层地址映射,映射虚拟磁盘的地址,隔离虚拟磁盘和物理磁盘………………套娃无极限~~~~

然后,快照保存的是什么呢???~~~
就是上图的这一部分(下图)。逻辑地址->物理地址 的映射关系。也可以叫“元数据(matadata)”

现在来举例,将“ABCD”修改为“AACD”。
没有快照的话,是这样的

有快照存在的话,是这样的

先来读数据,按照逻辑地址读,数据为“AACD”,按照快照地址读,数据为“ABCD”。于是,快照就能还原拍摄时的数据
再然后,为什么地址和数据会这样排列,为什么逻辑地址“0”跑到后面去了
这是因为,拍摄快照的时候,会寻找并锁定有对应数据的逻辑地址,使其对应的物理地址不可被写入数据(这里就是物理地址 “0-3”),之后如果要修改锁定的物理地址的数据,那么就会将被锁定的逻辑地址搬移原来的位置,放到物理地址可写入的地方做新的映射。这就是为什么这里的原逻辑地址“4”变成了“0”,而且根据这样的变化,其实存储器少了一个单元的逻辑地址~

但是大多数的理解其实不是这样,大多数的理解是名为“写时复制(CoW)(Copy on Write)”,就是在你修改源数据的时候,进行了将源数据拷贝一份到“快照中”的操作。其实这种理解好像更加好接受哈…………

最后,再讲数据备份,他在内存中是这样的

和快照就截然不同对吧

快照相对于备份,其优点有
1.速度快,这个就能回避很多备份时间带来的问题,比如就是时间一致性,下面就讲
2.占用空间小。快照文件一开始不占多少空间,只会根据原始数据的改变来填充

缺点为。
快照毕竟不是复制出另一份,如果不备份出来的话,原始数据损坏(磁盘损毁之类的问题)了快照也是读不出来的,也就无法回滚了

LVM快照
其实上面说的,快照的优点之一,可以回避备份时间带来的问题。如何解决时间一致性问题,就是LVM快照的作用了
先来说说什么是“时间一致性问题”

想这样一个环境,我要备份数据库,但是这个时候业务还在继续,从外面还在源源不断地对数据库进行操作,那我这个时候直接备份数据库可以吗?
假设现在是20:00,我启动了备份数据库的作业,预计30分钟可以完成。那么也就是说,我现在创建了一个20:00的数据库备份档,20:30成功生成。之后,我想回滚数据库到今天20:00的状态,就恢复这个备份档即可……………………是这样吗?????
不要忘了很重要的一点,我这半个小时在进行备份,外面在这半个小时也在进行数据库操作,业务没有停止!!!我20:30得到的备份档中有可能包含了,也有可能没包含,这30分钟内外界对数据库的任何读写操作…………那么,这个备份档就是个废物……毕竟都不能还原到某个时间的状态,这备份有啥子用处

这就是“时间一致性问题”

解决方案……
A:停业务。然后悠然的备份,等备份完成了再开业务。解决了时间一致性问题,但是…业务停了…一秒亏损几千万(笑)
B:快照

使用快照来解决时间一致性问题是一个很普遍的做法,除了LVM,很多文件系统和卷管理都是支持快照的
一般用快照解决的思路是,先拍摄快照,然后对着快照备份。按照上面的例子来讲,我拍摄20:00的快照,那么只要服务器不爆炸,我对着快照都是可以读取到20:00的数据库状态的。那么我直接对着快照进行备份即可,就可以完美的得到20:00的备份档了
但是,这里还有两个问题

1.快照虽然生成的很快,但是并不是一瞬间,这期间还是可能被外界的业务影响里面的数据
那么就要进行短时间的锁表操作即可。使用户短时间只能读取不能改写数据,这样子其实业务不会完全中断,只会有一小会的无法写数据,让前端给个抱歉的提示,让客户等一小会不就行了~
这个操作用脚本完成是很快的,所以完全可行,解决了问题~~
脚本:给所有的表写保护->拍摄快照->解除写保护

2.快照大小问题
逻辑卷的快照和逻辑卷是等同的,他们都有自己的空间大小!快照自己也是一个可以被挂载的逻辑卷!
这里就直接拿CoW的思路来想一下,如果业务进行的非常激烈,对数据库的改写异常的多,直接把快照给撑爆了该怎么办!
在这个问题里,LVM的快照就相当于是一个缓存。这个缓存是为了兜住备份时间内源数据发生的改写而生的,所以,“缓存”的大小要提前规划好,以一个预估值来设定,让他足以应对备份时间中的数据改写。说白了,就是能为备份拖住时间即可
之后,备份结束,直接删掉LVM快照~
用完就扔。所以这就是为什么之前说的,为什么LVM快照不用来做备份,首先,容量一个设的不好就会被撑爆,其次,备份完后他的生命周期也就结束了

LVM快照配置
注意两点即可:
1.LVM快照是对某个LV生成的
2.LVM快照会和被拍摄的LV共同占用上级VG的空间

LVM快照使用“lvcreate”命令创建,只是要用到“-s”参数,意为“snapshot”,表示创建的这个LV是一个LVM快照。以及命令后面不再是卷组名,而是指定对那个LV拍摄快照
命令格式:lvcreate -s [参数] [LV设备文件]
这里给两个LV都创建一个100MB的快照

	[root@centos8-main ~]# lvcreate -s -L 100MB -n "lv1_snapshot" /dev/mapper/shinya_vg-shinya_lv1
	[root@centos8-main ~]# lvcreate -s -L 100MB -n "lv2_snapshot" /dev/mapper/shinya_vg-shinya_lv2

这时查看LV

	[root@centos8-main ~]# lvs shinya_vg
	  LV                      VG              Attr            LSize      Pool   Origin          Data%   Meta%   Move  Log  Cpy%Sync  Convert
	  lv1_snapshot    shinya_vg   swi-a-s---    100.00m           shinya_lv1   0.01                                   
	  lv2_snapshot    shinya_vg   swi-a-s---    100.00m           shinya_lv2   0.02                                   
	  shinya_lv1        shinya_vg   owi-aos---   300.00m                                                        
	  shinya_lv2        shinya_vg   owi-aos---   300.00m     

能看到,多出来很多参数。这些都是用来给快照的。快照首先会显示他是数据那个LV的(origin)。以及快照卷已经被占用了多少,以给管理员示意,这个快照还有没有空间,防止写爆

快照既然是一个LV,那么他就可以被挂载,当做一个分区来使用……但是这不是管理员希望的啊!要是往快照里直接写入数据,定会破坏快照。所以挂载是需要注意的
一般,挂载快照要指定用只读的方式挂载。mount -o ro(read only)

	[root@centos8-main ~]# mkdir /lv_snapshot{1,2}
	[root@centos8-main ~]# mount -o ro /dev/shinya_vg/lv1_snapshot /lv_snapshot1
	[root@centos8-main ~]# mount -o ro /dev/shinya_vg/lv2_snapshot /lv_snapshot2
	mount: /lv_snapshot2: wrong fs type, bad option, bad superblock on /dev/mapper/shinya_vg-lv2_snapshot, missing codepage or helper program, or other error.

诶!出问题了!LV1挂上了,但是LV2报错了
因为,LV2是XFS文件系统。前面安全缩减XFS的那块说过,XFS是根据UUID来分辨文件系统的,快照和LV2原卷是一摸一样的,自然有相同的UUID,那么挂载就会报错。这里必须加上不检查UUID的挂载选项才能挂上LV2

	[root@centos8-main ~]# mount -o ro,nouuid /dev/shinya_vg/lv2_snapshot /lv_snapshot2
使用LVM快照回滚逻辑卷
当然,既然是快照,其实也是能回滚的
因为LVM快照也是一个逻辑卷,所以最简单的“回滚”方法就是直接将快照中的文件全部归档,然后重新格式化逻辑卷,再将压缩档释放

第一种方法,全盘归档
用LV1来举这个例子
先打包

	[root@centos8-main ~]# tar czvf lv1_backup.tar.gz /lv_snapshot1

重建逻辑卷文件系统

	[root@centos8-main ~]# umount -v /data1
	[root@centos8-main ~]# mkfs.ext4 /dev/shinya_vg/shinya_lv1
	[root@centos8-main ~]# mount /dev/shinya_vg/shinya_lv1 /data1

再解压包

	[root@centos8-main ~]# tar xzvf lv1_backup.tar.gz -C /data1

这种方法比较low,但是有效
注意的是,即使重新格式化逻辑卷,其快照卷也还是存在的(但是一般这样一遍下来快照绝对爆了,废掉)

第二种方法,合并快照卷和逻辑卷
这个是LVM自带的~就是用来回滚快照的,注意的是,快照回滚后会消失
用LV2来举例
首先先要卸载逻辑卷和快照卷

	[root@centos8-main ~]# umount -v /data2
	[root@centos8-main ~]# umount -v /lv_snapshot2 

然后执行回滚,使用“lvconvert --merge [快照卷设备文件]”

	[root@centos8-main ~]# lvconvert --merge /dev/shinya_vg/lv2_snapshot 
	  Merging of volume shinya_vg/lv2_snapshot started.
	  shinya_vg/shinya_lv2: Merged: 100.00%

之后,回滚完成,快照卷自动消失

使用LVM快照进行存储设备间在线数据迁移
前面用pvmove可以将一个物理卷上的所有PE都转移到另一个物理卷上
这其实是一种很有效但是粗暴的方法。某些情况,转移的目标不会是一整个物理卷,而是一个逻辑卷。如何将某个一逻辑卷转移到另一个物理卷上呢
其实pvmove就带了这个功能了~
第一种方法,使用pvmove完成单个逻辑卷的转移
命令格式:pvmove -n [逻辑卷设备文件] [原物理卷] [目标物理卷] 。说白了,-n 指定某个逻辑卷做一个子转移
转移之前,首先要知道逻辑卷是依附于那个物理设备的。这个需要在查看逻辑卷时加上一个输出选项即可
格式:lvs -o+devices 或者 vg -o+devices
先来查看一下

	[root@centos8-main ~]# lvs -o+devices shinya_vg
	  LV         VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices            
	  shinya_lv1 shinya_vg -wi-ao---- 300.00m                                                     /dev/nvme0n1p1(0)  
	  shinya_lv2 shinya_vg -wi-a----- 300.00m                                                     /dev/nvme0n1p1(500)

最后的“Devices”就注明了逻辑卷时依附于那个物理设备
现在来把LV1从NVME设备转移回之前的sdb1。注意一点,不管是pvmove转移整个物理卷,还是转移单个逻辑卷,转移和被转移的两个物理卷都必须在同一VG

	[root@centos8-main ~]# pvmove -n /dev/shinya_vg/shinya_lv1 /dev/nvme0n1p1 /dev/sdb1

然后再查看此时LV1的所属物理卷

	[root@centos8-main ~]# lvs -o+devices shinya_vg
	  LV         VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices            
	  shinya_lv1 shinya_vg -wi-ao---- 300.00m                                                     /dev/sdb1(0)       
	  shinya_lv2 shinya_vg -wi-a----- 300.00m                                                     /dev/nvme0n1p1(500)

转移了对吧~

第二种方法,使用LVM快照的镜像来做LV的数据迁移
牵扯到LVM快照,已经是LVM的高级应用了。这个的使用,其实我也不是特别清楚,资料也不太好找……
先来用LV2演示一遍。此时的LV2是在NVME设备上的,将它转移到sdb1上
使用LVM镜像转移LV要用到lvconvert。命令格式:lvconvert -m 1 [LV设备文件] [目标PV设备文件]

	[root@centos8-main ~]# lvconvert -m 1 /dev/shinya_vg/shinya_lv2 /dev/sdb1 

然后查看

	[root@centos8-main ~]# lvs -o+devices shinya_vg
	  LV         VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices                                      
	  shinya_lv1 shinya_vg -wi-ao---- 300.00m                                                     /dev/sdb1(0)                                 
	  shinya_lv2 shinya_vg rwi-a-r--- 300.00m             100.00                   
      shinya_lv2_rimage_0(0),shinya_lv2_rimage_1(0)

这个时候,表示做了一个LVM快照镜像在sdb1上,瞬间完成,不存在物理上的数据复制
然后,将原来物理卷上的LV数据清理掉即可,这就利用快照的原理将数据转移到另一个物理卷上了~
清楚原来逻辑卷的数据,命令格式:lvconvert -m 0 [LV设备文件] [原PV设备文件]

	[root@centos8-main ~]# lvconvert -m 0 /dev/shinya_vg/shinya_lv2 /dev/nvme0n1p1 

现在再查看

	[root@centos8-main ~]# lvs -o+devices shinya_vg
	  LV         VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices       
	  shinya_lv1 shinya_vg -wi-ao---- 300.00m                                                     /dev/sdb1(0)  
	  shinya_lv2 shinya_vg -wi-a----- 300.00m                                                     /dev/sdb1(301)

已经成功转移啦~~~~~~

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00