浅谈Linux磁盘存储管理续【逻辑卷管理(LVM)】

时间:2021-09-15 18:32:50

一、LVM的基本概念
在对磁盘进行分区大小规划时,有时往往不能确定这个分区要使用的总空间大小,而用fdisk对磁盘分区后,每个分区的大小已经固定了,如果分区设置的过大,就白白浪费了磁盘空间,而分区设置的过小,就会导致空间不够用的情形,此时最常见的方法是重新划分磁盘分区,或者通过软连接的方式将此分区的目录链接到另一个分区,虽然能临时解决问题,但是给管理带来了麻烦。如何能解决这些问题呢,LVM是一个不错的方法。
LVM,是Logical Volume Manager的缩写,中文意思是逻辑卷管理,它是linux下对磁盘分区进行管理的一种机制,LVM是建立在磁盘分区和文件系统之间的一个逻辑层,管理员利用LVM可以在磁盘不用重新分区的情况下动态的调整分区的大小。如果系统新增了一块硬盘,通过LVM就可以将新增的硬盘空间直接扩展到原来的磁盘分区上。

二、 LVM的使用术语
 通过LVM技术,屏蔽了磁盘分区的底层差异,在逻辑上给文件系统提供了一个卷的概念,然后在这些卷上建立相应的文件系统,在认识LVM之前,先熟悉下LVM中几个常用的术语,在LVM中主要涉及以下几个概念。
 物理存储设备(physical media):指系统的存储设备文件,比如:/dev/sda、/dev/hdb等等。
 物理卷(physical volume):简称PV,是指硬盘分区或者从逻辑上看起来和硬盘分区类似的设备(比如RAID设备)。
 卷组(Volume Group):简称VG,类似与非LVM系统中的物理硬盘,一个LVM卷组有一个或者多个物理卷组成。
 逻辑卷(logical volume):简称LV,类似与非LVM系统上的硬盘分区,LV建立在VG上,可以在LV上创建文件系统。
 PE(physical extent):PV中可以分配的最小存储单元称为PE,PE的大小是可指定的,默认为4M。
 LE(logical extent):LV中可以分配的最小存储单元称为LE,在同一个卷组中,LE的大小和PE是一样的,且一一对应。
图1清楚的说明了LVM各个组成部分之间的对应关系:

浅谈Linux磁盘存储管理续【逻辑卷管理(LVM)】

图1 LVM磁盘组织结构图
 

在图1中:
 有两块物理硬盘组成了LVM的底层结构,这两块硬盘的大小、型号可以不同。
 PV可以看作是硬盘上的分区,因此,可以说物理硬盘A划分了两个分区,物理硬盘B划分了3个分区。
 然后将前三个PV组成了一个卷组VG1,后两个PV组成了一个卷组VG2。
 接着在卷组VG1上划分了两个逻辑卷LV1和LV2,在卷组VG2上划分了一个独立的逻辑卷LV3。
 最后,在逻辑卷LV1、LV2和LV3上创建文件系统,分别用来挂载/usr、/home和/var分区。

三、 安装LVM工具
通过下面的命令确认LVM是否已经安装:
[root@localhost ~]# rpm -qa|grep lvm
lvm2-2.02.16-3.el5
system-config-lvm-1.0.22-1.0.el5
如果有类似上面的输出,就说明系统中已经安装了LVM,如果没有任何输出,则说明系统中还没有安装LVM,可以从系统安装光盘或者网络上找到对应的rpm包安装即可,安装方法这里不在讲述。
现在默认的linux发行版本内核一般都支持LVM,因此只要安装好LVM工具,即可使用LVM提供的强大功能。

四、 LVM的创建与管理
LVM的创建需要经过以下几个步骤:

1.创建物理分区
在使用LVM之前,需要首先划分磁盘分区,也就是用fdisk命令划分磁盘分区,划分的方法在上个章节已经介绍过,稍微不同的是,在创建分区的时候,需要指定分区类型为linux LVM,对应的ID为8e(其实LVM也能识别linux默认的分区类型83),
这里我们将所有分区类型都指定为8e,假定linux下新增了两块硬盘,分区后显示如下:
[root@localhost ~]# fdisk -l /dev/sdb /dev/sdc

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1044     8385898+   5  Extended
/dev/sdb5               1         250     2008062   8e  Linux LVM
/dev/sdb6             251         500     2008093+  8e  Linux LVM
/dev/sdb7             501         750     2008093+  8e  Linux LVM
/dev/sdb8             751        1044     2361523+  8e  Linux LVM

Disk /dev/sdc: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1        1044     8385898+   5  Extended
/dev/sdc5               1         499     4008154+  8e  Linux LVM
/dev/sdc6             500        1044     4377681   8e  Linux LVM
由上面输出可知,/dev/sdb硬盘划分了一个扩展分区和四个逻辑分区,分区类型均为Linux LVM,/dev/sdc磁盘划分了一个扩展分区和两个逻辑分区,分区类型也都是Linux LVM。
这里以两块硬盘举例的主要目的是为了突出LVM可以跨磁盘操作的概念。也就是LVM可以操作多块物理硬盘上的不同分区,通过LVM管理磁盘,屏蔽了底层物理设备的异构性。
注意,这里仅仅是进行了分区操作,磁盘分区还没有进行格式化。

2.创建物理卷(PV)
创建物理卷的命令是pvcreate,通过该命令可以将希望添加到卷组(VG)的所有磁盘分区或者整个磁盘创建为物理卷。使用格式为:
pvcreate  磁盘分区或整个磁盘
这里将第一步中划分的所有磁盘分区创建为物理卷,操作如下:
[root@localhost ~]# pvcreate  /dev/sdb5 /dev/sdb6 /dev/sdb7 /dev/sdb8 /dev/sdc5 /dev/sdc6
  Physical volume "/dev/sdb5" successfully created
  Physical volume "/dev/sdb6" successfully created
  Physical volume "/dev/sdb7" successfully created
  Physical volume "/dev/sdb8" successfully created
  Physical volume "/dev/sdc5" successfully created
  Physical volume "/dev/sdc6" successfully created

3.创建卷组
创建卷组的命令是vgcreate,使用格式为:
vgcreate 卷组名 物理卷
卷组名:就是要创建的卷组的名称。
物理卷:指定希望添加到此卷组的所有磁盘分区或者整个磁盘。
这里我们创建两个卷组myvg1和myvg2,同时两个卷组都跨越了不同的磁盘,卷组myvg1由/dev/sdb磁盘的/dev/sdb5、/dev/sdb6和/dev/sdc磁盘的/dev/sdc5分区组成。同理,卷组myvg2由/dev/sdb磁盘的/dev/sdb7、/dev/sdb8和/dev/sdc磁盘的/dev/sdc6分区组成。操作如下:
[root@localhost ~]# vgcreate myvg1 /dev/sdb5 /dev/sdb6 /dev/sdc5
  Volume group "myvg1" successfully created
[root@localhost ~]# vgcreate myvg2 /dev/sdb7 /dev/sdb8 /dev/sdc6
  Volume group "myvg2" successfully created

4.激活卷组
卷组创建完毕后,可以通过vgchange命令激活卷组,而无需重启系统。Vgchange使用格式如下:
vgchange -a y 卷组名 (激活卷组)
vgchange -a n 卷组名 (停用卷组)
这里我们激活卷组myvg1和myvg2,使用如下命令:
[root@localhost ~]# vgchange -a y myvg1
  0 logical volume(s) in volume group "myvg1" now active
[root@localhost ~]# vgchange -a y myvg2
  0 logical volume(s) in volume group "myvg2" now active

5.显示卷组、物理卷属性信息
vgdisplay用于显示创建的卷组信息,同理pvdisplay命令用于显示物理卷组信息,使用格式为:
vgdisplay 卷组名
pvdisplay 物理卷名
要显示卷组myvg1的信息,执行操作如下:
[root@localhost ~]# vgdisplay myvg1
  --- Volume group ---
  VG Name               myvg1
  System ID            
  Format                lvm2
  Metadata Areas        3
  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                3
  Act PV                3
  VG Size               7.65 GB
  PE Size               4.00 MB
  Total PE              1958
  Alloc PE / Size       0 / 0  
  Free  PE / Size       1958 / 7.65 GB
  VG UUID               H6RMci-9F2C-QlPw-Bnl2-07AP-J0h7-XPq4FQ
从输出可以看出此卷组所有信息,例如卷组大小为7.65 GB,每个PE大小为4M,总共的PE数为1958。

6.创建逻辑卷
创建逻辑卷的命令是lvcreate,常用的使用格式为:
lvcreate [-L 逻辑卷大小| -l PE数 ] –n 逻辑卷名称  所属的卷组名
其中:
-L:后面接逻辑卷的大小,可以用K、M、G表示。例如100M、10G等
-l:用PE数来计算逻辑卷的大小。
这里我们在卷组myvg1下创建两个逻辑卷mylv11和mylv12,在卷组myvg2下创建一个卷组mylv2:
[root@localhost ~]# lvcreate  -L 4G -n mylv11 myvg1  
#在卷组myvg1中创建一个大小为4G的卷组mylv11
  Logical volume "mylv11" created
[root@localhost ~]# vgdisplay myvg1|grep "Free  PE"  
#检查卷组myvg1中可用的卷组空间
  Free  PE / Size       934 / 3.65 GB
[root@localhost ~]# lvcreate  -l 934  -n mylv12 myvg1 
#将卷组myvg1中剩余的空间全部分给逻辑卷mylv12   
  Logical volume "mylv12" created
[root@localhost ~]# vgdisplay myvg1|grep "Free  PE"
#检查卷组myvg1中是否还有剩余空间,从输出可知,空间全部利用,没有浪费。
  Free  PE / Size       0 / 0  
[root@localhost ~]# vgdisplay myvg2|grep "Free  PE"  
#检查卷组myvg2的可用空间
  Free  PE / Size       2134 / 8.34 GB
[root@localhost ~]# lvcreate  -l 2134  -n mylv2 myvg2  
#将卷组myvg2的所有空间分配给逻辑卷mylv2
  Logical volume "mylv2" created

7.格式化逻辑卷,创建文件系统
文件系统是创建在逻辑卷上的,这里假定使用linux默认的ext3文件系统,接下来的工作是用mkfs.ext3格式化文件系统:
[root@localhost ~]# mkfs.ext3 /dev/myvg1/mylv11
[root@localhost ~]# mkfs.ext3 /dev/myvg1/mylv12
[root@localhost ~]# mkfs.ext3 /dev/myvg2/mylv2
最后,建立挂载目录,挂载这些逻辑卷即可:
[root@localhost ~]#mkdir /mylv11
[root@localhost ~]#mkdir /mylv12
[root@localhost ~]# mkdir /mylv2
[root@localhost ~]# mount /dev/myvg1/mylv11  /mylv11 
[root@localhost ~]# mount /dev/myvg1/mylv12  /mylv12
[root@localhost ~]# mount /dev/myvg2/mylv2  /mylv2
[root@localhost ~]# df -h|grep mylv
Filesystem                Size  Used  Avail Use%  Mounted on
/dev/mapper/myvg1-mylv11  4.0G  137M  3.7G   4%   /mylv11
/dev/mapper/myvg1-mylv12  3.6G   72M  3.4G   3%   /mylv12
/dev/mapper/myvg2-mylv2   8.3G  147M  7.7G   2%   /mylv2
到这里为止,新增的磁盘设备已经可以使用了,如果要开机自动挂载,编辑/etc/fstab文件,加上新增的三个逻辑分区即可。

8.添加新的物理卷到卷组
添加新的物理卷到卷组的命令为vgextend,使用格式为:
vgextend 卷组名 新加入的物理卷
紧接着上面的讲解实例,假定系统增加了第四块硬盘/dev/sdd,大小为4G,同时通过fdisk进行了磁盘分区,对应的分区为/dev/sdd5,现在要把新增的硬盘分区加入到卷组myvg2,操作如下:
[root@localhost ~]# vgdisplay myvg2|grep “Free  PE”  #首先检查myvg2卷是否有空闲空间,由输出可知,空间全部用完。
Free  PE / Size       0 / 0 
[root@localhost ~]# pvcreate /dev/sdd5           #先将/dev/sdd5转换为物理卷
  Physical volume "/dev/sdd5" successfully created
[root@localhost ~]# vgextend myvg2 /dev/sdd5     #将新增物理卷添加到卷组myvg2中
  Volume group "myvg2" successfully extended
[root@localhost ~]# vgdisplay myvg2|grep "Free  PE"  #此时剩余卷组空间还有4G,刚好是新增物理卷的大小
  Free  PE / Size       1023 / 4.00 GB

9.修改逻辑卷的大小
LVM最主要的功能就是能动态的调整分区的大小,其实也就是修改逻辑卷的大小,修改逻辑卷需要用到的命令有lvextend(扩展逻辑卷)、lvreduce(缩减逻辑卷)以及ext2resize(修改文件系统大小),下面分别进行介绍。
lvextend与lvreduce的使用格式类似,如下所示:
lvextend [-L (+size) –l (+PE数)]  逻辑卷名称
lvreduce [-L (-size) –l (-PE数)]  逻辑卷名称
-L:“+size”表示给逻辑卷空间增加指定的大小,“-size”表示给逻辑卷空间缩减指定的大小。size表示将逻辑卷增加(lvextend)或缩减(lvreduce)到指定的空间大小。例如“+300”表示将逻辑卷空间增大300M,“-2G”表示将逻辑卷的空间缩减2G。
 -l:与“-L”用法相同,不同的是“-l”选项用PE数来表示逻辑卷的大小。
ext2resize的使用格式如下:
ext2resize 设备文件或逻辑卷  空间大小
修改逻辑卷分为扩充逻辑卷大小和减小逻辑卷大小两种情况,下面依次介绍。
(1)扩充逻辑卷空间
扩充逻辑卷大小的一般步骤为:
 利用扩展逻辑卷命令lvextend扩展逻辑卷空间
 卸载已经挂载的逻辑卷分区
 利用ext2resize指令修改文件系统大小以实现空间扩充
 挂载扩充后的逻辑卷分区
在上个小节中,我们给卷组myvg2增加了一个新的物理卷,现在要将新增的物理卷空间扩充到逻辑卷mylv2中,操作如下:
首先扩充逻辑卷mylv2的大小,执行以下命令:
[root@localhost ~]# lvextend -l +1023 /dev/myvg2/mylv2
  Extending logical volume mylv2 to 12.33 GB
  Logical volume mylv2 successfully resized
 注意,“-l”选项后面的“+1023”代表的是增加的PE数,这个值是在上个小节中通过命令“vgdisplay myvg2|grep "Free  PE"”得到的,当然这里也可以使用“-L +4G”来代替“-l +1023”。
 接下来的工作是卸载/dev/myvg2/mylv2分区,为修改文件系统大小做准备。
[root@localhost ~]#umount /dev/myvg2/mylv2或者执行 umount /mylv2
 修改文件系统大小的工具是ext2resize指令,这个指令可能不包含在某些linux发行版中,Redhat Linux就默认没有这个命令,因此需要先安装这个指令对应的rpm包,下载类似ext2resize-1.1.19-1.i386.rpm的rpm文件,安装即可。
[root@localhost ~]# rpm -ivh ext2resize-1.1.19-1.i386.rpm
Preparing... ###########################[100%]
1:ext2resize ##########################[100%]
 安装完毕,系统就会出现一个ext2resize指令,利用这个指令修改文件系统的大小。
第三步,修改文件系统大小,执行如下命令:
[root@localhost ~]# ext2resize  /dev/myvg2/mylv2
ext2resize v1.1.18 - 2001/03/18 for EXT2FS 0.5b
由于已经将扩展的分区加入到逻辑卷mylv2中,因此上面的操作其实就是刷新逻辑卷,使更改生效。
最后,挂载逻辑卷到文件系统即可,执行如下命令:
[root@localhost ~]# mount /dev/myvg2/mylv2 /mylv2
[root@localhost ~]# df -h |grep mylv2
Filesystem                    Size   Used   Avail  Use%  Mounted on
/dev/mapper/myvg2-mylv2        13G   147M    12G    2%    /mylv2
 可以看到,逻辑卷/dev/myvg2/mylv2的空间已经增加到13G,动态扩展逻辑卷成功。
(2)减小逻辑卷的空间
减小逻辑卷的一般步骤为:
 卸载已经挂载的逻辑卷分区
 利用ext2resize指令修改文件系统大小以实现空间缩减
 利用减小逻辑卷命令lvreduce减小逻辑卷空间
 挂载缩减后的逻辑卷分区
假定我们要对上面的逻辑卷/dev/myvg2/mylv2缩减2G的空间,可以这么操作。
首先卸载逻辑卷/dev/myvg2/mylv2分区:
umount /mylv2
然后用ext2resize指令缩减文件系统大小:
ext2resize  /dev/myvg2/mylv2  11G
接着利用lvreduce指令缩减逻辑卷/dev/myvg2/mylv2到11G,执行此步骤主要目的是将缩减的空间从/dev/myvg2/mylv2释放,从而可以供其它逻辑卷使用。
[root@localhost ~]# lvreduce -L 11G /dev/myvg2/mylv2  #缩减逻辑卷/dev/myvg2/mylv2到11G
  WARNING: Reducing active logical volume to 11.00 GB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce mylv2? [y/n]: y   #这里输入y
  Reducing logical volume mylv2 to 11.00 GB
  Logical volume mylv2 successfully resized
[root@localhost ~]# ext2resize  /dev/myvg2/mylv2    #将修改结果加载到文件系统
ext2resize v1.1.18 - 2001/03/18 for EXT2FS 0.5b
ext2resize: new size is same as current (2883584)
最后,重新挂载逻辑卷/dev/myvg2/mylv2
[root@localhost ~]# mount /dev/myvg2/mylv2  /mylv2   #挂载逻辑卷分区到/mylv2目录
[root@localhost ~]# df -h|grep mylv2   #查看挂载情况,可以看到,逻辑卷分区已经缩减到11G
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/myvg2-mylv2   11G  147M   11G   2% /mylv2

10.如何删除物理卷、卷组和逻辑卷
删除物理卷的命令是pvremove,将物理卷从卷组移除的命令是vgreduce,删除卷组的命令是vgremove,同理,删除逻辑卷的命令是lvremove。
在删除一个卷组之前需要了解卷组与逻辑卷之间的组成关系,例如要删除卷组myvg1,需要知道的关系是:卷组myvg1有/dev/sdb5、/dev/sdb6和/dev/sdc5三个物理卷组成,然后在卷组myvg1下分了两个逻辑卷mylv11和mylv12。
由此可知,删除一个卷组的顺序是:卸载逻辑卷分区-->删除卷组上所有逻辑卷-->删除卷组,删除卷组myvg1的示例如下:
[root@localhost ~]# umount /dev/myvg1/mylv11  #首先卸载逻辑卷mylv11对应的分区
[root@localhost ~]# lvremove /dev/myvg1/mylv11  #删除逻辑卷mylv11
Do you really want to remove active logical volume "mylv11"? [y/n]: y
  Logical volume "mylv11" successfully removed
[root@localhost ~]# lvremove /dev/myvg1/mylv12  #由于没有卸载逻辑卷mylv12对应的分区,删除逻辑卷失败
  Can't remove open logical volume "mylv12"
[root@localhost ~]# umount /dev/myvg1/mylv12    #卸载逻辑卷mylv12对应的分区
[root@localhost ~]# lvremove /dev/myvg1/mylv12  #成功删除逻辑卷mylv12
Do you really want to remove active logical volume "mylv12"? [y/n]: y
  Logical volume "mylv12" successfully removed
[root@localhost ~]# vgreduce  myvg1 /dev/sdb5   #这里是从卷组myvg1中移除一个物理卷
  Removed "/dev/sdb5" from volume group "myvg1"
[root@localhost ~]# pvremove  /dev/sdb5       #这里是删除物理卷/dev/sdb5
  Labels on physical volume "/dev/sdb5" successfully wiped
[root@localhost ~]# vgremove myvg1  #这里是删除卷组myvg1
  Volume group "myvg1" successfully removed

本文出自 “爱维Linux运维培训” 博客,请务必保留此出处http://ixdba.blog.51cto.com/2895551/562111