LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题.
逻辑卷管理器(LogicalVolumeManager)本质上是一个虚拟设备驱动,是在内核中块设备和物理设备之间添加的一个新的抽象层次,如图所示。它可以将几块磁盘(物理卷,PhysicalVolume)组合起来形成一个存储池或者卷组(VolumeGroup)。LVM可以每次从卷组中划分出不同大小的逻辑卷(LogicalVolume)创建新的逻辑设备。底层的原始的磁盘不再由内核直接控制,而由LVM层来控制。对于上层应用来说卷组替代了磁盘块成为数据存储的基本单元。LVM管理着所有物理卷的物理盘区,维持着逻辑盘区和物理盘区之间的映射。LVM逻辑设备向上层应用提供了和物理磁盘相同的功能,如文件系统的创建和数据的访问等。但LVM逻辑设备不受物理约束的限制,逻辑卷不必是连续的空间,它可以跨越许多物理卷,并且可以在任何时候任意的调整大小。相比物理磁盘来说,更易于磁盘空间的管理。

物理存储介质(PhysicalStorageMedia)
指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda等,是存储系统最底层的存储单元。
物理卷(Physical Volume,PV)
指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
卷组(Volume Group,VG)
类似于非LVM系统中的物理磁盘,其由一个或多个物理卷PV组成。可以在卷组上创建一个或多个LV(逻辑卷)。
逻辑卷(Logical Volume,LV)
类似于非LVM系统中的磁盘分区,逻辑卷建立在卷组VG之上。在逻辑卷LV之上可以建立文件系统(比如/home或者/usr等)。
物理块(Physical Extent,PE)
每一个物理卷PV被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。所以物理卷(PV)由大小等同的基本单元PE组成。
逻辑块(Logical Extent,LE)

逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
图所示LVM抽象模型,展示了PV、VG、LV三者之间关系:
和非LVM系统将包含分区信息的元数据保存在位于分区的起始位置的分区表中一样,逻辑卷以及卷组相关的元数据也是保存在位于物理卷起始处的VGDA(卷组描述符区域)中。VGDA包括以下内容:PV描述符、VG描述符、LV描述符、和一些PE描述符。
系统启动LVM时激活VG,并将VGDA加载至内存,来识别LV的实际物理存储位置。当系统进行I/O操作时,就会根据VGDA建立的映射机制来访问实际的物理位置。
1、创建lv逻辑卷步骤
前提:先创建3个磁盘分区,类型为8e;
1、PV创建
pvcrete /dev/sda#
2、VG创建
vgcreate VG_NAME /dev/sda# /dev/sda#+1 ...
3、LV创建
lvcreate -L # -n LV_NAME VG_NAME
4、格式化文件系统
mkfs.ext4 LV_NAME
5、挂载使用
mount /PATH/TO/VG_NAME/LV_NAME 挂载点
2、扩展lv步骤:
前提:先保证vg有足够的空间pv
1、lvextend -L #[MGT] /dev/VG_NAME/LV_NAME
2、resize2fs /dev/VG_NAME/LV_NAME
3、缩减lv步骤:
前提:先保证vg有足够的空间pv,再保证pv有足够空间的lv
提示:xfs文件格式不支持缩减.请使用ext系列文件格式测试.
1、先卸载
umount /dev/VG_NAME/LV_NAME
2、强制检查文件系统一致性
e2fsck -f /dev/VG_NAME/LV_NAME
3、缩减逻辑边界(缩减后空间一定要能容纳现有文件)
resize2fs /dev/VG_NAME/LV_NAME #[MMT](缩减到多少)
4、缩减物理边界
lvreduce -L #(缩减到多少)[MGT] /dev/VG_NAME/LV_NAME
输入:y,确认缩减;
5、重新挂载
mount /dev/VG_NAME/LV_NAME /PATH/TO/SOMEDIR
6、查看磁盘分区确认
$ df -lh
4、创建快照卷
同创建lv,前提确保有足够的可用lv空间
1、lvcreate -s -L #G SNAP_NAME -p r /dev/VG_NAME/LV_NAME
2、挂载使用
3、恢复快照
取消挂载逻辑卷和对应的快照
umount /dev/VG_NAME/SNAP_NAME
umount /dev/VG_NAME/LV_NAME
合并快照内容
lvconvert --merge /dev/VG_NAME/SNAP_NAME
4、删除快照
取消快照文件夹的挂载,再lvremove.
umount /PATH/TO/SOMEDIR
lvremove /dev/VG_NAME/SNAP_NAME

5、卸载删除lv步骤:
前提:确保数据备份
1、卸载
umount 挂载点
2、移除lv
lvremove /dev/VG_NAME/LV_NAME
3、移除vg
vgremove VG_NAME
4、移除pv
pvremove /dev/sda#

下面是在云主机上加对一个分区扩容的过程,(原来划的硬盘没有用完0
[root@localhost ~]# fdisk /dev/sda
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p): p
Partition number (3,4, default 3): 3
First sector (209715200-419430399, default 209715200):
Using default value 209715200
Last sector, +sectors or +size{K,M,G} (209715200-419430399, default 419430399):
Using default value 419430399
Partition 3 of type Linux and of size 100 GiB is set

Command (m for help): wq
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
[root@localhost ~]# partprobe
[root@localhost ~]# vgscan
Reading volume groups from cache.
Found volume group "rhel" using metadata type lvm2
[root@localhost ~]# fdisk -l

Disk /dev/sda: 214.7 GB, 214748364800 bytes, 419430400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000bfb29

Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 209715199 103808000 8e Linux LVM
/dev/sda3 209715200 419430399 104857600 83 Linux

Disk /dev/mapper/rhel-root: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/rhel-swap: 8455 MB, 8455716864 bytes, 16515072 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/rhel-home: 44.1 GB, 44149243904 bytes, 86228992 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

[root@localhost ~]# vgextend rhel /dev/sda3
Physical volume "/dev/sda3" successfully created.
Volume group "rhel" successfully extended
[root@localhost ~]# lvextend -L +100G /dev/mapper/rhel-home
Size of logical volume rhel/home changed from <41.12 GiB (10526 extents) to <141.12 GiB (36126 extents).
Logical volume rhel/home successfully resized.
[root@localhost ~]# xfs_growfs /dev/mapper/rhel-home
meta-data=/dev/mapper/rhel-home isize=512 agcount=4, agsize=2694656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=10778624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=5263, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 10778624 to 36993024
[root@localhost ~]# df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel-root 52403200 5911928 46491272 12% /
devtmpfs 3989584 0 3989584 0% /dev
tmpfs 4005252 0 4005252 0% /dev/shm
tmpfs 4005252 418816 3586436 11% /run
tmpfs 4005252 0 4005252 0% /sys/fs/cgroup
/dev/sda1 1038336 181760 856576 18% /boot
/dev/mapper/rhel-home 147951044 1253816 146697228 1% /home
tmpfs 801052 48 801004 1% /run/user/0