- 细说Linux系统管理(第2版)
- 沈超编著
- 6146字
- 2021-01-05 18:33:23
1.2 LVM(逻辑卷管理)
在实际使用Linux 服务器的时候,总会遇到一个让人头疼的问题:分区到底应该分多大呢?分得太大,会浪费硬盘空间;分得太小,又会面临分区不够用的情况。如果在安装系统时规划不合理,这种困扰就会经常出现。如果真出现了分区不够用的情况,应该怎么解决呢?在以往(2.4内核以前)要想调整分区大小,要么先新建一个更大的分区,然后复制旧分区中的内容到新分区,最后使用软链接来替代旧分区;要么使用调整分区大小的工具(如parted)。parted 虽然可以调整分区大小,但是要在卸载分区之后才可以进行,也就是说,需要停止服务。LVM 最大的好处就是可以随时调整分区大小,分区中的现有数据不会丢失,并且不需要卸载分区、停止服务。
1.2.1 LVM 的概念
LVM 是Logical Volume Manager 的简称,译为中文就是逻辑卷管理。它是Linux 系统对硬盘分区的一种管理机制。LVM 先在硬盘分区之上建立一个逻辑层,这个逻辑层让多块硬盘或多个分区看起来像一块逻辑硬盘,然后将这块逻辑硬盘分成逻辑卷使用,从而大大提高了分区的灵活性。我们把真实的物理硬盘或分区称作物理卷(Physical Volume,PV);由多个物理卷组成一块大的逻辑硬盘,叫作卷组(Volume Group,VG);将卷组划分成多个可以使用的分区,叫作逻辑卷(Logical Volume,LV)。在LVM 中,保存数据的最小单元不再是block,而是物理扩展(Physical Extend,PE)。我们通过图1-1来看看这些概念之间的联系。
● 物理卷:可以把分区或整块硬盘划分成物理卷。如果把分区划分成物理卷,则需要把分区ID 改为8e00(LVM 的标识ID)。如果把整块硬盘划分成物理卷,则可以直接划分,不需要提前把整块硬盘划分成一个分区。
● 卷组:将多个物理卷合起来就组成了卷组。组成同一个卷组的物理卷既可以是同一块硬盘上的不同分区,也可以是不同硬盘上的不同分区。可以把卷组想象为一块逻辑硬盘。
● 逻辑卷:卷组是一块逻辑硬盘,硬盘必须在分区之后才能使用,我们把这个分区称作逻辑卷。逻辑卷可以被格式化和写入数据。可以把逻辑卷想象为分区。
● 物理扩展:PE 是用来保存数据的最小单元,我们的数据实际上都是被写入PE 当中的。PE 的大小是可以配置的,默认为4MB。不要把PE 和block 搞混了,block 是在格式化的时候写入文件系统时划分的,而PE 是在划分VG 的时候划分的。
图1-1 LVM 示意图
也就是说,在建立LVM 的时候,需要按照以下步骤进行:
(1)把物理硬盘划分成分区,并把分区ID 改为8e00。当然也可以直接使用整块硬盘。如果直接使用整块硬盘,则不需要把硬盘提前分区。
(2)把物理分区建立成物理卷。也可以直接把整块硬盘建立成物理卷。
(3)把物理卷整合为卷组。在建立卷组的时候需要划分PE,默认大小为4MB。卷组可以动态地调整大小。既可以把物理分区加入卷组中,也可以把物理分区从卷组中删除。
(4)把卷组再划分成逻辑卷。逻辑卷也是可以直接调整大小的。
(5)这时,逻辑卷就可以直接被当作分区来使用了。需要把逻辑卷格式化,之后挂载,就可以存储数据了。
其实,在采用图形界面安装Linux 系统时就可以直接把硬盘配置成LVM(RAID 也可以在安装时直接配置),但在当时我们只分配了基本分区。那是因为LVM 最主要的作用是调整分区大小,所以,就算在安装Linux 系统时已经安装了LVM,我们仍然需要学习LVM 的命令。下面我们就一步一步地实现LVM。
1.2.2 在采用图形界面安装Linux 系统时建立LVM
还记得我们在安装Linux 系统的时候只分配了基本分区吗?其实,在安装Linux 系统的过程中,采用图形界面也是可以建立LVM 的。采用光盘启动图形安装界面的方法,进入“安装信息摘要”界面,如图1-2所示。
图1-2 安装信息摘要
在“安装信息摘要”界面上选择“安装位置”,进入“安装目标位置”界面,如图1-3所示。
图1-3 安装目标位置
在“安装目标位置”界面上选择“我要配置分区”单选按钮,然后单击“完成”按钮,进入“手动分区”界面,如图1-4所示。
图1-4 手动分区1
在“手动分区”界面中,把“新挂载点将使用以下分区方案”选择为“LVM”。
单击“+”按钮,进入“添加新挂载点”界面。添加/boot 分区,大小分配为500MB,如图1-5所示。
图1-5 添加新挂载点1
单击“添加挂载点”按钮,/boot 分区分配完成,返回“手动分区”界面,如图1-6所示。
图1-6 手动分区2
这时我们会发现,明明选择的是LVM 分区方案,但/boot 分区依然是“标准分区”,设备文件名依然是/sda1。
需要注意的是,就算选择的是LVM 分区方案,在启动/boot 分区时也必须使用标准分区,而不能使用LVM 分区,否则系统会报错。所以要先建立一个标准分区作为/boot 分区,后续的分区才能使用LVM 分区。
再次单击“+”按钮,接着进入“添加新挂载点”界面,添加swap 分区,如图1-7所示。
图1-7 添加新挂载点2
给swap 分区分配512MB 空间。注意,在swap 前面没有“/”,因为swap 是一种独立的文件系统类型,而不是“/”下的目录。
这个添加挂载点的界面看起来好像和分配/boot 分区的界面没有任何区别,这样分配出来的分区是LVM 分区吗?单击“添加挂载点”按钮,返回“手动分区”界面,如图1-8所示。
图1-8 手动分区3
我们会发现,swap 分区的“设备类型”是“LVM”。“Volume Group”选项就是卷组名,将其改为“scvg”;“名称”选项就是逻辑卷名,将其改为“lvswap”,如图1-9所示。
图1-9 修改卷组名和逻辑卷名
再次单击“+”按钮,准备添加“/”分区,如图1-10所示。因为我们打算就分这3个基本分区,所以把所有剩余空间都分配给“/”分区。
图1-10 添加新挂载点3
这里的“期望容量”不要输入大小,代表把所有剩余空间分配给“/”分区。单击“添加挂载点”按钮就完成了分配,如图1-11所示。
图1-11 LVM 分区完成
因为在添加swap 分区的时候修改过卷组名,所以“/”分区的卷组名默认是“scvg”,不用再修改了。把“/”分区的逻辑卷名改为“lvroot”,最终在系统中“/”分区的设备文件名是“/dev/scvg/lvroot”。
1.2.3 命令模式管理LVM——物理卷管理
虽然使用图形界面方式建立LVM 更加方便,但是这种方式只能在新安装Linux 系统的时候才可以使用。因为LVM 最主要的作用是在不丢失数据和不停机的情况下调整分区大小,所以我们一定会在安装完系统之后,使用命令模式进行LVM 调整。那么,在命令模式下,LVM管理反而更加常用。下面,我们一步一步地在命令模式下实现LVM 吧。
有两种方法可以建立物理卷。
● 一种方法是使用分区建立物理卷。这时需要先进行分区,并把分区ID 改为8e00。我们打算在/dev/sdb 硬盘上建立3个1GB 大小的分区,用于实验。
● 另一种方法是直接把整块/dev/sdc 硬盘建立成物理卷。这时,整块硬盘不需要提前分区。
1.硬盘分区
首先建立所需的物理分区,建立方式就是使用gdisk 交互命令。在这里直接使用了GPT 分区表,建立过程请参考《细说Linux 基础知识》(第2版)中的相关内容。
需要注意的是,分区ID 不再是Linux 默认的分区ID 8300,而要改成LVM 的ID 8e00。在/dev/sdb 硬盘上建立3个分区,每个分区的大小为1GB。命令如下:
2.建立物理卷
建立物理卷的命令如下:
在建立物理卷时,既可以把整块硬盘建成物理卷,也可以把某个分区建成物理卷。如果要把整块硬盘建成物理卷,那么这块硬盘不需要提前分区,直接建成物理卷即可。命令如下:
因为在我们的实验中需要把分区建成物理卷,所以执行以下命令:
3.查看物理卷
查看物理卷的命令有两个。第一个查看命令是pvscan,用来查看系统中有哪些硬盘或分区是物理卷。命令如下:
可以看到,在我们的系统中,/dev/sdb1~3这3个分区是物理卷,/dev/sdc 这块硬盘也是物理卷。上述代码最后一行的意思是:共有4个物理卷[大小] / 使用了0个物理卷[大小] / 空闲4个物理卷[大小]。
第二个查看命令是pvdisplay,使用它可以查看更详细的物理卷状态。命令如下:
4.删除物理卷
如果不再需要物理卷,则使用pvremove 命令将其删除。命令如下:
在删除物理卷时,物理卷必须不属于任何卷组,也就是需要先将物理卷从卷组中删除,再删除物理卷。其实,所有的删除操作都是把建立过程反过来的,在建立时不能缺少某个步骤,在删除时同样不能跳过某个步骤直接删除。
1.2.4 命令模式管理LVM——卷组管理
我们已经建立了物理分区,也把物理分区建成物理卷,按照步骤,接下来就要建立卷组了。可以把卷组想象成基本分区中的硬盘,它是由多个物理卷组成的。因为卷组可以动态地调整大小,所以,当卷组空间不足时,可以向卷组中添加新的物理卷。
1.建立卷组
建立卷组使用的命令是vgcreate,具体命令格式如下:
我们有4个物理卷,分别是/dev/sdb1、/dev/sdb2、/dev/sdb3和/dev/sdc。先把/dev/sdc 和/dev/sdb1加入卷组scvg 中,留着/dev/sdb2和/dev/sdb3一会儿实验调整卷组大小。命令如下:
我们把/dev/sdc 和/dev/sdb1两个物理卷加入卷组scvg 中,卷组的名称是可以自定义的。
2.查看卷组
查看卷组的命令同样有两个:vgscan 命令主要用于查看系统中是否有卷组;vgdisplay 命令则用于查看卷组的详细状态。命令如下:
3.增加卷组容量
现在要把/dev/sdb2和/dev/sdb3两个物理卷加入卷组scvg 中,使用的命令是vgextend。命令如下:
4.缩减卷组容量
既然可以增加卷组容量,当然也可以缩减卷组容量。可以使用vgreduce 命令在卷组中删除物理卷。命令如下:
使用LVM 的目的是在硬盘空间不足时进行扩容,绝不是觉得硬盘空间太大了,需要缩减,所以缩减卷组容量不符合实际使用习惯。另外,LVM 采用的是线性存储模式,也就是说,如果卷组是由两个物理卷组成的,则会先把第一个物理卷写满,再向第二个物理卷中写入数据。这样一旦把有数据的物理卷删除,数据是会丢失的。所以,我们并不建议缩减卷组容量。
当然,缩减之后记得添加回来,以便用于后续实验。
5.删除卷组
删除卷组的命令是vgremove。命令如下:
只有在删除卷组之后,才能删除物理卷。还要注意的是,在scvg 卷组中还没有添加任何逻辑卷,如果拥有了逻辑卷,则记得先删除逻辑卷,再删除卷组。再次强调,删除就是安装的反过程,每一步都不能跳过。
当然,删除之后记得建立回来,否则逻辑卷的实验就不能完成了。命令如下:
1.2.5 命令模式管理LVM——逻辑卷管理
在建立了卷组后,需要把卷组划分为逻辑卷。可以把逻辑卷想象成分区,那么,这个逻辑卷也需要被格式化和挂载。
逻辑卷也是可以动态调整大小的。如果要增加逻辑卷,那么逻辑卷中的数据是不会丢失的;如果要缩减逻辑卷,那么逻辑卷中的数据是有可能丢失的,所以不建议缩减逻辑卷,也不符合实际使用习惯。在调整逻辑卷大小的时候,不用卸载逻辑卷。
1.建立逻辑卷
我们现在已经拥有了23GB 大小的卷组scvg,接下来需要在卷组中建立逻辑卷。命令格式如下:
建立一个3GB 大小的逻辑卷disklv,命令如下:
建立完逻辑卷,还要在格式化和挂载之后才能正常使用。此时的格式化和挂载命令与操作普通分区时的格式化和挂载命令是一样的,需要注意的是,逻辑卷的设备文件名是“/dev/卷组名/逻辑卷名”,例如,逻辑卷disklv 的设备文件名是“/dev/scvg/disklv”。具体命令如下:
当然,如果需要开机后自动挂载,则要修改/etc/fstab 文件。
逻辑卷的设备文件名“/dev/scvg/disklv”和“/dev/mapper/scvg-disklv”都是“/dev/dm-0”的软链接。换句话说,这3个设备文件名代表同一个逻辑卷。
2.查看逻辑卷
查看逻辑卷的命令同样有两个。第一个查看命令lvscan 只能查看系统中是否拥有逻辑卷。命令如下:
第二个查看命令lvdisplay 可以查看逻辑卷的详细信息。命令如下:
3.调整逻辑卷大小
可以使用lvresize 命令调整逻辑卷大小。和缩减卷组是同样的道理,我们不推荐缩减逻辑卷的空间,因为这非常容易导致逻辑卷中的数据丢失,而且不符合实际使用习惯。lvresize 命令的具体格式如下:
先在/disklvm 分区中建立一些测试文件,在调整完大小后,再看看数据是否丢失了。
逻辑卷disklv 的大小是3GB,而卷组scvg 的大小是23GB,所以还有20GB 的剩余空间。那么,增加逻辑卷disklv 的大小到6GB。命令如下:
逻辑卷的大小已经改变了,但是好像有如下一些问题:
为什么/disklvm 分区的大小还是3GB?刚刚只是逻辑卷的大小改变了,如果要让分区使用这个新逻辑卷,则还要使用xfs_growfs 命令来调整分区的大小。不过,这里就体现出了LVM的优势:不需要卸载分区,可以直接调整分区的大小。
我们已经把逻辑卷的大小调整到6GB,这时需要把整个逻辑卷加入/disklvm 分区中。命令如下:
如果要缩减逻辑卷的容量,则只需把增加步骤反过来做一遍。不过,我们并不推荐缩减逻辑卷的容量,因为这有可能导致数据丢失。
4.删除逻辑卷
删除了逻辑卷,其中的数据就会丢失,所以要确定你真的需要删除这个逻辑卷。命令格式如下:
删除逻辑卷lamplv,记得在删除时要先卸载。命令如下:
当然,在删除逻辑卷后,里面的所有数据都会被清空。
1.2.6 LVM 快照
LVM 还有一个常用功能,就是LVM 快照。可以把LVM 快照理解为虚拟机的快照,用于把当前状态保存下来,如果状态发生了改变,则可以使用快照区中的数据进行恢复,从而保证数据不丢失。
1.LVM 快照的原理
在LVM 中,要想创建快照,需要注意快照区和被快照的逻辑卷必须在同一个卷组中,因为快照区与被快照的逻辑卷有很多物理扩展是通用的。那是怎么造成这种情况的呢?
当给原始LV 建立一个快照时,在快照区中只写入原始LV 的“元数据”(元数据是LVM的必需数据,主要记录卷组相关数据、逻辑卷相关数据等),如图1-12所示。
图1-12 LVM 快照
图1-12左图是建立快照时的情况,快照区不会真实地复制原始LV 中的数据,只是记录了原始LV 的元数据。这时,快照区的PE 是空白的,快照区共享了原始LV 中的PE。所以会看到快照区与原始LV 的大小一致,内容也完全一样。
当原始LV 中的数据被修改后,原始LV 在数据更新之前,会先把原始数据在快照区中备份一份。如图1-12右图所示,在把A 写成New A 之前,先将A 备份至快照区的一个PE 中,然后原始LV 中的数据才更新为New A。这样,不论原始LV 中的数据如何变化,快照区中保存的都是建立快照时的数据。
需要注意的是,快照也是有大小限制的。如果原始LV中的数据变化量小于快照区的大小,那么快照正常生效;但是,如果原始LV 中的数据变化量大于快照区的大小,那么快照马上就会失效。为了解决这个问题,提出两个建议。
● 在建立完快照之后,马上把快照区中的数据进行备份,这样就不用担心数据快照失效的问题了。但是,这样做和直接备份原始LV 中的数据是没有什么区别的。
● 把快照区建立得和原始LV 一样大,这样就不用考虑快照失效的问题了。
2.建立LVM 快照
在建立LVM 快照之前,先向原始LV 中复制一些测试数据。命令如下:
建立LVM 快照依然要使用lvcreate 命令。命令格式如下:
在建立快照之前,先查看一下卷组scvg 中的剩余空间。命令如下:
给逻辑卷/dev/scvg/disklv 建立一个2GB 大小的快照。命令如下:
快照建立完成,查看一下。命令如下:
在快照建立完成之后,也需要完成挂载才能正常使用。命令如下:
注意:在挂载快照分区的时候,需要使用“-o nouuid”选项,因为快照区和原始LV 的UUID是同一个,在XFS 文件系统中不允许具有相同UUID 的分区同时挂载。
在挂载之后,查看原始LV 和快照区中的数据。命令如下:
3.利用LVM 快照恢复数据
我们来测试一下如何利用LVM 快照恢复数据。在当前实验中,不能直接删除原始LV(/disklvm)中的数据,然后把快照区(/snap1)中的数据复制过去,从而完成数据恢复。因为如果原始LV(/disklvm)中的数据变化量大于快照区(/snap1)的大小,那么部分数据无法完全复制到快照区(/snap1),就会导致快照失效,数据丢失。
如果原始LV 中的数据发生变化,不论是数据增长,还是数据丢失,都可以通过快照区中的数据进行恢复。先向原始LV 中增加数据,命令如下:
必须事先备份快照区中的数据,然后才能删除原始LV 中的数据。命令如下:
在备份之后,开始卸载原始LV,并重新格式化,删除原始LV 中的所有数据。命令如下:
这时,如果需要恢复原始LV 中的数据,则只需要还原备份的数据。命令如下:
在这里是通过打包压缩的方式进行数据备份和恢复的,当然也可以利用其他的复制命令来进行数据备份和恢复。
对于LVM 快照的思考:采用以上方法进行快照和恢复,中间需要手工备份和恢复数据,才能保证数据不丢失。既然需要手工备份,那么,为什么不直接打包备份原始LV 中的数据,反而还需要创建快照?这不是多此一举吗?这样看来,只有把快照区创建得和原始LV 一样大小,才不用考虑快照失效的问题,才能真正利用快照来保护数据。