目录
1. LVM的基本概念
2. Linux下创建和管理LVM
3. 环境准备
4. 物理卷管理
4.1. 创建物理卷
4.2. 显示物理卷
4.3. 删除物理卷
4. 卷组管理
4.1. 创建卷组
4.2. 显示卷组
4.3. 扩展卷组
4.4. 缩减卷组
4.5. 删除卷组
4.6. 分割卷组
4.7 组合卷组
5. 逻辑卷管理
5.1. 创建逻辑卷
5.2. 显示逻辑卷
5.3. 创建文件系统并挂载
5.4. 扩展逻辑卷
5.5. 缩减逻辑卷
5.6. 删除逻辑卷
文件LVM是逻辑卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分析进行管理的一种机制。LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统。在传统的磁盘管理机制中,上层应用是直接访问文件系统来对底层的物理硬盘进行读写。而在LVM中,它会将底层的硬盘进行封装,当我们通过软件去对底层的物理磁盘进行操作时,它不再是直接对分区进行操作,而是通过逻辑卷对底层的物理硬盘进行操作。LVM最大的特点就是可以对磁盘进行动态管理,因为逻辑卷的大小是可以动态调整的,而且不会丢失数据。逻辑卷的技术大大提高了磁盘管理的逻辑性。
1. LVM的基本概念
LVM中的概念有物理卷、卷组、逻辑卷、物理区块和逻辑区块等,其含义如下:
- 物理卷(Physical Volume, PV):物理卷是指硬盘/硬盘分区或者从逻辑上与硬盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但是与基本的物理存储介质(如硬盘、分区等)比较却包含有与LVM相关的管理参数。
- 卷组(Volume Group, VG):卷组是由一个或多个物理卷组成的一个整体,在卷组中可以动态地添加或移除物理卷,卷组名称由用户自行定义。
- 逻辑卷(Logical Volume,LV):逻辑卷是建立在卷组之上的,与物理卷无直接关系,对于逻辑卷来说,每一个卷组就是一个整体,从这个整体中切出一小块空间,作为用户创建文件系统基础,这一小块空间就称为逻辑卷。
- 物理区块(Physical Extent, PE):每一个物理卷被划分为称为PE的基本单位,具有唯一编号的PE是可以被LVM寻址的最小单元,PE大小可配置,默认4MB。
- 逻辑区块(Logical Extend,LE):逻辑卷也被划为为称为LE的可寻址的基本单元,在同一卷组中,LE的大小和PE是相同的,并且一一对应。
图1描述了存储介质、物理卷、卷组、逻辑卷和文件系统之间的关系。
图1. 存储介质、物理卷、卷组、逻辑卷和文件系统之间的关系
2. Linux下创建和管理LVM
在Ubuntu、Debian 和 Linux Mint 上安装 LVM的命令:
sudo apt install lvm2
在 CentOS、Fedora、AlmaLinux 和 Red Hat 上安装 LVM的命令:
sudo dnf install lvms
LVM中的主要管理命令如表1所示。
功能 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
扫描(scan) | pvscan | vgscan | lvscan |
建立(create) | pvcreate | vgcreate | lvcreate |
显示(display) | pvdisplay | vgdisplay | lvdisplay |
删除(remove) | pvremove | vgremove | lvremove |
缩减(reduce) | vgreduce | lvreduce | |
扩展(extend) | vgextend | lvextend |
3. 环境准备
准备4块硬盘:/dev/sdb、/dev/sdc、/dev/sdd和/dev/sde,每个硬盘的容量为10G。将硬盘/dev/sdc划分两个分区:/dev/sdc1和/dev/sdc2,其中,/dev/sdc的容量为2G,/dev/sdc2的容量为8G;将硬盘/dev/sdd划分为两个分区:/dev/sdd1和/dev/sdd2,其中,/dev/sdd1的容量5G,/dev/sdd2的容量为8G。
查看机器分区情况:
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sde 8:32 0 10G 0 disk ... |
4. 物理卷管理
4.1. 创建物理卷
将硬盘/dev/sdb,以及硬盘分区/dev/sdc1、/dev/sdc2、/dev/sdd1、/dev/sdd2转换为物理卷,创建物理卷命令如下:
# 将硬盘/dev/sdb创建为一个物理卷
sudo pvcreate /dev/sdb
WARNING: dos signature detected on /dev/sdb at offset 510. Wipe it? [y/n]: y Wiping dos signature on /dev/sdb. Physical volume "/dev/sdb" successfully created. |
# 将硬盘分区/dev/sdc1和/dev/sdc2创建为两个物理卷
sudo pvcreate /dev/sdc[1,2]
Physical volume "/dev/sdc1" successfully created. Physical volume "/dev/sdc2" successfully created. |
# 将硬盘分区/dev/sdd1和/dev/sdd2创建为两个物理卷
sudo pvcreate /dev/sdd1 /dev/sdd2
Physical volume "/dev/sdd1" successfully created. Physical volume "/dev/sdd2" successfully created. |
4.2. 显示物理卷
# 显示所有物理卷信息:
sudo pvdisplay
"/dev/sdb" is a new physical volume of "10.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb VG Name PV Size 10.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID X8hoHa-3Osn-laEc-QlI3-1sT5-aaJZ-TvdTjg "/dev/sdc1" is a new physical volume of "<2.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc1 VG Name PV Size <2.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID xC3MDe-V3NL-Xgsx-NSFb-8aaW-6OkA-W5CTlr "/dev/sdc2" is a new physical volume of "<8.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc2 VG Name PV Size <8.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID MTKNlr-Rk8T-v3qN-l8lR-QhB5-UtxR-3r3Ygt "/dev/sdd1" is a new physical volume of "<5.00 GiB" --- NEW Physical volume --- PV Name /dev/sdd1 VG Name PV Size <5.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID OL6a9y-oDZG-j8G1-S0kV-2QT9-kBwS-PcnMS5 "/dev/sdd2" is a new physical volume of "5.00 GiB" --- NEW Physical volume --- PV Name /dev/sdd2 VG Name PV Size 5.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID dM8BcS-tHa7-7mnd-WYZ0-U0TG-7bPW-HLklmR |
输出显示已经创建了5个物理卷:/dev/sdb、/dev/sdc1、/dev/sdc2、/dev/sdd1、/dev/sdd2。
# 显示单个物理卷信息:
sudo pvdisplay /dev/sdb
"/dev/sdb" is a new physical volume of "10.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb VG Name PV Size 10.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID X8hoHa-3Osn-laEc-QlI3-1sT5-aaJZ-TvdTjg |
4.3. 删除物理卷
删除一个物理卷的命令如下:
sudo pvremove /dev/sdd2
Labels on physical volume "/dev/sdd2" successfully wiped. |
4. 卷组管理
4.1. 创建卷组
将物理卷/dev/sdb、/dev/sdc1和/dev/sdd1组组合成一个卷组,卷组的名称为vg1;将物理卷/dev/sdc2和/dev/sdd2组成一个卷组,卷组的名称为vg2。
# 创建卷组vg1,该卷组是由物理卷/dev/sdb、/dev/sdc1和/dev/sdd1组成
sudo vgcreate vg1 /dev/sdb /dev/sdc1 /dev/sdd1
Volume group "vg1" successfully created |
# 创建卷组vg2,该卷组是由物理卷/dev/sdc2和/dev/sdd2组成
sudo vgcreate vg2 /dev/sdc2 /dev/sdd2
Volume group "vg2" successfully created |
4.2. 显示卷组
# 显示所有卷组信息:
sudo vgdisplay
--- Volume group --- VG Name vg2 |
输出显示创建了2个卷组:vg1和vg2。
# 显示单个卷组信息:
sudo vgdisplay vg1
--- Volume group --- VG Name vg1 System ID Format lvm2 Metadata Areas 3 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 3 Act PV 3 VG Size <16.99 GiB PE Size 4.00 MiB Total PE 4349 Alloc PE / Size 0 / 0 Free PE / Size 4349 / <16.99 GiB VG UUID Isf2u3-0OGe-56zB-wf8k-0JZU-WOce-CJXJPt |
显示卷组的命令还有:
vgscan:扫描卷组的所有磁盘,并重新构建LVM缓存文件,同时显示卷组。
vgs:使用可配置格式显示卷组信息,每行一个卷组。
4.3. 扩展卷组
扩展卷组是指像一个卷组中增加一个或多个物理卷,示例如下:
# 创建一个新的物理卷/dev/sde
sudo pvcreate /dev/sde
Physical volume "/dev/sde" successfully created. |
# 将新创建的物理卷/dev/sde加入到卷组vg2中
sudo vgextend vg2 /dev/sde
Volume group "vg2" successfully extended |
4.4. 缩减卷组
缩减卷组是指从一个卷组中移除一个 或多个物理卷,示例如下:
# 将物理卷/dev/sde从卷组vg2中移除
sudo vgreduce vg2 /dev/sde
Removed "/dev/sde" from volume group "vg2" |
4.5. 删除卷组
使用vgremove命令可以删除不包含逻辑卷的卷组,示例如下:
# 删除逻辑卷vg2
sudo vgremove vg2
Volume group "vg2" successfully removed |
4.6. 分割卷组
使用vgsplit命令可以拆分卷组中的物理卷,并创建新的卷组。示例如下:
# 将卷组vg2中的物理卷/devsde拆分为一个新的卷组vg3
sudo vgsplit vg2 vg3 /dev/sde
New volume group "vg3" successfully split from "vg2" |
4.7 组合卷组
使用lvmerge命令可以将两个卷组合并为一个更大的卷组,在合并卷组之前,确保两个卷组中的逻辑卷没有重叠,否则合并操作将会失败。示例如下:
# 把卷组vg3合并到卷组vg2中
sudo vgmerge -v vg2 vg3
Checking for volume group "vg2" Checking for volume group "vg3" Archiving volume group "vg3" metadata (seqno 2). Archiving volume group "vg2" metadata (seqno 5). Writing out updated volume group WARNING: updating old metadata to 6 on /dev/sde for VG vg2. Creating volume group backup "/etc/lvm/backup/vg2" (seqno 6). Volume group "vg3" successfully merged into "vg2" |
5. 逻辑卷管理
5.1. 创建逻辑卷
在卷组vg1上创建一个大小为5GB,名称为lv11的逻辑卷:
sudo lvcreate -L 5GB -n lv11 vg1
Logical volume "lv11" created. |
在卷组vg1上创建一个大小为6GB,名称为lv12的逻辑卷:
sudo lvcreate -L 6GB -n lv12 vg1
Logical volume "lv12" created. |
在卷组vg2上创建一个名称为lv21的逻辑卷,该逻辑卷的大小为卷组剩余空间的40%:
sudo lvcreate -l 40%VG -n lv21 vg2
Logical volume "lv21" created. |
注:参数l指定卷组中剩余可用空间的百分比作为逻辑卷的大小
5.2. 显示逻辑卷
显示所有的逻辑卷信息:
sudo lvdisplay
--- Logical volume --- |
sudo lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv11 vg1 -wi-ao---- 6.00g lv12 vg1 -wi-ao---- 6.00g lv21 vg2 -wi-a----- <9.20g |
显示单个逻辑卷的信息:
sudo lvdisplay /dev/lvg1/lv11
--- Logical volume --- LV Path /dev/vg1/lv11 LV Name lv11 VG Name vg1 LV UUID 5195Ei-gZA6-50iR-Dyv6-iUTY-8QlK-PCam7I LV Write Access read/write LV Creation host, time myvm1, 2024-05-09 21:35:36 +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 256 Block device 253:0 |
5.3. 创建文件系统并挂载
在逻辑卷/dev/vg1/lv11上创建ext4文件系统:
sudo mkfs -t ext4 /dev/vg1/lv11
创建含有 1310720 个块(每块 4k)和 327680 个inode的文件系统 正在分配组表: 完成 |
在逻辑卷/dev/vg1/lv12上创建ext4文件系统:
sudo mkfs -t ext4 /dev/vg1/lv12
创建含有 1572864 个块(每块 4k)和 393216 个inode的文件系统 正在分配组表: 完成 |
创建挂载点
sudo mkdir /mnt/lv11
sudo mkdir /mnt/lv12
挂载逻辑卷
sudo mount /dev/vg1/vg11 /mnt/lv11
sudo mount /dev/vg1/vg12 /mnt/lv12
查看磁盘挂载信息:
df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点 ... /dev/mapper/vg1-lv11 ext4 4.9G 24K 4.6G 1% /mnt/lv11 /dev/mapper/vg1-lv12 ext4 5.9G 24K 5.6G 1% /mnt/lv12 |
为了机器重启后自动挂载逻辑卷,打开文件:
sudo nano /etc/fstab
在文件中最后添加如下信息:
/dev/vg1/lv11 /mnt/lv11 ext4 defaults,nofail,discard 0 0 /dev/vg1/lv12 /mnt/lv12 ext4 defaults,nofail,discard 0 0 |
保存并关闭文件。
5.4. 扩展逻辑卷
逻辑卷的最大优点是,当空间不足时,可以随时对其进行扩展。
将逻辑卷lv11的空间扩展1GB:
sudo lvextend -L +1GB /dev/vg1/lv11
Size of logical volume vg1/lv11 changed from 5.00 GiB (1280 extents) to 6.00 GiB (1536 extents). Logical volume vg1/lv11 successfully resized. |
上述命令 实际上并没有增加文件系统的大小,而只是增加了逻辑卷的大小。为了使文件系统增长,我们需要使用以下命令调整文件系统的大小。
sudo resize2fs /dev/vg1/lv11
/dev/vg1/lv11 上的文件系统已被挂载于 /mnt/lv11;需要进行在线调整大小 old_desc_blocks = 1, new_desc_blocks = 1 /dev/vg1/lv11 上的文件系统现在为 1572864 个块(每块 4k)。 |
5.5. 缩减逻辑卷
可以使用lvreduce命令减小一个逻辑卷的大小,但在执行此操作之前需要非常小心,以确保不会丢失数据。在对逻辑卷进行任何缩减操作之前,强烈建议备份相关数据,以避免意外丢失。对于要缩小的逻辑卷,需要确保其文件系统支持缩小,对于 ext4 文件系统,首先可以使用resize2fs命令先缩小文件系统,然后使用lvreduce命令实际缩小逻辑卷的大小。
例如,逻辑卷/dev/vg1/lv11的大小为5GB,其文件系统的大小也为5GB,该逻辑卷挂载到目录/mnt/lv11上,如果想要将该逻辑卷缩减为4GB,步骤如下:
1) 卸载目录
sudo umount /mnt/lv11
2) 检查文件系统
sudo e2fsck -f /dev/vg1/lv11
e2fsck 1.45.5 (07-Jan-2020) 第 1 步:检查inode、块和大小 第 2 步:检查目录结构 第 3 步:检查目录连接性 第 4 步:检查引用计数 第 5 步:检查组概要信息 /dev/vg1/lv11:11/393216 文件(0.0% 为非连续的), 46190/1572864 块 |
3) 缩小文件系统
sudo resize2fs /dev/vg1/lv11 4G
将 /dev/vg1/lv11 上的文件系统调整为 1048576 个块(每块 4k)。 /dev/vg1/lv11 上的文件系统现在为 1048576 个块(每块 4k)。 |
4) 缩小逻辑卷
sudo lvreduce -L 4G /dev/vg1/lv11
WARNING: Reducing active logical volume to 4.00 GiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce vg1/lv11? [y/n]: y Size of logical volume vg1/lv11 changed from 6.00 GiB (1536 extents) to 4.00 GiB (1024 extents). Logical volume vg1/lv11 successfully resized. |
5.6. 删除逻辑卷
可以使用lvremove命令删除逻辑卷。在删除逻辑卷前,先卸载其挂载的目录,删除逻辑卷后,数据将无法恢复。
例如,逻辑卷/dev/vg1/lv12挂载到目录/mnt/lv12,删除该逻辑卷的步骤:
1) 卸载目录
sudo umount /mnt/lv12
2)删除逻辑卷
sudo lvremove /dev/vg1/lv12
Do you really want to remove and DISCARD active logical volume vg1/lv12? [y/n]: y Logical volume "lv12" successfully removed |