LVM逻辑卷管理
要使用磁盘存储数据,必须要先分区、建立文件系统,之后才可以挂载并使用文件系统存储数据。但是一些系统中凸显了这种方式的弊端:随着应用的不断扩展,存储的数据越来越多(例如数据库、文件服务器等),分区大小不能在线扩充就成了一个棘手的问题。为了解决问题,管理员们不得不关闭正在提供的业务,然后在线下执行扩展和数据转移工作。由于数据量巨大,线下扩展通常花费的时间很长,这对与关键性业务而言可能是致命的。
可以使用LVM来解决这一难题。LVM(Logical Volume Manager),逻辑卷管理。LVM可以将多个不同容量的分区合并在一起,然后重新分配使用空间。不仅如此,LVM还支持在线添加磁盘、删除磁盘、在线扩充文件系统等功能。
一、LVM的基本概念
1、基本术语
物理卷(PV,Physical Volume):构成LVM的基本存储设备。在实际应用中,物理卷可以是磁盘分区、RAID设备等。
卷组(VG,Volume Group):卷组就像一个可以扩充的磁盘(可以简单地理解为卷组是未分区的磁盘),由一个或多个物理卷组成。
逻辑卷(LV,Logical Volume):逻辑卷就像是卷组中的一个分区,可以创建文件系统,挂载并存储数据。
将多个物理卷组成卷组后,就可以在卷组的基础上创建逻辑卷、文件系统并存储数据。由于逻辑卷在卷组的基础上创建,而卷组又由多个物理卷组成,因此一个逻辑卷可能位于不同的物理卷之上。
在磁盘中,系统会通过查找扇区的方式寻址并存取数据。由于逻辑卷可能会位于不同的磁盘上,因此不能使用扇区寻址。为解决逻辑卷寻址的问题,LVM引入了两个新的概念:物理块和逻辑块。
物理块(PE,Physical Extent),加入卷组的物理卷被划分为许多大小相等的物理块,物理块的大小通常为4MB。物理块的功能类似于磁盘上的扇区,每个物理块都具有唯一的地址,LVM通过物理块在磁盘中寻址。与磁盘中的扇区类似,物理块也是LVM中最小的可寻址存储单元。
逻辑快(LE,Logical Extent),与物理卷一样,逻辑卷也被划分为许多大小相等的逻辑块,其大小和物理块大小相同。逻辑块是逻辑卷上可寻址的最小存储单元。
逻辑块和物理块之间的关系是一一对应的,即一个逻辑块对应一个物理块。在物理卷的起始处,有一个类似于分区表的区域,称为VGDA(卷组描述符区域)。LE和PE之间的对应关系就保存在VGDA的一个表中,除此之外VGDA还保存有卷组描述符等内容。
提示:读者可以简单地理解为:物理块是物理卷中的“扇区”,逻辑块是逻辑卷中的“扇区”。
2、LVM工作原理
存储数据时,LVM会为数据分配逻辑块,将数据存储到分配的逻辑块上。此时卷组会分配与逻辑块相对应的物理块,并将数据交给磁盘,磁盘会将数据存储到对应的物理块中。
在这个数据存储的例子中,卷组就像是逻辑卷与物理卷的“中间人”,它负责地址转换工作。读取、写入数据时,卷组会将逻辑卷分配的逻辑块地址转换为物理块地址。
二、创建物理卷
创建LVM的顺序依次是:物理卷、卷组、逻辑卷。
物理卷的实质是一个存储设备,通常可以使用的存储设备有磁盘分区、RAID设备等。创建物理卷的过程,就是向物理卷写入LVM信息的过程。
(1)创建并修改分区类型
创建物理卷PV之前,需要先对磁盘进行分区并修改分区类型,这个过程与创建组成RAID设备的分区类似:
[root@localhost ~]# fdisk /dev/sda The number of cylinders for this disk is set to 1958. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-1958, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-1958, default 1958): Using default value 1958 #此处使用的分区类型是8e Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): p Disk /dev/sda: 16.1 GB, 16106127360 bytes 255 heads, 63 sectors/track, 1958 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 1 1958 15727603+ 8e Linux LVM Command (m for help): w
创建分区的过程与前几节介绍的过程一样,不同的是需要将分区的类型设置为Linux LVM,以便管理员查看和管理。
本例中还需要依次创建分区sdc2和sdd5.
(2)初始化物理卷
分区创建好之后,就可以使用pvcreate命令初始化物理卷。pvcreate命令没有任何选项,直接将要初始化的分区作为其参数即可。
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdc2 /dev/sdd5
Phsical volume “/dev/sdb1” successfully created
Phsical volume “/dev/sdc2” successfully created
Phsical volume “/dev/sdd5” successfully created
三、创建卷组
所有的物理卷都初始化完成后,就可以创建卷组了。创建卷组的命令是vgcreate。
【命令格式】
vgcreate vg_name pv
vg_name是要创建的卷组名称,pv是组成卷组的物理卷列表。如果列表中有多个物理卷,需要使用空格作为分隔符。
【用法示例】
(1)使用上面创建的物理卷/dev/sdb1、/dev/sdc2和/dev/sdd5,创建一个名为LVM01_Volume的卷组。
[root@localhost ~]# vgcreate LVM01_Volume /dev/sdb1 /dev/sdc2 /dev/sdd5
(2)常见完成后,可以使用vgdisplay查看新建立的卷组:
[root@localhost ~]# vgdisplay -v LVM01_Volume
提示:如果需要查看更为详细的卷组信息,可以使用vgdisplay -vv或vgdisplay -vvv命令。
四、创建逻辑卷
创建卷组之后,就可以使用lvcreate命令在其基础上创建逻辑卷了。在创建逻辑卷之前,还需要规划逻辑卷的大小(按实际需要划分)、逻辑卷的模式等。
1、逻辑卷模式
按写入的方式不同,逻辑卷有如下两种模式:
线性模式:先写满组成线性逻辑卷的第一个物理卷,再向第2个物理卷中写入数据,以此类推。
交错模式:写入数据时交错地将数据写入组成逻辑卷的多个物理卷中(写入方式类似于RAID 0)。
交错模式的理论写入速度比线性模式快。
2、创建逻辑卷
选择逻辑卷模式时,如果逻辑卷需要处理大量读写操作,通常建议使用交错模式,否则应该使用线性模式。
(1)创建一个名为file,大小为100GB的线性逻辑卷:
#选项L用于指定逻辑卷的大小
#选项n用于指定逻辑卷的名称
[root@localhost ~]# lvcreate -L 100G -n file LVM01_Volume
(2)如果要创建交错逻辑卷,可以使用如下命令:
#选项i表示交错值为2 #选项I(大写字母i)表示指定逻辑卷的块大小,本例中为4MB #选项l(小写字母L)表示块数量,本例中表示块数量为100个 [root@localhost ~]# lvcreate -i 2 -I 4 -l 100 -n test LVM01_Volume
3、查看逻辑卷
(1)新建的逻辑卷已经放在目录/dev中,可以使用ls命令查看逻辑卷的块设备文件:
[root@localhost ~]# ls -l /dev/LVM01_Volume/file
逻辑卷文件以/dev/VGname/LVname的格式命名。
(2)如果要查看指定的逻辑卷的详细信息,可以使用命令lvdisplay:
[root@localhost ~]# lvdispaly -v /dev/LVM01_Volume/file
提示:与查看卷组命令一样,查看更详细的逻辑卷信息,也可以使用lvdisplay -vv,lvdisplay -vvv命令。
4、使用逻辑卷
逻辑卷创建完成之后,其使用方法与分区相同,先创建文件系统,然后挂载并存储数据。
(1)为逻辑卷file创建ext3文件系统,并挂载到目录/mnt/file:
[root@localhost ~]# mkfs.ext3 /dev/LVM01_Volume/file [root@localhost ~]# mkdir /mnt/file [root@localhost ~]# mount /dev/LVM01_Volume/file /mnt/file/
(2)为了能在系统启动时自动挂载逻辑卷,可以在配置文件/etc/fstab的最后加入以下内容:
/dev/LVM01_Volume/file /mnt/file ext3 defaults 0 2
完成上述步骤之后,就可以使用逻辑卷存储数据了。
五、添加物理卷
随着逻辑卷中存储数据越来越多,其可用空间可能会不足,由于LVM支持在线扩展,可以使用这一功能在线扩充空间。扩展之前可以使用vgdisplay查看卷组中是否还有未分配的空间,如果空间不足,就需要为卷组添加物理卷。
添加物理卷时,应该先对物理卷进行初始化,之后再利用vgextend命令为卷组添加物理卷。
(1)例如为LVM01_Volume卷组添加新物理卷/dev/sde3:
[root@localhost ~]# pvcreate /dev/sde3 Physical volume "/dev/sde3" successfully created [root@localhost ~]# vgextend LVM01_Volume /dev/sde3 Volume group "LVM01_Volume" successfully extended
(2)除命令输出之外,还可以使用vgdisplay,查看物理卷是否添加成功。
六、扩充逻辑卷
如果卷组还有为分配的空间,就可以使用lvextend命令扩充逻辑卷了。扩充逻辑卷时,不必卸载已挂载的文件系统,也无需停止对逻辑卷的读写操作。
(1)要将当前的逻辑卷/dev/LVM01_Volume/file扩展到120GB可以使用如下命令:
[root@localhost ~]# lvextend -L 120G /dev/LVM01_Volume/file
注意上面的示例命令的作用是将逻辑卷扩展到120GB,而不是为其增加120GB。
(2)如果需要指定增加空间的大小,可以使用以下命令:
[root@localhost ~]# lvextend -L +10G /dev/LVM01_Volume/file
(3)虽然逻辑卷已经扩充到了130GB,但使用df -h命令(用于查看已挂载的文件系统的使用情况)显示的结果却没有变化。原因在于,虽然逻辑卷的容量已经改变,但逻辑卷上的文件系统却没有发生变化,因此还需要在线扩充文件系统。在线扩充文件系统的命令为resize2fs。
注意:命令resize2fs只能用于调整ext2、ext3文件系统,如果逻辑卷使用的是其他文件系统,就需要参阅相关文档了解具体的命令。
例如,将逻辑卷file的文件系统在线扩充至130GB:
[root@localhost ~]# resize2fs /dev/LVM01_Volume/file 130G
接下来执行df -h命令就可以看到正确的容量了。
七、减少逻辑卷
有时不合理地分配了逻辑卷的容量,导致其他逻辑卷空间不足,也可能是调整空间以便于移除某个物理卷。这时就需要减少某个逻辑卷的空间。减少逻辑卷的空间可以使用命令lvreduce。
相对于逻辑卷的扩充过程而言,减小逻辑卷容量的过程比较麻烦,这时因为减少容量的过程中,需要移动某些数据,并修改文件信息。
(1)由于要修改文件信息,因此整个操作过程不能在线进行。首先需要卸载文件系统,并强制检查文件系统是否存在错误:
[root@localhost ~]# umount /mnt/file/
[root@localhost ~]# fsck -f /dev/LVM01_Volume/file
由于fsck命令会扫描所有数据块,因此当文件系统较大时,可能需要花费大量的时间。
(2)与扩充逻辑卷的过程相反,减小逻辑卷时,应该首先减小文件系统,减小文件系统仍然使用命令resize2fs。
例如将逻辑卷file的文件系统减少至50GB:
[root@localhost ~]# resize2fs /dev/LVM01_Volume/file 50GB
由于resize2fs命令会合并未使用的空间并移动数据,因此上面这个示例命令可能需要花费许多时间。
提示:减小文件系统之前,应该保证逻辑卷中存放的数据减小后的空间,否则可能会损坏逻辑卷中的数据。
(3)文件系统减小后,就可以使用lvreduce命令减小逻辑卷的容量了:
#使用lvreduce命令将逻辑卷减小至50GB
#选项L用于指定减小后的逻辑卷的大小
[root@localhost ~]# lvreduce -L 50G /dev/LVM01_Volume/file
八、移动数据并移除物理卷
有时需要将物理卷从卷组中删除,以便于添加更大容量的磁盘,以扩充逻辑卷的存储空间。此时可以使用pvremove命令。
移除物理卷时,一定要确保卷组中未分配的连续可用物理块,大于移除的物理卷中分配的物理块。只有这样,才能将物理卷中的数据移动到其他物理卷中。
(1)在本例中,演示如何从卷组中移除物理卷/dev/sdd5。首先需要使用pvdisplay查看物理卷的分配情况:
[root@localhost ~]# pvdisplay –m
…
--- Physical voluem ---
PV Name /dev/sdd5
VG Name LVM01_Volume
PV Size 80.00 GB / not usable 1.32MB
Allocatable yes
PE Size (KByte) 4096
#注意sdd5中已分配的PE数目
Total PE 20479
Free PE 10238
Allocated PE 10241
PV UUID *
#注意使用物理卷的逻辑卷为/dev/LVM01_Volume/file
--- Physical Segments ---
Phsical extents 0 to 10240:
Logical volume /dev/LVM01_Volume/file
Logical extents 20479 to 30719
Phsical extent 10241 to 20478:
FREE
…
尤其注意物理卷/dev/sdd5的分配情况,关注其被占用的物理块共有多少块,查看哪些物理卷的大小可以放的下这些物理块,就可以将这些物理卷确定为数据移动的目标物理卷。
(2)确认数据移动的目标物理卷后,就可以使用pvmove命令移动PE了。例如将/dev/sdd5上的数据移动到/dev/sde3中:
[root@localhost ~]# pvmove /dev/sdd5 /dev/sde3
移动数据时,命令会显示当前移动数据的进度。由于物理卷中可能会有很多数据。因此这个过程通常会很慢,建议在逻辑卷读写压力较小时进行。
移动物理卷数据的过程中,一定要确保没有新的逻辑卷被分配,否则可能又会占用要移除的物理卷。
如果卷组中的剩余PE足够,也可以使用以下命令移动数据:
#使用pvmove命令自动移动物理卷/dev/sdd5中的数据 #选项i表示移动指定百分比的数据,就向用户报告 [root@localhost ~]# pvmove -i 10 /dev/sdd5
此命令将由系统自己决定将数据移动到哪个物理卷上。
(3)确认没有逻辑卷占用物理卷后,可以使用命令vgreduce将其移出卷组。例如移除物理卷/dev/sdd5:
[root@localhost ~]# vgreduce LVM01_Volume /dev/sdd5
注意:移除物理卷操作非常危险,应该确认所有的数据均已移动到其他物理卷上,否则会造成数据丢失。
九、逻辑卷快照
对数据库文件进行备份时,由于数据库处于工作状态,因此不停地写入、删除数据库中的信息,会造成备份后的数据前后不一致。这时可以使用快照(snapshot)。
创建逻辑卷快照与创建逻辑卷一样,都使用lvcreate命令。
(1)创建快照卷之前,需要确认原始卷的大小,因为创建的快照卷通常都应该比原始卷大(1.1倍至1.2倍之间即可)。
例如要为/dev/LVM01_Volume/databases创建快照卷:
#使用lvcreate命令创建名为db_snapshot的快照卷
#选项L用于指定快照卷的大小
#选项s表示要创建的是快照卷
#选项n用于指定快照卷的名称
[root@localhost ~]# lvcreate -L 40G -s -n db_snapshot /dev/LVM01_Volume/databases
快照卷创建完成后,就可以挂载并备份其中的数据文件了。
(2)完成备份之后,可以使用以下命令卸载并删除快照卷:
[root@localhost ~]# umount /dev/LVM01_Volume/db_sanpshot
[root@localhost ~]# lvremove /dev/LVM01_Volume/db_sanpshot
快照卷具有非常广泛的用途,例如快速还原虚拟机。