参考资料列表
本文部分资料参考自以下列表
https://www.ibm.com/developerworks/cn/linux/l-lvm2/ 比较详细地描述了Linux 逻辑卷的管理
https://linux.die.net/man/8/lvm Linux LVM2工具手册
本文将从以下几个方面介绍LVM
什么是逻辑卷
逻辑卷的结构
逻辑卷的管理
迁移逻辑卷到新的系统
删除逻辑卷
逻辑卷快照
什么是逻辑卷
逻辑卷管理(LVM)指系统将物理卷管理抽象到更高的层次,常常会形成更简单的管理模式。与物理磁盘和分区不同,逻辑卷展现给我们的是逻辑上的存储结构。LVM 可以将分区和磁盘聚合成一个虚拟磁盘(virtual disk),从而用小的存储空间组成一个统一的大空间。这个虚拟磁盘在 LVM 术语中称为卷组(volume group)。
将众多比较小的物理磁盘设备组织起来创建一个比单个磁盘本身还要大的文件系统,并不是LVM的唯一用途,它还可以
在磁盘列表中添加磁盘和分区,对现有的文件系统进行扩展。
用一个 160GB 磁盘替换两个 80GB 磁盘,而不需要让系统离线,也不需要在磁盘之间手工转移 。
当存储空间远大于我们所需要的空间的时候,我们可以将物理硬盘从磁盘列表中去掉,从而减少存储空间。
使用快照(snapshot)执行一致的备份(本文后面会进一步讨论)
为了理解起来更加的形象,我们来思考这样一个问题,假设我们一共有三个物理硬盘,容量分别是200G,100G,80G,我们如何来创建一个大于300G的文件系统呢?在没有接触到LVM之前,我们恐怕是将这个三个硬盘挂载到系统中,然后进行分区,创建文件系统来使用。比如下图这样。
但是这样的分区模式有些时候是没有办法满足我们的需求的,我们想要的是一个完整的300G的独立文件系统,而此时使用LVM就能够实现这样的设计。
物理磁盘到逻辑的映射
如图所示,我们从逻辑上实现了 创建了一个大于300G的文件系统,而且在用户看来,根本不清楚底层一共有多少个硬盘,只知道有一个文件系统可以用来存储数据。当然,这对用户来说就足够了。具体的实验将在稍后的内容中实现。
逻辑卷的结构
LVM 的组成一共包含三种元素,卷(Volume,物理和逻辑卷,卷组),区段(物理和逻辑区段),设备映射器 。 接下来,我们分别介绍这三种元素各代表什么意思。
卷
Linux LVM 组织为物理卷(PV)、卷组(VG)和逻辑卷(LV)。物理卷 是物理磁盘或物理磁盘分区(比如 /dev/sdb1 或 /dev/sdc)。卷组 是物理卷的集合。卷组 可以在逻辑上划分成多个逻辑卷。
物理磁盘到逻辑卷的映射
卷组是实现将n个PV映射成m个LV的关键。我们可以这样来理解。当我们将多个PV划分到一个卷组中去了之后(也就是VG0),就可以创建多个任意容量的LV(逻辑卷),在这些逻辑卷看来,他们的底层实际上就是一个380G的空间,他们可以自由分配。如图所示,我们在VG0上划分了一个LV0,在LV0和FREE SPACE 看来,VG0就是一个整体,不关心VG0是由多少个PV组合而来。在实际的使用过程中,用户就会将LV0看作一个物理磁盘分区来使用。
在创建 LV 之后,可以使用任何文件系统对它进行格式化并将它挂载在某个挂载点上,然后就可以开始使用它了。 如下图所示,给创建出来的LV0格式化文件系统,并将其挂载到/app 目录下。
区段
为了实现n个PV到m个LV的映射,PV和VG划分的基本的数据块必须要大小一致,我们就将这些基本的数据块称为区段。也就是物理区段(PE)和逻辑区段(LE) 。虽然是n个PV到m个LV的映射,但是PE和LE总是一对一映射的(如下图中红色区段与绿色区段)。
在LVM2中,默认的区段大小是4M,也就是说,在划分LV的时候,会以4M为基本单位进行划分,这个概念与磁盘存储数据的块(Block 默认4k)是类似的。在实际的使用中,最好不要修改这个默认值,因为有可能会降低LVM的效率。
这里有一点需要注意。物理区段的分配并非是连续的,也就是说,属于LV0的逻辑区段,他们所对应的物理区段有可能来自不同的物理设备。这也再一次证实了,卷组在对应物理卷到逻辑卷的映射上起到了关键性的作用。
设备映射器
通俗的来理解的话,或许应该是这样的。当我们在系统中创建了多个卷组(VG0,VG1…)之后,又在每个卷组上创建了多个逻辑卷(LV1,LV2…)比方说,如下所示的结构。
#采用文件夹的形式模式LVM[root@localhost test]# tree. ├── VG0 │ ├── LV0 │ ├── LV1 │ └── LV2 └── VG1 ├── LV0 └── LV1
这样的话,我们需要对每一个逻辑卷进行有效的标识,以便我们能够快捷的访问,设备映射器应运而生。
在大多数的Linux 发行版中设备映射器会被默认安装。在创建VG和LV的时候,如果我们不指定名字的话,设备映射器就会默认生成名称,并指定到物理设备。对于前面的示例,设备映射器会在 /dev 文件系统中创建下面的设备节点,设备名称一般为 /dev/dm-#。 /dev/mapper/VG0-LV0 ,/dev/VG0/LV0 是生成的设备名(/dev/dm-#)相应的软连接。
注意名称的格式标准:/dev/{vg_name}/{lv_name} -> /dev/mapper/{vg_name}{lv_name}
逻辑卷的管理
对于逻辑卷的管理通常包括创建,新增,缩减和删除。将通过接下来的实验介绍以下逻辑卷的管理。 首先看一下我们的实验环境 。 我们将使用sdb,sdc,sdd三个物理设备来实现我们在前文所描述的案例。sda在本实例中将不会使用。
[root@localhost ~]#lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 55G 0 part / ├─sda3 8:3 0 50G 0 part /app ├─sda4 8:4 0 512B 0 part └─sda5 8:5 0 2G 0 part [SWAP] sdb 8:16 0 200G 0 disk ├─sdb1 8:17 0 100G 0 part └─sdb2 8:18 0 100G 0 part sdc 8:32 0 100G 0 disk sdd 8:48 0 80G 0 disk
创建物理卷
当物理设备添加到系统中之后,我们可以对物理设备进行分区,也可以直接拿过来使用,也就是说,我们可以将 sdb2 和sdc 、sdd 一起组合使用,组成一个逻辑卷,而不是使用sdb整个磁盘都使用。同时有一点需要注意,如果要使用分区来构建逻辑卷的话,在创建该分区的时候,分区的类型应该是
Linux LVM
,如下所示
Device Boot Start End Blocks Id System /dev/sdb1 2048 209717247 104857600 8e Linux LVM /dev/sdb2 209717248 419430399 104856576 8e Linux LVM
我们这里会直接使用整个 /dev/sdb 设备来创建逻辑卷。
[root@localhost ~]#pvcreate /dev/sd{b{1,2},c,d} Physical volume "/dev/sdb1" successfully created. Physical volume "/dev/sdb2" successfully created. Physical volume "/dev/sdc" successfully created. Physical volume "/dev/sdd" successfully created.[root@localhost ~]#pvs PV VG Fmt Attr PSize PFree /dev/sdb1 lvm2 --- 100.00g 100.00g /dev/sdb2 lvm2 --- 100.00g 100.00g /dev/sdc lvm2 --- 100.00g 100.00g /dev/sdd lvm2 --- 80.00g 80.00g
物理卷已经成功的创建了。使用
pvs
命令可以查看生成的物理卷的信息。从列表中,我们可以看到,所有的物理卷还没有相应卷组(VG),因为我们还没有进行划分。使用pvdisplay
命令可以看到每个物理卷的详细信息。
[root@localhost ~]#pvdisplay "/dev/sdd" is a new physical volume of "80.00 GiB" --- NEW Physical volume --- PV Name /dev/sdd VG Name PV Size 80.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID HJE2wS-rX0U-FUcq-32TI-YUjv-k0jO-qDp0Rh "/dev/sdb1" is a new physical volume of "100.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb1 VG Name PV Size 100.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID SQnDDE-U3BB-X9TY-07ix-Hn5x-EBdj-RgAWDq "/dev/sdc" is a new physical volume of "100.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc VG Name PV Size 100.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 5l0Nf9-snrM-oG0j-Si4y-s3Tb-qRw8-kod0xD "/dev/sdb2" is a new physical volume of "100.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb2 VG Name PV Size 100.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID jnHzv4-PEYl-qOvO-n5Ee-Nt8r-Wbkg-5GN03S
从上面的详细信息中可以看到 VG Name 还没有值, PE Size 也没有值, 那么接下来,我们就要创建卷组,创建了卷组之后,我们再回过头查看以下这些物理卷的详细信息,就会发生很大的变化 。
创建卷组
在创建卷组的过程中,我们可以人为地指定卷组的名称,和物理区块(PE)的大小。这里我们这里不指定。
#创建卷组 [root@localhost ~]#vgcreate VG0 /dev/sd{b{1,2},c,d} Volume group "VG0" successfully created [root@localhost ~]#vgs VG #PV #LV #SN Attr VSize VFree VG0 4 0 0 wz--n- 379.98g 379.98g [root@localhost ~]#pvs PV VG Fmt Attr PSize PFree /dev/sdb1 VG0 lvm2 a-- 100.00g 100.00g /dev/sdb2 VG0 lvm2 a-- 100.00g 100.00g /dev/sdc VG0 lvm2 a-- 100.00g 100.00g /dev/sdd VG0 lvm2 a-- 80.00g 80.00g
创建卷组结束之后,我们就可以看到相应的物理卷已经有了所属的卷组叫做VG0,同样我们还是使用
pvdisplay
来看一下每一个物理卷的详细信息。
[root@localhost ~]#pvdisplay --- Physical volume --- PV Name /dev/sdb1 VG Name VG0 PV Size 100.00 GiB / not usable 4.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 25599 Free PE 25599 Allocated PE 0 PV UUID SQnDDE-U3BB-X9TY-07ix-Hn5x-EBdj-RgAWDq --- Physical volume --- PV Name /dev/sdb2 VG Name VG0 PV Size 100.00 GiB / not usable 3.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 25599 Free PE 25599 Allocated PE 0 PV UUID jnHzv4-PEYl-qOvO-n5Ee-Nt8r-Wbkg-5GN03S --- Physical volume --- PV Name /dev/sdc VG Name VG0 PV Size 100.00 GiB / not usable 4.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 25599 Free PE 25599 Allocated PE 0 PV UUID 5l0Nf9-snrM-oG0j-Si4y-s3Tb-qRw8-kod0xD --- Physical volume --- PV Name /dev/sdd VG Name VG0 PV Size 80.00 GiB / not usable 4.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 20479 Free PE 20479 Allocated PE 0 PV UUID HJE2wS-rX0U-FUcq-32TI-YUjv-k0jO-qDp0Rh
由上面的详细信息,我们发现 PE的默认大小就是4M,这也就是说,以后我们在分配磁盘大小的时候,应该以4M为最小单位进行划分。同样我们还能够看到卷组名(VG Name),空闲的区块( Free PE)。 如果想要看卷组的详细信息,我们使用
vgdisplay
命令来查看卷组VG0的详细信息。
[root@localhost ~]#vgdisplay --- Volume group --- VG Name VG0 #卷组名称 System ID Format lvm2 #Format版本 Metadata Areas 4 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 4 Act PV 4 VG Size 379.98 GiB #卷组的大小 PE Size 4.00 MiB #默认区块的大小 Total PE 97276 Alloc PE / Size 0 / 0 Free PE / Size 97276 / 379.98 GiB VG UUID rrI0HJ-JPwB-CWtU-ddM0-kvJ5-7Beo-uV5qEy
创建逻辑卷
只有了卷组还不足够,因为从文章开头的案例中我们可以知道,没有逻辑卷和文件系统,用户并不能直接使用。接下来我们在卷组 VG0 的基础上创建一个逻辑卷LV0。在创建逻辑卷的过程中,需要指定逻辑卷的大小。指定逻辑卷的大小有三种方式,一是指定PE的个数,二是直接指定逻辑卷的大小,三是直接使用百分比来指定,都是可以的。
[root@localhost ~]#lvcreate -n LV0 -l 50%vg VG0 [root@localhost ~]#lvcreate -n LV0 -l 100%FREE VG0 [root@localhost ~]#lvcreate -n LV0 -L 250G VG0 Logical volume "LV0" created. #创建成功之后系统中已经有了一个逻辑卷 [root@localhost ~]#lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert LV0 VG0 -wi-a----- 250.00g
此时我们使用
pvdisplay
命令来查看所有的物理卷状态的时候,我们会发现,物理卷的PE等各种信息已经发生了变化。
[root@localhost ~]#pvdisplay --- Physical volume --- PV Name /dev/sdb1 VG Name VG0 PV Size 100.00 GiB / not usable 4.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 25599 Free PE 0 #已经全部被分配 Allocated PE 25599 PV UUID SQnDDE-U3BB-X9TY-07ix-Hn5x-EBdj-RgAWDq --- Physical volume --- PV Name /dev/sdb2 VG Name VG0 PV Size 100.00 GiB / not usable 3.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 25599 Free PE 0 #已经全部被分配 Allocated PE 25599 PV UUID jnHzv4-PEYl-qOvO-n5Ee-Nt8r-Wbkg-5GN03S --- Physical volume --- PV Name /dev/sdc VG Name VG0 PV Size 100.00 GiB / not usable 4.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 25599 Free PE 12797 #还有一部分没有被使用 Allocated PE 12802 PV UUID 5l0Nf9-snrM-oG0j-Si4y-s3Tb-qRw8-kod0xD --- Physical volume --- PV Name /dev/sdd VG Name VG0 PV Size 80.00 GiB / not usable 4.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 20479 Free PE 20479 #还没有被使用 Allocated PE 0 PV UUID HJE2wS-rX0U-FUcq-32TI-YUjv-k0jO-qDp0Rh
从上面的信息中,我们看到物理卷发生了变化,那么相应的卷组呢?
[root@localhost ~]#vgdisplay --- Volume group --- VG Name VG0 System ID Format lvm2 Metadata Areas 4 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 0 Max PV 0 Cur PV 4 Act PV 4 VG Size 379.98 GiB PE Size 4.00 MiB Total PE 97276 Alloc PE / Size 64000 / 250.00 GiB #已经被占用的PE Free PE / Size 33276 / 129.98 GiB #还剩下没有被使用的PE VG UUID rrI0HJ-JPwB-CWtU-ddM0-kvJ5-7Beo-uV5qEy
同样,因为我们已经创建了逻辑卷,我们可以使用
lvdisplay
来查看逻辑卷的详细信息。
[root@localhost ~]#lvdisplay --- Logical volume --- LV Path /dev/VG0/LV0 #已经生成了设备名称 LV Name LV0 VG Name VG0 LV UUID D3dpT9-EYFP-ieGm-DiYm-Ey4P-O5JM-EMtrOh LV Write Access read/write LV Creation host, time localhost.localdomain, 2017-08-15 21:51:32 +0800 LV Status available # open 0 LV Size 250.00 GiB #逻辑卷的大小 Current LE 64000 #当前一共有多少LE 逻辑区块 Segments 3 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:0
给逻辑卷创建文件系统
逻辑卷创建成功之后,就可以将其作为一个分区来使用了。就像物理分区一样,我们首先对逻辑卷创建文件系统。
#CentOS 7中默认的文件系统是xfs [root@localhost ~]#mkfs.xfs /dev/VG0/LV0 meta-data=/dev/VG0/LV0 isize=512 agcount=4, agsize=16384000 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=65536000, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=32000, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # 使用blkid 可以查看文件系统是否已经成功创建 [root@localhost ~]#blkid /dev/sdb1: UUID="SQnDDE-U3BB-X9TY-07ix-Hn5x-EBdj-RgAWDq" TYPE="LVM2_member" /dev/sdb2: UUID="jnHzv4-PEYl-qOvO-n5Ee-Nt8r-Wbkg-5GN03S" TYPE="LVM2_member" /dev/sdc: UUID="5l0Nf9-snrM-oG0j-Si4y-s3Tb-qRw8-kod0xD" TYPE="LVM2_member" /dev/sdd: UUID="HJE2wS-rX0U-FUcq-32TI-YUjv-k0jO-qDp0Rh" TYPE="LVM2_member" /dev/mapper/VG0-LV0: UUID="56cde737-2618-4ff5-9298-1cb15a80f04e" TYPE="xfs"
创建了文件系统之后,将LV0挂载到 /app 目录下,就可以正常访问 LV0了,当然挂载的方式有临时挂载和永久挂载两种方式,永久挂载就是将挂载选项写到 /etc/fstab 文件中,我们这里不再详细介绍。
扩展逻辑卷
现在我们假设LV0这个逻辑卷的空间已经使用完了,需要进行扩展,我们在之前的信息中已经看到,卷组VG0中还有120多G的空间没有使用,我们就从这段未使用的空间中为LV0进行扩展 。指定需要扩展的空间的大小时,与创建时的使用方法是一致的,可以有多种灵活的方式。
[root@localhost ~]#lvextend -L +50G /dev/VG0/LV0 Size of logical volume VG0/LV0 changed from 250.00 GiB (64000 extents) to 300.00 GiB (76800 extents). Logical volume VG0/LV0 successfully resized. [root@localhost ~]#lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert LV0 VG0 -wi-a----- 300.00g
我们看到LV0的大小已经成功的发生了变化,然后我们再查看一下所有块设备的使用情况 使用
df -h
命令来查看
[root@localhost ~]#df -h Filesystem Size Used Avail Use% Mounted on ...................... /dev/mapper/VG0-LV0 250G 33M 250G 1% /mnt/lv0 # LV0的大小没有发生变化
此时出现了一个状况,LV0的容量明明已经发生了变化,但是使用 df 命令查看块设备使用情况的时候,LV0的大小却没有发生变化。这是因为,我们刚刚追加的那部分空间没有文件系统,所以文件系统的容量没有发生变化。因此我们需要给刚刚追加的那部分逻辑卷同步文件系统 。
#不同的文件系统 同步的命令是不一样的。其他文件系统的命令是resize2fs [root@localhost ~]#xfs_growfs /mnt/lv0 ................. [root@localhost ~]#df -h Filesystem Size Used Avail Use% Mounted on .......... /dev/mapper/VG0-LV0 300G 33M 300G 1% /mnt/lv0 #逻辑卷的大小已经发生了变化
从整个扩展的过程中,我们看出,只要LV0的空间不足,我们就可以很灵活的给LV0扩展存储空间。如果VG0的空间不足够使用了,那我们就可以重新加入一个物理磁盘,并按照此过程将物理卷添加到VG0中,只要使用
vgextend
命令就可以。
缩减逻辑卷
对于XFS文件系统的逻辑卷,只能进行扩展,不能进行缩减,这一点是很遗憾的。同时缩减逻辑卷也是有很大风险的,对于ext类型的文件系统来说,如果要缩减逻辑卷,就需要将设备取消挂载,这点会影响到用户的使用,同时如果逻辑卷上已经存在了大量的数据,进行缩减的过程有可能对数据造成损坏,最好事前有所备份,所以在实际生产中,缩减逻辑卷的操作应该谨慎为之。
我们首先使用一下命令重新创建一个ext4的逻辑卷 LV1,用来实现我们缩减逻辑卷的实验。
#创建逻辑卷 [root@localhost ~]#lvcreate -n LV1 -l 100%FREE VG0 #格式化文件系统 [root@localhost ~]#mkfs.ext4 /dev/VG0/LV1 #编辑 /etc/fatab 文件 并挂载该LV1 [root@localhost ~]#mount -a #此时系统中结构如图所示 [root@localhost ~]#lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 55G 0 part / ├─sda3 8:3 0 50G 0 part /app ├─sda4 8:4 0 512B 0 part └─sda5 8:5 0 2G 0 part [SWAP] sdb 8:16 0 200G 0 disk ├─sdb1 8:17 0 100G 0 part │ └─VG0-LV0 253:0 0 300G 0 lvm /mnt/lv0 └─sdb2 8:18 0 100G 0 part └─VG0-LV0 253:0 0 300G 0 lvm /mnt/lv0 sdc 8:32 0 100G 0 disk └─VG0-LV0 253:0 0 300G 0 lvm /mnt/lv0 sdd 8:48 0 80G 0 disk ├─VG0-LV0 253:0 0 300G 0 lvm /mnt/lv0 └─VG0-LV1 253:1 0 80G 0 lvm /mnt/lv1
卷组VG0的所有空间都被使用了。接下来我们就可以进行缩减逻辑卷的实验。
取消逻辑卷的挂载
我们之前就已经说过,逻辑卷在挂载的时候是不能进行缩减的。因此我们先取消该逻辑卷的挂载。
[root@localhost ~]#umount /mnt/lv1
缩减逻辑卷的空间
系统会提示 应该先检查文件系统,所以我们就先检查一下。
#检查文件系统 -f 表示强制性检查 [root@localhost ~]#e2fsck -f /dev/VG0/LV1 # 直接将文件系统的大小缩减到 50G [root@localhost ~]#resize2fs /dev/VG0/LV1 50G # 将逻辑卷的空间缩减到50G [root@localhost ~]#lvreduce -L 50G /dev/VG0/LV1 WARNING: Reducing active logical volume to 50.00 GiB. THIS MAY DESTROY YOUR DATA (filesystem etc.)Do you really want to reduce VG0/LV1? [y/n]: y Size of logical volume VG0/LV1 changed from 79.98 GiB (20476 extents) to 50.00 GiB (12800 extents). Logical volume VG0/LV1 successfully resized.
在这一步中,一共有三个步骤。准备步骤:强制性检查文件系统。然后:先缩减文件系统大小。接着:缩减逻辑卷。 这三步,缺一不可。
重新挂载
,逻辑卷缩减之后,将逻辑卷重新挂载到之前的目录中就可以重新访问逻辑卷了。 重新查看块设备的使用情况,就可以发现逻辑卷发生了变化
[root@localhost ~]#lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 55G 0 part / ├─sda3 8:3 0 50G 0 part /app ├─sda4 8:4 0 512B 0 part └─sda5 8:5 0 2G 0 part [SWAP] sdb 8:16 0 200G 0 disk ├─sdb1 8:17 0 100G 0 part │ └─VG0-LV0 253:0 0 300G 0 lvm /mnt/lv0 └─sdb2 8:18 0 100G 0 part └─VG0-LV0 253:0 0 300G 0 lvm /mnt/lv0 sdc 8:32 0 100G 0 disk └─VG0-LV0 253:0 0 300G 0 lvm /mnt/lv0 sdd 8:48 0 80G 0 disk ├─VG0-LV0 253:0 0 300G 0 lvm /mnt/lv0 └─VG0-LV1 253:1 0 50G 0 lvm /mnt/lv1
迁移逻辑卷到新的系统
我首先在另外一个虚拟机中创建一个逻辑卷,并在里面存入相应的数据,然后来模拟我们的迁移逻辑卷的实验。在另外一个虚拟机中创建LV0逻辑卷的操作,如下图所示。
此时该系统中块设备列表如下所示。 LV0。就是我们刚刚创建的逻辑卷。
[root@centos6 lv0]#lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 3.7G 0 rom /media/CentOS_6.9_Final sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1000M 0 part /boot ├─sda2 8:2 0 53.7G 0 part / ├─sda3 8:3 0 48.8G 0 part /app ├─sda4 8:4 0 1K 0 part └─sda5 8:5 0 2G 0 part [SWAP] sdb 8:16 0 20G 0 disk └─VG0-LV0 (dm-0) 253:0 0 10G 0 lvm /mnt/lv0
现在我们要将刚刚创建的这个逻辑卷迁移到一个新的系统中,而且我们要保证,数据不能丢失。同时,我们考虑一下,万一我们要迁移到的新的文件系统中有跟我们新创建的逻辑卷同名的逻辑卷该如何处理,比方说像,下面这样。 注意,两个系统不一样,但是逻辑卷的名字一致。
#CentOS6 中的逻辑卷,即将被迁移到CentOS7中 [root@centos6 ~]#lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert LV0 VG0 -wi-ao---- 10.00g #CentOS 7 中的逻辑卷,即将迁移到这里。 [root@localhost ~]#lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert LV0 VG0 -wi-ao---- 300.00g LV1 VG0 -wi-ao---- 50.00g
总结一下迁移过程中的重要步骤,一共有如下几步。 在源主机上
将旧的逻辑卷解除挂载
umount /mnt/lv0
修改旧的卷组名称
vgrename VG0 NEWVG0
修改旧的逻辑卷的名称
lvrename /dev/NEWVG0/LV0 NEWLV0
将旧的卷组设置为非活动状态
vgchange -an NEWVG0
将旧的卷组导出
vgexport NEWVG0
将硬盘拆下 安装到新的主机上
相关的操作如下所示,操作成功之后,将硬盘文件拆下,接到新的主机上。
[root@centos6 ~]#umount /mnt/lv0 [root@centos6 ~]#vgrename VG0 NEWVG0 Volume group "VG0" successfully renamed to "NEWVG0"[root@centos6 ~]#lvrename /dev/NEWVG0/LV0 NEWLV0 Renamed "LV0" to "NEWLV0" in volume group "NEWVG0"[root@centos6 ~]#vgchange -an NEWVG0 0 logical volume(s) in volume group "NEWVG0" now active[root@centos6 ~]#vgexport NEWVG0 Volume group "NEWVG0" successfully exported
在目标主机上
在新的系统中安装硬盘,并将其导入文件系统。
vgimport NEWVG0
激活新的卷组
vgchange -ay NEWVG0
重新挂载
mount /dev/NEWVG0/NEWLV0 /mnt/newlv0
在加装了新的硬盘之后,我们可以看到系统中已经添加了一块新的硬盘。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 55G 0 part / ├─sda3 8:3 0 50G 0 part /app ├─sda4 8:4 0 1K 0 part └─sda5 8:5 0 2G 0 part [SWAP] sdb 8:16 0 200G 0 disk ├─sdb1 8:17 0 100G 0 part │ └─VG0-LV0 253:0 0 300G 0 lvm /mnt/lv0 └─sdb2 8:18 0 100G 0 part └─VG0-LV0 253:0 0 300G 0 lvm /mnt/lv0 sdc 8:32 0 100G 0 disk └─VG0-LV0 253:0 0 300G 0 lvm /mnt/lv0 sdd 8:48 0 80G 0 disk ├─VG0-LV0 253:0 0 300G 0 lvm /mnt/lv0 └─VG0-LV1 253:1 0 50G 0 lvm /mnt/lv1 sde 8:64 0 20G 0 disk └─NEWVG0-NEWLV0 253:2 0 10G 0 lvm
使用pvscan 命令可以查看到系统中已经有一个处于 exported 状态的 设备,及其详细的信息。
[root@localhost ~]#pvscan PV /dev/sdb1 VG VG0 lvm2 [100.00 GiB / 0 free] PV /dev/sdb2 VG VG0 lvm2 [100.00 GiB / 0 free] PV /dev/sdc VG VG0 lvm2 [100.00 GiB / 0 free] PV /dev/sdd VG VG0 lvm2 [80.00 GiB / 29.98 GiB free] PV /dev/sde is in exported VG NEWVG0 [20.00 GiB / 10.00 GiB free] Total: 5 [399.98 GiB] / in use: 5 [399.98 GiB] / in no VG: 0 [0 ]
接下来我们将新的NEWVG0 导入到系统中。
#导入新的卷组 [root@localhost ~]#vgimport NEWVG0 Volume group "NEWVG0" successfully imported #将新的卷组激活[root@localhost ~]#vgchange -ay NEWVG0 1 logical volume(s) in volume group "NEWVG0" now active
此时我们再使用pvscan 来查看的话,状态应该与之前已经不一样了。
# 状态已经发生了相应的变化 [root@localhost ~]#pvscan PV /dev/sdb1 VG VG0 lvm2 [100.00 GiB / 0 free] PV /dev/sdb2 VG VG0 lvm2 [100.00 GiB / 0 free] PV /dev/sdc VG VG0 lvm2 [100.00 GiB / 0 free] PV /dev/sdd VG VG0 lvm2 [80.00 GiB / 29.98 GiB free] PV /dev/sde VG NEWVG0 lvm2 [20.00 GiB / 10.00 GiB free] Total: 5 [399.98 GiB] / in use: 5 [399.98 GiB] / in no VG: 0 [0 ]
将已经添加好的逻辑卷重新挂载就可以继续使用了。
[root@localhost ~]#mkdir /mnt/newlv0 [root@localhost ~]#mount /dev/NEWVG0/NEWLV0 /mnt/newlv0 [root@localhost ~]#cd /mnt/newlv0[root@localhost newlv0]#ls acpid iptables.old readahead atd irqbalance readonly-root auditd kdump rngd authconfig kernel rsyslog ................
删除逻辑卷
在完成了上面的大部分操作之后,我们又有了一个新的想法,如果我想将某个分区,从卷组中去掉该怎样做?
实际中,我们可能面临众多的困难,比方说,该分区中已经存储了很多的数据,这样的话,我们是不能直接删除的。假设我们有下面这样的一组逻辑卷(只是假设,为了用来佐证)
[root@localhost ~]#pvs PV VG Fmt Attr PSize PFree /dev/sdb1 VG0 lvm2 a-- 100.00g 0 /dev/sdb2 VG0 lvm2 a-- 100.00g 0 /dev/sdc VG0 lvm2 a-- 10.00g 89.98g /dev/sdd VG0 lvm2 a-- 80.00g 29.98g
如果我们要将/dev/sdd 这个分区删除掉,那么我们首先就要在同一个卷组(VG0)中找到与/dev/sdd 已经使用掉的空间同样大小的空间,来做迁移。然后将/dev/sdd 的空间 移动到 /dev/sdc中,此时就可以进行删除了。
这样,我们就详细的介绍了逻辑卷的详细使用,以及在使用过程中需要注意的相关内容。实际上,逻辑卷还有快照,关于快照的内容在逻辑卷中也是很重要的一部分内容,实际使用中也是非常重要的,以后有机会会详细地介绍。如若本片文章中有描述不合理的地方,敬请留言,我会及时改正。
个人博客地址:http://www.pojun.tech/ 欢迎访问