> 文章列表 > LVM逻辑卷管理

LVM逻辑卷管理

LVM逻辑卷管理

目录

  • 一、LVM简介
    • 1、逻辑卷管理磁盘的优点
    • 2、缺陷
    • 3、LVM概述图
  • 二、LVM的使用
    • 1、创建逻辑卷
    • 2、使用逻辑卷
    • 3、删除逻辑卷
    • 4、LVM扩容
    • 5、LVM缩容
  • 三、Snapshot(快照功能)
    • 1、LVM-snapshot简介
    • 2、利用snapshot做备份(LV快照)
  • 四、LVM数据迁移
    • 1、源设备操作
    • 2、目标设备操作
  • 五、总结

一、LVM简介

LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的存储卷,在存储卷上建立文件系统。LVM不局限与物理磁盘分区划分。

1、逻辑卷管理磁盘的优点

Linux的LVM非常强大,可以在生产运行系统上面直接在线扩展硬盘分区,可以把分区umount以后收缩分区大小,还可以在系统运行过程中把一个分区从一块硬盘搬到另一块硬盘上面去等等,而且这一切都可以在一个繁忙运行的系统上面直接操作,不会对你的系统运行产生任何影响,很安全。

2、缺陷

LVM使用有局限性。虽然能很方便的扩容和缩容磁盘的空间(扩容磁盘大小,文件不丢失),但是一旦出现问题,数据丢失,想要恢复数据就有点困难。

3、LVM概述图

LVM逻辑卷管理

  1. pv:pv 命令用于显示物理卷(Physical Volume)的信息,包括物理卷的名称、大小、空闲空间、占用情况等。物理卷是 Linux LVM(Logical Volume Manager,逻辑卷管理器)中的一种基本概念,用于管理硬盘驱动器或分区。
  2. vg:vg 命令用于显示卷组(Volume Group)的信息,包括卷组的名称、物理卷的数量、逻辑卷的数量、占用情况等。卷组是 LVM 中的逻辑概念,用于将多个物理卷组合成一个逻辑单元,从而提供更灵活的存储管理。
  3. lv:lv 命令用于显示逻辑卷(Logical Volume)的信息,包括逻辑卷的名称、卷组名称、大小、挂载点、文件系统类型等。逻辑卷是 LVM 中的最终逻辑单元,用于将卷组中的存储空间划分为逻辑单元,供操作系统使用

二、LVM的使用

1、创建逻辑卷

当前环境

NAME            MAJ:MIN 	RM  SIZE RO 	TYPE 	MOUNTPOINT
sda			8:0    0   10G  0 	disk 
├─sda1		8:1    0    1G  0 	part	/boot
└─sda2		8:2    0    9G  0 	part ├─centos-root	253:0  0    7G  0	lvm  	/└─centos-swap	253:1  0    2G  0 	lvm  	[SWAP]
Sdb			8:16   0   20G  0 	disk 
Sdc			8:32   0   30G  0 	disk 

首先是要将我们的物理硬盘格式化成PV,然后将多个PV加入到创建好的VG中,最后通过VG创建我们的LV。所以我们第一步就是将我们的物理硬盘格式化成PV(物理卷)。
将物理硬盘格式化成PV(物理卷)

[root@lvm ~]# fdisk -l
Disk /dev/sda: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000b88e0Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    20971519     9436160   8e  Linux LVMDisk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytesDisk /dev/sdc: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytesDisk /dev/mapper/centos-root: 7511 MB, 7511998464 bytes, 14671872 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytesDisk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

根据上面所示,我们先将 /dev/sdb、 /dev/sdc 两块硬盘格式化成PV

[root@lvm ~]# pvcreate /dev/sdb /dev/sdcPhysical volume "/dev/sdb" successfully created.Physical volume "/dev/sdc" successfully created.

创建完PV以后,我们可以使用pvdisplay(显示详细信息)、pvs命令来查看当前pv的信息

[root@lvm ~]# pvdisplay --- Physical volume ---PV Name               /dev/sda2VG Name               centosPV Size               <9.00 GiB / not usable 3.00 MiBAllocatable           yes (but full)PE Size               4.00 MiBTotal PE              2303Free PE               0Allocated PE          2303PV UUID               c4T0zy-4Bhj-dAfK-4CiU-nezj-cz02-NFFsep"/dev/sdc" is a new physical volume of "30.00 GiB"--- NEW Physical volume ---PV Name               /dev/sdcVG Name               PV Size               30.00 GiBAllocatable           NOPE Size               0   Total PE              0Free PE               0Allocated PE          0PV UUID               eiFpcS-mfqo-0MLf-Qqg8-yfvZ-Imcl-HmH0SD"/dev/sdb" is a new physical volume of "20.00 GiB"--- NEW Physical volume ---PV Name               /dev/sdbVG Name               PV Size               20.00 GiBAllocatable           NOPE Size               0   Total PE              0Free PE               0Allocated PE          0PV UUID               J90cm2-oKZC-aOmh-sfAo-vbtL-WMxj-yeXBYN

通过这两个命令我们可以看到我们已经创建好的PV的信息,两个PV一个是20G一个是30G,目前还没有使用。(我们可能用不到这么多,先放着吧)
创建卷组(VG),并将PV加入到卷组中  
通过 vgcreate 命令,在创建完PV以后,这时候我们需要创建一个VG,然后将我们的PV都加入到这个卷组当中,在创建卷组时要给该卷组起一个名字。

[root@lvm ~]# vgcreate john /dev/sdb /dev/sdc	

在到已有的VG添加一个新的LV的话,直接扩容原来的VG卷

vgextend centosVolume group "john" successfully created

同样,在创建好VG以后,我们也可以使用 vgdisplay 或者 vgs 命来来查看VG的信息

[root@lvm ~]# vgdisplay --- Volume group ---VG Name               centosSystem ID             Format                lvm2Metadata Areas        1Metadata Sequence No  3VG Access             read/writeVG Status             resizableMAX LV                0Cur LV                2Open LV               2Max PV                0Cur PV                1Act PV                1VG Size               <9.00 GiBPE Size               4.00 MiBTotal PE              2303Alloc PE / Size       2303 / <9.00 GiBFree  PE / Size       0 / 0   VG UUID               HEm8Jc-Zqqd-F0U2-ESI0-wOjd-TRu2-NoEVxl--- Volume group ---VG Name               zhouSystem ID             Format                lvm2Metadata Areas        2Metadata Sequence No  1VG Access             read/writeVG Status             resizableMAX LV                0Cur LV                0Open LV               0Max PV                0Cur PV                2Act PV                2VG Size               49.99 GiBPE Size               4.00 MiBTotal PE              12798Alloc PE / Size       0 / 0   Free  PE / Size       12798 / 49.99 GiBVG UUID               aGHDlM-HUVG-woEm-ZJes-T3bO-cdMw-0yADbR
[root@lvm ~]# vgsVG     #PV #LV #SN Attr   VSize  VFree centos   1   2   0 wz--n- <9.00g     0 zhou     2   0   0 wz--n- 49.99g 49.99g

基于卷组(VG)创建逻辑卷(LV)  
通过 lvcreate 命令,因为创建好的PV、VG都是底层的东西,我们上层使用的是逻辑卷,所以我们要基于VG创建我们的逻辑卷才行

 [root@lvm ~]# lvcreate -n lv0 -L 2G john[root@lvm ~] lvcreate -l 100%free lcp -n redhat 

LVM逻辑卷管理
意思:在centos的vg卷中将全部的给到data的lv中

  Logical volume "lv0" created.

通过 lvcreate 命令基于VG创建好我们的逻辑卷,名字为lv0,大小为2G,同样我们可以使用 lvdisplay 或者 lvs 命令来查看创建好的逻辑卷的信息。

[root@lvm ~]# lvdisplay --- Logical volume ---LV Path                /dev/centos/swapLV Name                swapVG Name                centosLV UUID                tAe9i5-4Nx6-XvIn-t2Nf-DA8T-KiKX-UjJ5ifLV Write Access        read/writeLV Creation host, time localhost, 2018-08-03 11:26:07 -0400LV Status              available# open                 2LV Size                2.00 GiBCurrent LE             512Segments               1Allocation             inheritRead ahead sectors     auto- currently set to     8192Block device           253:1--- Logical volume ---LV Path                /dev/centos/rootLV Name                rootVG Name                centosLV UUID                hZpwip-88Np-2tcn-pOnN-3hfk-60uI-VQDDRqLV Write Access        read/writeLV Creation host, time localhost, 2018-08-03 11:26:07 -0400LV Status              available# open                 1LV Size                <7.00 GiBCurrent LE             1791Segments               1Allocation             inheritRead ahead sectors     auto- currently set to     8192Block device           253:0--- Logical volume ---LV Path                /dev/zhou/lv0LV Name                lv0VG Name                johnLV UUID                R9gaGn-oi5b-FNoT-6ojC-sc3S-agK3-Gy93BgLV Write Access        read/writeLV Creation host, time lvm, 2018-08-03 04:21:34 -0400LV Status              available# open                 0LV Size                2.00 GiBCurrent LE             512Segments               1Allocation             inheritRead ahead sectors     auto- currently set to     8192Block device           253:2
[root@lvm ~]# lvsLV   VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertroot centos -wi-ao---- <7.00g                                                    swap centos -wi-ao----  2.00g                                                    lv0  john  -wi-a-----  2.00g

这样子我们的逻辑卷也就已经创建好了,我们这个时候再通过 vgs 还有 pvs 命令查看一下我们的PV与VG的信息

[root@lvm ~]# vgsVG     #PV #LV #SN Attr   VSize  VFree centos   1   2   0 wz--n- <9.00g     0 john     2   1   0 wz--n- 49.99g 47.99g
[root@lvm ~]# pvsPV         VG     Fmt  Attr PSize   PFree  /dev/sda2  centos lvm2 a--   <9.00g      0 /dev/sdb   john   lvm2 a--  <20.00g <18.00g/dev/sdc   john   lvm2 a--  <30.00g <30.00g
我们发现,当我们每创建完一个LV时,VG与PV的信息都是时时在变化的,并且我们创建LV的大小是根据当前VG的大小来决定的,不能超过当前VG的剩余大小。
每创建好一个逻辑卷,都会在 /dev 目录下出现一个以该卷组命名的文件夹,基于该卷组创建的所有的逻辑卷都是存放在这个文件夹下面,我们可以查看一下。
```bash
[root@lvm ~]# ls /dev/john/lv0 
/dev/john/lv0

我们每创建一个新的逻辑卷,该VG目录下都会多出这么一个设备。

2、使用逻辑卷

我们已经创建好了我们的PV、VG以及LV,这时候我们如果要使用逻辑卷,就必须将其格式化成我们需要用的文件系统,并将其挂载起来,然后就可以像使用分区一样去使用逻辑卷了.

[root@lvm ~]# mkfs.xfs /dev/john/lv0 			blkid查看文件类型
meta-data=/dev/john/lv0          isize=512    agcount=4, agsize=131072 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=524288, imaxpct=25=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2=                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

格式化我们的逻辑卷以后,就可以使用 mount 命令将其进行挂载,我们将其挂载到 /mnt 目录下。

[root@lvm ~]# mount /dev/john/lv0 /mnt/

如果新建data要新建一个data目录将逻辑卷挂载在data目录中

[root@lvm ~]# mount /dev/Sentos/data /data/
[root@lvm ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  7.0G  1.2G  5.9G  17% /
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    488M     0  488M   0% /dev/shm
tmpfs                    488M  7.6M  480M   2% /run
tmpfs                    488M     0  488M   0% /sys/fs/cgroup
/dev/sda1               1014M  130M  885M  13% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/mapper/john-lv0     2.0G   33M  2.0G   2% /mnt

逻辑卷挂载完成之后,我们可以像使用其他分区一样在上面进行文件操作了。
挂载好后需要在vim /etc/fstab中写入 然后mount -a看是否报错不报错则成功
最后df -h看一下就可以了

LVM逻辑卷管理
LVM逻辑卷管理

3、删除逻辑卷

我们在创建好逻辑卷后可以通过创建文件系统,挂载逻辑卷来使用它,如果说我们不想用了也可以将其删除掉。
【注意:】对于创建物理卷、创建卷组以及创建逻辑卷我们是有严格顺序的,同样,对于删除逻辑卷、删除卷组以及删除物理卷也是有严格顺序要求的。
1首先将正在使用的逻辑卷卸载掉  通过 umount 命令
2将逻辑卷先删除  通过 lvremove 命令
3删除卷组  通过 vgremove 命令
4最后再来删除我们的物理卷  通过 pvremove 命令

[root@lvm ~]# umount /dev/zhou/lv0 
[root@lvm ~]# lvremove /dev/zhou/lv0
Do you really want to remove active logical volume zhou/lv0? [y/n]: yLogical volume "lv0" successfully removed
[root@lvm ~]# vgremove zhouVolume group "zhou" successfully removed
[root@lvm ~]# pvremove /dev/sdb /dev/sdc Labels on physical volume "/dev/sdb" successfully wiped.Labels on physical volume "/dev/sdc" successfully wiped.

此时我们的刚创建的逻辑卷 lv0,卷组 zhou以及物理卷 /dev/sdb、/dev/sdc 已经从我们当前操作系统上删除掉了,通过 lvs、vgs、pvs命令可以查看一下.

[root@lvm ~]# lvsLV   VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertroot centos -wi-ao---- <7.00g                                                    swap centos -wi-ao----  2.00g                                                    
[root@lvm ~]# vgsVG     #PV #LV #SN Attr   VSize  VFreecentos   1   2   0 wz--n- <9.00g    0 
[root@lvm ~]# pvsPV         VG     Fmt  Attr PSize  PFree/dev/sda2  centos lvm2 a--  <9.00g    0

4、LVM扩容

当前环境

[root@lvm ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   10G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0    9G  0 part ├─centos-root 253:0    0    7G  0 lvm  /└─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0   20G  0 disk 
├─sdb1            8:17   0    2G  0 part 
│ └─vg0-lv0     253:2    0    2G  0 lvm  /lvmtest
├─sdb2            8:18   0    2G  0 part 
│ └─vg1-lv1     253:3    0    2G  0 lvm  /lvmtest1
├─sdb3            8:19   0  512B  0 part 
├─sdb5            8:21   0    5G  0 part 
├─sdb6            8:22   0    5G  0 part 
└─sdb7            8:23   0    6G  0 part 
sdc               8:32   0   30G  0 disk

如上所示,lvmtest为2G以xfs为文件系统的lv挂载点,lvmtest1为2G以ext4为文件系统的lv挂载点
例:对其进行扩展,分别将sdb5扩展到lv0
步骤为:

[root@lvm ~]# pvcreate /dev/sdb5		##a.新建pvPhysical volume "/dev/sdb5" successfully created.
[root@lvm ~]# vgextend vg0 /dev/sdb5		##b.扩容vgVolume group "vg0" successfully extended[root@lvm ~]# lvresize -l +100%FREE /dev/vg0/lv0		 c.扩容lvSize of logical volume vg0/lv0 changed from <2.00 GiB (511 extents) to 6.99 GiB (1790 extents).Logical volume vg0/lv0 successfully resized.
[root@lvm ~]# xfs_growfs /dev/vg0/lv0 		##d.扩展文件系统
meta-data=/dev/mapper/vg0-lv0    isize=512    agcount=4, agsize=130816 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=523264, imaxpct=25=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2=                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 523264 to 1832960
[root@lvm ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   10G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0    9G  0 part ├─centos-root 253:0    0    7G  0 lvm  /└─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0   20G  0 disk 
├─sdb1            8:17   0    2G  0 part 
│ └─vg0-lv0     253:2    0    7G  0 lvm  /lvmtest			##初始环境下此挂载点下的lv为2G
├─sdb2            8:18   0    2G  0 part 
│ └─vg1-lv1     253:3    0    2G  0 lvm  /lvmtest1
├─sdb3            8:19   0  512B  0 part 
├─sdb5            8:21   0    5G  0 part 
│ └─vg0-lv0     253:2    0    7G  0 lvm  /lvmtest
├─sdb6            8:22   0    5G  0 part 
└─sdb7            8:23   0    6G  0 part 
sdc               8:32   0   30G  0 disk 

xfs扩容完成,ext4文件系统请大家自行试验。
LVM逻辑卷管理
LVM逻辑卷管理

5、LVM缩容

当前环境:

[root@lvm ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   10G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0    9G  0 part ├─centos-root 253:0    0    7G  0 lvm  /└─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0   20G  0 disk 
├─sdb1            8:17   0    2G  0 part 
│ └─vg0-lv0     253:2    0    7G  0 lvm  /lvmtest
├─sdb2            8:18   0    2G  0 part 
│ └─vg1-lv1     253:3    0    7G  0 lvm  /lvmtest1
├─sdb3            8:19   0  512B  0 part 
├─sdb5            8:21   0    5G  0 part 
│ └─vg0-lv0     253:2    0    7G  0 lvm  /lvmtest
├─sdb6            8:22   0    5G  0 part 
│ └─vg1-lv1     253:3    0    7G  0 lvm  /lvmtest1
└─sdb7            8:23   0    6G  0 part 
sdc               8:32   0   30G  0 disk

如上所示,在此对lv0所在挂载点lvmtest进行缩容(缩容只能在实际容量小于缩容后的容量的情况下进行,并且一般不支持在线缩容)

[root@lvm ~]# umount /dev/vg1/lv1		##a.卸载文件系统
[root@lvm ~]# e2fsck -f /dev/vg1/lv1 		##b.执行磁盘检查
e2fsck 1.42.9 (28-Dec-2013)
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/458752 files (0.0% non-contiguous), 39295/1833984 blocks
[root@lvm ~]# resize2fs /dev/vg1/lv1 2G		##c.缩小文件系统容量
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/vg1/lv1 to 524288 (4k) blocks.
The filesystem on /dev/vg1/lv1 is now 524288 blocks long.
[root@lvm ~]# lvresize -L 2G /dev/vg1/lv1		##d.缩小lv容量(相当于lvreduce -L -5G /dev/vg1/lv1)WARNING: Reducing active logical volume to 2.00 GiB.THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg1/lv1? [y/n]: ySize of logical volume vg1/lv1 changed from <7.00 GiB (3582 extents) to 2.00 GiB (1024 extents).Logical volume vg1/lv1 successfully resized.
[root@lvm ~]# lvdisplay /dev/vg1/lv1		##e.查看缩容后的lv--- Logical volume ---LV Path                /dev/vg1/lv1LV Name                lv1VG Name                vg1LV UUID                wgIeIU-Wv0I-9eo5-Y4cS-kNHB-mz3D-TbblzuLV Write Access        read/writeLV Creation host, time lvm, 2018-08-06 04:07:24 -0400LV Status              available# open                 0LV Size                2.00 GiBCurrent LE             1024Segments               2Allocation             inheritRead ahead sectors     auto- currently set to     8192Block device           253:3

上述缩容方案只对ext4有效,在缩容前,最好执行备份操作(备份文件系统,并非备份逻辑卷),以免数据丢失。缩容步骤可以改为d-b-c,先缩容lv,再缩容文件系统。xfs文件系统缩容,不支持免格式化,如实在需要缩容xfs文件系统,相当于重新构造。

三、Snapshot(快照功能)

1、LVM-snapshot简介

在正常系统运行的情况下,文件系统内部存在着数据读写,意味着系统内的数据大多数时间处于一个非静止状态,如果此时进行文件系统备份(诸如:xfsdump/xfsrestore、Rsnapshot、dump)。在此只介绍CoW(copy-on-write):当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data)。创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里,这就是CoW(相当于卷的符号连接symbol link),也可以被挂载使用。
LV的snapshot只能对于LVM生效,对文件系统是不生效的,当创建lv快照分配一部分空间给它之后,它开始记录原始卷数据写入情况,当lv快照空间被用完之后,这个lv快照会立即被释放,从而无法使用。所以,非常重要的一点,一定要在snapshot的生命周期里,做完你需要做得事情。当然,如果你的lv快照大小和原始卷一样大,甚至还要大,那它的就是“天地同寿”了。

2、利用snapshot做备份(LV快照)

[root@lvm ~]# lvcreate -L 200M -s -n lvsnapshot /dev/vg1/lv1 【注意:snapshot会占用lv所在vg容量,创建之前确认其空间足够】Logical volume "lvsnapshot" created.		##1,创建一个snapshot做lv1的快照
[root@lvm ~]# lvdisplay /dev/vg1/lv1 		##2,查看snapshot状态--- Logical volume ---LV Path                /dev/vg1/lv1LV Name                lv1VG Name                vg1LV UUID                wgIeIU-Wv0I-9eo5-Y4cS-kNHB-mz3D-TbblzuLV Write Access        read/writeLV Creation host, time lvm, 2018-08-06 04:07:24 -0400LV snapshot status     source oflvsnapshot [active]LV Status              available# open                 1LV Size                <2 GiBCurrent LE             1996Segments               2Allocation             inheritRead ahead sectors     auto- currently set to     8192Block device           253:3
[root@lvm ~]# lvs /dev/vg1/lvsnapshot 	##3,查看snapshot的利用率LV         VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertlvsnapshot vg1 swi-a-s--- 200.00m      lv1    0.01                                   
[root@lvm ~]# cd /lvmtest1/		##4,模拟snapshot利用率增加的情景
[root@lvm lvmtest1]# touch testfile
[root@lvm lvmtest1]# dd if=/dev/zero of=testfile bs=1 count=20
20+0 records in
20+0 records out
20 bytes (20 B) copied, 0.072071 s, 0.3 kB/s
[root@lvm lvmtest1]# lvs /dev/vg1/lvsnapshot LV         VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertlvsnapshot vg1 swi-a-s--- 200.00m      lv1    0.04                                   
[root@lvm lvmtest1]# dd if=/dev/zero of=testfile bs=1 count=200
200+0 records in
200+0 records out
200 bytes (200 B) copied, 0.000667621 s, 300 kB/s
[root@lvm lvmtest1]# lvs /dev/vg1/lvsnapshot LV         VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertlvsnapshot vg1 swi-a-s--- 200.00m      lv1    0.05                                   
[root@lvm lvmtest1]# dd if=/dev/zero of=testfile bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 9.34816 s, 22.4 MB/s
[root@lvm lvmtest1]# lvs /dev/vg1/lvsnapshot 		##5,这里snapshot的利用率到了100%LV         VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertlvsnapshot vg1 swi-I-s--- 200.00m      lv1    100.00                                 
[root@lvm lvmtest1]# lvdisplay /dev/vg1/lv1 		##6,可以查看到利用率100%后,snapshot变成不可用的状态--- Logical volume ---LV Path                /dev/vg1/lv1LV Name                lv1VG Name                vg1LV UUID                wgIeIU-Wv0I-9eo5-Y4cS-kNHB-mz3D-TbblzuLV Write Access        read/writeLV Creation host, time lvm, 2018-08-06 04:07:24 -0400LV snapshot status     source oflvsnapshot [INACTIVE]LV Status              available# open                 1LV Size                2 GiBCurrent LE             1996Segments               2Allocation             inheritRead ahead sectors     auto- currently set to     8192Block device           253:3
[root@lvm lvmtest1]# lvremove /dev/vg1/lvsnapshot 		##7,对此我们只能删除原始的snapshot后重建
Do you really want to remove active logical volume vg1/lvsnapshot? [y/n]: yLogical volume "lvsnapshot" successfully removed
[root@lvm lvmtest1]# lvcreate -L 2G -s -n lvsnapshot /dev/vg1/lv1 		##8,新建snapshot为2G,与lv容量相同Logical volume "lvsnapshot" created.
[root@lvm lvmtest1]# lvdisplay /dev/vg1/lv1 --- Logical volume ---LV Path                /dev/vg1/lv1LV Name                lv1VG Name                vg1LV UUID                wgIeIU-Wv0I-9eo5-Y4cS-kNHB-mz3D-TbblzuLV Write Access        read/writeLV Creation host, time lvm, 2018-08-06 04:07:24 -0400LV snapshot status     source oflvsnapshot [active]LV Status              available# open                 1LV Size                2 GiBCurrent LE             1996Segments               2Allocation             inheritRead ahead sectors     auto- currently set to     8192Block device           253:3[root@lvm lvmtest1]# dd if=/dev/zero of=testfile bs=1M count=1800
1800+0 records in
1800+0 records out
1887436800 bytes (1.9 GB) copied, 20.1192 s, 93.8 MB/s
[root@lvm lvmtest1]# lvs /dev/vg1/lvsnapshot LV         VG  Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertlvsnapshot vg1 swi-a-s--- 2.00g      lv1    88.25           

当我创建的snapshot大于等于原始卷容量时,将原始卷写满,snapshot也不会到100%,进而就可以随便使用了。

四、LVM数据迁移

LVM迁移是LVM众多优秀特性之一,通过它,我们可以迁移逻辑卷到一个新的磁盘而不会丢失数据,也不用关机操作。该特性的功能是将数据从旧磁盘移动到新磁盘。通常,我们只是在一些磁盘发生错误时,才将数据从一个磁盘迁移到另外一个磁盘存储。

1、源设备操作

[root@lvm lvmtest1]# umount /dev/vg1/lv1 		##卸载lv1
[root@lvm lvmtest1]# vgrename vg1 newvg		##重命名vg,使之不与新设备vg冲突Volume group "vg1" successfully renamed to "newvg"
[root@lvm lvmtest1]# lvrename /dev/newvg/lv1 newlv		##同样重命名lvRenamed "lv0" to "newlv" in volume group "newvg"
[root@lvm lvmtest1]# vgchange -an newvg		##使vg处于不活动状态0 logical volume(s) in volume group "newvg" now active[root@lvm lvmtest1]# lvdisplay --- Logical volume ---LV Path                /dev/newvg/newlvLV Name                newlvVG Name                newvgLV UUID                12CLK9-3E1O-tsWG-y08m-I5Yh-lUtC-as5YQ0LV Write Access        read/writeLV Creation host, time lvm, 2018-08-06 03:49:44 -0400LV Status              NOT available			##vg不活动了lv自然也就不活动了LV Size                6.99 GiBCurrent LE             1790Segments               2Allocation             inheritRead ahead sectors     auto
[root@lvm lvmtest1]# vgexport  newvg			##导出newvg备用Volume group "newvg" successfully exported
[root@lvm lvmtest1]# pvdisplay 			##可以看到两个分区的同一个vg都已经被导出了Physical volume "/dev/sdb1" of volume group "newvg" is exported--- Physical volume ---PV Name               /dev/sdb1VG Name               newvg (exported)PV Size               2.00 GiB / not usable 4.00 MiBAllocatable           yes (but full)PE Size               4.00 MiBTotal PE              511Free PE               0Allocated PE          511PV UUID               SSfIeC-xv8e-pp9M-Kfe9-CEjV-KLUC-BEfGfAPhysical volume "/dev/sdb5" of volume group "newvg" is exported--- Physical volume ---PV Name               /dev/sdb5VG Name               newvg (exported)PV Size               5.00 GiB / not usable 4.00 MiBAllocatable           yes (but full)PE Size               4.00 MiBTotal PE              1279Free PE               0Allocated PE          1279PV UUID               TtbBh1-b6tm-fbEs-w1bI-lyLy-KXBb-A8qsOC

2、目标设备操作

[root@localhost ~]# lsblk			##拆除硬盘,换到目标设备上后(此处为目标设备的分区)
NAME                   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                      8:0    0   10G  0 disk 
├─sda1                   8:1    0    1G  0 part /boot
└─sda2                   8:2    0    9G  0 part ├─centos-root        253:0    0    8G  0 lvm  /└─centos-swap        253:1    0    1G  0 lvm  [SWAP]
sdb                      8:16   0   20G  0 disk 
├─sdb1                   8:17   0    2G  0 part 
├─sdb2                   8:18   0    2G  0 part 
│ └─vg1-lv1-real       253:2    0  3.9G  0 lvm  
│   ├─vg1-lv1          253:3    0  3.9G  0 lvm  
│   └─vg1-lvsnapshot   253:5    0  3.9G  0 lvm  
├─sdb3                   8:19   0    1K  0 part 
├─sdb5                   8:21   0    5G  0 part 
├─sdb6                   8:22   0    5G  0 part 
│ ├─vg1-lv1-real       253:2    0  3.9G  0 lvm  
│ │ ├─vg1-lv1          253:3    0  3.9G  0 lvm  
│ │ └─vg1-lvsnapshot   253:5    0  3.9G  0 lvm  
│ └─vg1-lvsnapshot-cow 253:4    0    2G  0 lvm  
│   └─vg1-lvsnapshot   253:5    0  3.9G  0 lvm  
└─sdb7                   8:23   0    6G  0 part 
[root@localhost ~]# pvscan		##扫描一遍pv,发现exported VGPV /dev/sda2   VG centos          lvm2 [<9.00 GiB / 0    free]PV /dev/sdb1    is in exported VG newvg [<2.00 GiB / 0    free]PV /dev/sdb5    is in exported VG newvg [<5.00 GiB / 0    free]PV /dev/sdb2   VG vg1             lvm2 [<2.00 GiB / 0    free]PV /dev/sdb6   VG vg1             lvm2 [<5.00 GiB / <1.10 GiB free]Total: 5 [22.98 GiB] / in use: 5 [22.98 GiB] / in no VG: 0 [0   ]
[root@localhost ~]# vgscanReading volume groups from cache.Found volume group "centos" using metadata type lvm2Found exported volume group "newvg" using metadata type lvm2Found volume group "vg1" using metadata type lvm2
[root@localhost ~]# vgimport newvg		##加载导出的vgVolume group "newvg" successfully imported
[root@localhost ~]# vgdisplay newvg--- Volume group ---VG Name               newvgSystem ID             Format                lvm2Metadata Areas        2Metadata Sequence No  10VG Access             read/writeVG Status             resizableMAX LV                0Cur LV                1Open LV               0Max PV                0Cur PV                2Act PV                2VG Size               6.99 GiBPE Size               4.00 MiBTotal PE              1790Alloc PE / Size       1790 / 6.99 GiBFree  PE / Size       0 / 0   VG UUID               YCA5jl-VHmW-ikFR-SVML-jjmc-8Wej-ukpkML[root@localhost ~]# vgchange -ay newvg		##激活逻辑卷组1 logical volume(s) in volume group "newvg" now active                                         
[root@localhost ~]# lvdisplay /dev/newvg/newlv--- Logical volume ---LV Path                /dev/newvg/newlvLV Name                newlvVG Name                newvgLV UUID                12CLK9-3E1O-tsWG-y08m-I5Yh-lUtC-as5YQ0LV Write Access        read/writeLV Creation host, time lvm, 2018-08-06 03:49:44 -0400LV Status              available		##其实不难发现,激活vg的同时,lv也已经激活了# open                 0LV Size                6.99 GiBCurrent LE             1790Segments               2Allocation             inheritRead ahead sectors     auto- currently set to     8192Block device           253:6

至此,我们已将原系统的lv迁移到目标系统上了,直接挂载即可使用。数据迁移完成。可以通过迁移有数据的lv来更直观的验证lvm迁移功能。

五、总结

以下是单vg扩容和加盘后扩容的省流版

[root@localhost ~]# pvcreate /dev/nvme0n1 
Physical volume "/dev/nvme0n1" successfully created.[root@localhost ~]# vgcreate john /dev/nvme0n1
Volume group "john" successfully created[root@localhost ~]# lvcreate -n lv0 -L 2G john
WARNING: xfs signature detected on /dev/john/lv0 at offset 0. Wipe it? [y/n]: y
Wiping xfs signature on /dev/john/lv0.
Logical volume "lv0" created.[root@localhost ~]# mkfs.xfs /dev/john/lv0
meta-data=/dev/john/lv0          isize=512    agcount=4, agsize=131072 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=524288, imaxpct=25=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2=                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0[root@localhost ~]# mount /dev/john/lv0  /mnt/
[root@localhost ~]# lsblk
NAME       MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda          8:0    0   45G  0 disk
├─sda1       8:1    0  300M  0 part /boot
├─sda2       8:2    0  3.9G  0 part [SWAP]
└─sda3       8:3    0 35.9G  0 part /
sr0         11:0    1  4.4G  0 rom
nvme0n1    259:0    0    5G  0 disk
└─john-lv0 253:0    0    2G  0 lvm  /mnt
nvme0n2    259:1    0    5G  0 disk
[root@localhost ~]# vgex[root@localhost ~]# lvresize -l +100%free /dev/john/lv0
Size of logical volume john/lv0 changed from 2.00 GiB (512 extents) to <5.00 GiB (1279 extents).
Logical volume john/lv0 successfully resized.[root@localhost ~]# pvcreate /dev/nvme0n2
Physical volume "/dev/nvme0n2" successfully created.[root@localhost ~]# vgextend john /dev/nvme0n2
Volume group "john" successfully extended[root@localhost ~]# lvresize -l +100%free /dev/john/lv0
Size of logical volume john/lv0 changed from <5.00 GiB (1279 extents) to 9.99 GiB (2558 extents).
Logical volume john/lv0 successfully resized.[root@localhost ~]# xfs_growfs /dev/john/lv0
meta-data=/dev/mapper/john-lv0   isize=512    agcount=4, agsize=131072 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=524288, imaxpct=25=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2=                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 524288 to 2619392