【linux系统命令⑤】、LVM逻辑卷管理

(由于以下内容纯经手打,有些过于白话,且省事尽量无配图,不明之处敬请留言!)


  • 需求场景
    linux一般磁盘划分的分区,无论是主分区还是扩展分区,都有很大的限制,特别是是文件系统空间的扩展性上,分区一旦创建并挂载使用,想要更改其大小,是非常不方便的,为什么?当然是局限于单个物理磁盘的空间大小咯,重要是,普通的文件系统是直接建立在物理磁盘柱面上的,如果后面有分区存在,我们就很难在扩容了,当然如果使用特殊的工具,如“diskgenius”工具,可以把后面分区压缩并向后移动;而如果分区后面有为分配空间,linux中我们也可以通过“fdisk”命令删除分区,然后新建大点的分区表;但是这种操作一是太麻烦二是有风险。
    怎么办?不要怕,逻辑卷帮助你!

简介、什么是lvm逻辑卷  

逻辑卷是使用逻辑卷组管理创建的虚拟磁盘设备,在linux操作系统中使用的是LVM(logical volume manager)逻辑卷管理;

事实上,逻辑卷是介于物理磁盘设备和文件系统的中间层,为什么这么说?我们跟着我的思路来看一下几个关于逻辑卷的基本概念:

  • 物理磁盘(physicaldisk),也就是硬盘,最底层的硬件存储单元。
  • 物理卷(physical volume,PV),可以认为是物理磁盘上创建的分区,但是这里和普通分区有点不一样,在物理磁盘管理方式中,如/dev/sdb1,我们是直接格式化成某种文件系统使用了,而这里我们要把物理磁盘分区更改为LVM分区,分区代码ID:8e(linux LVM)然后用pvcreate初始化为PV逻辑卷;
  • 卷组(volume group,VG),也就是PV的组合,一个虚拟磁盘,可以是单个物理磁盘上的若干PV组合,也可以是多个物理磁盘上的PV组合,这是LVM的特点,突破了单块磁盘空间的局限;
  • 逻辑卷(logic volume,LV),也就是从VG中划分出来的一块逻辑磁盘卷区;
  • PE(physicalextent),物理卷PV的基本单元,即PV是有一个个可被LVM寻址的PE单元组成,其大小可配置默认4MB,就像我们格式化普通分区创建文件系统时的分配单元大小一样;
  • LE(logicalextent),逻辑卷LV的基本单元,即组成LV并可被LVM寻址的基本单位,在同一个卷组中,LE的大小和PE的大小相同,并且一一对象,并可以让逻辑卷可以任意扩容;
思考·总结

融汇一下:先把物理磁盘分区初始化为PV,然后组合成一个虚拟磁盘VG,在之基础上,创建逻辑卷区,之后再创建文件系统挂载使用;

如此,VG相当于物理磁盘设备,而逻辑卷LV便相当于在物理磁盘上创建的一个分区,然后我们给之创建文件系统,挂载使用,所以说逻辑卷是介于物理磁盘设备和文件系统的中间层,我们姑且可以把它当作一个个分区看待即可;

第一节、简单创建与管理逻辑卷  

①、创建、删除物理卷PV:fdisk、pvcreate、pvremove、pvdisplay  

首先并不是所有系统都已经安装了lvm工具包,检查一下不就晓得了!

c[root@Moni ~]# rpm -qa | grep lvm
lvm2-libs-2.02.111-2.el6.x86_64
lvm2-2.02.111-2.el6.x86_64
mesa-private-llvm-3.4-3.el6.x86_64

下面我们开始创建物理卷:

首先使用“fdisk”分区工具,创建LVM分区,即更改其分区代码ID为:8e(linux LVM)

[root@Moni ~]# fdisk /dev/sdb
Command (m for help): n
Command action
 e extended
 p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-16384, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-16384, default 16384): +10G
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): p
Disk /dev/sdb: 17.2 GB, 17179869184 bytes 64 heads, 32 sectors/track, 16384 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xd6a54623
 Device Boot Start End Blocks Id System
/dev/sdb1 1 10241 10486768 8e Linux LVM 

然后使用PV工具pvcrate创建,初始化逻辑卷:

[root@Moni ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created
<--把sdb1-4分区转为PV物理卷-->
[root@Moni ~]# pvcreate /dev/sdb{1,2,3,4}
<--删除PV-->
[root@Moni ~]# pvremove /dev/sdb1
pvdisplay | grep "/dev/sdb1" <--检查是否删除成功-->
<--检查PV状态信息-->
[root@Moni ~]# pvcan
[root@Moni ~]# pvs
[root@Moni ~]# pvdisplay /dev/sdb1
<--检查物理卷的LVM元数据的一致性-->
[root@Moni ~]# pvck -v /dev/sdb1
<--禁止分配指定物理卷上的PE-->
[root@Moni ~]# pvchange -x n /dev/sdb1

②、创建、删除卷组VG:vgcreate、vgremove、vgdisplay  

把单个或多个PV,以PE为基础单元组合为一个完整的卷组,使用命令vgcreate;

[root@Moni ~]# vgcreate pvgroup /dev/sdb1
 Volume group "pvgroup" successfully created
<--查看vg信息-->
[root@Moni ~]# vgs
 VG #PV #LV #SN Attr VSize VFree 
 VolGroup 1 2 0 wz--n- 39.51g 0 
 pvgroup 1 0 0 wz--n- 10.00g 10.00g
[root@Moni ~]# vgscan 、 vgdisplay
<--更改vg名称-->
[root@Moni ~]#vgrename pvgroup vg1
<--删除vg-->
[root@Moni ~]# vgremove -f pvgroup
<--备份vg描述文件(默认在/etc/lvm/backup,也可以自定义)-->
[root@Moni ~]# vgcfgbackup pvgroup
<--恢复vg配置-->
[root@Moni ~]# vgcfgrestore pvgroup
<--从vg中移除pv/dev/sdb1-->
[root@Moni ~]# vgreduce pvgroup /dev/sdb1
Removed "/dev/sdd1" from volume group "vg0"
<--将/dev/sdb1添加到vg中-->
[root@Moni ~]# vgextend pvgroup /dev/sdb1
Volume group "pvgroup" successfully extended
<--将一个pv从一个vg中分裂出来挪动到其他vg中-->
[root@Moni ~]# vgsplit pvgroup vg0 /dev/sdb1
Existing volume group "vg0" successfully split from "pvgroup"
<--更改物理卷的卷组ID-->
[root@Moni ~]# vgchgid /dev/sdb1
<--打开或关闭卷组-->
[root@Moni ~]# vgchage -a y/n pvgroup
<--合并卷组-->
[root@Moni ~]# vgmerge -v pvgroup vg0

vgcreate、-l:卷组上允许创建的最大逻辑卷数; -p:卷组中允许添加的最大物理卷数; -s:卷组上的物理卷的PE大小。

③、创建、删除逻辑卷LV:lvcreate、lvremove、lvdisplay  

在vg卷组上面创建逻辑卷LV,使用命令lvcreate:

[root@Moni ~]# lvcreate -n lv0 -L 2G pvgroup
 Logical volume "lv0" created
[root@Moni ~]# lvs <--查看逻辑卷情况-->
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
 lv_root VolGroup -wi-ao---- 35.51g 
 lv_swap VolGroup -wi-ao---- 4.00g 
 lv0 pvgroup -wi-a----- 2.00g 
[root@Moni ~]# lvdisplay 、lvscan
<--逻辑卷的扩容-->
[root@Moni ~]# lvextend -L +1G /dev/pvgroup/lv0 
 Size of logical volume pvgroup/lv0 changed from 2.00 GiB (512 extents) to 3.00 GiB (768 extents).
 Logical volume lv0 successfully resized
[root@Moni ~]#resize2fs /dev/pvgroup/lv0 <--重设逻辑卷上的文件系统大小-->
<--如果lvextend加上了“-r”参数,则表示直接resize2fs,不用再执行一次-->
<--逻辑卷的缩减,只针对linux的ext文件系统,并确保没有挂载使用-->
[root@Moni ~]# lvs | grep lv0
 lv0 pvgroup -wi-a----- 3.00g 
[root@Moni ~]# resize2fs /dev/pvgroup/lv0 2G
resize2fs 1.41.12 (17-May-2010)<-先减小文件系统的大小->
Resizing the filesystem on /dev/pvgroup/lv0 to 524288 (4k) blocks.
The filesystem on /dev/pvgroup/lv0 is now 524288 blocks long.
[root@Moni ~]# lvreduce -L 2G /dev/pvgroup/lv0 <-再减小逻辑卷的大小->
 WARNING: Reducing active logical volume to 2.00 GiB
 THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv0? [y/n]: y
 Size of logical volume pvgroup/lv0 changed from 3.00 GiB (768 extents) to 2.00 GiB (512 extents).
 Logical volume lv0 successfully resized
<--检测所有的scsi、ide等存储设备-->
[root@Moni ~]# lvmdiskscan
<--删除逻辑卷-->
[root@Moni ~]# lvremove /dev/pvgroup/lv001 -f
<--重命名lv-->
[root@Moni ~]# lvrename /dev/pvgroup/lv0 /dev/pvgroup/lv001
 Renamed "lv0" to "lv001" in volume group "pvgroup"

④、创建文件系统并挂载:mkfs、mount  

[root@Moni ~]# mkfs.ext4 /dev/pvgroup/lv0
[root@Moni ~]# mount /dev/pvgroup/lv0 /mnt/
<--同步文件系统-->
[root@Moni ~]# resize2fs /dev/pvgroup/lv0 
resize2fs 1.41.12 (17-May-2010)
The filesystem is already 786432 blocks long. Nothing to do!
<--如果是xfs操作系统则用命令“xfs_growfs”-->
[root@Moni ~]# xfs_growfs /dev/pvgroup/lv0

第二节、逻辑卷的其它相关管理:(创建镜像逻辑卷、创建逻辑卷快照、LVM的灾难恢复、数据迁移等)  

①、首先创建个镜像逻辑卷:mirror(镜像逻辑卷有点类似阵列raid1,即多块磁盘相互同步)  

现在有四个物理卷,/dev/sdb1、/dev/sdb2、/dev/sdb3、/dev/sdb4;现在将sdb1-sdb3三个物理卷加入到卷组pvg001中,并在上面创建包含镜像功能的逻辑卷lv01;

[root@Moni ~]# pvcreate /dev/sdb1 /dev/sdb2 /dev/sdb3
[root@Moni ~]# vgcreate pvg001 /dev/sdb1 /dev/sdb2 /dev/sdb3
[root@Moni ~]# lvcreate -L 2G -ml -n lv01 pvg001 
Logical volume "lv01" created
[root@Moni ~]# lvs -a -o +devices
 LV VG Attr LSize Origin Snap% Move Log Copy% Convert Devices 
 lv01 pvg001 mwi-a- 3.00G lv01_mlog 5.34 lv01_mimage_0(0),lv01_mimage_1(0)
 [lv01_mimage_0] pvg001 Iwi-ao 3.00G /dev/sdb1(0) 
 [lv01_mimage_1] pvg001 Iwi-ao 3.00G /dev/sdb2(0) 
 [lv01_mlog] pvg001 lwi-ao 4.00M /dev/sdb3(0)
<--当然你也可以指定三块盘顺序,“-n”参数指定lv名称-->
[root@Moni ~]# lvcreate -L 500M -m1  pvg001 -n lv01 /dev/sdb3 /dev/sdb2 /dev/sdb1
思考·总结

如上,“-m1” 参数为配置镜像逻辑卷,至少需要三块物理卷,前两块为互为mirror镜像的率逻辑卷,最后一块大小为“4MB”的日志逻辑卷;

当然这样会浪费一块物理卷,而且这样岂不是类似于raid5了吗,可不可以就是raid1的那种镜像模式,只用两块物理卷:

[root@Moni ~]# lvcreate -L 500M -m1 --mirrorlog core pvg001 -n lv01

“–mirrorlog core”参数,可以让日志保存在内存中;

②、创建一个快照逻辑卷:snapshot(快照就像是备份出来的某个时刻的状态但又可以独立存在)  

快照有别于镜像,镜像可以理解为从底层做了备份并实时同步的,而快照就是某一时刻一致性备份出来的设备或文件,也可以理解为,快照是逻辑卷的镜像分离

所以快照可以单独查看,可以直接挂载使用;但事实上,快照的实现并不是表面上的拷贝复制,什么叫镜像分离,我们来分析一下:

我们姑且也可以把快照比作是钱庄给你做资产统计的一种业务;就需要一张基于超级快的bitmap位图文件,来确定你的资产;

但这是需要开销的,这张图分为两个部分,第一个部分就是办理业务以前的资产统计,第二个部分是给你新分配的预留空白空间,空间越大,开销越大;

旧资产统计不用说,钱庄保留那份bitmap位图文件,如此即使你删除或修改了旧文件,钱庄也可以根据这份图恢复;

如果预留的空间用完了,那么这份业务就失效了,以前的旧数据人家也没有义务给你保留了,要想继续就要重新办理业务;

如果没有用完,仍然在业务范围内,那么恭喜你,随时可以找回自己办理业务时的那份数据;

事实上当创建快照时,数据并没有拷贝的操作,所以在执行的时候,速度非常快;但创建预留空间是需要一点时间的;

而至于在新数据写入后,有没有对旧数据有拷贝的操作,我认为是没有,因为没有看到新占用的空间,但是数据删除也能恢复,这个耿可能是和那张bitmap位图有关吧。

说了这么多,足见博主理解它时的坎坷,让我们赶快一起看看实例配置吧!

我们直接对之前创建的逻辑卷/dev/pvg001/lv01做快照:

[root@Moni ~]#lvcreate --size 100m --snapshot --name lv01-snap /dev/pvg001/lv01

由上可见我配置了100M的快照预留空间,事实上我们还可以配置成原逻辑卷空间的百分比:

[root@Moni ~]#lvcreate -s -l 20%ORIGIN --name lv01-snap /dev/pvg001/lv01
思考·总结

好吧,我们再一起分析一下以下的过程进一步理解:

(首先我们看一下此时的几项状态)

[root@Moni ~]# mkdir -R /home/lvm/lv01 /home/lvm/lv02/ /home/lvm/lv03/
[root@Moni ~]# mount /dev/pvg001/lv01 /home/lvm/lv01
[root@Moni ~]# cd /home/lvm/lv01
[root@Moni lv01]# echo "123456" > 123.txt
[root@Moni lv01]# dd if=/dev/zero of=/home/lvm/lv01/50m bs=1M count=50
[root@Moni lv01]# lvcreate --size 100m --snapshot --name lv01-snap /dev/pvg001/lv01 
 Logical volume "lv01-snap" created
[root@Moni lv01]# vgs
 VG #PV #LV #SN Attr VSize VFree 
 pvg001 3 2 1 wz--n- 5.99g 4.91g
[root@Moni lv01]# lvs
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
 lv01 pvg001 owi-aom--- 500.00m 100.00 
 lv01-snap pvg001 swi-a-s--- 100.00m lv01 0.01
[root@Moni lv01]# mount /dev/pvg001/lv01-snap /home/lvm/lv02
[root@Moni lv01]# df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/pvg001-lv01       477M 53M 399M 12% /home/lvm/lv01
/dev/mapper/pvg001-lv01--snap 477M 53M 399M 12% /home/lvm/lv02

如上我们可以很直观的看到,lv01和快照lv01-snap卷挂载后的分区空间、使用量、空闲空间都是一样的;

而从lvs逻辑卷信息可以看到,lv01500M,lv01-snap是100M,这个正是预留空间的大小;

事实上,由于lv01做了镜像,则500*2+100正是vgs卷组信息中查看的被使用的空间,可能小不明显,我们继续看;

[root@Moni lv01]# dd if=/dev/zero of=/home/lvm/lv01/300m bs=1M count=300
[root@Moni lv01]# lvscan
 ACTIVE Original '/dev/pvg001/lv01' [500.00 MiB] inherit
 inactive Snapshot '/dev/pvg001/lv01-snap' [100.00 MiB] inherit
[root@Moni lv01]# lvcreate --size 100m --snapshot --name lv02-snap /dev/pvg001/lv01
 Logical volume "lv02-snap" created
[root@Moni lv01]# df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/pvg001-lv01        477M 353M 99M 79% /home/lvm/lv01
/dev/mapper/pvg001-lv02--snap  477M 353M 99M 79% /home/lvm/lv03
[root@Moni lv01]# vgs
 VG #PV #LV #SN Attr VSize VFree 
 pvg001 3 3 2 wz--n- 5.99g 4.82g
[root@Moni lv01]# lvs
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
 lv01 pvg001 owi-aom--- 500.00m 100.00 
 lv01-snap pvg001 swi-I-s--- 100.00m lv01 100.00 
 lv02-snap pvg001 swi-aos--- 100.00m lv01 0.01 
[root@Moni lv01]# lsblk 
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
、、、
├─sdb1 8:22 0 2G 0 part 
│ ├─pvg001-lv01_mimage_0 (dm-2) 253:2 0 500M 0 lvm 
│ │ └─pvg001-lv01-real (dm-6) 253:6 0 500M 0 lvm 
│ │ ├─pvg001-lv01 (dm-4) 253:4 0 500M 0 lvm /home/lvm/lv01
│ │ ├─pvg001-lv01--snap (dm-5) 253:5 0 500M 0 lvm 
│ │ └─pvg001-lv02--snap (dm-8) 253:8 0 500M 0 lvm /home/lvm/lv03
│ ├─pvg001-lv01--snap-cow (dm-7) 253:7 0 100M 0 lvm 
│ │ └─pvg001-lv01--snap (dm-5) 253:5 0 500M 0 lvm 
│ └─pvg001-lv02--snap-cow (dm-9) 253:9 0 100M 0 lvm 
│ └─pvg001-lv02--snap (dm-8) 253:8 0 500M 0 lvm /home/lvm/lv03
├─sdb2 8:23 0 2G 0 part 
│ └─pvg001-lv01_mimage_1 (dm-3) 253:3 0 500M 0 lvm 
│ └─pvg001-lv01-real (dm-6) 253:6 0 500M 0 lvm 
│ ├─pvg001-lv01 (dm-4) 253:4 0 500M 0 lvm /home/lvm/lv01
│ ├─pvg001-lv01--snap (dm-5) 253:5 0 500M 0 lvm 
│ └─pvg001-lv02--snap (dm-8) 253:8 0 500M 0 lvm /home/lvm/lv03
[root@Moni lv01]# lvs -a -o +devices
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices 
 lv01 pvg001 owi-aom---            500.00m 100.00 lv01_mimage_0(0),lv01_mimage_1(0) 
 [lv01_mimage_0] pvg001 iwi-aom--- 500.00m /dev/sdb1(0) 
 [lv01_mimage_1] pvg001 iwi-aom--- 500.00m /dev/sdb2(0)
 lv01-snap pvg001 swi-I-s---       100.00m lv01 100.00 /dev/sdb1(125)
 lv02-snap pvg001 swi-aos---       100.00m lv01 0.01 /dev/sdb2(150)

看到没有,这里有个问题,当原逻辑卷已经做了镜像时,再做快照时,100M的预留空间lv01-snap-cow,只在第一块镜像逻辑卷上有;

而lv01-snap的快照逻辑卷,在两个镜像逻辑卷上都有,而且大小是500M,但是呢在卷组的使用空间里,并没有看到有分配这些空间;

因为从vgs查看到卷组被使用的空间大概等于500*2+100+100,而不是500*2+53+353的空间

另外,我创建了100M空间的lv01-snap-cow后,在原逻辑卷中又dd创建了一个300M的文件后,df -lh发现挂载的lv01-snap已经自动卸载;lvs也发现lv01-snap的状态已经是“inactive”;

事实上,快照逻辑卷创建的新数据预留空间,是和原逻辑卷一一对象的,依据就是那张bitmap位图文件;

当数据突破空间时,从而根据位图把新增数据拷贝到对应的原逻辑卷中,而快照的预留空间包括对旧数据的快照就失效不可用了;

所以创建快照时务必保留足够的空间,避免新增数据超出预留空间大小从而造成快照失效。

对此我们需要及时发现并做删除处理,然后创建新的快照;

[root@Moni lv01]# lvremove /dev/pvg001/lv01-snap 
Do you really want to remove active logical volume lv01-snap? [y/n]: y
 Logical volume "lv01-snap" successfully removed
[root@Moni lv01]# lvcreate --size 100M --snapshot --name lv01-snap /dev/pvg001/lv01

③、基于镜像逻辑卷的灾难恢复(想象一下raid1的故障)  

创建逻辑卷的镜像逻辑卷,一般两个pv物理卷选择分别位于不同物理磁盘上,如此挂掉一块盘,不影响数据;

和raid不同的是,raid1在插上新磁盘后会自动加入阵列组并恢复同步,lvm的镜像逻辑卷则需要手动替换物理卷:

[root@Moni lv01]# lvs -a -o +devices
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices 
 lv01 pvg001 owi-aom---            500.00m 100.00 lv01_mimage_0(0),lv01_mimage_1(0)
 [lv01_mimage_0] pvg001 iwi-aom--- 500.00m /dev/sdb6(0) 
 [lv01_mimage_1] pvg001 iwi-aom--- 500.00m /dev/sdb7(0)

(模拟对/dev/sdb7设备文件进行破坏并确认破坏状态且对源数据无影响)

[root@Moni lv01]# dd if=/dev/zero of=/dev/sdb7 bs=1M count=10
[root@Moni lv01]# lvs -a -o +devices
 Couldn't find device with uuid c3mQdK-ysZ1-vdYh-aUVF-y6eo-2KxC-l7XzOz.
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices 
 lv01 pvg001 owi-aom-p-            500.00m 100.00 lv01_mimage_0(0),lv01_mimage_1(0)
 [lv01_mimage_0] pvg001 iwi-aom--- 500.00m /dev/sdb6(0) 
 [lv01_mimage_1] pvg001 iwi-aom-p- 500.00m <unknown device(0)>
[root@Moni lv01]# ls
123.txt 300m 50m

(从卷组pvg001中移除损坏的物理卷/dev/sdb7)

[root@Moni lv01]# vgreduce -f --removemissing pvg001
 Couldn't find device with uuid c3mQdK-ysZ1-vdYh-aUVF-y6eo-2KxC-l7XzOz.
 Wrote out consistent volume group pvg001

(把一块新的物理卷/dev/sdb9加入到卷组pvg001)

[root@Moni lv01]# vgextend pvg001 /dev/sdb9
 Volume group "pvg001" successfully extended

进行镜像逻辑卷恢复(过程中无需解除逻辑卷的挂载,要注意的是之前的镜像逻辑卷有无日志卷

[root@Moni lv01]# lvconvert -m1  --mirrorlog core /dev/pvg001/lv01 /dev/sdb6 /dev/sdb9
 pvg001/lv01: Converted: 0.8%
 pvg001/lv01: Converted: 41.6%
 pvg001/lv01: Converted: 82.4%
 pvg001/lv01: Converted: 100.0%
  Logical volume lv01 converted.
[root@Moni lv01]# lvs -a -o +devices
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices 
 lv01 pvg001 owi-aom---            500.00m 100.00 lv01_mimage_0(0),lv01_mimage_1(0) 
 [lv01_mimage_0] pvg001 iwi-aom--- 500.00m /dev/sdb6(0) 
 [lv01_mimage_1] pvg001 iwi-aom--- 500.00m /dev/sdb9(0)
[root@Moni lv01]# ls
123.txt 300m 50m

④、基于快照的灾难恢复(只能恢复到快照的还原点)  

我们使用上面的逻辑卷lv01和它的快照逻辑卷lv01-snap来进行恢复操作:

首先,我们查看一下当前的状态:

[root@Moni ~]# lvs -a -o +devices
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices 
 lv01 pvg001 owi-aom---      500.00m 100.00 lv01_mimage_0(0),lv01_mimage_1(0)
 lv01-snap pvg001 swi-aos--- 100.00m lv01 0.02 /dev/sdb6(125)
[root@Moni ~]# df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/pvg001-lv01       477M 353M 99M 79% /home/lvm/lv01
/dev/mapper/pvg001-lv01--snap 477M 353M 99M 79% /home/lvm/lv02
[root@Moni ~]# cd /home/lvm/lv02 && ls && cd /home/lvm/lv01 && ls
123.txt 300m 50m
123.txt 300m 50m
[root@Moni lv01]# cat 123.txt 
123456

快照是当前原逻辑卷最新的状态,我先把原逻辑卷中的文件做删除修改的操作

[root@Moni lv01]# echo 654321 >123.txt
[root@Moni lv01]# rm -f 300m

注意,有意思的是下面碰到一个问题,就是我在恢复时提示错误;

[root@Moni lv01]# lvconvert --merge /dev/pvg001/lv01-snap
Logical volume pvg001/lv01 contains a filesystem in use.
Can't merge over open origin volume.
Merging of snapshot pvg001/lv01-snap will occur on next activation of pvg001/lv01.
[root@Moni ~]# lvconvert --merge /dev/pvg001/lv01-snap
Snapshot lv01-snap is already merging.
Unable to merge LV "lv01-snap" into its origin.
[root@Moni lv01]# cat 123.txt
654321
[root@Moni lv01]# lvscan
ACTIVE Original '/dev/pvg001/lv01' [500.00 MiB] inherit
[root@Moni lv01]# lvcreate -s -n snap1 -L 100M /dev/pvg001/lv01
Snapshots of an origin that has a merging snapshot is not supported
[root@Moni lv01]# lvremove /dev/pvg001/lv01-snap
Can't remove merging snapshot logical volume "lv01-snap"

我连续执行两遍报错,查看文件并没有被恢复,lvs已经发现不了快照逻辑卷lv01-snap;

lvscan也没有了快照逻辑卷,但是逻辑卷lv01仍然被标识为“original”原逻辑卷;

接下来我尝试直接删除lv01-snap,提示正在merging无法删除;

而lsblk查看仍然能看到lv01-snap镜像逻辑卷,且这个设备文件仍然可以挂载查看使用;

什么引起的呢?事实上不难发现,第一条命令提示in use;这是因为恢复时原逻辑卷没有卸载

解决方法也有提示,卸载并关闭再激活一下原逻辑卷即可:

[root@Moni ~]# umount /dev/pvg001/lv01
[root@Moni ~]# lvchange -a n /dev/pvg001/lv01
[root@Moni ~]# vgchange -a y pvg001
3 logical volume(s) in volume group "pvg001" now active
Background polling started for 1 logical volume(s) in volume group "pvg001"
[root@Moni ~]# mount /dev/pvg001/lv01 /home/lvm/lv01
[root@Moni ~]# cd /home/lvm/lv01
[root@Moni lv01]# cat 123.txt
123456

当然如果你不想恢复了,此时也新建不了新的快照怎么办?

[root@Moni lv01]# lvcreate -s -n snap1 -L 100m /dev/pvg001/lv01
Snapshots of an origin that has a merging snapshot is not supported
<--卸载后,直接删除原逻辑卷,即可删除merging中的快照逻辑卷,然后“n”退出-->
[root@Moni ~]# lvremove /dev/pvg001/lv01
Logical volume "lv01-snap" successfully removed
Do you really want to remove active logical volume lv01? [y/n]: n
[root@Moni ~]# lvscan
ACTIVE  '/dev/pvg001/lv01' [500.00 MiB] inherit

⑤、数据迁移实例(基于pv、vg、lv):  

数据的迁移在实际工作中,是很重要也很危险的一份工作,但是lvm提供比较友好的迁移功能;

1、首先,最简单的就是基于原物理磁盘的vg在系统内迁移  

我们lvm的物理卷pv是创建在物理磁盘上,可能不在同一块物理磁盘上的多个pv组成了一个卷组vg;

但我们知道服务器的物理磁盘接口往往都不止一个,那么如果我们想把物理磁盘更换一个磁盘接口,又不想影响卷组使其改动怎么办?

事实上很简单,我们只需要对卷组进行停用,然后更换接口后重新启用卷组即可:

[root@Moni ~]# umount /dev/pvg001/lv01 
[root@Moni ~]# vgchange -a n pvg001
 0 logical volume(s) in volume group "pvg001" now active
<--停用前记得卸载所有逻辑卷,然后更换物理磁盘,更换后重启启用vg-->
[root@Moni ~]# vgchange -ay pvg001
 2 logical volume(s) in volume group "pvg001" now active

2、其次,仍然是基于原物理磁盘的vg在系统间迁移  

注意如果卷组包含多个物理磁盘上的物理卷,想要整个迁移,必须把所有的物理磁盘迁移:

当然我们仍然需要把卷组关闭

[root@Moni ~]# umount /dev/pvg001/lv01
[root@Moni ~]# vgchange -a n pvg001
0 logical volume(s) in volume group "pvg001" now active

导出卷组:(并把所有物理磁盘迁移到别的服务器)

[root@Moni ~]# vgexport pvg001
Volume group "pvg001" successfully exported
[root@Moni ~]# pvscan
PV /dev/sdb6 is in exported VG pvg001 [2.00 GiB / 1.41 GiB free]
PV /dev/sdb8 is in exported VG pvg001 [2.00 GiB / 2.00 GiB free]
PV /dev/sdb9 is in exported VG pvg001 [2.00 GiB / 1.51 GiB free]

(可以看到三个pv已经是exported状态,庆幸的是三个pv都在sdb磁盘上)
导入卷组并激活:(在另外一个服务器上也可以识别到这三个pv)

[root@db ~]# pvscan
PV /dev/sdb6 is in exported VG pvg001 [2.00 GiB / 1.41 GiB free]
PV /dev/sdb8 is in exported VG pvg001 [2.00 GiB / 2.00 GiB free]
PV /dev/sdb9 is in exported VG pvg001 [2.00 GiB / 1.51 GiB free]
[root@db ~]# vgimport pvg001
Volume group "pvg001" successfully imported

(查看状态,可以确认已经识别逻辑卷,并可挂载使用)

[root@db ~]# vgs
VG #PV #LV #SN Attr VSize VFree
VolGroup 1 2 0 wz--n- 39.51g 0
pvg001 3 2 1 wz--n- 5.99g 4.91g
[root@db ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_root VolGroup -wi-ao---- 35.51g
lv_swap VolGroup -wi-ao---- 4.00g
lv01 pvg001 owi-a-m--- 500.00m 89.60
[root@db ~]# mount /dev/pvg001/lv01 /mnt
[root@db ~]# cd /mnt/
[root@Moni mnt]# ls
100m 10m 123.txt 50m

3、然后,是基于pv物理卷的迁移  

上面一个案例我们说如果pv分布在不同的物理磁盘上需要我们把所有磁盘迁移,那么是不是一定要这么做呢,显然并不需要;

lvm提供了非常友好的迁移功能,就上面的案例,我们可以把多个磁盘上的pv先转移到同一块物理磁盘上,再做系统间迁移

当然也适用于系统内迁移到新的物理磁盘上的操作,这里就基于pv把数据迁移到新的物理磁盘上;

检查磁盘上的pv,有新的磁盘,看情况在新磁盘上创建新的pv;

如下检测pvg001这个vg包含了三个pv,且都在/dev/sdb磁盘上,所以我在新的磁盘sdc上也创建对应的三个pv并把其加入到pvg001这个卷组中:

[root@Moni ~]# pvscan 
 PV /dev/sdb6 VG pvg001 lvm2 [2.00 GiB / 1.41 GiB free]
 PV /dev/sdb8 VG pvg001 lvm2 [2.00 GiB / 2.00 GiB free]
 PV /dev/sdb9 VG pvg001 lvm2 [2.00 GiB / 1.51 GiB free]
[root@Moni mnt]# fdisk /dev/sdc(创建了三个逻辑分区分区)
[root@Moni mnt]# pvcreate /dev/sdc5 /dev/sdc6 /dev/sdc7
 Physical volume "/dev/sdc5" successfully created
 Physical volume "/dev/sdc6" successfully created
 Physical volume "/dev/sdc7" successfully created
[root@Moni mnt]# vgextend pvg001 /dev/sdc5 /dev/sdc6 /dev/sdc7
 Volume group "pvg001" successfully extended
[root@Moni mnt]# pvscan 
 PV /dev/sdb6 VG pvg001 lvm2 [2.00 GiB / 1.41 GiB free]
 PV /dev/sdb8 VG pvg001 lvm2 [2.00 GiB / 2.00 GiB free]
 PV /dev/sdb9 VG pvg001 lvm2 [2.00 GiB / 1.51 GiB free]
 PV /dev/sdc5 VG pvg001 lvm2 [2.00 GiB / 2.00 GiB free]
 PV /dev/sdc6 VG pvg001 lvm2 [2.00 GiB / 2.00 GiB free]
 PV /dev/sdc7 VG pvg001 lvm2 [2.00 GiB / 2.00 GiB free]

使用pvmove命令把sdb上pv中的数据迁移到新磁盘sdc上pv中:

c[root@Moni mnt]# pvmove /dev/sdb6 /dev/sdc5
 /dev/sdb6: Moved: 0.0%
 /dev/sdb6: Moved: 16.7%
 /dev/sdb6: Moved: 55.3%
 /dev/sdb6: Moved: 94.7%
 /dev/sdb6: Moved: 100.0%
[root@Moni mnt]# lvs -a -o +devices
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices 
 lv01 pvg001 owi-aom---            500.00m 100.00 lv01_mimage_0(0),lv01_mimage_1(0)
 [lv01_mimage_0] pvg001 iwi-aom--- 500.00m /dev/sdc5(25) 
 [lv01_mimage_1] pvg001 iwi-aom--- 500.00m /dev/sdb9(0) 
 snap3 pvg001 swi-a-s--- 100.00m lv01 10.17 /dev/sdc5(0)
[root@Moni mnt]# ls
100m 10m 123.txt 50m

可以看到,迁移过程中不影响逻辑卷的使用,其中逻辑卷lv01的镜像卷mimage_0之前是再sdb6上现在已经迁移到sdc5物理卷上;

注意,网上发现有道友说,存在快照逻辑卷时,会报错应当删除快照后迁移,但是,这里博主的snap3快照并没有报错,具体原因尚不清楚,知道有这么回事即可;

同理我们把其它两个pv都做迁移处理,如此,我们便可以把sdb磁盘上的pv从vg中剔除并取出磁盘;

当然你还会发现,看上面逻辑卷lv01只使用了sdb6和sdb9两个物理卷,sdb8并没有被使用也就没有数据:

[root@Moni mnt]# pvmove /dev/sdb8 /dev/sdc6 
 No data to move for pvg001
[root@Moni mnt]# pvmove /dev/sdb9 /dev/sdc7 
 /dev/sdb9: Moved: 0.0%
 /dev/sdb9: Moved: 46.4%
 /dev/sdb9: Moved: 94.4%
 /dev/sdb9: Moved: 100.0%
<--使用vgreduce把三个pv从卷组中剔除-->
[root@Moni mnt]# vgreduce pvg001 /dev/sdb6 /dev/sdb8 /dev/sdb9
 Removed "/dev/sdb6" from volume group "pvg001"
 Removed "/dev/sdb8" from volume group "pvg001"
 Removed "/dev/sdb9" from volume group "pvg001"
[root@Moni mnt]# lvs -a -o +devices
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices 
 lv01 pvg001 owi-aom---            500.00m 100.00 lv01_mimage_0(0),lv01_mimage_1(0)
 [lv01_mimage_0] pvg001 iwi-aom--- 500.00m /dev/sdc5(25) 
 [lv01_mimage_1] pvg001 iwi-aom--- 500.00m /dev/sdc7(0) 
 snap3 pvg001 swi-a-s--- 100.00m lv01 10.17 /dev/sdc5(0) 
[root@Moni mnt]# ls
100m 10m 123.txt 50m

数据没有影响,所有数据已经迁移到新磁盘sdc上;当然你还可以使用“pvremove”删除pv,并取出磁盘;

4、最后,是基于lv的镜像逻辑卷的方法直接对数据系统内迁移,迁移过程中不影响数据使用  

这个就比较厉害了,说白了就是给原逻辑卷创建个镜像逻辑卷,然后剔除原逻辑卷,从而达到迁移的效果,风险小;

我们先检查一下当前的lv和pv的对应关系,用上一个案例中的环境,把lv01逻辑卷整体再迁移回sdb磁盘;

c[root@Moni ~]# mount | tail -n1
/dev/mapper/pvg001-lv01 on /mnt type ext4 (rw)
[root@Moni ~]# cd /mnt
[root@Moni mnt]# ls
100m 10m 123.txt 50m
[root@Moni mnt]# cat 123.txt 
123456 <--lv01挂载在mnt下,数据读写是正常的-->
[root@Moni mnt]# lvs -a -o +devices
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices 
 lv01 pvg001 owi-aom--- 500.00m 100.00 lv01_mimage_0(0),lv01_mimage_1(0)
 [lv01_mimage_0] pvg001 iwi-aom--- 500.00m /dev/sdc5(25) 
 [lv01_mimage_1] pvg001 iwi-aom--- 500.00m /dev/sdc7(0) 
 snap3 pvg001 swi-a-s--- 100.00m lv01 10.17 /dev/sdc5(0)

细心的朋友会发现,lv01已经是一个镜像逻辑卷了,为了不和下面搞混,我先把sdc7这个镜像剔除掉,顺便也罢快照删除了;

[root@Moni mnt]# lvconvert -m 0 /dev/pvg001/lv01 /dev/sdc7
Logical volume lv01 converted.
[root@Moni mnt]# lvremove /dev/pvg001/snap3
Do you really want to remove active logical volume snap3? [y/n]: y
Logical volume "snap3" successfully removed
[root@Moni mnt]# lvs -a -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
lv01 pvg001 -wi-ao---- 500.00m /dev/sdc5(25)

注意,命令lvconvert的” -m 0″是剔除镜像逻辑卷的参数、”-m 1″则是添加单一镜像逻辑卷的参数

如此,sdb6物理卷加入pvg001卷组中:并把它制作成lv01的镜像逻辑卷;

[root@Moni mnt]# vgextend pvg001 /dev/sdb6
Volume group "pvg001" successfully extended
[root@Moni mnt]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb6 pvg001 lvm2 a-- 2.00g 2.00g
/dev/sdc5 pvg001 lvm2 a-- 2.00g 1.51g
[root@Moni mnt]# dmsetup deps /dev/pvg001/lv01
1 dependencies : (<8, 37>)
[root@Moni mnt]# ls -l /dev | grep sdc5
brw-rw---- 1 root disk <8, 37> 9月 7 12:39 sdc5

在物理卷sdb6上创建lv01的镜像逻辑卷:

[root@Moni mnt]#< lvconvert -m 1 /dev/pvg001/lv01 /dev/sdb6 >
pvg001/lv01: Converted: 0.0%
pvg001/lv01: Converted: 70.4%
pvg001/lv01: Converted: 100.0%
[root@Moni mnt]# lvs -a -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
lv01 pvg001 mwi-aom---                         500.00m lv01_mlog 100.00 lv01_mimage_0(0),lv01_mimage_1(0)
[lv01_mimage_0] pvg001 iwi-aom--- 500.00m /dev/sdc5(25)
[lv01_mimage_1] pvg001 iwi-aom---  500.00m /dev/sdb6(0)
[lv01_mlog] pvg001 lwi-aom--- 4.00m /dev/sdb6(125)

可以看到已经在sdb6上创建了lv01的镜像逻辑卷,但同样在sdb6上多了个4M的日志逻辑卷,不需要可以用下面方法取消:

[root@Moni mnt]# lvconvert -m 1 --mirrorlog core /dev/pvg001/lv01 /dev/sdb6
Logical volume lv01 converted.
[root@Moni mnt]# lvs -a -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
lv01 pvg001 mwi-aom---                         500.00m 100.00 lv01_mimage_0(0),lv01_mimage_1(0)
[lv01_mimage_0] pvg001 iwi-aom--- 500.00m /dev/sdc5(25)
[lv01_mimage_1] pvg001 iwi-aom---  500.00m /dev/sdb6(0)

然后我们删除sdc5上的原逻辑卷,可以看到数据正常,迁移成功;

[root@Moni mnt]# lvconvert -m 0 /dev/pvg001/lv01 /dev/sdc5
Logical volume lv01 converted.
[root@Moni mnt]# lvs -a -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
lv01 pvg001 -wi-ao---- 500.00m /dev/sdb6(0)
[root@Moni mnt]# cat 123.txt
123456

从pvg001卷组中剔除sdc5物理卷,并取出sdc磁盘;

[root@Moni mnt]# vgreduce pvg001 /dev/sdc5
Removed "/dev/sdc5" from volume group "pvg001"c

⑥、基于pv物理卷的灾难恢复:  

上面我们说了基于pv的迁移,那么当我们磁盘损坏导致pv物理卷损坏后,如何处理?

事实上这个时候,如果做了raid或镜像逻辑卷还好说,如果没有,我们知道数据是写在物理磁盘上,而pv如果分布在多个磁盘上,数据可能也会分布在多个pv中;

不过一般数据都是按照磁盘block顺序写入的,所以我们只能庆幸,损坏的磁盘中没有重要的数据;如果不幸,只能找更专业的工具进行数据恢复咯。

我们可以使用lvm更换pv物理卷的来恢复卷组和逻辑卷的正常使用,但是不能保证数据可以完全恢复

首先查看一下lv,发现一个lv01逻辑卷是创建在pvg001卷组中的/dev/sdb6物理卷上的:

[root@Moni mnt]# lvs -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
lv01 pvg001 -wi-ao---- 500.00m /dev/sdb6(0)

那么lvm是如何确定lv01逻辑卷对应的卷组和物理卷的呢?

那是因为lvm有一个逻辑卷标签对应关联表;同时每个逻辑卷保留开始512b大小的空间用来存放标签的信息,其实也就是物理卷的uuid

下面我们手动擦除lv01逻辑卷的对应标签,模拟lvm逻辑标签对应错误的故障;

[root@Moni mnt]# dd if=/dev/zero of=/dev/sdb6 bs=512 count=1 seek=1
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.000401111 秒,1.3 MB/秒
[root@Moni mnt]# lvs -o +devices
<Couldn't find device with uuid FgIFUZ-Oehy-e5LR-9Xel-eEp1-T07y-L6yh5d.>
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
lv01 pvg001 -wi-ao--p- 500.00m <unknown device(0)>
[root@Moni mnt]# pvs --partial
PARTIAL MODE. Incomplete logical volumes will be processed.
Couldn't find device with uuid FgIFUZ-Oehy-e5LR-9Xel-eEp1-T07y-L6yh5d.
unknown device pvg001   lvm2 a-m   2.00g 1.51g

不难看出sdb7物理卷已经成为了未知设备,lvm通过标签对应关系表,却找不到上面那个uuid的设备;

注意这个uuid是pv物理卷的uuid,却不是逻辑卷文件系统的uuid,所以,此时的lv01依然可以挂载并使用;

[root@Moni mnt]# ls
100m 10m 123.txt 50m
[root@Moni mnt]# mount |tail -n1
/dev/mapper/pvg001-lv01 on /mnt type ext4 (rw)

这个时候我们可以把它挂载成只读,然后备份,(只读是因为避免逻辑卷上有动态生成数据的程序仍在执行如oracle)

[root@Moni mnt]# mount -o remount -o ro /dev/pvg001/lv01
[root@Moni mnt]# mount |tail -n1
/dev/mapper/pvg001-lv01 on /mnt type ext4 (ro)
[root@Moni mnt]# mkdir /home/backup
[root@Moni mnt]# cp -p ./* /home/backup

然后我们来恢复物理卷的标签:

[root@Moni ~]# pvcreate /dev/sdb6
Couldn't find device with uuid FgIFUZ-Oehy-e5LR-9Xel-eEp1-T07y-L6yh5d.
Can't open /dev/sdb6 exclusively. Mounted filesystem?

因为上面有逻辑卷,所以直接pvcreate是不行的;

卸载并关闭卷组pvg001后,给/dev/sdb6指定上面pv的uuid来重新创建pv:

[root@Moni ~]# pvcreate /dev/sdb6 -u FgIFUZ-Oehy-e5LR-9Xel-eEp1-T07y-L6yh5d --restorefile /etc/lvm/backup/pvg001
Couldn't find device with uuid FgIFUZ-Oehy-e5LR-9Xel-eEp1-T07y-L6yh5d.
Physical volume "/dev/sdb6" successfully created
[root@Moni ~]# pvs
<WARNING: Volume Group pvg001 is not consistent>
PV VG Fmt Attr PSize PFree
/dev/sdb6 pvg001 lvm2 a-- 2.00g 1.51g
/dev/sdc5                lvm2 --- 2.00g 2.00g
<--发现仍然有报错,我们修复一下卷组pvg001-->
[root@Moni ~]# vgcfgrestore pvg001
Restored volume group pvg001
[root@Moni ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb6 pvg001 lvm2 a-- 2.00g 1.51g
/dev/sdc5                lvm2 --- 2.00g 2.00g

如此物理卷恢复后,激活卷组并挂载逻辑卷,数据正常,恢复成功:

[root@Moni ~]# vgchange -ay pvg001
1 logical volume(s) in volume group "pvg001" now active
[root@Moni ~]# mount /dev/pvg001/lv01 /mnt/ && cd /mnt && cat 123.txt
123456
总结·思考

注意上面恢复物理卷时,用到了一个文件“/etc/lvm/backup/pvg001”;

事实上这个就是lvm的pv、vg、lv的标签对应关系表,这个表很重要,有必要时需要备份几份,以避免类似的pv标签错误引起的故障;

但事实上,工作中可能pv是直接损坏或是磁盘损坏的,这样就会有数据的丢失,逻辑卷的文件系统可能也会损坏,如何修复呢?

这个时候逻辑卷已经无法正常挂载使用,想要完全恢复就比较咯;这个时候只能使用替换pv来尽可能保留正常pv上的数据了;

简单的模拟一下,为了效果明显,我把三个2g的pv加到卷组中,然后创建一个5g的逻辑卷,放点数据,然后模拟损坏一块pv,尝试恢复。

[root@Moni ~]# vgextend pvg001 /dev/sdb7 /dev/sdb8
Volume group "pvg001" successfully extended
[root@Moni ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb6 pvg001 lvm2 a-- 2.00g 1.51g
/dev/sdb7 pvg001 lvm2 a-- 2.00g 2.00g
/dev/sdb8 pvg001 lvm2 a-- 2.00g 2.00g
[root@Moni ~]# lvs -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
lv01 pvg001 -wi-a----- 500.00m /dev/sdb6(0)
[root@Moni ~]# lvextend -r -L +4g /dev/pvg001/lv01
fsck from util-linux-ng 2.17.2
/dev/mapper/pvg001-lv01: clean, 15/128016 files, 190497/512000 blocks
Size of logical volume pvg001/lv01 changed from 500.00 MiB (125 extents) to 4.49 GiB (1149 extents).
Logical volume lv01 successfully resized
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/mapper/pvg001-lv01 to 4706304 (1k) blocks.
The filesystem on /dev/mapper/pvg001-lv01 is now 4706304 blocks long.
[root@Moni ~]# lvs -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
lv01 pvg001 -wi-a----- 4.49g /dev/sdb6(0)
lv01 pvg001 -wi-a----- 4.49g /dev/sdb7(0)
lv01 pvg001 -wi-a----- 4.49g /dev/sdb8(0)

到此,可以发现目前lv01逻辑卷4.5g,占用了sdb6-8三块物理卷。

[root@Moni ~]# mount /dev/pvg001/lv01 /mnt/ && cd /mnt && ls
100m 10m 123.txt 50m lost+found
[root@Moni mnt]# dd if=/dev/zero of=/mnt/2g bs=1M count=2048
记录了2048+0 的读入
记录了2048+0 的写出
2147483648字节(2.1 GB)已复制,15.9571 秒,135 MB/秒
[root@Moni mnt]# dd if=/dev/zero of=/mnt/100m-1 bs=1M count=100
[root@Moni mnt]# dd if=/dev/zero of=/mnt/100m-2 bs=1M count=100
[root@Moni mnt]# dd if=/dev/zero of=/mnt/100m-3 bs=1M count=100
[root@Moni mnt]# du -h
2.5G .
[root@Moni mnt]# echo 654321 >321.txt
[root@Moni mnt]# cat 123.txt 321.txt
123456
654321
[root@Moni mnt]# ls
100m 100m-1 100m-2 100m-3 10m 123.txt 2g 321.txt 50m lost+found

里面的数据还在,但是数据太少,可能其它两个pv上没有数据,所以我新建了几个文件,保证其它pv中也有文件;

现在我要损坏第一块物理卷/dev/sdb6,来进行模拟灾难恢复,届时一些数据将会丢失;

[root@Moni mnt]# dd if=/dev/zero of=/dev/sdb6 bs=1M count=300
记录了300+0 的读入
记录了300+0 的写出
314572800字节(315 MB)已复制,0.212387 秒,1.5 GB/秒
[root@Moni mnt]# pvs --partial
PARTIAL MODE. Incomplete logical volumes will be processed.
Couldn't find device with uuid FgIFUZ-Oehy-e5LR-9Xel-eEp1-T07y-L6yh5d.
PV VG Fmt Attr PSize PFree
/dev/sdb7 pvg001 lvm2 a-- 2.00g 0
/dev/sdb8 pvg001 lvm2 a-- 2.00g 1.50g
unknown device pvg001 lvm2 a-m 2.00g 0
[root@Moni mnt]# ls
100m 100m-1 100m-2 100m-3 10m 123.txt 2g 321.txt 50m lost+found
[root@Moni mnt]# cat 123.txt 321.txt
654321

庆幸的是文件系统没有损坏,因为我们擦除的是sdb6物理卷,而不是lv01逻辑卷,恢复方法是一样的;

所以这个时候仍然可以挂载,但123.txt的内容已经没有了,新创建的321.txt数据是完整的;

你会疑问,这些文件不是还有吗,那是因为linux读写文件的特点,真实数据在物理磁盘上,看到的只是个显示在文件系统中的文件名而已。

仍然挂载成只读,并备份:

[root@Moni mnt]# mount -o remount -o ro /dev/pvg001/lv01
[root@Moni mnt]# mount |tail -n1
/dev/mapper/pvg001-lv01 on /mnt type ext4 (ro)
[root@Moni mnt]# mkdir /home/backup
[root@Moni mnt]# cp -p ./* /home/backup
[root@Moni mnt]# cd && umount /dev/pvg001/lv01
[root@Moni ~]# vgchange -an pvg001
Couldn't find device with uuid FgIFUZ-Oehy-e5LR-9Xel-eEp1-T07y-L6yh5d.
0 logical volume(s) in volume group "pvg001" now active

如此我们来尝试修复,错误很明显,找不到上面那个uuid的物理卷;

[root@Moni ~]# pvcreate -u FgIFUZ-Oehy-e5LR-9Xel-eEp1-T07y-L6yh5d /dev/sdb6 --restorefile /etc/lvm/backup/pvg001
Couldn't find device with uuid FgIFUZ-Oehy-e5LR-9Xel-eEp1-T07y-L6yh5d.
Physical volume "/dev/sdb6" successfully created
[root@Moni ~]# pvs
<WARNING: Volume Group pvg001 is not consistent>
PV VG Fmt Attr PSize PFree
/dev/sdb6 pvg001 lvm2 a-- 2.00g 0
/dev/sdb7 pvg001 lvm2 a-- 2.00g 0
/dev/sdb8 pvg001 lvm2 a-- 2.00g 1.50g
[root@Moni ~]# pvs -v
<WARNING: Volume Group pvg001 is not consistent>
PV VG Fmt Attr PSize PFree DevSize PV UUID
/dev/sdb6 pvg001 lvm2 a-- 2.00g 0 2.00g FgIFUZ-Oehy-e5LR-9Xel-eEp1-T07y-L6yh5d
/dev/sdb7 pvg001 lvm2 a-- 2.00g 0 2.00g gwkYiV-bXaG-MXBx-xtXo-sONs-nNHG-elu4Fz
/dev/sdb8 pvg001 lvm2 a-- 2.00g 1.50g 2.00g 8RVuMI-KohI-co7Q-iHEU-ryLY-WNJ2-bc3wsb
[root@Moni ~]# vgreduce --removemissing pvg001
Volume group "pvg001" is already consistent

到此你会发现,和上面的案例不是一样了吗,而且removemissing也没有删除,说明物理卷没有毛病了,lvm的标签对应关系也已经恢复了;

[root@Moni ~]# vgcfgrestore pvg001
Restored volume group pvg001
[root@Moni ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb6 pvg001 lvm2 a-- 2.00g 0
/dev/sdb7 pvg001 lvm2 a-- 2.00g 0
/dev/sdb8 pvg001 lvm2 a-- 2.00g 1.50g

那么问题来了,我们还需不需要更换新的pv,事实上真实环境下,也要根据具体情况;

我们现在是模拟,但并没有真实损坏磁盘或物理卷,真实环境中,如果是磁盘损坏了,还是需要换的,但如果是坏道的故障,则也可以退而求次,修复一下:

更换也和简单,准备一个新的磁盘或分区,最后和旧的差不多大小的,不要执行上面的pvcreate –restorefile恢复命令;

而是执行下面的把旧的物理卷uuid指向给新的物理卷;

[root@Moni ~]# pvcreate -u FgIFUZ-Oehy-e5LR-9Xel-eEp1-T07y-L6yh5d /dev/sdb9 --restorefile /etc/lvm/backup/pvg001
Couldn't find device with uuid FgIFUZ-Oehy-e5LR-9Xel-eEp1-T07y-L6yh5d.
Physical volume "/dev/sdb9" successfully created
[root@Moni ~]# pvs
WARNING: Volume Group pvg001 is not consistent
PV VG Fmt Attr PSize PFree
/dev/sdb7 pvg001 lvm2 a-- 2.00g 0
/dev/sdb8 pvg001 lvm2 a-- 2.00g 1.50g
/dev/sdb9 pvg001 lvm2 a-- 2.00g 0

可以看到sdb6已经被sdb9替换,而/devsdb6已经不再是一块物理卷;

然后我在修复一下卷组便可以成功启动了(本地的模拟案例也就结束了,你会发现丢失的数据并没有回来

[root@Moni ~]# vgcfgrestore pvg001
Restored volume group pvg001
[root@Moni ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb7 pvg001 lvm2 a-- 2.00g 0
/dev/sdb8 pvg001 lvm2 a-- 2.00g 1.50g
/dev/sdb9 pvg001 lvm2 a-- 2.00g 0
[root@Moni ~]# vgchange -ay pvg001
1 logical volume(s) in volume group "pvg001" now active

但事实上,真实环境中,有可能还会报错:metadata信息不一致

这是因为,你吧sdb6更换成sdb9,但是/etc/lvm/backup的文件可能还没有更新,这个时候可以选择重启一下操作系统

如果是磁盘坏道引起的文件系统损坏,做了上面处理后,我们是可以简单的修复一下的:

使用badblocks、e2fsck命令扫描逻辑卷文件系统,并添加坏道列表;

可参考文章(最下面):【linux系统命令④】、文件系统

另外有意思的是,当你想从vg中剔除一个pv时,当逻辑卷的空间大于剩余卷组的空间时,是无法剔除的,所以需要你先添加一块新的pv在做剔除处理;

[root@Moni ~]# vgreduce pvg001 /dev/sdb6
Physical volume "/dev/sdb6" still in use

最后,建议如果能有效管理的话,可以把pv创建小一点,并分布在多个磁盘上,创建逻辑卷时指定pv,当然最重要的是做镜像或快照,及时备份啦!

⑦、lvm创建Raid逻辑卷-(硬盘损坏灾难恢复):  

上面说到使用镜像逻辑卷可以实现灾难恢复,还说到镜像逻辑卷就好比raid1的阵列;

事实上除了硬件和软件raid外,lvm也提供了一种raid级别的逻辑卷。

同样,我们把组建raid逻辑卷的pv分别选取在不同物理磁盘上,便可以实现避免单一磁盘物理故障后的灾难;

首先我准备了一个11g左右的卷组,包含了6个pv

[root@Moni ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb7 pvg001 lvm2 a-- 2.00g 332.00m
/dev/sdb8 pvg001 lvm2 a-- 2.00g 332.00m
/dev/sdb9 pvg001 lvm2 a-- 2.00g 332.00m
/dev/sdc5 pvg001 lvm2 a-- 2.00g 2.00g
/dev/sdc6 pvg001 lvm2 a-- 2.00g 332.00m
/dev/sdc7 pvg001 lvm2 a-- 2.00g 2.00g
[root@Moni ~]# vgs
VG #PV #LV #SN Attr VSize VFree
pvg001 6 1 0 wz--n- 11.98g 5.29g

现在我们创建一个raid5的逻辑卷:

[root@Moni ~]# lvcreate --type raid5 -L 5G -i 3 -I 64 -n lv_raid5 pvg001
Rounding size (1280 extents) up to stripe boundary size (1281 extents).
Logical volume "lv_raid5" created
[root@Moni ~]# lvs -a -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
lv_raid5 pvg001 rwi-a-r--- 5.00g 100.00 lv_raid5_rimage_0(0),lv_raid5_rimage_1(0),lv_raid5_rimage_2(0),lv_raid5_rimage_3(0)
[lv_raid5_rimage_0] pvg001 iwi-aor--- 1.67g /dev/sdb9(1)
[lv_raid5_rimage_1] pvg001 iwi-aor--- 1.67g /dev/sdb7(1)
[lv_raid5_rimage_2] pvg001 iwi-aor--- 1.67g /dev/sdb8(1)
[lv_raid5_rimage_3] pvg001 iwi-aor--- 1.67g /dev/sdc6(1)
[lv_raid5_rmeta_0] pvg001 ewi-aor--- 4.00m /dev/sdb9(0)
[lv_raid5_rmeta_1] pvg001 ewi-aor--- 4.00m /dev/sdb7(0)
[lv_raid5_rmeta_2] pvg001 ewi-aor--- 4.00m /dev/sdb8(0)
[lv_raid5_rmeta_3] pvg001 ewi-aor--- 4.00m /dev/sdc6(0)

你会发现lv_raid5这个5G逻辑卷,大小被自动均分到四块物理卷上,事实上是三块物理卷,有一块是作为奇偶校验驱动器,man手册是这么说的

另外,参数”-I 64″代表的是Strip Size(条带深度),类似于格式化文件系统的分配单元大小吧;

strip size是指在阵列的磁盘集中的单块磁盘上,从条带起始位置开始读/写所允许的最大数据量。

Strip Size越大,顺序读写性能越好,但IOPS越低; Strip Size越小,IOPS越高,随机读写性能越好。并出于性能考虑,建议符合2^N这个规则;

同理,strip width表示阵列磁盘集中用于保存数据的磁盘(非冗余目的磁盘)数量。比如Raid 5中,Stripe Width为4,也建议符合2^N规则;

另外,和快照逻辑卷一样,raid逻辑卷也会默认创建对应的4Mrmeta逻辑卷;

像创建快照逻辑卷类似,也可让raid5使用整个卷组剩余空间的百分比;

[root@Moni ~]# lvcreate --type raid5 -l 100%FREE -n lv-raid5 pvg001

此外还可以创建raid1、rad10、raid6:

[root@Moni ~]# lvcreate --type raid1 -L 2G -n lv_raid1 pvg001
Logical volume "lv_raid1" created
[root@Moni ~]# lvcreate --type raid10 -L 100M -i 2 -m 1 -n lv-raid10 pvg001
Using default stripesize 64.00 KiB
Rounding size (25 extents) up to stripe boundary size (26 extents).
Logical volume "lv-raid10" created
[root@Moni ~]# lvcreate --type raid6 -L 100M -i 5 -n lv-raid6 pvg001
Using default stripesize 64.00 KiB
Insufficient suitable allocatable extents for logical volume lv-raid6: 30 more required

状态如下:

[root@Moni ~]# lvs -a -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
<lv-raid10 pvg001 rwi-a-r--- 104.00m 100.00 lv-raid10_rimage_0(0),lv-raid10_rimage_1(0),lv-raid10_rimage_2(0),lv-raid10_rimage_3(0)>
[lv-raid10_rimage_0] pvg001 iwi-aor--- 52.00m /dev/sdb9(456)
[lv-raid10_rimage_1] pvg001 iwi-aor--- 52.00m /dev/sdb7(456)
[lv-raid10_rimage_2] pvg001 iwi-aor--- 52.00m /dev/sdb8(429)
[lv-raid10_rimage_3] pvg001 iwi-aor--- 52.00m /dev/sdc6(429)
[lv-raid10_rmeta_0] pvg001 ewi-aor--- 4.00m /dev/sdb9(455)
[lv-raid10_rmeta_1] pvg001 ewi-aor--- 4.00m /dev/sdb7(455)
[lv-raid10_rmeta_2] pvg001 ewi-aor--- 4.00m /dev/sdb8(428)
[lv-raid10_rmeta_3] pvg001 ewi-aor--- 4.00m /dev/sdc6(428)
<lv_raid1 pvg001 rwi-a-r--- 2.10g 100.00 lv_raid1_rimage_0(0),lv_raid1_rimage_1(0) >
[lv_raid1_rimage_0] pvg001 iwi-aor--- 2.10g /dev/sdc7(1)
[lv_raid1_rimage_0] pvg001 iwi-aor--- 2.10g /dev/sdb9(428)
[lv_raid1_rimage_1] pvg001 iwi-aor--- 2.10g /dev/sdc5(1)
[lv_raid1_rimage_1] pvg001 iwi-aor--- 2.10g /dev/sdb7(428)
[lv_raid1_rmeta_0] pvg001 ewi-aor--- 4.00m /dev/sdc7(0)
[lv_raid1_rmeta_1] pvg001 ewi-aor--- 4.00m /dev/sdc5(0)
<lv_raid5 pvg001 rwi-a-r--- 5.00g 100.00 lv_raid5_rimage_0(0),lv_raid5_rimage_1(0),lv_raid5_rimage_2(0),lv_raid5_rimage_3(0) >
[lv_raid5_rimage_0] pvg001 iwi-aor--- 1.67g /dev/sdb9(1)
[lv_raid5_rimage_1] pvg001 iwi-aor--- 1.67g /dev/sdb7(1)
[lv_raid5_rimage_2] pvg001 iwi-aor--- 1.67g /dev/sdb8(1)
[lv_raid5_rimage_3] pvg001 iwi-aor--- 1.67g /dev/sdc6(1)
[lv_raid5_rmeta_0] pvg001 ewi-aor--- 4.00m /dev/sdb9(0)
[lv_raid5_rmeta_1] pvg001 ewi-aor--- 4.00m /dev/sdb7(0)
[lv_raid5_rmeta_2] pvg001 ewi-aor--- 4.00m /dev/sdb8(0)
[lv_raid5_rmeta_3] pvg001 ewi-aor--- 4.00m /dev/sdc6(0)
思考·总结

lvm-raid无法更改减小空间:Unable to reduce RAID LV – operation not implemented.

但是可以扩容:lvextend -L +100m /dev/pvg001/lv_raid1

其中raid1使用三块pv、raid5/raid4使用四块pv、raid6使用5块pv,是不是和物理阵列raid有点不一样;

基于raid的逻辑卷恢复,参照镜像和快照逻辑卷操作吧,有兴趣的朋友自行研究一下;

下面是找到的lvm-raid的标准参数:

raid0, raid1, raid4, raid5, raid6, raid10.

lvcreate –type raid0 [–stripes Number –stripesize Size] VG [PVs]

lvcreate –type raid1 [–mirrors Number] VG [PVs]

lvcreate –type raid4 [–stripes Number –stripesize Size] VG [PVs]

lvcreate –type raid5 [–stripes Number –stripesize Size] VG [PVs]

lvcreate –type raid6 [–stripes Number –stripesize Size] VG [PVs]

lvcreate –type raid10 [–mirrors NumberMirrors] [–stripes NumberStripes –stripesize SizeVG [PVs]

其中–stripes可以用“-i”代替、–stripesize可以用“-I”代替、–mirrors可以用“-m”代替;

pv使用数量至少是:raid1:2、raid4:3、raid5:3、raid6:5、raid10:4;

stripes至少是:raid4:2、raid5:2、raid6:3、raid10:4;

最后扩展一下mdadm,创建软raid基本操作:

fdisk /dev/sdc (把sdc6-8分区类型更改成raid分区即:fd)
mdadm --create /dev/raid5 --level=5 --raid-devices=3 /dev/sdc6 /dev/sdc7 /dev/sdc8
mkfs.ext4 /dev/raid5
(把raid5卷加入md启动列表)
mdadm --detail --scan >> /etc/mdadm.conf
cat /proc/mdstat (查看raid5信息)

如果raid5有硬盘损坏,如何更换?

mdadm /dev/raid5 --fail /dev/sdc6 (首先让坏磁盘分区在raid中失效)
mdadm /dev/raid5 --remove /dev/sdc6 (从raid中剔除损坏磁盘分区)
mdadm /dev/raid5 -add /dev/sdc9 (添加一个好的新磁盘分区,分区类型为raid,大小和损坏分区大小相同)

所以,创建软raid,建议一个磁盘一个分区,或是raid组成分区分布在不同的磁盘上;

第三节、LVM的存储资源池(存储虚拟化)  

这算是一个扩展内容,普通的运维岗位很难接触到它,博主也是一次偶然机会,一个客户朋友装了proxmox虚拟化系统,结果虚拟宿主机系统挂了,但里面跑的虚拟机,数据如何取出?当时把装有虚拟化系统的物理磁盘接入到另外一台pc上,但系统识别了逻辑卷,却无法生成对应的设备文件,也就无法挂载查看,而且有个逻辑卷,还被制作成虚拟磁盘设备文件,被识别成两个虚拟分区,也就是里面跑的那个虚拟机的系统分区和数据分区,当然这个就涉及到虚拟化的了,无奈博主眼力有限,想了不少方法,都没成功挂载;我们先来看一下LVM存储资源池以及虚拟机的虚拟磁盘!

[root@Moni ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sr0 
sda 
├─sda1 ext4 74d0f4e9-a559-458f-8bce-307cd57ab975 /boot
└─sda2 LVM2_member              hQAliU-vJ6v-d82t-fKpv-jc0u-Hws3-udZysD
 ├─VolGroup-lv_root (dm-0) ext4 7f526517-f48d-4026-b338-9bcbc0048dd3 /
 └─VolGroup-lv_swap (dm-1) swap 85b568bd-02f6-4949-981b-a2f3417108ca [SWAP]
sdb <--注意sdb磁盘的逻辑卷,其中proxmox-data-tpool就是资源池,有“tmeta”“tdata”-->
└─sdb1 
└─sdb2 vfat                     B166-BF10        /boot/efi
└─sdb3 LVM2_member              kFdvyw-3UYL-LAzy-ZxGw-Fs6O-G5gx-eatgdG
 ├─proxmox-swap    swap         7f9f1d3d-219c-463e-a4cf-8619-5ff0da69faf7 [SWAP]
 ├─proxmox-root    ext4         bf074bb0-4e1b-410a-8619-5ff0da69faf7      /
 ├─proxmox-data-tmeta
 ├└─proxmox-data-tpool
 ├  ├─proxmox-data
 ├  ├─proxmox-vm--100--disk--1 <--这就是里面那个虚拟机的虚拟磁盘->
 └—proxmox-data-tdata
  └─proxmox-data-tpool
     ├─proxmox-data
    └─proxmox-vm--100--disk--1

我们可以使用fdisk、sfdisk、cffdisk都可以查看那个虚拟机的虚拟磁盘上的两个分区:

[root@Moni ~]# sfdisk -l
......
Device                                         Boot   Start        End     Sectors   Size  Id  Type
/dev/mapper/proxmox-vm--100--disk--1--part1    *       2048    2099199     2097152     1G  83  Linux
/dev/mapper/proxmox-vm--100--disk--1--part2         2099200  134217727   132118528    63G  8e  Linux LVM
<--看到没有这个逻辑卷是包含两个分区的虚拟磁盘,并且第二个又是一个LVM的逻辑卷,所以虚拟机的真实数据应该就在这个上面-->

看不懂了吧,不过今天要说的是,其底层采用的LVM存储资源池,既然遇到了,索性简单研究一下它!

不过在研究lvm的storage pool时,意外发现lvm的精简置备逻辑卷,先来看一下吧!  

[root@Moni ~]# lvcreate -i 2 -I 64 -c 256 -L 100M -T pvg001/pool -V 10G --name thin-lv01
Logical volume "lvol0" created
Rounding size (25 extents) up to stripe boundary size (26 extents).
Logical volume "thin-lv01" created
[root@Moni ~]# lvs -a -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
pool pvg001 twi-a-tz------------- 104.00m 0.00 0.98 pool_tdata(0)
[pool_tdata] pvg001 Twi-ao---- 104.00m /dev/sdb9(1),/dev/sdb7(0)
[pool_tmeta] pvg001 ewi-ao---- 4.00m /dev/sdc5(0)
thin-lv01 pvg001 Vwi-a-tz------- 10.00g pool 0.00

如上创建一个lvm类型的使用两条pv、条带深度为64kb且superblock大小为256kb;

配置瘦空间10gb实际使用大小100Mb的精简资源池,也叫精简置备;

玩过虚拟机的朋友应该知道,精简置备、厚置备延迟置零、厚置备置零的虚拟磁盘类型;

今天我们只说说这个精简置备的逻辑卷,打个摆宴的比方就是,来了多少客人,开多少桌酒席,每次来新客人,就重新划分空间,当然最多就是酒楼摆满了桌椅;

所以说那10g就是你画的最大地盘,100m呢就是预设的最小的真实使用空间“pool-tdata”;是不是很省空间呢;

好了废话不多少,事实上,上面讲的精简置备逻辑卷和我们今天将的lvm的storage pool并没有啥关系;

lvm 的storage pool 存储资源池案例,应用于存储虚拟化:  

如上面案例中proxmox虚拟化系统里查到的逻辑卷,实际上就是promox中kvm虚拟机的数据盘;

下面就针对kvm虚拟化应用,lvm的storage pool存储资源池,搞一下小小的研究:

事实上,kvm使用的存储虚拟化,包括目录类型的、lvm类型、还有其他类型的storage pool;

其中lvm类型的storage pool 可以把pool的vg中的lv作为虚拟磁盘分配给虚拟机使用,也可以作为普通的逻辑卷供宿主机本地系统使用;

不过lv没有磁盘的mbr引导几率,所以不能作为虚拟启动盘,只能作为数据盘使用;

如此,我们把宿主机中的vg配置成storage pool,pool中创建的lv就是虚拟机的虚拟磁盘;

①、首先,在宿主机上创建一个容量为10g的vg,命名为lvmpool:

[root@Moni ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdc5 lvm2 --- 2.00g 2.00g
/dev/sdc6 lvm2 --- 2.00g 2.00g
/dev/sdc7 lvm2 --- 2.00g 2.00g
[root@Moni ~]# vgcreate lvmpool /dev/sdc5 /dev/sdc6 /dev/sdc7
Volume group "lvmpool" successfully created
[root@Moni ~]# vgs
VG #PV #LV #SN Attr VSize VFree
lvmpool 3 0 0 wz--n- 5.99g 5.99g

②、创建一个storage pool的定义文件/etc/libvirt/storage/lvmpool.xml:

[root@Moni ~]# vim  /etc/libvirt/storage/lvmpool.xml
<pool type='logical'>
<name>lvmpool</name>
<source>
<name>lvmpool</name>
<format type='lvm2' />
</source>
<target>
<path>/dev/lvmpool</path>
</target>
</pool>

③、通过“virsh”命令来创建对应的新的storage pool “lvmpool”:

[root@Moni ~]# virsh pool-list --all
错误:Failed to reconnect to the hypervisor
错误:无效的连接
错误:内部错误 Unable to locate libvirtd daemon in /usr/sbin (to override, set $LIBVIRTD_PATH to the name of the libvirtd binary)

这是因为libvirtd相关的软件包没有安装齐全或错误安装,可以“yum install libvirt* -y”安装;

[root@Moni ~]# virsh pool-define /etc/libvirt/storage/lvmpool.xml
错误:Failed to reconnect to the hypervisor
错误:无效的连接
错误:Failed to connect socket to '/var/run/libvirt/libvirt-sock': 没有那个文件或目录

这是因为libvirtd服务没有启动或没有正常运行;

[root@Moni ~]# service libvirtd start
启动 libvirtd 守护进程: [确定]
[root@Moni ~]# virsh pool-define /etc/libvirt/storage/lvmpool.xml
在 lvmpool 中定义池 /etc/libvirt/storage/lvmpool.xml
[root@Moni ~]# virsh pool-list --all
名称 状态 自动开始
-----------------------------------------
lvmpool 不活跃 no

启用storage pool vg 资源池 “lvmpool”

[root@Moni ~]# virsh pool-start lvmpool
池 lvmpool 已启动
[root@Moni ~]# virsh pool-list --all
名称        状态    自动开始
-----------------------------------------
lvmpool 活动    no

开启资源池自动启动:

[root@Moni libvirt]# virsh pool-autostart lvmpool
池 lvmpool 标记为自动启动

④、然后在此vg上创建lv,也就是在池中创建可以供虚拟机直接使用的虚拟磁盘:

显然使用普通lvcreate可以创建给本地系统使用,但是不适用于虚拟化使用:

[root@Moni ~]# virsh pool-info lvmpool
名称: lvmpool
UUID: fc378f1c-f3da-0d90-46b6-ee044e6054cb
状态: running
Persistent: yes
自动启动: no
容量: 5.99 GiB
分配: 0.00
可用: 5.99 GiB
[root@Moni ~]# virsh vol-create-as lvmpool kvm001.img 200M --format qcow2
创建卷 kvm001.img
[root@Moni ~]# virsh vol-list lvmpool
名称 路径
-----------------------------------------
kvm001.img /dev/lvmpool/kvm001.img

可以看到创建的虚拟磁盘卷kvm001.img的路径和lvmpool卷组下的逻辑卷lv的路径是一样的;

⑤、最后我们查看一下lv的状态,并删除创建的卷和资源池:

[root@Moni ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
kvm001.img lvmpool -wi-a----- 200.00m
[root@Moni ~]# lsblk -f
sdc
├─sdc1
├─sdc5 LVM2_member 6wLnrX-r8v3-dg1S-yGN7-NiJp-5sS0-yz4PCI
│ └─lvmpool-kvm001.img (dm-3)
├─sdc6 LVM2_member z9M2S4-fQnK-5kY9-M5eB-ZNgk-kf2h-wGu0GF
└─sdc7 LVM2_member zQx7gJ-GD0N-q76c-m7x2-sd5t-tFCh-tnzNya

删除卷和池怎么操作:

[root@Moni ~]# virsh --voldelete /dev/lvmpool/kvm001.img
[root@Moni ~]# virsh pool-destroy lvmpool
销毁池 lvmpool
[root@Moni ~]# virsh pool-delete lvmpool
池 lvmpool 被删除
思考·总结

到这里,便可以在kvm虚拟化管理工具窗口,创建虚拟机,使用此逻辑卷作为虚拟的数据磁盘了;

事实上,安装了类似kvm虚拟化系统后,使用其提供的管理窗口,就可以图形化创建资源池和作为虚拟磁盘了;

当然也可以直接使用命令创建虚拟机,包括上面创建资源池等;想了解用命令配置虚拟化的更多知识,可以尝试手工配置下linux的kvm虚拟化服务;

案例中是直接基于xml文件创建的storage pool资源池,也可以直接使用命令创建基于文件夹的存储池,不过这里也不做演示了,祝你学习愉快;

(好的就分享到这里,如果您有高见或好的分享,记得留言哦!)


原创文章,转载请注明:转自于公牛博客

本文链接地址:【linux系统命令⑤】、LVM逻辑卷管理

11
祝福我们的祖国繁荣昌盛
  • 请尽情挥洒您的笔墨!

    欢迎来到公牛博客更多分享更多精彩记录美丽点亮生活

    公牛博客·统计碑运行:2847 D
    博文:213 P
    评论:1872 S