简介
LVM(Logical Volume Manager),即逻辑卷管理,是在硬盘分区和文件系统之间添加的一个逻辑层,为文件系统屏蔽下层硬盘分区布局,并提供一个抽象的盘卷,在盘卷上建立文件系统。管理员利用LVM可以在硬盘不用重新分区的情况下动态调整文件系统的大小,并且利用LVM管理的文件系统可以跨越物理硬盘。当服务器添加了新的硬盘后,管理员不必将原有的文件移动到新的硬盘上,而是通过LVM直接扩展文件系统来跨越物理硬盘。
常用概念
- PV(physical volume):物理卷位于逻辑卷管理的最底层抽象,可以是物理硬盘或者物理硬盘上的分区
- VG(volume group):卷组建立在物理卷上,是对物理卷在上层抽象,一个卷组中至少要包括一物理卷,卷组建立后可动态的添加物理卷到卷组中,一个逻辑卷管理系统工程中可有多个卷组。
- LV(logical volume):逻辑卷建立在卷组基础上,是最终给到文件系统挂载的层级。卷组中未分配空间可用于建立新的逻辑卷,逻辑卷建立后可以动态扩展和缩小空间。
- PE(physical extent):物理区域是物理卷中可用于分配的最小存储单元,物理区域大小在建立卷组时指定,一旦确定不能更改,同一卷组所有物理卷的物理区域大小需一致,新的pv加入到vg后,pe的大小自动更改为vg中定义的pe大小。
- LE(logical extent):逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。 卷组描述区域:卷组描述区域存在于每个物理卷中,用于描述物理卷本身、物理卷所属卷组、卷组中逻辑卷、逻辑卷中物理区域的分配等所有信息,它是在使用pvcreate建立物理卷时建立的。
结构说明
lvm的结构:硬盘、分区-> pv -> vg -> lv
如上图:
- pv可以由硬盘或者硬盘的分区组成,一个硬盘或者一个分区只能对应一个pv。
- vg由pv组成,一个vg可以对应多个pv。
- lv由vg组成,一个vg可以给多个lv使用,但是一个lv固定只能对应一个vg。
软件安装
lvm所有的软件包都包含在lvm这个软件里面,以centos 7为例,lvm的版本升级到lvm2。安装命令如下:
# yum install -y lvm2
常用命令
PV命令
pvcreate:将物理分区建立成独立的pv
pvscan:查找目前系统里面任何具有pv的磁盘
pvdisplay、pvs:显示出目前系统上面的pv状态
pvremove:将pv属性删除,让该分区不具有pv属性
VG命令
vgcreate:建立VG的命令
主要参数:
-l:卷组上允许创建的最大逻辑卷数
-p:卷组中允许添加的最大物理卷数
-s:卷组上的物理卷的PE大小
vgscan:查看系统上存在的VG
vgdisplay、vgs:显示系统上的VG
vgextend:对VG的大小进行扩展(添加新的PV)
vgreduce:对VG的大小进行缩减(删除指定PV)
vgchange:设置VG的属性
vgchange 用于修改卷组的属性,经常被用来设置卷组是处于活动状态或非活动状态。处于活动状态的卷组无法被删除,必须使用vgchange命令将卷组设置为非活动状态后才能删除。
扩展: 在系统重装之后,需要执行该命令把vg设置为激活状态
# vgchange -ay vg名称
vgremove:删除VG
LV命令
lvcreat:创建LV
lvscan:查看系统上存在的LV
lvdisplay、lvs:显示系统上的LV
lvextend:对LV的大小进行扩展
lvreduce:对LV的大小进行缩减
lvremove:删除LV
lvresize:调整LV容量大小
xfs_growfs:xfs文件系统,扩展lv的大小
resize2fs:非xfs文件系统,扩展lv的大小
xfs_growfs和resize2fs命令用以扩展lv的大小,该命名是在通过lvextend命令扩展了LV的大小之后,让LV的大小生效。
实战
lvm创建磁盘挂载的顺序为: fdisk格式化硬盘 -> 创建pv -> 创建vg -> 创建lv -> 挂载lv
fdisk格式化硬盘相关操作,请移步:【磁盘挂载相关操作】
首先查看硬盘分区情况
# fdisk -l
Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 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: 0x000c7bcb
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 83886046 41941999+ 83 Linux
Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 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: 0x8b1332ff
Device Boot Start End Blocks Id System
/dev/vdb1 2048 20000000 9998976+ 83 Linux
如上,/dev/vdb1是我新格式化的分区,准备把它通过lvm格式进行挂载。可以看到,其System类型为Linux,因为我们使用的是lvm2,所以可以直接使用该文件格式,若使用的是lvm,则需要通过fdisk命令,修改其文件系统类型为lvm,可以参考【磁盘挂载相关操作】
咱们现在就对分区进行lvm操作:
-
创建物理卷pv
# pvcreate /dev/vdb1pvcreate 可以指定分区,可以指定硬盘。例如: pvcreate /dev/vdb,命令其他参数,可以通过man pvcreate查看
-
创建卷组vg
# vgcreate user /dev/vdb1 Volume group "user" successfully created如上,基于/dev/vdb1分区,创建了卷组:user
-
创建逻辑卷lv
# lvcreate -l 100%FREE -n app user Logical volume "app" created.创建lv : app ,并把user这个卷组的所有空闲空间给到它。
一个卷组可以给多个lv使用,在创建lv的时候,可以指定当前lv使用的空间有多大。如下命令,创建逻辑卷app,使用卷组user2G的大小。
# lvcreate -L 2G -n app user -
格式化并挂载lv
执行fdisk -l查看分区情况,可以看到如下条目:
# fdisk -l Disk /dev/mapper/user-app: 10.2 GB, 10234101760 bytes, 19988480 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 byteslvm的操作产生了如上的 分区:/dev/mapper/user-app , 我们对其进行格式化并挂载就可以使用了,本例中,我们使用xfs文件系统。
# mkfs.xfs /dev/mapper/user-app meta-data=/dev/mapper/user-app isize=512 agcount=4, agsize=624640 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=2498560, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0挂载硬盘
# mount /dev/mapper/user-app /app # df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 496K 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/vda1 40G 3.0G 35G 8% / tmpfs 379M 0 379M 0% /run/user/0 /dev/mapper/user-app 9.6G 33M 9.5G 1% /app -
扩展空间
查看分区信息
执行fdisk -l,可看到如下条目。其中/dev/vdb2是我要新扩展到lv:app里面去的分区。
# fdisk -l Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 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: 0x8b1332ff Device Boot Start End Blocks Id System /dev/vdb1 2048 20000000 9998976+ 83 Linux /dev/vdb2 20000768 41943039 10971136 83 Linux创建物理卷pv
基于/dev/vdb2创建物理卷/dev/vdb2
# pvcreate /dev/vdb2 WARNING: ext4 signature detected on /dev/vdb2 at offset 1080. Wipe it? [y/n]: y Wiping ext4 signature on /dev/vdb2. Physical volume "/dev/vdb2" successfully created.扩展卷组
把物理卷/dev/vdb2加入到卷组user里面
# vgextend user /dev/vdb2 Volume group "user" successfully extended扩展逻辑卷
把逻辑卷/dev/user/app增大5G
# lvdisplay --- Logical volume --- LV Path /dev/user/app LV Name app VG Name user LV UUID IFoazm-IbGi-zy2h-HXe9-DncI-2C2r-MOvvlt LV Write Access read/write LV Creation host, time app1, 2022-05-07 11:04:01 +0800 LV Status available # open 0 LV Size 9.53 GiB Current LE 2440 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 252:0 # lvextend -L +5G /dev/user/app Size of logical volume user/app changed from 9.53 GiB (2440 extents) to 14.53 GiB (3720 extents). Logical volume user/app successfully resized.调整实际的大小
执行 xfs_growfs /dev/user/app命令扩展硬盘
# xfs_growfs /dev/user/app meta-data=/dev/mapper/user-app isize=512 agcount=4, agsize=624640 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=2498560, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 2498560 to 3809280 # # df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 496K 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/vda1 40G 3.0G 35G 8% / tmpfs 379M 0 379M 0% /run/user/0 /dev/mapper/user-app 15G 33M 15G 1% /app如上可以看见,/app 的挂载已经由开始的9.6G扩展成为15G。
备注1
对xfs文件系统进行扩展使用xfs_growfs命令,对ext4等其他文件系统的扩展使用resize2fs命令
备注2
lvm创建磁盘挂载之前,需要先用磁盘格式化工具对磁盘进行格式选择,lvm1必须要设置磁盘格式为8e,lvm2可以使用默认的格式,也可以使用8e。
备注3
本例中,我在创建/dev/vdb2分区保存的时候,报了如下警告:
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.fdisk -l命令能看到该分区,但是lsblk却看不到。
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 40G 0 disk └─vda1 253:1 0 40G 0 part / vdb 253:16 0 20G 0 disk └─vdb1 253:17 0 9.5G 0 part └─user-app 252:0 0 9.5G 0 lvm解决方法(二选其一或者都做,看具体情况)
-
重启服务
-
执行如下命令:
# partprobe # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 40G 0 disk └─vda1 253:1 0 40G 0 part / vdb 253:16 0 20G 0 disk ├─vdb1 253:17 0 9.5G 0 part │ └─user-app 252:0 0 9.5G 0 lvm └─vdb2 253:18 0 10.5G 0 part
-
lv、vg、pv、删除操作以及空间压缩
注意:xfs文件系统,不能缩减空间。
注意:xfs文件格式,不能缩减空间。
注意:xfs文件格式,不能缩减空间。
空间压缩、释放
把逻辑卷/dev/user/app的空间压缩到5G
# lvreduce -L 5G /dev/mapper/user-app
把逻辑卷/dev/user/app的空间减少5G
# lvreduce -L -5G /dev/mapper/user-app
重装系统数据恢复
重装系统之后,以前通过lvm挂载的硬盘模式是不能用的
# mkdir /app
# mount /dev/user/app /app
需要做如下操作对vg进行激活:
# vgchange -ay user
# mount /dev/user/app /app
# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/vda1 40G 1.9G 36G 6% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 452K 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 379M 0 379M 0% /run/user/0
/dev/mapper/user-app 15G 33M 15G 1% /app
raid和lvm的区别
LVM主要侧重动态磁盘扩容
LVM是一个动态扩展磁盘分区容量的功能性工具,可以用来管理磁分区满了,扩容,但是在大规模环境性能低下,尽量不要使用它。
RAID主要侧重磁盘性能和数据安全
磁盘阵列可以把多个磁盘驱动器通过不同的连接方式连接在一起协同工作,大大提高了读取速度,同时把磁盘系统的可靠性提高到接近无错的境界,使其可靠性极高.
用RAID最直接的好处是:
- 提升数据安全性。
- 提升数据读写性能。
- 提供更大的单一逻辑磁盘数据容量存储。