您的位置:首页 > 运维架构 > Linux

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

2011-05-09 11:47 836 查看
一、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各个组成部分之间的对应关系:




图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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: