1.2 LVM(逻辑卷管理)
我们在实际使用Linux服务器的时候,总会有一个让人头疼的问题:分区到底应该分多大呢?分得太大,会浪费硬盘空间;分得太小,又会面临不够使用的情况。如果在安装系统时规划不合理,这种困扰就会经常出现。如果真出现了分区不够用的情况,则应该怎么解决呢?在以往(2.4内核以前)要想调整分区大小,要么先新建立一个更大的分区,然后复制旧分区中的内容到新分区,最后使用软链接来替代旧分区;要么使用调整分区大小的工具(如parted)。parted虽然可以调整分区大小,但是它需要卸载分区之后才可以进行,也就是说需要停止服务。而LVM最大的好处就是可以随时调整分区的大小,分区中的现有数据不会丢失,并且不需要卸载分区、停止服务。
1.2.1 LVM的概念
LVM是Logical Volume Manager的简称,译为中文就是逻辑卷管理。它是Linux系统对磁盘分区的一种管理机制。LVM是在硬盘分区之上建立一个逻辑层,这个逻辑层让多个硬盘或分区看起来像一块逻辑硬盘,然后将这块逻辑硬盘分成逻辑卷之后使用,从而大大提高了分区的灵活性。我们把真实的物理硬盘或分区称作物理卷(PV);由多个物理卷组成一块大的逻辑硬盘,叫作卷组(VG);将卷组划分成多个可以使用的分区,叫作逻辑卷(LV)。而在LVM中最小的存储单位不再是block,而是物理扩展块(Physical Extend, PE)。我们通过图1-1看看这些概念之间的联系。
图1-1 LVM示意图
· 物理卷(Physical Volume, PV):就是真正的物理硬盘或分区。
· 卷组(Volume Group, VG):将多个物理卷合起来就组成了卷组。组成同一个卷组的物理卷可以是同一块硬盘的不同分区,也可以是不同硬盘上的不同分区。我们可以把卷组想象为一块逻辑硬盘。
· 逻辑卷(Logical Volume, LV):卷组是一块逻辑硬盘,硬盘必须分区之后才能使用,我们把这个分区称作逻辑卷。逻辑卷可以被格式化和写入数据。我们可以把逻辑卷想象为分区。
· 物理扩展(Physical Extend, PE):PE是用来保存数据的最小单元,我们的数据实际上都是写入PE当中的。PE的大小是可以配置的,默认是4MB。
也就是说,我们在建立LVM的时候,需要按照以下步骤来进行:
(1)把物理硬盘分成分区,当然也可以是整块物理硬盘。
(2)把物理分区建立为物理卷(PV),也可以直接把整块硬盘都建立为物理卷。
(3)把物理卷整合为卷组(VG)。卷组就已经可以动态地调整大小了,可以把物理分区加入卷组,也可以把物理分区从卷组中删除。
(4)把卷组再划分为逻辑卷(LV),当然逻辑卷也是可以直接调整大小的。我们说逻辑卷可以想象为分区,所以也需要格式化和挂载。
其实,在安装Linux系统时,我们采用的图形安装界面就可以直接把硬盘配置成LVM(RAID也可以在安装时直接配置),但当时我们只分配了基本分区。那是因为LVM最主要的作用是调整分区大小,所以就算在安装时已经安装了LVM,我们还是需要学习LVM的命令。那么我们就一步一步来实现LVM吧。
1.2.2 图形界面安装系统时配置LVM分区
还记得我们在安装系统的时候只分配了基本分区吗?其实在安装的过程中,采用图形界面也是可以建立LVM分区的。那么我们先来看看在图形安装界面下如何进行LVM分区,如图1-2所示。
图1-2 选择自定义分区
分区方法选择“创建自定义布局”,然后单击“下一步”按钮,就会进入驱动器选择界面,如图1-3所示。
图1-3 驱动器选择1
请大家注意引导分区/boot是不能在LVM中划分的,/boot分区必须使用基本分区。所以先将/boot分区划分为/dev/sda1,如图1-4所示。
图1-4 先建立/boot分区
然后单击“创建”按钮,就会进入“生成存储”界面,如图1-5所示。
图1-5 生成存储1
在“生成存储”界面中选择“LVM物理卷”单选按钮,就会建立物理卷。大家发现了吗?无论是图形方式建立LVM,还是下面要讲的命令方式建立LVM,建立顺序都是一样的。要先建立物理卷,再把一个或多个物理卷组合成卷组,最后在卷组中再划分出逻辑卷。单击“创建”按钮,就会进入“添加分区”界面,如图1-6所示。
图1-6 添加分区
在“添加分区”界面中,挂载点不适用,因为物理卷不能直接挂载使用。文件系统类型也只有physical volume(物理卷)这一种。我们选择“使用全部可用空间”单选按钮,把剩余的硬盘空间都建立为物理卷(大家注意,在这里我们把剩余的硬盘空间都建立为物理卷,而我们下面要讲的使用命令进行LVM管理时,也要先把分区建立为物理卷,才能进行后续操作,步骤是一致的)。单击“确定”按钮,物理卷就添加完成了,又回到了驱动器选择界面,如图1-7所示。
图1-7 驱动器选择2
在这里我们发现,除/boot分区之外,都变成了物理卷,这时需要把物理卷组合成卷组,单击“创建”按钮,再次进入“生成存储”界面,如图1-8所示。
图1-8 生成存储2
再次进入“生成存储”界面时,我们发现LVM卷组已经可以选择了,这时选择“LVM卷组”单选按钮,然后单击“创建”按钮,进入“生成LVM卷组”界面,如图1-9所示。
图1-9 生成LVM卷组
在“生成LVM卷组”界面中,可以修改卷组的名字,默认是“VolGroup”,把它改成“scvg”。也可以修改PE的大小,默认的物理范围是4MB,把它改成8MB。然后单击“添加”按钮,就可以建立逻辑卷了,如图1-10所示。
图1-10 生成逻辑卷
生成逻辑卷的过程和建立普通分区就基本一样了。我先建立的是/home分区,文件系统类型是ext4,逻辑卷的名称修改为lamplv01,逻辑卷的大小设定为2000MB。接下来再划分swap分区和/分区就好,不过需要swap分区是没有挂载点的,需要修改的是文件系统类型。全部分区分配完成之后,如图1-11所示。
图1-11 LVM分区完成
大家注意到我们把整块硬盘变成了物理卷(实际上是先把整个硬盘分为/dev/sda1分区,再把分区变为物理卷),然后把物理卷组成了scvg卷组,在卷组中划分了/分区、swap分区和/home分区三个逻辑卷。还要注意一点,一旦配置了LVM,逻辑卷的设备文件名不再是普通分区的命名表示(如/dev/sda1或/dev/sda2),而是采用“/dev/卷组名/逻辑卷名”的方式命名。例如,在我们刚刚划分的LVM中,/home分区的设备文件名是/dev/scvg/lamplv01。
1.2.3 命令模式管理LVM——物理卷管理
虽然使用图形界面方式建立LVM更加方便,但是LVM最主要的作用是在不丢失数据和不停机的情况下调整分区大小,所以我们一定会在系统安装完成之后,使用命令模式进行LVM调整。那么,在命令模式中LVM管理反而更加常用,我们一步一步在命令模式下实现LVM吧。
1.硬盘分区
首先建立所需的物理分区,创建方式就是使用fdisk交互命令。需要注意的是,分区的系统ID不再是Linux默认的分区ID 83,而要改成LVM的ID 8e。在/dev/sdb硬盘中还有空闲空间,在这块硬盘中新建立3个分区,每个分区的大小为1GB。命令如下:
[root@localhost ~]# fdisk /dev/sdb #建立分区的命令省略 Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000ebd Device Boot Start End Blocks Id System /dev/sdb1 1 65 522081 83 Linux /dev/sdb2 66 2610 20442712+ 5 Extended /dev/sdb5 66 197 1060258+ 83 Linux /dev/sdb6 198 329 1060258+ 83 Linux /dev/sdb7 330 461 1060258+ 83 Linux #建立了/dev/sdb5~7三个分区 Command (m for help): t Partition number (1-7): 5 Hex code (type L to list codes): 8e Changed system type of partition 5 to 8e (Linux LVM) #把/dev/sdb5的分区ID改为8e,其他两个分区照做,改好后,查询结果如下 Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000ebd Device Boot Start End Blocks Id System /dev/sdb1 1 65 522081 83 Linux /dev/sdb2 66 2610 20442712+ 5 Extended /dev/sdb5 66 197 1060258+ 8e Linux LVM /dev/sdb6 198 329 1060258+ 8e Linux LVM /dev/sdb7 330 461 1060258+ 8e Linux LVM #保存退出 [root@localhost ~]# partprobe #记得重新读取分区表,否则重启系统
2.建立物理卷
建立物理卷的命令如下:
[root@localhost ~]# pvcreate [设备文件名]
在建立物理卷时,我们既可以把整块硬盘都建立成物理卷,也可以把某个分区建立成物理卷。如果要把整块硬盘都建立成物理卷,则命令如下:
[root@localhost ~]# pvcreate /dev/sdb
在我们的使用中要把分区建立成物理卷,所以执行以下命令:
[root@localhost ~]# pvcreate /dev/sdb5 Writing physical volume data to disk "/dev/sdb5" Physical volume "/dev/sdb5" successfully created [root@localhost ~]# pvcreate /dev/sdb6 Writing physical volume data to disk "/dev/sdb6" Physical volume "/dev/sdb6" successfully created [root@localhost ~]# pvcreate /dev/sdb7 Writing physical volume data to disk "/dev/sdb7" Physical volume "/dev/sdb7" successfully created
3.查看物理卷
查看物理卷的命令有两个,第一个是pvscan,用来查询系统中哪些硬盘或分区是物理卷。命令如下:
[root@localhost ~]# pvscan PV /dev/sdb5 lvm2 [1.01 GiB] PV /dev/sdb6 lvm2 [1.01 GiB] PV /dev/sdb7 lvm2 [1.01 GiB] Total: 3 [3.03 GiB] / in use: 0 [0 ] / in no VG: 3 [3.03 GiB]
可以看到,在我们的系统中,/dev/sdb5~7这三个分区是物理卷。最后一行的意思是:共有3个物理卷[大小] / 使用了0个卷[大小] / 空闲3个卷[大小]。
第二个查询命令是pvdisplay,它可以查看到更详细的物理卷状态,命令如下:
[root@localhost ~]# pvdisplay "/dev/sdb5" is a new physical volume of "1.01 GiB" --- NEW Physical volume --- PV Name /dev/sdb5←PV名 VG Name ←属于的VG名,还没有分配,所以空白 PV Size 1.01 GiB ←PV的大小 Allocatable NO ←是否已经分配 PE Size 0 ←PE大小,因为还没有分配,所以PE大小也没有指定 Total PE 0 ←PE总数 Free PE 0 ←空闲PE数 Allocated PE 0 ←可分配的PE数 PV UUID CEsVz3-f0sD-e1w0-wkHZ-iaLq-O6aV-xtQNTB ←PV的UUID …其它两个PV省略…
4.删除物理卷
如果不再需要物理卷,则使用pvremove命令删除,命令如下:
[root@localhost ~]# pvremove /dev/sdb7
Labels on physical volume "/dev/sdb7" successfully wiped
# 当然,在我们的使用中还要用到/dev/sdb7物理卷,所以实验完成后,记得把它再添加回来
在删除物理卷时,物理卷必须不属于任何卷组,也就是需要先将物理卷从卷组中删除,再删除物理卷。其实所有的删除就是把创建过程反过来,建立时不能少某个步骤,删除时也同样不能跳过某一步直接删除。
1.2.4 命令模式管理LVM——卷组管理
物理分区已经建立,我们也把物理分区建立成了逻辑卷,按照步骤,接下来就要建立卷组了。我们说可以把卷组想象成基本分区中的硬盘,是由多个物理卷组成的。卷组就已经可以动态地调整空间大小了,当卷组空间不足时,可以向卷组中添加新的物理卷。
1.建立卷组
建立卷组使用的命令是vgcreate,具体命令格式如下:
[root@localhost ~]# vgcreate [选项] 卷组名 物理卷名 选项: -s PE大小:指定PE的大小,单位可以是MB、GB、TB等。如果不写,则默认PE大小是4MB
我们有三个物理卷/dev/sdb5~7,先把/dev/sdb5和/dev/sdb6加入卷组,留着/dev/sdb7一会儿实验调整卷组大小,命令如下:
[root@localhost ~]# vgcreate -s 8MB scvg /dev/sdb5 /dev/sdb6 Volume group "scvg" successfully created
我们把/dev/sdb5和/dev/sdb6两个物理卷加入了卷组scvg,并指定了PE的大小是8MB
2.查看卷组
查看卷组的命令同样有两个:vgscan命令主要用于查看系统中是否有卷组;而vgdisplay命令则用于查看卷组的详细状态。命令如下:
[root@localhost ~]# vgscan Reading all physical volumes. This may take a while... Found volume group "scvg" using metadata type lvm2 #scvg卷组确实存在 [root@localhost ~]# vgdisplay --- Volume group --- VG Name scvg ←卷组名 System ID Format lvm2 Metadata Areas 2 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 2 ←当前物理卷数 Act PV 2 VG Size 2.02 GiB ←卷组大小 PE Size 8.00 MiB ←PE大小 Total PE 258 ←PE总数 Alloc PE / Size 0 / 0 ←已用PE数量/大小 Free PE / Size 258 / 2.02 GiB ←空闲PE数量/大小 VG UUID Fs0dPf-LV7H-0Ir3-rthA-3UxC-LX5c-FLFriJ
3.增加卷组容量
我们现在要把/dev/sdb7加入卷组,使用的命令是vgextend。命令如下:
[root@localhost ~]# vgextend scvg /dev/sdb7 Volume group "scvg" successfully extended #把/dev/sdb7物理卷也加入scvg卷组 [root@localhost ~]# vgdisplay --- Volume group --- VG Name scvg System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 2 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 3.02 GiB ←卷组容量增加 PE Size 8.00 MiB Total PE 387 ←PE总数增加 Alloc PE / Size 0 / 0 Free PE / Size 387 / 3.02 GiB VG UUID Fs0dPf-LV7H-0Ir3-rthA-3UxC-LX5c-FLFriJ
4.减少卷组容量
既然可以增加卷组容量,当然也可以减少卷组容量,我们使用vgreduce命令在卷组中删除物理卷。命令如下:
[root@localhost ~]# vgreduce scvg /dev/sdb7 Removed "/dev/sdb7" from volume group "scvg" #在卷组中删除/dev/sdb7物理卷 [root@localhost ~]# vgreduce -a #删除所有未使用的物理卷
当然,删除之后记得再添加回来,以便下面再用于实验。
5.删除卷组
删除卷组的命令是vgremove。命令如下:
[root@localhost ~]# vgremove scvg Volume group "scvg" successfully removed
只有在删除卷组之后,才能删除物理卷。还要注意的是,scvg卷组中还没有添加任何逻辑卷,如果拥有了逻辑卷,则记得先删除逻辑卷再删除卷组。再次强调,删除就是安装的反过程,每一步都不能跳过。
当然,删除之后记得再建立回来,否则逻辑卷的实验就不能完成了。命令如下:
[root@localhost ~]# vgcreate -s 8MB scvg /dev/sdb5 /dev/sdb6 /dev/sdb7 Volume group "scvg" successfully created #这次三个物理卷就一起加入卷组了
1.2.5 命令模式管理LVM——逻辑卷管理
卷组建立完成后,接下来需要把卷组再划分为逻辑卷。我们可以把逻辑卷想象成分区,那么这个逻辑卷当然也需要被格式化和挂载。另外,逻辑卷也是可以动态调整大小的,而且数据不会丢失,也不用卸载逻辑卷。
1.建立逻辑卷
我们现在已经建立了3GB大小的卷组scvg,接下来需要在卷组中建立逻辑卷。命令格式如下:
[root@localhost ~]# lvcreate [选项] [-n逻辑卷名] 卷组名 选项: -L容量:指定逻辑卷大小,单位为MB、GB、TB等 -l个数:按照PE个数指定逻辑卷大小,这个参数需要换算容量,太麻烦 -n逻辑卷名:指定逻辑卷名
我们建立一个1.5GB大小的lamplv逻辑卷,命令如下:
[root@localhost ~]# lvcreate -L 1.5G -n lamplv scvg Logical volume "lamplv" created #在scvg卷组中建立一个1.5GB大小的lamplv逻辑卷
建立完逻辑卷,还要在格式化和挂载之后才能正常使用。格式化和挂载命令与操作普通分区时是一样的,不过需要注意的是,逻辑卷的设备文件名是“/dev/卷组名/逻辑卷名”,如逻辑卷lamplv的设备文件名就是“/dev/scvg/lamplv”。具体命令如下:
[root@localhost ~]# mkfs -t ext4 /dev/scvg/lamplv #格式化 [root@localhost ~]# mkdir /disklvm [root@localhost ~]# mount /dev/scvg/lamplv /disklvm/ #建立挂载点,并挂载 [root@localhost ~]# mount …省略部分输出… /dev/mapper/scvg-lamplv on /disklvm type ext4 (rw) #已经挂载了
当然,如果需要开机后自动挂载,则要修改/etc/fstab文件。
2.查看逻辑卷
查看命令同样有两个,第一个命令lvscan只能看到系统中是否拥有逻辑卷,命令如下:
[root@localhost ~]# lvscan ACTIVE '/dev/scvg/lamplv' [1.50 GiB] inherit #能够看到激活的逻辑卷,大小是1.5GB
第二个命令lvdisplay可以看到逻辑卷的详细信息,命令如下:
[root@localhost ~]# lvdisplay --- Logical volume --- LV Path /dev/scvg/lamplv ←逻辑卷的设备文件名 LV Name lamplv ←逻辑卷名 VG Name scvg ←所属的卷组名 LV UUID 2kyKmn-Nupd-CldB-8ngY-NsI3-b8hV-QeUuna LV Write Access read/write LV Creation host, time localhost, 2013-04-18 03:36:39 +0800 LV Status available # open 1 LV Size 1.50 GiB ←逻辑卷大小 Current LE 192 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
3.调整逻辑卷大小
我们可以使用lvresize命令调整逻辑卷的大小,不过我们一般不推荐减少逻辑卷的空间,因为这非常容易导致逻辑卷中的文件系统的数据丢失。所以,除非我们已经备份了逻辑卷中的数据,否则不要减少逻辑卷的空间。lvresize命令格式如下:
[root@localhost ~]# lvresize [选项] 逻辑卷的设备文件名 选项: -L容量:安装容量调整大小,单位为KB、GB、TB等。使用+代表增加空间,-代表减少 空间。如果直接写容量,则代表设定逻辑卷大小为指定大小 -l个数:按照PE个数调整逻辑卷大小
我们先在/disklvm分区中建立一些测试文件,一会儿调整完大小,我们再看看数据是否丢失了。
[root@localhost ~]# cd /disklvm/ [root@localhost disklvm]# touch testf [root@localhost disklvm]# mkdir testd [root@localhost disklvm]# ls lost+found testd testf
lamplv逻辑卷的大小是1.5GB,而scvg卷组中还有1.5GB的空闲空间,那么增加lamplv逻辑卷的大小到2.5GB。命令如下:
[root@localhost disklvm]# lvresize -L 2.5G /dev/scvg/lamplv Extending logical volume lamplv to 2.50 GiB Logical volume lamplv successfully resized #增加lamplv逻辑卷的大小到2.5GB #当然命令也可以这样写[root@localhost disklvm]# lvresize -L +1G /dev/scvg/lamplv [root@localhost disklvm]# lvdisplay --- Logical volume --- LV Path /dev/scvg/lamplv LV Name lamplv VG Name scvg LV UUID 2kyKmn-Nupd-CldB-8ngY-NsI3-b8hV-QeUuna LV Write Access read/write LV Creation host, time localhost, 2013-04-18 03:36:39 +0800 LV Status available # open 1 LV Size 2.50 GiB ←大小改变了 Current LE 320 Segments 3 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
逻辑卷的大小已经改变了,但是好像有如下一些问题:
[root@localhost disklvm]# df -h /disklvm/ 文件系统 容量 已用 可用 已用%% 挂载点 /dev/mapper/scvg-lamplv 1.5G 35M 1.4G 3% /disklvm
怎么/disklvm分区的大小还是1.5GB啊?刚刚只是逻辑卷的大小改变了,如果要让分区使用这个新逻辑卷,则还要使用resize2fs命令来调整分区的大小。不过这里就体现出了LVM的优势:我们不需要卸载分区,直接就能调整分区的大小。resize2fs命令的格式如下:
[root@localhost ~]# resize2fs [选项] [设备文件名] [调整的大小] 选项: -f:强制调整 设备文件名:指定调整哪个分区的大小 调整的大小:指定把分区调整到多大,要加M、G等单位。如果不加大小,则会使用整个分区
我们已经把逻辑卷调整到2.5GB,这时就需要把整个逻辑卷都加入/disklvm分区中,命令如下:
[root@localhost ~]# resize2fs /dev/scvg/lamplv resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/scvg/lamplv is mounted on /disklvm; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/scvg/lamplv to 655360 (4k) blocks. The filesystem on /dev/scvg/lamplv is now 655360 blocks long. #已经调整了分区大小 [root@localhost ~]# df -h /disklvm/ 文件系统 容量 已用 可用 已用%% 挂载点 /dev/mapper/scvg-lamplv 2.5G 35M 2.4G 2% /disklvm #分区大小已经是2.5GB了 [root@localhost ~]# ls /disklvm/ lost+found testd testf #而且数据并没有丢失
如果要减少逻辑卷的容量,则只需把增加步骤反过来再做一遍就可以了。不过我们并不推荐减少逻辑卷的容量,因为这有可能导致数据丢失。
4.删除逻辑卷
删除了逻辑卷,其中的数据就会丢失,所以要确定你真的需要删除这个逻辑卷。命令格式如下:
[root@localhost ~]# lvremove逻辑卷的设备文件名
我们删除lamplv逻辑卷,记得在删除时要先卸载。命令如下:
[root@localhost ~]# umount /dev/scvg/lamplv [root@localhost ~]# lvremove /dev/scvg/lamplv Do you really want to remove active logical volume lamplv? [y/n]: n Logical volume lamplv not removed #这里选择的是no,因为一会儿还要做实验,所以就不真的删除了
当然,在删除逻辑卷后,里面的所有数据都会被清空。