LVM是Logical Volume Manager(逻辑卷管理)的简写,它是LINUX环境下对磁盘分区进行管理的一种机制,LVM利用Linux内核的device-mapper来实现存储系统的虚拟化(系统分区独立于底层硬件)。LVM重点在于可以弹性的调整文件系统的容量,而并非在于性能与数据安全上面(这些是RAID的功能).通过LVM,可以实现存储空间的抽象化并在上面建立虚拟分区(virtual partitions),可以更简便地扩大和缩小分区,在增删分区时无需担心某个硬盘上没有足够的连续空间,可以整合多个物理分区在一起,让这些分区看起来就像是一个磁盘一样,而且,还可以将其他物理分区加入或者从这个LVM管理的磁盘中删除,如此一来,在整个磁盘空间使用上,相当的有弹性。
LVM的基本组成块(building blocks)如下:
物理卷Physical volume (PV):
可以在上面建立卷组的块设备,可以是硬盘分区,也可以是硬盘本身或者回环文件(loopback file ) 。实际的分区需要调整系统标识符(System ID)成为8e(LVM的标识符),然后再经过pvcreate的命令将它转换成LVM最底层的物理卷(PV),之后才能将这些PV加以利用,而调整SystemID的方法就是通过fdisk,物理卷包括一个特殊的header,其余部分被切割为一块块物理区域(physical extents)。
物理扩展Physical extent (PE):硬盘可供指派给逻辑卷的最小单位(通常为4MB)
LVM默认使用4MB大小的PE块,而LVM的VG最多仅能含有65534个PE,因此默认最大256G。PE是整个LVM最小的存储块,这个有点类似与文件系统的block,所有文件的写入都由PE来完成.
卷组Volume group (VG):将一组物理卷组合成为一个管理单元
所谓的LVM大磁盘就是将许多PV整合成这个VG,所以VG就是LVM组合PV形成的大磁盘。那么这个大磁盘最大可以达到多少容量呢?这与PE有关,因为每个VG最多仅能包含65534个PE。如果使用LVM默认的参数,则一个VG最大可以达到256GB的容量.
逻辑卷Logical volume (LV):虚拟分区,由物理区域(physical extents)组成
最终的VG还会被切成LV,这个LV就是最后可以被格式化使用,类似于分区。LV的设备文件提供了对lv的的访问,LV的设备文件名通常是:
/dev/VG_NAME/LV_NAME
/dev/mapper/VG_NAME-LV_NAME
逻辑扩展―LE(Logical Extent)
逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。在同一个卷组中,LE的大小和PE是相同的,并且--对应。
LVM可以弹性更改文件系统的容量,这个怎么办到的呢,其实就是通过交换PE来进行的,将原本LV内的PE转移到其他设备中以降低LV容量,或将其他设备的PE加到此LV中加大容量.通过PV,VG,LV的规划后,再利用mkfs就可以将你的LV格式化成可利用的文件系统。
优点
比起正常的硬盘分区管理,LVM更富于弹性:
使用卷组(VG),使众多硬盘空间看起来像一个大硬盘。
使用逻辑卷(LV),可以创建跨越众多硬盘空间的分区。
可以创建小的逻辑卷(LV),在空间不足时再动态调整它的大小。
在调整逻辑卷(LV)大小时可以不用考虑逻辑卷在硬盘上的位置,不用担心没有可用的连续空间。
可以在线(online)对逻辑卷(LV)和卷组(VG)进行创建、删除、调整大小等操作。LVM上的文件系统也需要重新调整大小,某些文件系统也支持这样的在线操作。
无需重新启动服务,就可以将服务中用到的逻辑卷(LV)在线(online)/动态(live)迁移至别的硬盘上。
允许创建快照,可以保存文件系统的备份,同时使服务的下线时间(downtime)降低到最小。
缺点
在系统设置时需要更复杂的额外步骤。
-------------LVM实作流程-------------------
先分2个分区,每个分区容量均为10G,调整Sytem ID为8e
全部分区整合为一个VG,VG名称为testVG,且PE大小为16MB
全部的VG容量都丢给LV,LV的名称为testLV
将这个LV格式化为ext4的文件系统,且挂载在/mnt/lvm中
准备分区------------------:
查看系统中可用的硬盘:
[root@localhost ~]# ls -l /dev/sd* brw-rw----. 1 root disk 8, 0 Mar 5 03:30 /dev/sda brw-rw----. 1 root disk 8, 1 Mar 5 03:30 /dev/sda1 brw-rw----. 1 root disk 8, 2 Mar 5 03:30 /dev/sda2 brw-rw----. 1 root disk 8, 16 Mar 5 03:30 /dev/sdb brw-rw----. 1 root disk 8, 32 Mar 5 03:30 /dev/sdc
准备分区并调整分区System ID 为 8e,分区结果:
[root@localhost ~]# fdisk /dev/sdb Device Boot Start End Blocks Id System /dev/sdb1 1 1306 10490413+ 8e Linux LVM [root@localhost ~]# fdisk /dev/sdc Device Boot Start End Blocks Id System /dev/sdc1 1 1306 10490413+ 8e Linux LVM
PV价段相关的命令-----------:
pvcreate:将物理分区新建成为PV
pvscan:查询当前系统里面任何具有pv的磁盘
pvdisplay:显示系统上的PV状态
pvs : 简略查看所有物理卷的状况
pvremove:将PV属性删除,让该分区不具有PV属性
lvmdiskscan: 扫描用可作物理卷的块设备
pvresize :重新设置物理卷的大小可以在LVM正在使用物理卷的时候使用这个命令
pvremove: 删除物理卷,当物理卷里的扩展没有被使用时可以删除
pvchange :改变LV的属性
防止一个或者多个物理卷的剩余空间进行物理扩展分配pvchange -x {n|y} pv分区
-x, --allocatable {y|n} : 允许或不允许分配物理扩展
-x y 允许在之前禁止进行分配的地方分配扩展
查看当前系统中具有pv的设备:
[root@localhost ~]# pvscan No matching physical volumes found
使用刚创建的两个分区创建pv:
[root@localhost ~]# pvcreate /dev/sd{b,c}1 Physical volume "/dev/sdb1" successfully created Physical volume "/dev/sdc1" successfully created
再次查看当前系统中具有pv的设备:
[root@localhost ~]# pvscan PV /dev/sdb1 lvm2 [10.00 GiB] PV /dev/sdc1 lvm2 [10.00 GiB] Total: 2 [20.01 GiB] / in use: 0 [0 ] / in no VG: 2 [20.01 GiB]
上面分别显示的是每个PV的信息与系统所有PV的信息,尤其最后一行,显示的是:
整体PV的量 / 已经被使用到VG的PV量 / 剩余的PV量
其实就是一个物理分区,将它变成了LVM的物理逻辑卷,供以后去用的。
显示PV的简略信息:
[root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sdb1 lvm2 a-- 10.00g 10.00g /dev/sdc1 lvm2 a-- 10.00g 10.00g
PV :实际的分区设备名
VG :因为尚未分配出去,所以还是空白
Fmt :物理卷的元数据格式(lvm2或者lvm1)和lvm的版本有关
Attr :物理卷的状态:可分配(a)或者导出的(x)
PSize :物理卷的容量说明
PFree :物理卷空闲容量
更加详细的列出系统上面每个PV的信息:
[root@localhost ~]# pvdisplay "/dev/sdb1" is a new physical volume of "10.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb1 <--实际的分区设备名 VG Name <--因为尚未分配出去,所以还是空白 PV Size 10.00 GiB <--容量说明 Allocatable NO <--是否已经被分配给VG PE Size 0 <--在此PV内的PE大小,因为尚未创建VG,所以是0 Total PE 0 <--共分出几个PE Free PE 0 <--剩余还有多少个PE,也就是没有被LV用掉的PE数量 Allocated PE 0 <--可被分配出去的PE数量(实际能不能被分配看这个参数) PV UUID x4Wak9-RB8t-9gbQ-f2M6-uSgA-I3A1-9Uw1Lb "/dev/sdc1" is a new physical volume of "10.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc1 VG Name PV Size 10.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID zIs9mx-crfV-3ECe-HWMm-3w4j-sWwe-ZF6N4O
VG价段相关的命令-----------:
vgcreate:新建VG的命令,它的参数比较多
vgs: 查看vg的摘要信息
vgscan:查看系统上是否有VG存在
vgdisplay:显示目前系统上面的VG状态
vgextend:在VG内增加额外的PV vgextend VGNAME PV的设备文件名
vgreduce:在VG内删除PV vgreduce VGNAME PV的设备文件名
vgchange:vgchange �Ca {y|n} VGNAME 使卷组激活或使卷组失效
vgremove:删除一个VG(删除不包含逻辑卷的卷组)
vgmerge:合并卷组
vgsplit:分割卷组
vgrename重命名卷组vgrename vgrename /dev/vg0 /dev/my_vloume_group
vgexport 和vgimport :将卷组移动到其它系统中
vgmknodes :重新创建卷组目录和逻辑卷专用文件
vfcrestore:备份卷组元数据,还可为卷组中的所有物理卷从归档中恢复卷组的元数据
每次修改卷组和逻辑卷配置时都会自动进行元数据备份和归档
元数据备份保存在/etc/lvm/backup文件中
元数据归档保存在/etc/lvm/archives中
PV的名字就是设备文件名,而VG是可自己设置名字的。
vgcreate [-s N[mgt]] VG名称 PV名称
-s:后接PE大小,单位可以是m,g,t(大小写均可)
创建名为testVG的VG:
[root@localhost ~]# vgcreate -s 8M testVG /dev/sd{b,c}1 Volume group "testVG" successfully created
查看当前系统上是否有VG:
[root@localhost ~]# vgscan Reading all physical volumes. This may take a while... Found volume group "testVG" using metadata type lvm2
可以看到Fmt元数据类型为lvm2
查看VG的摘要信息:
[root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree testVG 2 0 0 wz--n- 20.00g 20.00g
Attr卷组的状态:
w:可写入
r:只读
z:可重新定义大小
x:导出的
p:不完整的
c:群集的
更加详细的列出系统上面每个VG的信息:
[root@localhost ~]# vgdisplay --- Volume group --- VG Name testVG <--卷组名称 System ID <--lvm的系统ID Format lvm2 <--卷组的元数据格式 Metadata Areas 2 <--元数据所在位置 Metadata Sequence No 1 VG Access read/write VG Status resizable <--VG的状态 可以使用vgchange改变 MAX LV 0 Cur LV 0 <--当前卷中的LV数 Open LV 0 Max PV 0 Cur PV 2 <--当前VG中包含多少个PV Act PV 2 <--活动的pv VG Size 20.00 GiB <--vg的大小 等于所在pv相加 PE Size 8.00 MiB <--pe的尺寸 Total PE 2560 <--当前卷中所包含的PE Alloc PE / Size 0 / 0 <--pv的使用比例 Free PE / Size 2560 / 20.00 GiB <--卷组中可用物理扩展数目 VG UUID RgaF3G-LTrg-gXQZ-NMdq-MnhX-Wgho-ra0Mil
最后三行指的就是能够使用的PE情况,由于尚未切分出LV,所以是所有的PE均可自由使用
创建了VG以后再次使用pvdsiplay查看pv:
[root@localhost ~]# pvdisplay --- Physical volume --- PV Name /dev/sdb1 VG Name testVG PV Size 10.00 GiB / not usable 4.54 MiB Allocatable yes PE Size 8.00 MiB Total PE 1280 Free PE 1280 Allocated PE 0 PV UUID x4Wak9-RB8t-9gbQ-f2M6-uSgA-I3A1-9Uw1Lb --- Physical volume --- PV Name /dev/sdc1 VG Name testVG PV Size 10.00 GiB / not usable 4.54 MiB Allocatable yes PE Size 8.00 MiB Total PE 1280 Free PE 1280 Allocated PE 0 PV UUID zIs9mx-crfV-3ECe-HWMm-3w4j-sWwe-ZF6N4O
再创建了VG以后,就可以查看pe的大小了
LV阶段相关命令――――�C:
创造出VG这个大磁盘后,接下来为这个创建lv并对其进行分区,通过LV功能来处理。
lvcreate:新建LV
lvscan:查询系统上面的LV
lvremane:重新命名逻辑卷 lvrename vg0 lvold lvnew
lvs: 查看lv的摘要信息
lvdisplay:显示系统上面的LV状态
lvextend:在LV里面增加容量
lvreduce:在LV里面减少容量
lvremove:删除一个LV
lvchange :修改逻辑卷组的参数 lvchange -a {y|n}使lv生效或失效
lvresize:对LV进行容量大小的调整
lvcreate [-L N[mgt]] [-n LV名称] VG名称
lvcreate [-l N] [-n LV名称] VG名称
-L:后面接容量,单位是m,g,t(大小写均可),要注意的是这个数必须是PE大小
的整 数倍。
-l:后面接PE的个数,而不是容量
-n:后面接LV的名称
查看PV的大小:
[root@localhost ~]# vgdisplay | grep 'Total PE' Total PE 2560
创建一个大小为10G的LV:
[root@localhost ~]# lvcreate -L 10G -n testLV testVG Logical volume "testLV" created
查看LV的摘要信息:
[root@localhost ~]# lvs LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert testLV testVG -wi-a---- 10.00g
Attr逻辑卷的状态:
字节1:卷类型 :镜像m ,不带初始同步的镜像M,源o ,pvmove p, 快照s ,不可用快照s,虚拟v
字节2:权限 可写入w 只读r
字节3:分配策略 持续c,正常n,任意a ,继承i,
字节4:固定的副号码m
字节5:激活a ,暂停s,不可用快照l,不可用暂停快照S,不带表格的映射d,还有i
字节6:设备开放o
更加详细的列出系统上面每个LV的信息:
[root@localhost ~]# lvdisplay --- Logical volume --- LV Path /dev/testVG/testLV <--LV的设备路径 LV Name testLV <--LV的名字 VG Name testVG <--卷组名 LV UUID raOisN-DzwI-bKRV-bu1a-fAJm-M53L-5y26Dh LV Write Access read/write LV Creation host, time localhost.localdomain, 2014-03-05 04:20:45 +0800 LV Status available # open 0 LV Size 10.00 GiB Current LE 1280 <--LE的大小和PE一一对应 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
VG的名称为testVG,但是LV要用全名,而不是lv的名称testLV:
/dev/testVG/yidaolv或/dev/mapper/testVG-testLV
[root@localhost ~]# ls -l /dev/{mapper/testVG-testLV,testVG/testLV} lrwxrwxrwx. 1 root root 7 Mar 5 04:20 /dev/mapper/testVG-testLV -> ../dm-0 lrwxrwxrwx. 1 root root 7 Mar 5 04:20 /dev/testVG/testLV -> ../dm-0
可以看到她们都是链接文件,它们都指向/dev/下以dm开头的文件
查看系统识别的lvm设备其实是以dm开头的设备:
[root@localhost ~]# cat /proc/partitions major minor #blocks name 8 16 125829120 sdb 8 17 10490413 sdb1 8 0 125829120 sda 8 1 204800 sda1 8 2 51200000 sda2 8 32 125829120 sdc 8 33 10490413 sdc1 253 0 10485760 dm-0
接下来,我对LV进行分区格式化并挂载:
[root@localhost ~]# mke2fs -t ext4 /dev/testVG/testLV [root@localhost ~]# mount -t ext4 /dev/testVG/testLV /backup/ [root@localhost ~]# df -lh /backup/ Filesystem Size Used Avail Use% Mounted on /dev/mapper/testVG-testLV 9.9G 151M 9.2G 2% /backup