一、LVM原理概述
一般情况下,普通的磁盘分区是通过一个起始柱面和一个终止柱面来确定一个分区的范围的,这样的做法也就造成了分完区后,分区大小不可调整。比方说,有一个磁盘,分区时指定柱面1~500为分区一,柱面501~1000为分区二,若现在有需要,要扩大分区一的空间,而分区应该是连续的一段柱面范围,分区一的终止柱面后的空间又已经被分区二占据,无法扩大分区。正因如此,一般的分区范围是被规定为不可变的,无法扩大或缩小。
但在实际生产应用中,随着业务的发展变化,原来设计的分区大小也许不能继续满足需求,要求要有更大的分区。为了解决分区创建后空间不可变的缺点,便有了LV(Logical Volume,逻辑卷),相应的管理机制叫做LVM(Logical Volume Manager,逻辑卷管理)。
LV的实现过程如下:
整个LV的实现模型可分为三层,由低向上分别为物理卷PV、卷组VG和逻辑卷LV。
物理卷PV由普通的物理分区创建,也是LV模型中真实存储数据的物理设备,物理卷的空间大小由创建它的分区决定,且和分区一样,空间大小固定不可变。
一个或多个物理卷组成一个卷组VG。VG创建后,仍能增添新或删除组内的PV,所以VG的空间取决于组内所有PV之和,且VG空间可变(通过增删PV实现)。
最顶层的逻辑卷LV,是建立在VG之上的。可以这么理解:LV眼中的VG,就像以前分区眼中的磁盘一样,LV依托于VG提供的空间,且LV在构建后空间也是可变的,但大小在VG可提供的范围内。LV创建好后,我们便能在LV上创建文件系统来使用了。
虽然介绍了逻辑卷的模型,但好像没能解释清楚为什么LV是可变的。其实,在PV上创建VG时,会将PV划分为很多个物理块PE,PE默认是4MB,可指定大小。VG在分配空间给LV时,是以PE为单位进行分配的,且各PE无需连续。所以,在LV需要扩容时,VG只要给它增加配置更多的PE便能实现。
二、LVM管理工具
2.1 pv管理工具
2.1.1 pvs:简要pv信息显示
简要pv信息显示,在没有指定设备时,显示所有pv信息。
SYNOPSIS:pvs [device]
,
[root@www ~]# pvs /dev/sdb5
PV VG Fmt Attr PSize PFree
/dev/sdb5 lvm2 ---- 5.01g 5.01g
2.1.2 pvdisplay:显示pv的详细信息
显示pv的详细信息,在没有指定设备时,显示所有pv信息。
SYSNOPSIS:pvdisplay [device]
[root@www ~]# pvdisplay /dev/sdb5
"/dev/sdb5" is a new physical volume of "5.01 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb5
VG Name
PV Size 5.01 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID TvXIYs-eKsJ-lfX2-qMju-bWyH-2Z97-Lvdx7k
2.1.3 pvcreate:创建pv
SYNOPSIS:pvcreate device
[root@www ~]# pvcreate /dev/sdb5
Physical volume "/dev/sdb5" successfully created
2.1.4 pvmove
移动pv中的数据到同一vg中的其他pv中去。
SYNOPSIS:pvmove PhysicalDevicePath
[root@www ~]# pvmove /dev/sdb7
No data to move for myvg
2.1.5 pvremove
SYNOPSIS:pvremove PhysicalVolume [PhysicalVolume]...
[root@www ~]# pvremove /dev/sdb5
Labels on physical volume "/dev/sdb5" successfully wiped
2.2 vg管理工具
2.2.1 vgs:简要显示vg信息
简要显示vg信息,在不指定特定vg时,显示所有vg的简要信息。
SYNOPSIS:vgs [VolumGroupName]
[root@www ~]# vgs myvg
VG #PV #LV #SN Attr VSize VFree
myvg 2 0 0 wz--n- 10.02g 10.02g
[root@www ~]# vgs
VG #PV #LV #SN Attr VSize VFree
myvg 2 0 0 wz--n- 10.02g 10.02g
vg_livecd 1 3 0 wz--n- 119.51g 0
2.2.2 vgdisplay:显示vg详细信息
显示vg详细信息,不指定特定vg时,显示所有vg的详细信息。
[root@www ~]# vgdisplay myvg
--- Volume group ---
VG Name myvg
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 10.02 GiB
PE Size 4.00 MiB
Total PE 2564
Alloc PE / Size 0 / 0
Free PE / Size 2564 / 10.02 GiB
VG UUID BlckS2-QEP4-amji-dgt4-CFUJ-C994-kdcmwO
2.2.3 vgcreate:创建vg
SYNOPSOS:vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath]...
- VolumGroupName:卷组名。
- PhysicalDevicePath:物理设备路径,即物理卷PV。
- -s选项:用于指定PE大小,默认是4MB。
[root@www ~]# vgcreate myvg /dev/sdb5 /dev/sdb6
Volume group "myvg" successfully created
2.2.4 vgextend:扩展vg空间
向vg添加新的pv,以扩展vg空间。
SYNOPSIS:vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath]...
[root@www ~]# vgextend myvg /dev/sdb7
Volume group "myvg" successfully extended
2.2.5 vgreduce:缩小vg空间
移除vg下的pv,以缩小vg的空间。注意,移除pv前,需先使用pvmove
以移动被移除pv的数据至同一vg下的其他pv中。
SYNOPSIS:vgreduce VolumeGroupName PhysicalDevicePath
[root@www ~]# pvmove /dev/sdb7
No data to move for myvg
[root@www ~]# vgreduce myvg /dev/sdb7
Removed "/dev/sdb7" from volume group "myvg"
2.2.6 vgremove:删除vg
删除vg。
SYNOPSIS:vgremove VolumeGroupName
[root@www ~]# vgremove myvg
Volume group "myvg" successfully removed
2.3 lv管理工具
2.3.1 lvs:简要显示lv信息
SYNOPSIS:lvs [VolumeGroupName | LogicalVolumePath]
显示所有逻辑卷lv的简要信息:
[root@www ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mylv myvg -wi-a----- 10.00g
lv_home vg_livecd -wi-ao---- 68.57g
lv_root vg_livecd -wi-ao---- 50.00g
lv_swap vg_livecd -wi-ao---- 960.00m
显示指定的卷组vg下的所有逻辑卷LV:
[root@www ~]# lvs myvg
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mylv myvg -wi-a----- 10.00g
显示指定逻辑卷LV的简要信息:
[root@www ~]# lvs /dev/myvg/mylv
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mylv myvg -wi-a----- 10.00g
2.3.2 lvdisplay:显示LV的详细信息
SYNOPSIS:lvs [VolumeGroupName | LogicalVolumePath]
显示所有逻辑卷LV的详细信息:
[root@www ~]# lvdisplay
显示指定卷组VG上的逻辑卷LV的详细信息:
[root@www ~]# lvdisplay myvg
显示指定逻辑卷LV的详细信息:
[root@www ~]# lvdisplay /dev/myvg/mylv
2.3.3 lvcreate:创建LV
SYNOPSIS:lvcreate -L #[mMgGtT] -n NAME VolumeGroup
- -L:指定lv的空间大小。
- -n:指定lv的名称。
[root@www ~]# lvcreate -L 10G -n mylv myvg
Logical volume "mylv" created.
2.3.4 lvremove:删除LV
SYNOPSIS:lvremove /dev/VG_NAME/LV_NAME
[root@www ~]# clear
[root@www ~]# lvremove /dev/myvg/mylv
Do you really want to remove active logical volume mylv? [y/n]: y
Logical volume "mylv" successfully removed
2.3.5 lvextend:扩展逻辑卷
SYNOPSIS:lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
- -L:无“+”,则指定LV扩展后空间大小,有“+”,则指定LV扩展了的空间大小。
扩展逻辑卷后,还要扩展文件系统的边界,才能真正实现可用空间的扩展。其过程如下:
# lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME(扩展逻辑卷LV的空间)
# resize2fs /dev/VG_NAME/LV_NAME(调整文件系统的大小)
2.3.6 lvreduce:缩减逻辑卷
SYNOPSIS:lvreduce -L [-]#[mMgGtT] /DEV/VG_NAME/LV_NAME
- -L:无“-”,则指定LV缩减后空间大小,有“-”,则指定LV减少了的空间。
对使用中的LV进行缩减操作:
# umount /dev/VG_NAME/LV_NAME(卸载逻辑卷)
# e2fsck -f /dev/VG_NAME/LV_NAME(检查逻辑卷文件系统)
# resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT](缩减LV上文件系统的边界)
# lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME(缩减LV空间)
# mount ...(重新挂载逻辑卷)
2.3 快照:snapshot
数据备份是服务器维护中常见的操作,以保存某一时刻服务器中的数据。但备份内容一般较大,整个复制过程需要较长时间。在这个过程中,服务器仍要正常工作,有被访问并修改内容的可能性,这样就造成了先被复制备份的数据和最后被复制备份的数据不是一个时刻的,且中途可能数据会有所改动。而快照卷很好地解决了这个问题,快照卷将逻辑卷被快照的那一瞬间的状态保留下来,快照卷像时光机器似的,它保留了被拍了快照的逻辑卷一瞬间的状态,且该状态无法修改,我们可以通过访问快照来进行数据备份。
那么这个时光机器是怎么做到的,快照又是如何实现的呢?
如下图,假如现在我们要给逻辑卷lv_0创建一个快照卷lv_snapshot。在创建快照卷的同时,程序创建了一个元数据监视器,用于监视lv_0上的元数据变化。快照卷中一开始并没有真实的文件数据存在。对于未修改过的文件,快照卷中指向的文件存储位置是和lv_0相同的。而当元数据监视器发现有其他程序需要对lv_0中的文件进行修改时,先会复制一份未修改的文件到快照卷lv_snapshot的空间中,再对lv_0空间中的文件进行修改。
下图中,lv_snapshot是lv_0的快照卷,lv_0的文件A被修改过,所以在lv_snapshot的空间中复制有未修改过的文件A,而lv_0中的文件B未被修改过,所以lv_snapshot中没有存储文件B。
SYNOPSIS:lvcreate -L #[mMgGtT] -p r -s -n snapshot_lv_nae original_lv_name
- -L:指定lv的空间大小。
- -p | –permission {r | rw}:指定权限,快照卷应只有读权限。
- -s | –snapshot:指明创建的是快照卷。
- -n:指定lv的名称。
[root@www ~]# lvcreate -L 512M -p r -n mylv_snapshot -s /dev/myvg/mylv
Logical volume "mylv_snapshot" created.
三、逻辑卷LV在/dev目录下的存在形式
创建成功后的LV,在/dev目录下的为块设备/dev/dm-#
,并有两个链接文件指向这个块设备,分别是/dev/mapper/VG_NAME-LV_NAME
和/dev/VG_NAME/LV_NAME
。
例如:
[root@www ~]# ll /dev/dm-0 /dev/mapper/vg_livecd-lv_root /dev/vg_livecd/lv_root
brw-rw----. 1 root disk 253, 0 3月 21 20:41 /dev/dm-0
lrwxrwxrwx. 1 root root 7 3月 21 20:41 /dev/mapper/vg_livecd-lv_root -> ../dm-0
lrwxrwxrwx. 1 root root 7 3月 21 20:41 /dev/vg_livecd/lv_root -> ../dm-0