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概述图
- pv:pv 命令用于显示物理卷(Physical Volume)的信息,包括物理卷的名称、大小、空闲空间、占用情况等。物理卷是 Linux LVM(Logical Volume Manager,逻辑卷管理器)中的一种基本概念,用于管理硬盘驱动器或分区。
- vg:vg 命令用于显示卷组(Volume Group)的信息,包括卷组的名称、物理卷的数量、逻辑卷的数量、占用情况等。卷组是 LVM 中的逻辑概念,用于将多个物理卷组合成一个逻辑单元,从而提供更灵活的存储管理。
- 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
意思:在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看一下就可以了
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文件系统请大家自行试验。
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