1.1 LVM相关概念和机制
LVM(Logical Volume Manager)可以让分区变得弹性,可以随时随地的扩大和缩小分区大小,前提是该分区是LVM格式的。
lvm需要使用的软件包为lvm2,一般在CentOS发行版中都已经预安装了。
• PV(Physical Volume)即物理卷
  硬盘分区后(还未格式化为文件系统)使用pvcreate命令可以将分区创建为pv,要求分区的system ID为8e,即为LVM格式的系统标识符。
• VG(Volume Group)即卷组
将多个PV组合起来,使用vgcreate命令创建成卷组,这样卷组包含了多个PV就比较大了,相当于重新整合了多个分区后得到的磁盘。虽然VG是整合多个PV的,但是创建VG时会将VG所有的空间根据指定的PE大小划分为多个PE,在LVM模式下的存储都以PE为单元,类似于文件系统的Block。
• PE(Physical Extend)
PE是VG中的存储单元。实际存储的数据都是存储在这里面的。
• LV(Logical Volume)
VG相当于整合过的硬盘,那么LV就相当于分区,只不过该分区是通过VG来划分的。VG中有很多PE单元,可以指定将多少个PE划分给一个LV,也可以直接指定大小(如多少兆)来划分。划分为LV之后就相当于划分了分区,只需再对LV进行格式化即可变成普通的文件系统。
通俗地讲,非LVM管理的分区步骤是将硬盘分区,然后将分区格式化为文件系统。而使用LVM,则是在硬盘分区为特定的LVM标识符的分区后将其转变为LVM可管理的PV,其实PV仍然类似于分区,然后将几个PV整合为类似于磁盘的VG,最后划分VG为LV,此时LV就成了LVM可管理的分区,只需再对其格式化即可成为文件系统。
• LE(logical extent)
PE是物理存储单元,而LE则是逻辑存储单元,也即为lv中的逻辑存储单元,和pe的大小是一样的。从vg中划分lv,实际上是从vg中划分vg中的pe,只不过划分lv后它不再称为pe,而是成为le。
LVM之所以能够伸缩容量,其实现的方法就是将LV里空闲的PE移出,或向LV中添加空闲的PE。
1.2 LVM的写入机制
LV是从VG中划分出来的,LV中的PE很可能来自于多个PV。在向LV存储数据时,有多种存储机制,其中两种是:
• 线性模式(linear):先写完来自于同一个PV的PE,再写来自于下一个PV的PE。
• 条带模式(striped):一份数据拆分成多份,分别写入该LV对应的每个PV中,所以读写性能较好,类似于RAID 0.(数据库的数据盘可以采用这种模式,lvcreate -L 6G -i 2 -I 1024K -n lv_dbdata vg_db选项i和I就是使用条带模式)
尽管striped读写性能较好也不建议使用该模式,因为lvm的着重点在于弹性容量扩展而非性能,要实现性能应该使用RAID来实现,而且使用striped模式时要进行容量的扩展和收缩将比较麻烦。默认的是使用线性模式。

pvcreate        pvs        pvdisplay
vgcreate        vgs        vgdisplay
lvcreate        lvs         lvdisplay
#创建pv
pvcreate -f /dev/sdb
pvcreate -f /dev/sdc

#创建vg
vgcreate -s 128M -y vg_db /dev/sdb /dev/sdc

#创建lv
lvcreate -L 6G -i 2 -I 1024K -n lv_dbdata vg_db
lvcreate -L 12G -i 2 -I 1024K -n lv_dblog vg_db

#格式化
mkfs.xfs /dev/mapper/vg_db-lv_dbdata
mkfs.xfs /dev/mapper/vg_db-lv_dblog
mkdir  -pv /dbdata /dblog

#挂载
vim /etc/fstab
......
UUID=8b44b7a0-ef1b-44cf-a05d-282bade96044 /dbdata                 xfs     defaults  0  0      
UUID=31dcf481-3fa2-4d91-9bff-d2f655d05efc /dblog                  xfs     defaults  0  0
......

mount -a
df -h
#############################################################################################
##############扩容lvm
pvcreate /dev/sdd
pvs
vgextend vg_db /dev/sdd
vgs
lvextend -L 12G /dev/mapper/vg_db-lv_dbdata
xfs_growfs /dev/mapper/vg_db-lv_dbdata