目录
- 一、LVM概述
- 二、基本术语
- 三、PE、PV、VG、LV之间的关系
- 四、LVM的工作原理
- 五、LVM的使用
- 六、LVM的优缺点
- 七、Linux中的LVM
一、LVM概述
LVM
是 Logical Volume Manager(逻辑卷管理器)
的简写。逻辑卷管理器是Linux系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而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)
PE是物理卷PV的基本划分单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。所以物理卷(PV)由大小等同的基本单元PE组成。
- 逻辑块(Logical Extent,LE)
逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
三、PE、PV、VG、LV之间的关系
四、LVM的工作原理
- 物理磁盘被格式化为PV,空间被划分为一个个的PE。
- 不同的PV加入到同一个VG中,不同PV的PE全部进入到了VG的PE池内。
- LV基于PE创建,大小为PE的整数倍,组成LV的PE可能来自不同的物理磁盘。
- LV现在就直接可以格式化后挂载使用了。
- LV的扩充缩减实际上就是增加或减少组成该LV的PE数量,其过程不会丢失原始数据 。
五、LVM的使用
1、部署逻辑卷
常用的LVM部署命令
功能/命令 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
---|---|---|---|
扫描 | pvscan | vgscan | lvscan |
建立 | pvcreate | vgcreate | lvcreate |
显示 | pvdisplay | vgdisplay | lvdisplay |
删除 | pvremove | vgremove | lvremove |
扩展 | vgextend | lvextend | |
缩小 | vgreduce | lvreduce |
第一步:
还原快照,并在虚拟机添加两块新硬盘设备,开机
第二步:
让新添加的两块硬盘设备支持LVM技术
[root@localhost ~]# lsblk #确保已正确新增两块硬盘
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos_192-root 253:0 0 17G 0 lvm /
└─centos_192-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sr0 11:0 1 4.4G 0 rom
[root@localhost ~]# pvcreate /dev/sdb /dev/sdc #来将磁盘设备 /dev/sdb 和 /dev/sdc 初始化为物理卷(PV)以支持LVM(逻辑卷管理器)技术。
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.
第三步:
把两块硬盘设备加入到storage卷组中,查看卷组状态
[root@localhost ~]# vgcreate storage /dev/sdb /dev/sdc #将物理卷 /dev/sdb 和 /dev/sdc 合并在一起,形成一个新的名为"storage"卷组。
Volume group "storage" successfully created
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name centos_192
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size <19.00 GiB
PE Size 4.00 MiB
Total PE 4863
Alloc PE / Size 4863 / <19.00 GiB
Free PE / Size 0 / 0
VG UUID Qtwzup-pc0G-gAaa-Icyt-UfLP-CuM6-3VnATy
--- Volume group ---
VG Name storage
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.99 GiB
PE Size 4.00 MiB
Total PE 10238
Alloc PE / Size 0 / 0
Free PE / Size 10238 / 39.99 GiB
VG UUID SJWDak-DLob-UssH-6d8g-Ms8Y-R2Di-dczcAw
第四步:
切割出一个148MB的逻辑卷设备
在对逻辑卷进行切割时有两种计量单位
- 以容量为单位,使用参数
-L
。例如使用-L 150M
生成一个大小为150MB的逻辑卷。 - 以基本单元的个数为单位,使用的参数为
-l
。每个基本单元的大小默认为4MB
。例如使用-l 37
可以生成一个大小为37*4MB=148MB的逻辑卷。
-l
切割:
[root@localhost ~]# lvcreate -n vo -l 37 storage #参数-n后面跟的是要创建的逻辑卷名称
Logical volume "vo" created.
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/centos_192/swap
LV Name swap
VG Name centos_192
LV UUID XDa9D8-hZj7-QVSC-qiQ0-lbaQ-QKRZ-LeZXcT
LV Write Access read/write
LV Creation host, time 192.168.112.140, 2023-08-12 17:05:09 +0800
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
--- Logical volume ---
LV Path /dev/centos_192/root
LV Name root
VG Name centos_192
LV UUID pHMI0L-5zIz-U6RU-g7L0-1Uy1-K01W-SNxrJi
LV Write Access read/write
LV Creation host, time 192.168.112.140, 2023-08-12 17:05:09 +0800
LV Status available
# open 1
LV Size <17.00 GiB
Current LE 4351
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
--- Logical volume ---
LV Path /dev/storage/vo
LV Name vo
VG Name storage
LV UUID h6L7tj-pz3i-Iear-RK9Y-Fu0M-iVEc-HOn8On
LV Write Access read/write
LV Creation host, time localhost, 2024-02-06 20:50:44 +0800
LV Status available
# open 0
LV Size 148.00 MiB
Current LE 37
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
-L
切割:
[root@localhost ~]# lvcreate -n vo -L 148M storage
Logical volume "vo" created.
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/centos_192/swap
LV Name swap
VG Name centos_192
LV UUID XDa9D8-hZj7-QVSC-qiQ0-lbaQ-QKRZ-LeZXcT
LV Write Access read/write
LV Creation host, time 192.168.112.140, 2023-08-12 17:05:09 +0800
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
--- Logical volume ---
LV Path /dev/centos_192/root
LV Name root
VG Name centos_192
LV UUID pHMI0L-5zIz-U6RU-g7L0-1Uy1-K01W-SNxrJi
LV Write Access read/write
LV Creation host, time 192.168.112.140, 2023-08-12 17:05:09 +0800
LV Status available
# open 1
LV Size <17.00 GiB
Current LE 4351
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
--- Logical volume ---
LV Path /dev/storage/vo
LV Name vo
VG Name storage
LV UUID uIyQ4u-fs8f-gDkr-L4Kw-eqC9-FQzq-PwgtL5
LV Write Access read/write
LV Creation host, time localhost, 2024-02-06 21:10:05 +0800
LV Status available
# open 0
LV Size 148.00 MiB
Current LE 37
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
第五步:
把生成好的逻辑卷进行格式化,然后挂载使用
[root@localhost ~]# mkfs.ext4 /dev/storage/vo
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
38000 inodes, 151552 blocks
7577 blocks (5.00%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=33816576
19 block groups
8192 blocks per group, 8192 fragments per group
2000 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
[root@localhost ~]# mkdir /vo #根目录下创建vo挂载点
[root@localhost ~]# mount /dev/storage/vo /vo
[root@localhost ~]# df -h #查看成功挂载
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos_192-root 17G 2.0G 16G 12% /
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 378M 0 378M 0% /run/user/0
/dev/mapper/storage-vo 140M 1.6M 128M 2% /vo
[root@localhost ~]# echo "/dev/storage/vo /vo ext4 defaults 0 0" >> /etc/fstab #写入配置文件使之永久生效
2、扩容逻辑卷
第一步:
把上一个实验中的逻辑卷vo
扩展至292MB
[root@localhost ~]# umount /vo
[root@localhost ~]# lvextend -L 292M /dev/storage/vo
Rounding size to boundary between physical extents: 292.00 MiB.
Size of logical volume storage/vo changed from 148.00 MiB (37 extents) to 292.00 MiB (73 extents).
Logical volume storage/vo successfully resized.
第二步:
检查硬盘完整性,并重置硬盘容量
[root@localhost ~]# e2fsck -f /dev/storage/vo #检查 ext2、ext3 和 ext4 文件系统的工具。这里的 -f 参数强制进行文件系统的完整性检查,即使文件系统是“干净”的(即上次关机时没有错误)。
e2fsck 1.42.9 (28-Dec-2013)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/storage/vo: 11/38912 files (0.0% non-contiguous), 10567/155648 blocks
[root@localhost ~]# resize2fs /dev/storage/vo #同步更新文件系统的大小以匹配新的逻辑卷大小
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 299008 (1k) blocks.
The filesystem on /dev/storage/vo is now 299008 blocks long.
[root@localhost ~]# lvdisplay #看到逻辑卷vo变为292MB
--- Logical volume ---
LV Path /dev/centos_192/swap
LV Name swap
VG Name centos_192
LV UUID XDa9D8-hZj7-QVSC-qiQ0-lbaQ-QKRZ-LeZXcT
LV Write Access read/write
LV Creation host, time 192.168.112.140, 2023-08-12 17:05:09 +0800
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
--- Logical volume ---
LV Path /dev/centos_192/root
LV Name root
VG Name centos_192
LV UUID pHMI0L-5zIz-U6RU-g7L0-1Uy1-K01W-SNxrJi
LV Write Access read/write
LV Creation host, time 192.168.112.140, 2023-08-12 17:05:09 +0800
LV Status available
# open 1
LV Size <17.00 GiB
Current LE 4351
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
--- Logical volume ---
LV Path /dev/storage/vo
LV Name vo
VG Name storage
LV UUID MeqJRa-F8kt-jLi8-hmZV-co3K-KIvR-NjG9m0
LV Write Access read/write
LV Creation host, time localhost, 2024-02-06 21:35:32 +0800
LV Status available
# open 0
LV Size 292.00 MiB
Current LE 73
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
第三步:
重新挂载硬盘设备并查看挂载状态
[root@localhost /]# mount /dev/storage/vo /vo
[root@localhost /]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos_192-root 17G 2.0G 16G 12% /
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 378M 0 378M 0% /run/user/0
/dev/mapper/storage-vo 279M 2.1M 259M 1% /vo
3、缩小逻辑卷
第一步:
检查文件系统的完整性
[root@localhost ~]# umount /vo
[root@localhost ~]# e2fsck -f /dev/storage/vo
e2fsck 1.42.9 (28-Dec-2013)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/storage/vo: 11/75776 files (0.0% non-contiguous), 15729/299008 blocks
第二步:
把逻辑卷vo
的容量减少到120MB
[root@localhost ~]# resize2fs /dev/storage/vo 120M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 122880 (1k) blocks.
The filesystem on /dev/storage/vo is now 122880 blocks long.
[root@localhost ~]# lvreduce -L 120M /dev/storage/vo
WARNING: Reducing active logical volume to 120.00 MiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce storage/vo? [y/n]: y
Size of logical volume storage/vo changed from 240.00 MiB (60 extents) to 120.00 MiB (30 extents).
Logical volume storage/vo successfully resized.
第三步:
重新挂载文件系统并查看系统状态
[root@localhost ~]# mount /dev/storage/vo /vo
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos_192-root 17G 2.0G 16G 12% /
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 378M 0 378M 0% /run/user/0
/dev/mapper/storage-vo 113M 1.6M 103M 2% /vo
3、逻辑卷快照
LVM还具备有快照卷
功能,该功能类似于虚拟机软件的还原时间点功能。例如,可以对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快照卷进行覆盖还原。LVM的快照卷功能有两个特点:
- 快照卷的容量必须等同于逻辑卷的容量;
- 快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除。
先在/vo
下创建一个readme.txt
文件用来验证逻辑卷快照还原前后状态变化
[root@localhost ~]# echo "hello LVM" >> /vo/readme.txt
[root@localhost ~]# ls -l /vo
总用量 13
drwx------ 2 root root 12288 2月 6 22:04 lost+found
-rw-r--r-- 1 root root 10 2月 6 22:10 readme.txt
第一步:
使用-s
参数生成一个快照卷,使用-L
参数指定切割的大小
[root@localhost ~]# lvcreate -L 120M -s -n SNAP /dev/storage/vo #在 "storage" 卷组下,基于名为 "vo" 的现有逻辑卷,创建一个容量为120MB的快照卷,并将这个新的快照卷命名为 "SNAP"
Logical volume "SNAP" created.
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/storage/vo
LV Name vo
VG Name storage
LV UUID ywJ3ah-At9t-t65q-0JsQ-i45Q-pyeh-iHhxWN
LV Write Access read/write
LV Creation host, time localhost, 2024-02-06 22:04:25 +0800
LV snapshot status source of
SNAP [active]
LV Status available
# open 1
LV Size 120.00 MiB
Current LE 30
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
--- Logical volume ---
LV Path /dev/storage/SNAP
LV Name SNAP
VG Name storage
LV UUID JZpfG2-T6Yl-ODCF-CVnR-34Uw-pGQ9-3skxG9
LV Write Access read/write
LV Creation host, time localhost, 2024-02-06 22:11:07 +0800
LV snapshot status active destination for vo
LV Status available
# open 0
LV Size 120.00 MiB
Current LE 30
COW-table size 120.00 MiB
COW-table LE 30
Allocated to snapshot 0.01%
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:5
第二步:
在逻辑卷所挂载的目录中创建一个100MB的垃圾文件,然后再查看快照卷的状态。发现存储空间的占用量上升了
[root@localhost ~]# dd if=/dev/zero of=/vo/file bs=100M count=1
记录了1+0 的读入
记录了1+0 的写出
104857600字节(105 MB)已复制,1.21787 秒,86.1 MB/秒
[root@localhost ~]# ll -ht /vo/file
-rw-r--r-- 1 root root 100M 2月 6 22:19 /vo/file
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/storage/vo
LV Name vo
VG Name storage
LV UUID ywJ3ah-At9t-t65q-0JsQ-i45Q-pyeh-iHhxWN
LV Write Access read/write
LV Creation host, time localhost, 2024-02-06 22:04:25 +0800
LV snapshot status source of
SNAP [active]
LV Status available
# open 1
LV Size 120.00 MiB
Current LE 30
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
--- Logical volume ---
LV Path /dev/storage/SNAP
LV Name SNAP
VG Name storage
LV UUID JZpfG2-T6Yl-ODCF-CVnR-34Uw-pGQ9-3skxG9
LV Write Access read/write
LV Creation host, time localhost, 2024-02-06 22:11:07 +0800
LV snapshot status active destination for vo
LV Status available
# open 0
LV Size 120.00 MiB
Current LE 30
COW-table size 120.00 MiB
COW-table LE 30
Allocated to snapshot 83.71%
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:5
第三步:
为了校验SNAP快照卷的效果,需要对逻辑卷进行快照还原操作。在此之前记得先卸载掉逻辑卷设备与目录的挂载。
[root@localhost ~]# umount /vo
[root@localhost ~]# lvconvert --merge /dev/storage/SNAP #合并(merge)快照卷 "SNAP" 回到其源卷 "vo"
Merging of volume storage/SNAP started.
storage/vo: Merged: 23.03%
storage/vo: Merged: 100.00%
第四步:
快照卷会被自动删除掉,并且刚刚在逻辑卷设备被执行快照操作后再创建出来的100MB的垃圾文件也被清除了而/vo/readme.txt
还在
[root@localhost ~]# mount -a
[root@localhost ~]# ls /vo/
lost+found readme.txt
[root@localhost ~]# cat /vo/readme.txt
hello LVM
4、删除逻辑卷
第一步:
取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数。
[root@localhost ~]# umount /vo/
[root@localhost ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Aug 12 17:05:10 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos_192-root / xfs defaults 0 0
UUID=01838dd0-44b0-4056-b0e2-96760522a11b /boot xfs defaults 0 0
/dev/mapper/centos_192-swap swap swap defaults 0 0
第二步:
删除逻辑卷设备,需要输入y来确认操作
[root@localhost ~]# lvremove /dev/storage/vo
Do you really want to remove active logical volume storage/vo? [y/n]: y
Logical volume "vo" successfully removed
第三步:
删除卷组,此处只写卷组名称即可,不需要设备的绝对路径。
[root@localhost ~]# vgremove storage
Volume group "storage" successfully removed
第四步:
删除物理卷设备
[root@localhost ~]# pvremove /dev/sdb /dev/sdc
Labels on physical volume "/dev/sdb" successfully wiped.
Labels on physical volume "/dev/sdc" successfully wiped.
六、LVM的优缺点
优点:
- 动态扩展:在系统运行时可以在线增加或减少逻辑卷的大小,无需重启服务或操作系统,提供对存储空间的动态管理能力。
- 灵活性:允许文件系统跨越多个物理磁盘,突破单个硬盘容量限制,可以根据需要调整逻辑卷布局,实现存储资源的有效利用。
- 扩展性:可以方便地向现有的卷组中添加新的物理磁盘,进一步扩大存储池容量。
- 高可用与冗余:支持镜像和条带化技术,能够将数据冗余到多个磁盘上以提高数据安全性及读写性能。
- 数据迁移便捷:可以更容易地迁移或备份整个逻辑卷至其他系统或硬件环境。
缺点:
- 在从卷组中移除一个磁盘的时候必须使用reducevg命令(这个命令要求root权限,并且不允许在快照卷组中使用)。
- 当卷组中的一个磁盘损坏时,整个卷组都会受到影响。
- 因为加入了额外的操作,存储性能受到影响
- 不能减小文件系统大小(受文件系统类型限制)