一、什么是LVM?
LVM是Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux2.4内核上实现的,目前最新版本为:稳定版1.0.5,开发版1.1.0-rc2,以及LVM2开发版。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下了某个文件时,这个文件因为受到上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决办法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时的解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解了,用户可以在无需停机的情况下可以方便的调整各个分区的大小。
逻辑卷管理器(Logical Volume Manager)本质上是一个虚拟设备驱动,是在内核中块设备和物理设备之间添加的一个新的抽象层次,如图所示。它可以将几块磁盘(物理卷,Physical Volume)组合起来形成一个存储池或者卷组(Volume Group)。LVM可以每次从卷组中划分不同大小的逻辑卷(Logical Volume)创建新的逻辑设备。底层的原始的磁盘不再由内核直接控制,而是由LVM层来控制。对于上层应用来说,卷组替代了磁盘块成为了数据存储的基本单元。LVM管理着所有物理卷的物理盘区,维持着逻辑盘区和物理盘区之间的映射。LVM逻辑设备向上层提供了和物理磁盘相同的功能,如文件系统的创建和数据的访问等。但LVM逻辑设备不受物理约束的限制,逻辑卷不必是连续的空间,它可以跨越许多的物理卷,并且可以在任何时候任意的调整大小。相比物理磁盘来说,更易于磁盘空间的管理。
从用户态应用来看,LVM逻辑卷相当于一个普通的块设备,对其的读写操作和普通的块设备完全相同。而从物理设备层来看,LVM相对独立于底层的物理设备,并且屏蔽了不同的物理设备之间的差异。因而在LVM层上实现数据的连续保护问题,可以不需要单独考虑每一种具体的物理设备,避免了再数据复制过程中因物理设备之间的差异而产生的问题。从LVM的内核实现原理上看,LVM是在内核通用块设备层到磁盘驱动层的请求提交流之间开辟的另外一条路径,即在通用块层到磁盘设备驱动层之间插入了LVM管理映射层用于截获一定的请求进行处理。如图所示。
用户通过LVM提供的接口,依靠内核创建一系列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的创建与扩缩容
1)创建PV
[root@yang ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 500M 0 part /boot
├─sda2 8:2 0 40G 0 part /
└─sda3 8:3 0 9.5G 0 part
└─centos-swap 253:0 0 9.5G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sdd 8:48 0 20G 0 disk
sr0 11:0 1 4.3G 0 rom /mnt/cdrom
[root@yang ~]# pvcreate /dev/sdb /dev/sdc //创建PV
WARNING: dos signature detected on /dev/sdb at offset 510. Wipe it? [y/n]: y
Wiping dos signature on /dev/sdb.
WARNING: dos signature detected on /dev/sdc at offset 510. Wipe it? [y/n]: y
Wiping dos signature on /dev/sdc.
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.
[root@yang ~]# pvs //查看PV信息
PV VG Fmt Attr PSize PFree
/dev/sdb lvm2 --- 20.00g 20.00g
/dev/sdc lvm2 --- 20.00g 20.00g
[root@yang ~]# pvdisplay //查看PV的详细信息
"/dev/sdc" is a new physical volume of "20.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 20.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID mWEmVn-9rdN-0wXP-eB4x-5aaC-DL9m-oz2sUw
"/dev/sdb" is a new physical volume of "20.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 20.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 4ogs3v-i80P-lEoX-vDWu-qfLB-DRA9-kIEyb0
2)创建VG
[root@yang ~]# vgcreate vg0 /dev/sdb /dev/sdc -s 8MB //创建vg,命名为vg0,-s指明PE大小
Volume group "vg0" successfully created
[root@yang ~]# vgs //查看vg信息
VG #PV #LV #SN Attr VSize VFree
centos 1 1 0 wz--n- 9.50g 0
vg0 2 0 0 wz--n- 39.98g 39.98g
[root@yang ~]# vgdisplay //查看vg的详细信息
--- Volume group ---
VG Name vg0
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 39.98 GiB
PE Size 8.00 MiB
Total PE 5118
Alloc PE / Size 0 / 0
Free PE / Size 5118 / 39.98 GiB
VG UUID tPffhL-uE16-Bxkc-SBOx-w1Em-KF06-pDqrXl
[root@yang ~]# vgchange -s 4MB vg0 //修改PE的大小
Volume group "vg0" successfully changed
[root@yang ~]# vgdisplay
--- Volume group ---
VG Name vg0
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 2
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 39.98 GiB
PE Size 4.00 MiB
Total PE 10236
Alloc PE / Size 0 / 0
Free PE / Size 10236 / 39.98 GiB
VG UUID tPffhL-uE16-Bxkc-SBOx-w1Em-KF06-pDqrXl
3)创建LV
[root@yang ~]# lvcreate -L 10G -n lv01 vg0 //创建lv01,-L指明LV的大小
Logical volume "lv01" created.
[root@yang ~]# lvcreate -l 256 -n lv02 vg0 //创建lv02,-l指明LV由多少个PE组成
Logical volume "lv02" created.
[root@yang ~]# lvs //查看LV的信息
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
swap centos -wi-ao---- 9.50g
lv01 vg0 -wi-a----- 10.00g
lv02 vg0 -wi-a----- 1.00g
[root@yang ~]# lvdisplay //查看LV的详细信息
--- Logical volume ---
LV Path /dev/vg0/lv01
LV Name lv01
VG Name vg0
LV UUID u6PV9t-Aa5X-76HI-mhLw-6TGv-gbQc-hbZEw3
LV Write Access read/write
LV Creation host, time yang, 2019-10-21 16:18:44 +0800
LV Status available
# open 0
LV Size 10.00 GiB
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
--- Logical volume ---
LV Path /dev/vg0/lv02
LV Name lv02
VG Name vg0
LV UUID 3ZLlQw-hpgm-UCS0-VbXi-IWwA-ohRr-VzILwf
LV Write Access read/write
LV Creation host, time yang, 2019-10-21 16:19:04 +0800
LV Status available
# open 0
LV Size 1.00 GiB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
4)格式化并挂载使用
[root@yang ~]# mkfs.ext4 /dev/vg0/lv01 //格式化lv01
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@yang ~]# mkfs.ext4 /dev/vg0/lv02 //格式化lv02
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
[root@yang ~]# blkid
/dev/mapper/vg0-lv01: UUID="2de29067-43a4-4f67-a584-0e495125222e" TYPE="ext4"
/dev/mapper/vg0-lv02: UUID="f56b8bd6-7868-42f9-8efe-65a58173ea14" TYPE="ext4"
[root@yang ~]# vim /etc/fstab
UUID="2de29067-43a4-4f67-a584-0e495125222e" /mnt/lv01 ext4 defaults 0 0
UUID="f56b8bd6-7868-42f9-8efe-65a58173ea14" /mnt/lv02 ext4 defaults 0 0
[root@yang ~]# mkdir /mnt/lv01
[root@yang ~]# mkdir /mnt/lv02
[root@yang ~]# mount -a
[root@yang ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 xfs 43G 1.7G 42G 4% /
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 2.0G 13M 2.0G 1% /run
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda1 xfs 521M 143M 379M 28% /boot
tmpfs tmpfs 396M 0 396M 0% /run/user/0
/dev/sr0 iso9660 4.6G 4.6G 0 100% /mnt/cdrom
/dev/mapper/vg0-lv01 ext4 11G 38M 9.9G 1% /mnt/lv01
/dev/mapper/vg0-lv02 ext4 1.1G 2.7M 951M 1% /mnt/lv02
[root@yang ~]# cd /mnt/lv01/
[root@yang lv01]# cp -r /etc/ .
[root@yang lv01]# cp /boot/vmlinuz-3.10.0-957.el7.x86_64 .
[root@yang lv01]# ls
etc lost+found vmlinuz-3.10.0-957.el7.x86_64
5)扩容LV
[root@yang lv01]# vgextend vg0 /dev/sdd //扩容vg0
WARNING: dos signature detected on /dev/sdd at offset 510. Wipe it? [y/n]: y
Wiping dos signature on /dev/sdd.
Physical volume "/dev/sdd" successfully created.
Volume group "vg0" successfully extended
[root@yang lv01]# lvextend -L 20G /dev/vg0/lv01 //扩容lv01为20G
Size of logical volume vg0/lv01 changed from 10.00 GiB (2560 extents) to 20.00 GiB (5120 extents).
Logical volume vg0/lv01 successfully resized.
[root@yang lv01]# lvs //查看lv01的大小
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv01 vg0 -wi-ao---- 20.00g
lv02 vg0 -wi-ao---- 1.00g
[root@yang lv01]# resize2fs /dev/vg0/lv01 //扩容文件系统
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg0/lv01 is mounted on /mnt/lv01; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/vg0/lv01 is now 5242880 blocks long.
[root@yang lv01]# df -HT //查看lv01文件系统大小
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 xfs 43G 1.7G 42G 4% /
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 2.0G 13M 2.0G 1% /run
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda1 xfs 521M 143M 379M 28% /boot
tmpfs tmpfs 396M 0 396M 0% /run/user/0
/dev/sr0 iso9660 4.6G 4.6G 0 100% /mnt/cdrom
/dev/mapper/vg0-lv01 ext4 22G 88M 20G 1% /mnt/lv01
/dev/mapper/vg0-lv02 ext4 1.1G 2.7M 951M 1% /mnt/lv02
[root@yang lv01]# ls //查看文件
etc lost+found vmlinuz-3.10.0-957.el7.x86_64
6)缩容LV
[root@yang lv01]# vgreduce vg0 /dev/sdd //从vg0组中移除sdd
Removed "/dev/sdd" from volume group "vg0"
[root@yang lv01]# vgs //再查看vg0大小
VG #PV #LV #SN Attr VSize VFree
vg0 2 2 0 wz--n- 39.98g 18.98g
[root@yang ~]# umount /dev/vg0/lv01 //卸载文件系统
[root@yang ~]# e2fsck -f /dev/vg0/lv01 //检查lv01
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg0/lv01: 2400/1310720 files (0.2% non-contiguous), 136456/5242880 blocks
[root@yang ~]# resize2fs /dev/vg0/lv01 10G //缩容lv01文件系统
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/vg0/lv01 to 2621440 (4k) blocks.
The filesystem on /dev/vg0/lv01 is now 2621440 blocks long.
[root@yang ~]# lvreduce -L 10G /dev/vg0/lv01 //缩容lv01逻辑卷大小为10G
WARNING: Reducing active logical volume to 10.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg0/lv01? [y/n]: y
Size of logical volume vg0/lv01 changed from 20.00 GiB (5120 extents) to 10.00 GiB (2560 extents).
Logical volume vg0/lv01 successfully resized.
[root@yang ~]# lvs //查看lv01大小
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
swap centos -wi-ao---- 9.50g
lv01 vg0 -wi-a----- 10.00g
lv02 vg0 -wi-ao---- 1.00g
[root@yang ~]# mount /dev/vg0/lv01 /mnt/lv01 //重新挂载lv01
[root@yang ~]# df -TH //查看文件系统大小是否为10G
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 xfs 43G 1.7G 42G 4% /
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 2.0G 13M 2.0G 1% /run
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda1 xfs 521M 143M 379M 28% /boot
tmpfs tmpfs 396M 0 396M 0% /run/user/0
/dev/sr0 iso9660 4.6G 4.6G 0 100% /mnt/cdrom
/dev/mapper/vg0-lv02 ext4 1.1G 2.7M 951M 1% /mnt/lv02
/dev/mapper/vg0-lv01 ext4 11G 80M 9.9G 1% /mnt/lv01
[root@yang ~]# ls /mnt/lv01/ //查看文件是否存在
etc lost+found vmlinuz-3.10.0-957.el7.x86_64
四、LVM的数据迁移与其他属性
1)数据迁移:LVM支持数据从一块物理卷PV中的数据迁移到另外一块物理卷PV上
[root@yang ~]# vgextend vg0 /dev/sdd //添加sdd磁盘到vg0卷组中
Volume group "vg0" successfully extended
[root@yang ~]# vgs //查看vg大小
VG #PV #LV #SN Attr VSize VFree
centos 1 1 0 wz--n- 9.50g 0
vg0 3 2 0 wz--n- 59.98g 48.98g
[root@yang ~]# pvs //查看pv信息
PV VG Fmt Attr PSize PFree
/dev/sda3 centos lvm2 a-- 9.50g 0
/dev/sdb vg0 lvm2 a-- 19.99g 18.99g
/dev/sdc vg0 lvm2 a-- 19.99g 9.99g
/dev/sdd vg0 lvm2 a-- <20.00g <20.00g
[root@yang ~]# pvmove /dev/sdc /dev/sdd //把物理卷sdc的数据迁移到物理卷sdd上
/dev/sdc: Moved: 0.04%
/dev/sdc: Moved: 12.73%
/dev/sdc: Moved: 26.41%
/dev/sdc: Moved: 40.59%
/dev/sdc: Moved: 53.59%
/dev/sdc: Moved: 67.15%
/dev/sdc: Moved: 80.35%
/dev/sdc: Moved: 93.83%
/dev/sdc: Moved: 100.00%
[root@yang ~]# pvs //查看物理卷空间大小分配,迁移成功
PV VG Fmt Attr PSize PFree
/dev/sda3 centos lvm2 a-- 9.50g 0
/dev/sdb vg0 lvm2 a-- 19.99g 18.99g
/dev/sdc vg0 lvm2 a-- 19.99g 19.99g
/dev/sdd vg0 lvm2 a-- <20.00g <10.00g
2)修改逻辑卷属性
[root@yang ~]# pvchange -x n /dev/sdc //设置此pv不可分配
Physical volume "/dev/sdc" changed
1 physical volume changed / 0 physical volumes not changed
[root@yang ~]# pvchange -x y /dev/sdc //设置此pv可分配
Physical volume "/dev/sdc" changed
1 physical volume changed / 0 physical volumes not changed
[root@yang ~]# vgchange -an vg0 //禁用卷组
Logical volume vg0/lv02 contains a filesystem in use.
Can't deactivate volume group "vg0" with 2 open logical volume(s)
[root@yang ~]# vgchange -ay vg0 //激活卷组
2 logical volume(s) in volume group "vg0" now active
[root@yang ~]# lvchange -an /dev/vg0/lv01 //禁用逻辑卷
Logical volume vg0/lv01 contains a filesystem in use.
[root@yang ~]# lvchange -ay /dev/vg0/lv01 //激活逻辑卷
[root@yang ~]# lvchange -pr /dev/vg0/lv01 //设置逻辑卷只读
Logical volume vg0/lv01 changed.
[root@yang ~]# lvchange -prw /dev/vg0/lv01 //设置逻辑卷读写
Logical volume vg0/lv01 changed.
五、逻辑卷快照
快照概念:LVM中快照创建的时候,仅仅是拷贝原始卷里数据的元数据;创建的时候,并不会有数据的物理拷贝,因此
快照的创建几乎是瞬间完成的,当原始卷上有写操作执行时,快照跟踪原始卷块的改变,这个时候原始卷上
将要改变的数据在改变之前被拷贝到快照的预留的空间。
[root@yang ~]# ls /mnt/lv01/ //查看当前lv01文件系统上的文件
etc lost+found vmlinuz-3.10.0-957.el7.x86_64
[root@yang ~]# lvcreate -L 64M -n lv01-snap -s /dev/vg0/lv01
//为lv01逻辑卷创建一个大小64M名为lv01-snap的快照逻辑卷
Logical volume "lv01-snap" created.
[root@yang ~]# lvs //查看逻辑卷
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv01 vg0 owi-aos--- 10.00g
lv01-snap vg0 swi-a-s--- 64.00m lv01 0.02
lv02 vg0 -wi-ao---- 1.00g
[root@yang ~]# rm /mnt/lv01/etc/ -rf //删除lv01文件系统上的etc目录
[root@yang ~]# ls /mnt/lv01/ //查看当前lv01文件系统上的文件
lost+found vmlinuz-3.10.0-957.el7.x86_64
[root@yang ~]# umount /dev/vg0/lv01 //卸载lv01文件系统
[root@yang ~]# lvconvert --merge /dev/vg0/lv01-snap //执行快照恢复功能
Merging of volume vg0/lv01-snap started.
vg0/lv01: Merged: 100.00%
[root@yang ~]# mount /dev/vg0/lv01 /mnt/lv01/ //再次挂载lv01文件系统
[root@yang ~]# ls /mnt/lv01/ //查看etc目录是否恢复
etc lost+found vmlinuz-3.10.0-957.el7.x86_64