参考资料列表

本文部分资料参考自以下列表

本文将从以下几个方面介绍LVM

  • 什么是逻辑卷

  • 逻辑卷的结构

  • 逻辑卷的管理

  • 迁移逻辑卷到新的系统

  • 删除逻辑卷

  • 逻辑卷快照

什么是逻辑卷

逻辑卷管理(LVM)指系统将物理卷管理抽象到更高的层次,常常会形成更简单的管理模式。与物理磁盘和分区不同,逻辑卷展现给我们的是逻辑上的存储结构。LVM 可以将分区和磁盘聚合成一个虚拟磁盘(virtual disk),从而用小的存储空间组成一个统一的大空间。这个虚拟磁盘在 LVM 术语中称为卷组(volume group)

将众多比较小的物理磁盘设备组织起来创建一个比单个磁盘本身还要大的文件系统,并不是LVM的唯一用途,它还可以

  • 在磁盘列表中添加磁盘和分区,对现有的文件系统进行扩展。

  • 用一个 160GB 磁盘替换两个 80GB 磁盘,而不需要让系统离线,也不需要在磁盘之间手工转移 。

  • 当存储空间远大于我们所需要的空间的时候,我们可以将物理硬盘从磁盘列表中去掉,从而减少存储空间。

  • 使用快照(snapshot)执行一致的备份(本文后面会进一步讨论)

为了理解起来更加的形象,我们来思考这样一个问题,假设我们一共有三个物理硬盘,容量分别是200G,100G,80G,我们如何来创建一个大于300G的文件系统呢?在没有接触到LVM之前,我们恐怕是将这个三个硬盘挂载到系统中,然后进行分区,创建文件系统来使用。比如下图这样。

逻辑卷管理(LVM)_Linux

但是这样的分区模式有些时候是没有办法满足我们的需求的,我们想要的是一个完整的300G的独立文件系统,而此时使用LVM就能够实现这样的设计。

物理磁盘到逻辑的映射

逻辑卷管理(LVM)_ LVM_02

如图所示,我们从逻辑上实现了 创建了一个大于300G的文件系统,而且在用户看来,根本不清楚底层一共有多少个硬盘,只知道有一个文件系统可以用来存储数据。当然,这对用户来说就足够了。具体的实验将在稍后的内容中实现。

逻辑卷的结构

LVM 的组成一共包含三种元素,(Volume,物理和逻辑卷,卷组),区段(物理和逻辑区段),设备映射器 。 接下来,我们分别介绍这三种元素各代表什么意思。

Linux LVM 组织为物理卷(PV)、卷组(VG)和逻辑卷(LV)。物理卷 是物理磁盘或物理磁盘分区(比如 /dev/sdb1 或 /dev/sdc)。卷组 是物理卷的集合。卷组 可以在逻辑上划分成多个逻辑卷。

物理磁盘到逻辑卷的映射

逻辑卷管理(LVM)_逻辑卷_03

卷组是实现将n个PV映射成m个LV的关键。我们可以这样来理解。当我们将多个PV划分到一个卷组中去了之后(也就是VG0),就可以创建多个任意容量的LV(逻辑卷),在这些逻辑卷看来,他们的底层实际上就是一个380G的空间,他们可以自由分配。如图所示,我们在VG0上划分了一个LV0,在LV0和FREE SPACE 看来,VG0就是一个整体,不关心VG0是由多少个PV组合而来。在实际的使用过程中,用户就会将LV0看作一个物理磁盘分区来使用。
在创建 LV 之后,可以使用任何文件系统对它进行格式化并将它挂载在某个挂载点上,然后就可以开始使用它了。 如下图所示,给创建出来的LV0格式化文件系统,并将其挂载到/app 目录下。

逻辑卷管理(LVM)_Linux _04

区段

为了实现n个PV到m个LV的映射,PV和VG划分的基本的数据块必须要大小一致,我们就将这些基本的数据块称为区段。也就是物理区段(PE)和逻辑区段(LE) 。虽然是n个PV到m个LV的映射,但是PE和LE总是一对一映射的(如下图中红色区段与绿色区段)。
在LVM2中,默认的区段大小是4M,也就是说,在划分LV的时候,会以4M为基本单位进行划分,这个概念与磁盘存储数据的块(Block 默认4k)是类似的。在实际的使用中,最好不要修改这个默认值,因为有可能会降低LVM的效率。

逻辑卷管理(LVM)_ LVM_05

这里有一点需要注意。物理区段的分配并非是连续的,也就是说,属于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-#)相应的软连接。

逻辑卷管理(LVM)_ LVM_06

注意名称的格式标准:/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逻辑卷的操作,如下图所示。

逻辑卷管理(LVM)_Linux _07

此时该系统中块设备列表如下所示。 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/ 欢迎访问