1. 逻辑卷介绍
LVM全称为逻辑卷管理(Logical Volume Manager),是一种在Linux操作系统中用于管理和优化磁盘存储的技术。LVM提供了一种灵活的方式来管理硬盘和分区,它允许用户在不中断系统服务的情况下动态调整存储容量,提高了存储资源的利用率和管理效率。
优点包括:
- 允许在系统运行时动态地增加或减少逻辑卷的大小,无需重新分区或重启系统,极大提升了存储管理的灵活性。
- 将多个物理磁盘组合成卷组,实现了存储资源的池化,使得存储空间可以更高效地被管理和分配。
- 提供了一个统一的抽象层来管理存储,使得添加、删除或更换磁盘变得简单易行,降低了管理复杂度。
缺点包括:
- 相较于传统的分区管理,配置和管理较为复杂,需要一定的学习成本。
- 虽然可以优化存储性能,但在某些场景下,尤其是涉及大量小文件读写时,由于额外的抽象层,可能会有轻微的性能损失。
- 在特定情况下,例如系统崩溃,恢复LVM配置可能比标准分区更为复杂。
- 本身需要占用少量的系统资源,包括磁盘空间用于元数据管理,以及在处理大量I/O请求时可能消耗更多的CPU资源。
LVM技术是在硬LVM介绍盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。用户不必关心物理硬盘设备的低层架构和布局,就可以实现对硬盘分区的动态调整,LVM的技术架构如图。
LVM体系结构包括三个基本概念:
- 物理卷(Physical Volume, PV):LVM的基础构建块,通常对应于一个硬盘分区或整个硬盘。物理卷上包含可供LVM使用的存储容量,这些容量被划分为称为“物理区域(physical extents)”的小块。
- 卷组(Volume Group, VG):一个或多个物理卷可以组合成一个卷组,这构成了LVM的存储池。卷组中的物理区域形成了一个连续的地址空间,LVM在此基础上创建逻辑卷。
- 逻辑卷(Logical Volume, LV):从卷组中分配一部分物理区域创建而成,逻辑卷对操作系统来说就像一个普通的块设备,可以在其上创建文件系统。逻辑卷的大小可以根据需要动态调整,而且可以轻松迁移或扩展,而不会影响到数据的可用性。
- 三者之间的关系类似于
PV组成LG,LG分割出LV
。
LVM的核心理念:
物理卷处于LVM中的最底层,可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列, 这都可以。卷组建立在物理卷之上,一个卷组可以包含多个物理卷,而且在卷组创建之后也 可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立 后可以动态地扩展或缩小空间。
2. 部署逻辑卷
部署LVM时,需要逐个配置物理卷、卷组和逻辑卷。常用部署命令如下:
功能 | 物理卷管理命令 | 卷组管理命令 | 逻辑卷管理命令 |
---|---|---|---|
扫描 | pvscan | vgscan | lvscan |
建立 | pvcreate | vgcreate | lvcreate |
显示 | pvdisplay | vgdisplay | lvdisplay |
删除 | pvremove | vgremove | lvremove |
扩展 | vgextend | lvextend | |
缩小 | vgreduce | lvreduce |
演示:在虚拟机中添加两块新硬盘设备,然后开机
- 第一步:查看硬盘
[root@localhost ~]# fdisk -l
Disk /dev/sda: 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: 0x000bc797
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 5244927 1572864 82 Linux swap / Solaris
/dev/sda3 5244928 41943039 18349056 83 Linux
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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/sdc: 10.7 GB, 10737418240 bytes, 20971520 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
- 第二步:让新添加的两块硬盘设备支持LVM技术(创建物理卷)
[root@localhost ~]# pvcreate /dev/sdb /dev/sdc
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.
# 提示没有该命令的话,则安装软件包 yum -y install lvm2
- 第三步:把两块硬盘设备加入到storage卷组中,然后查看卷组的状态
# 创建卷组
[root@localhost ~]# vgcreate storage /dev/sdb /dev/sdc
Volume group "storage" successfully created
# 语法: vgcreate 卷组名 磁盘1 磁盘2 ...
# 查看卷组
[root@localhost ~]# vgdisplay
--- 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 19.99 GiB
PE Size 4.00 MiB
Total PE 5118
Alloc PE / Size 0 / 0
Free PE / Size 5118 / 19.99 GiB
VG UUID FdPjR1-cfK2-Hs1a-h6nh-hEZZ-1dun-bBhOSp
- 第四步:切割出一个5G的逻辑卷设备
在对逻辑卷进行切割时有两种计量单位。第一种是以容量为单位,所使用的参数为-L。例如,使用-L 5G生成一个大小为5GB的逻辑卷。另外一种是以基本单元的个数为单位,所使用的参数为-l。每个基本单元的大小默认为 4MB。例 如,使用-l 37可以生成一个大小为37×4MB=148MB的逻辑卷。
[root@localhost ~]# lvcreate -n vo1 -L 5G storage
Logical volume "vo1" created.
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/storage/vo1
LV Name vo1
VG Name storage
LV UUID fpfIpY-9PLx-nxiS-5I9h-akH2-vH1W-CJxdha
LV Write Access read/write
LV Creation host, time localhost, 2024-07-11 16:26:11 +0800
LV Status available
# open 0
LV Size 5.00 GiB
Current LE 1280
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
- 第五步:把生成好的逻辑卷进行格式化,然后挂载使用
Linux 系统会把LVM 中的逻辑卷设备存放在/dev设备目录中(实际上是做了一个符号链接),同时会以卷组的名称来建立一个目录,其中保存了逻辑卷的设备映射文件(即/dev/卷组 名称/逻辑卷名称)。
[root@localhost dev]# find / -name vo1
/dev/storage/vo1
[root@localhost dev]# mkfs.ext4 /dev/storage/vo1
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
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 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
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@localhost ~]# mkdir ceshi
[root@localhost ~]# mount /dev/storage/vo1 ceshi/
- 查看挂载状态,并写入到配置文件,使其永久生效。
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda3 18G 2.0G 16G 12% /
/dev/sda1 1014M 132M 883M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/storage-vo1 4.8G 20M 4.6G 1% /root/ceshi
echo "/dev/storage/vo1 /root/ceshi ext4 defaults 0 0" >> /etc/fstab
3. 扩容逻辑卷
- 第一步:把上一个实验中的逻辑卷vo1扩展至7G
# 卸载设备和挂载点(可选)
[root@localhost ~]# umount /root/ceshi
[root@localhost ~]# lvextend -L 7G /dev/storage/vo1
Size of logical volume storage/vo1 changed from 6.00 GiB (1536 extents) to 7.00 GiB (1792 extents).
Logical volume storage/vo1 successfully resized.
- 第二步:检查硬盘完整性,并重置硬盘容量。
[root@localhost ~]# e2fsck -f /dev/storage/vo1
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/storage/vo1: 11/393216 files (0.0% non-contiguous), 62574/1572864 blocks
[root@localhost ~]# resize2fs /dev/storage/vo1
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo1 to 1835008 (4k) blocks.
The filesystem on /dev/storage/vo1 is now 1835008 blocks long.
- 第三步:重新挂载硬盘设备并查看挂载状态。
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda3 18G 2.0G 16G 12% /
/dev/sda1 1014M 132M 883M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/storage-vo1 6.8G 23M 6.4G 1% /root/ceshi
- 注意1:e2fsck命令、resize2f命令、xfs_growf命令
e2fsck
是检查ext2、ext3、ext4等文件系统的正确性和完整性,并修复任何问题。如果有任何问题,请根据提示进行修复。
resize2fs
是ext2/ext3/ext4文件系统重定义大小工具。使用中将调整文件系统的大小,并根据需要扩展或收缩文件系统。
xfs_growf
是xfs文件系统重定义大小工具。在处理xfs文件系统时,使用xfs_growf替换resize2fs。
- 不卸载的方式(挂载扩容)
[root@localhost ~]# lvextend -L 7G /dev/storage/vo1 Size of logical volume storage/vo1 changed from 6.00 GiB (1536 extents) to 7.00 GiB (1792 extents). Logical volume storage/vo1 successfully resized. [root@localhost ~]# resize2fs /dev/storage/vo1 resize2fs 1.42.9 (28-Dec-2013) Resizing the filesystem on /dev/storage/vo1 to 1835008 (4k) blocks. The filesystem on /dev/storage/vo1 is now 1835008 blocks long. [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 476M 0 476M 0% /dev tmpfs 487M 0 487M 0% /dev/shm tmpfs 487M 7.7M 479M 2% /run tmpfs 487M 0 487M 0% /sys/fs/cgroup /dev/sda3 18G 2.0G 16G 12% / /dev/sda1 1014M 132M 883M 13% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/mapper/storage-vo1 6.8G 23M 6.4G 1% /root/ceshi
4. 缩小逻辑卷
相较于扩容逻辑卷,在对逻辑卷进行缩容操作时,其丢失数据的风险更大。所以在生产 环境中执行相应操作时,一定要提前备份好数据。另外Linux系统规定,在对LVM逻辑卷进 行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证我们的数据安全)。在执 行缩容操作前记得先把文件系统卸载掉。
- 第一步:检查文件系统的完整性。
[root@localhost ~]# umount /root/ceshi
[root@localhost ~]# e2fsck -f /dev/storage/vo1 # 不先卸载的话,执行该命令会报错
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/storage/vo1: 11/655360 files (0.0% non-contiguous), 79663/2621440 blocks
- 第二步:把逻辑卷vo的容量减小到5G
[root@localhost ~]# resize2fs /dev/storage/vo1 5G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo1 to 1310720 (4k) blocks.
The filesystem on /dev/storage/vo1 is now 1310720 blocks long.
[root@localhost ~]# lvreduce -L 5G /dev/storage/vo1
WARNING: Reducing active logical volume to 5.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce storage/vo1? [y/n]: y
Size of logical volume storage/vo1 changed from 10.00 GiB (2560 extents) to 5.00 GiB (1280 extents).
Logical volume storage/vo1 successfully resized.
- 第三步:重新挂载文件系统并查看系统状态。
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda3 18G 2.0G 16G 12% /
/dev/sda1 1014M 132M 883M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/storage-vo1 4.8G 20M 4.6G 1% /root/ceshi
5. 逻辑卷快照
LVM 还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。例如,可 以对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快 照卷进行覆盖还原。LVM的快照卷功能有两个特点:
- 快照卷的容量必须等同于逻辑卷的容量;
- 快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除。
首先查看卷组的信息。
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name storage
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 19.99 GiB
PE Size 4.00 MiB
Total PE 5118
Alloc PE / Size 1280 / 5.00 GiB
Free PE / Size 3838 / 14.99 GiB
VG UUID FdPjR1-cfK2-Hs1a-h6nh-hEZZ-1dun-bBhOSp
通过卷组的输出信息可以清晰看到,卷组中已经使用了 5GB 的容量,空闲容量还有 14.99GB。接下来用重定向往逻辑卷设备所挂载的目录中写入一个文件。
[root@localhost ~]# echo "Welcome to LVM" > /root/ceshi/readme.txt
[root@localhost ~]# ls -l /root/ceshi/
total 20
drwx------ 2 root root 16384 Jul 11 16:34 lost+found
-rw-r--r-- 1 root root 15 Jul 11 19:41 readme.txt
- 第1步:使用-s参数生成一个快照卷,使用-L参数指定切割的大小。另外,还需要在命令后面写上是针对哪个逻辑卷执行的快照操作。
[root@localhost ~]# lvcreate -L 5G -s -n BAK /dev/storage/vo1
Logical volume "BAK" created.
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/storage/vo1
LV Name vo1
VG Name storage
LV UUID fpfIpY-9PLx-nxiS-5I9h-akH2-vH1W-CJxdha
LV Write Access read/write
LV Creation host, time localhost, 2024-07-11 16:26:11 +0800
LV snapshot status source of
BAK [active]
LV Status available
# open 1
LV Size 5.00 GiB
Current LE 1280
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
--- Logical volume ---
LV Path /dev/storage/BAK
LV Name BAK
VG Name storage
LV UUID bYJmju-ZZn2-FYkw-PcUq-H7k8-awBM-LHLm1u
LV Write Access read/write
LV Creation host, time localhost, 2024-07-11 19:51:46 +0800
LV snapshot status active destination for vo1
LV Status available
# open 0
LV Size 5.00 GiB
Current LE 1280
COW-table size 5.00 GiB
COW-table LE 1280
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:3
- 第2步:在逻辑卷所挂载的目录中创建一个1GB的垃圾文件,然后再查看快照卷的状态。可以发现存储空间占的用量上升了。
[root@localhost ~]# dd if=/dev/zero of=/root/ceshi/files count=1 bs=1024M
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 18.5166 s, 58.0 MB/s
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/storage/vo1
LV Name vo1
VG Name storage
LV UUID fpfIpY-9PLx-nxiS-5I9h-akH2-vH1W-CJxdha
LV Write Access read/write
LV Creation host, time localhost, 2024-07-11 16:26:11 +0800
LV snapshot status source of
BAK [active]
LV Status available
# open 1
LV Size 5.00 GiB
Current LE 1280
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
--- Logical volume ---
LV Path /dev/storage/BAK
LV Name BAK
VG Name storage
LV UUID bYJmju-ZZn2-FYkw-PcUq-H7k8-awBM-LHLm1u
LV Write Access read/write
LV Creation host, time localhost, 2024-07-11 19:51:46 +0800
LV snapshot status active destination for vo1
LV Status available
# open 0
LV Size 5.00 GiB
Current LE 1280
COW-table size 5.00 GiB
COW-table LE 1280
Allocated to snapshot 20.08% #### 存储空间占的用量上升了
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
- 第3步:为了校验SNAP快照卷的效果,需要对逻辑卷进行快照还原操作。在此之前记得先卸载掉逻辑卷设备与目录的挂载。
[root@localhost ~]# umount /root/ceshi
[root@localhost ~]# lvconvert --merge /dev/storage/BAK
Merging of volume storage/BAK started.
storage/vo1: Merged: 80.57%
storage/vo1: Merged: 100.00%
- 第4步:快照卷会被自动删除掉,并且刚刚在逻辑卷设备被执行快照操作后再创建出来的1GB的垃圾文件也被清除了。
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda3 18G 2.0G 16G 12% /
/dev/sda1 1014M 132M 883M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/storage-vo1 4.8G 20M 4.6G 1% /root/ceshi
6. 删除逻辑卷
当生产环境中想要重新部署LVM或者不再需要使用LVM时,则需要执行LVM的删除 操作。为此,需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备, 这个顺序不可颠倒。
- 第1步:取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数。
[root@localhost ~]# umount /root/ceshi
[root@localhost ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Apr 8 15:58:05 2024
#
# 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
#
UUID=04637479-3fb2-40e0-9873-276b5a7ca53f / xfs defaults 0 0
UUID=af29a88b-a46b-4654-bdbd-405ca8d6c294 /boot xfs defaults 0 0
UUID=438d68b3-2f2b-4f3d-96ef-d0e5f26babf3 swap swap defaults 0 0
# /dev/storage/vo1 /root/ceshi ext4 defaults 0 0
- 第2步:删除逻辑卷设备,需要输入y来确认操作。
[root@localhost ~]# lvremove /dev/storage/vo1
Do you really want to remove active logical volume storage/vo1? [y/n]: y
Logical volume "vo1" successfully removed
- 第3步:删除卷组,此处只写卷组名称即可,不需要设备的绝对路径。
[root@localhost ~]# vgremove storage
Volume group "storage" successfully removed
- 第4步:删除物理卷设备。
[root@localhost ~]# pvremove /dev/sdb /dev/sdc
Labels on physical volume "/dev/sdb" successfully wiped.
Labels on physical volume "/dev/sdc" successfully wiped.
在上述操作执行完毕之后,再执行lvdisplay
、vgdisplay
、pvdisplay
命令来查看LVM 的信息时就不会再看到信息了。