LVM 介绍
LVM( Logical Volume Manager )是一个 device mapper 框架,用来提供逻辑卷管理能力。逻辑卷存在于块设备和具体文件系统之间,可以让上层应用忽略块设备的物理布局,达到更方便更灵活使用设备的目的。
物理卷管理
创建物理卷
使用
pvcreate 命令将块设备初始化为 LVM 物理卷。以下以 /dev/vdb 为例:警告:
pvcreate 会在目标设备上写入 LVM 标签和元数据。若设备中已存在文件系统或其他签名,继续操作可能破坏原有数据。请您在执行前确认目标设备正确,并已备份需要保留的数据。pvcreate /dev/vdb
输出示例:
Physical volume "/dev/vdb" successfully created.
若目标设备中已存在文件系统签名,命令会提示您确认是否清除该签名,输出示例如下:
WARNING: ext4 signature detected on /dev/vdb at offset 1080. Wipe it? [y/n]:
创建时默认会以设备目前可用最大大小创建。
查看物理卷
pvdisplay 命令用于显示物理卷(Physical Volume)的属性信息,包括物理卷的名称、UUID、大小、状态、分配情况等等。pvdisplay /dev/vdb
输出示例:
--- Physical volume ---PV Name /dev/vdbVG Name testPV Size 200.00 GiB / not usable 4.00 MiBAllocatable yesPE Size 4.00 MiBTotal PE 51199Free PE 51199Allocated PE 0PV UUID gQB42U-IKt2-517n-RB3q-p9ob-bAz7-Ggvjtd
直接执行
pvdisplay 命令(不带任何参数),可列出系统中所有物理卷的信息。也可以指定一个或多个物理卷名称作为参数,仅显示指定物理卷的信息。pvdisplay 命令的输出结果包括以下信息:PV Name:物理卷的名称
UUID:物理卷的 UUID
Total PE / Free PE:物理卷的大小
Allocatable / Exported / Missing:物理卷的状态
物理卷的属性(例如,是否加密、是否只读等等)
VG Name:物理卷所属的卷组
LV Name:物理卷上的逻辑卷
pvs 用于查看物理卷的状态:pvs
输出示例:
PV VG Fmt Attr PSize PFree/dev/vdb test lvm2 a-- <200.00g <200.00g
修改物理卷属性
pvchange 命令是 Linux 系统中 LVM(逻辑卷管理)的一个命令,用于更改物理卷的属性。以下是 pvchange 命令的使用方法:pvchange [options] [PhysicalVolumePath...]
其中,
PhysicalVolumePath 是需要更改属性的物理卷路径,可以指定多个物理卷路径,用空格分隔。以下是一些常用的选项:-a, --all:更改所有物理卷的属性。-x, --allocatable y/n: 设置物理卷是否可分配。y 表示可分配,n 表示不可分配。-t, --test: 测试模式,不会实际更改物理卷的属性,而是显示将要执行的操作。注意:
在使用
pvchange 命令时,请注意备份重要数据,并谨慎操作,以免造成数据丢失或其他不必要的损失。以下示例将分别修改单个物理卷、全部物理卷以及使用测试模式验证配置:
1. 将物理卷
/dev/sdb1 设置为不可分配(需要先将其分配给逻辑卷组,下同):pvchange -x n /dev/sdb1
2. 将所有物理卷设置为可分配:
pvchange -x y -a
3. 测试将物理卷
/dev/sdb1 设置为不可分配的操作:pvchange -x n -t /dev/sdb1
删除物理卷
删除物理卷会清除该物理卷上的 LVM 元数据。删除前请确认该物理卷已不属于任何卷组,并已备份需要保留的数据:
警告:
若物理卷仍属于某个卷组,请先使用 vgreduce 将其从卷组中移除,否则 pvremove 会执行失败;强行删除属于卷组的物理卷可能导致该卷组中的数据丢失。
pvremove /dev/vdb
输出示例:
Labels on physical volume "/dev/vdb" successfully wiped.
逻辑卷组管理
创建卷组
vgcreate 命令用于创建卷组(Volume Group,VG),并将一个或多个物理卷(Physical Volume,PV)加入该卷组。执行前,请您确认目标物理卷已通过 pvcreate 初始化,且未被其他卷组使用。以下示例创建名为
myvg 的卷组,并加入物理卷 /dev/sdb1:vgcreate myvg /dev/sdb1
输出示例:
Volume group "myvg" successfully created
如需在创建卷组时加入多个物理卷,请在命令末尾依次指定设备路径:
vgcreate myvg /dev/sdb1 /dev/sdc1 /dev/sdd1
常用选项如下:
-s, --physicalextentsize:指定物理区段(PE)的大小。-l, --maxlogicalvolumes:指定卷组中允许创建的最大逻辑卷数量。-p, --maxphysicalvolumes:指定卷组允许包含的最大物理卷数量。-A, --autobackup y|n:指定变更后是否自动备份卷组元数据,建议保持为 y。以下示例创建 PE 大小为 16MiB 的卷组
myvg:vgcreate -s 16M myvg /dev/sdb1
创建完成后,请执行
vgdisplay myvg 或 vgs myvg 验证卷组状态。PE 大小在卷组创建后难以调整,请您在创建前根据业务需要合理规划。查看卷组
vgdisplay 命令用于查看卷组的 UUID、大小、状态、物理卷数量、逻辑卷数量和空闲 PE 等详细信息。以下示例查看卷组 myvg:vgdisplay myvg
输出示例(节选):
--- Volume group ---VG Name myvgVG Status resizableCur LV 0Cur PV 1VG Size <200.00 GiBPE Size 4.00 MiBTotal PE 51199Alloc PE / Size 0 / 0Free PE / Size 51199 / <200.00 GiB
如需以表格形式查看所有卷组,可执行:
vgs
输出示例:
VG #PV #LV #SN Attr VSize VFreemyvg 1 0 0 wz--n- <200.00g <200.00g
您可以根据输出中的
VG Status、Cur PV、Cur LV、VG Size 和 VFree 等字段判断卷组是否可用以及剩余空间是否充足。修改卷组属性
vgchange 命令用于修改卷组及其逻辑卷的激活状态、卷组是否允许增删物理卷等属性。常用选项如下:-a, --activate y|n|ay:激活或停用卷组中的逻辑卷。y 表示激活,n 表示停用,ay 表示自动激活。-x, --resizeable y|n:允许或禁止通过 vgextend、vgreduce 增加或移除物理卷。-u, --uuid:为卷组生成新的随机 UUID。修改 UUID 前必须确保卷组处于非激活状态。警告:
停用卷组会使其中的逻辑卷无法访问,可能导致正在使用这些逻辑卷的业务中断。执行前请您先卸载相关文件系统,并确认没有进程正在使用对应逻辑卷。
1. 停用卷组
myvg 中的逻辑卷(执行成功时无输出):vgchange -a n myvg
2. 重新激活卷组
myvg 中的逻辑卷:vgchange -a y myvg
输出示例:
1 logical volume(s) in volume group "myvg" now active
修改完成后,可执行
lvs -o lv_name,vg_name,lv_attr 验证逻辑卷的激活状态。伸缩卷组
扩展
vgextend 命令用于将一个或多个物理卷添加到已有卷组中,从而增加卷组可分配给逻辑卷的空间。执行前,请您确认待添加设备未被其他卷组使用。以下示例将物理卷
/dev/sdc1 添加到卷组 myvg:vgextend myvg /dev/sdc1
输出示例:
Volume group "myvg" successfully extended
如需一次添加多个物理卷,请在命令末尾依次指定设备路径:
vgextend myvg /dev/sdc1 /dev/sdd1
常用选项如下:
-A, --autobackup y|n:指定变更后是否自动备份卷组元数据,建议保持为 y。-t, --test:测试操作,不写入卷组元数据。-v, --verbose:显示详细执行信息。卷组的 PE 大小由
vgcreate -s 在创建时确定,不能通过 vgextend 修改。扩展完成后,请执行以下命令验证卷组空间:vgs myvg
请确认输出中的物理卷数量和空闲空间符合预期。
缩减
vgreduce 命令用于从卷组中移除一个或多个未被使用的物理卷。若待移除物理卷仍包含已分配的 PE,请先使用 pvmove 将数据迁移到同一卷组中的其他物理卷。警告:
移除仍承载数据的物理卷会导致逻辑卷不完整和数据丢失。执行前请您使用
pvs -o pv_name,pv_used 确认目标物理卷的 PUsed 为 0,并备份重要数据。命令语法如下:
vgreduce [options] <VG> <PV> [<PV>...]
其中,
<VG> 表示卷组名称,<PV> 表示需要移除的物理卷路径。常用选项如下:-a, --all:移除卷组中所有空闲、未承载数据的物理卷。-f, --force:强制执行操作,可能导致数据丢失,不建议在常规场景使用。-t, --test:测试操作,不写入卷组元数据。示例命令如下:
1. 从卷组
vg01 中移除物理卷 /dev/sdb1:vgreduce vg01 /dev/sdb1
2. 移除卷组
vg01 中所有空闲物理卷:vgreduce -a vg01
3. 使用测试模式检查从卷组
vg01 移除 /dev/sdb1 的操作:vgreduce -t vg01 /dev/sdb1
实际移除完成后,请执行
pvs 或 vgs -o vg_name,pv_count 验证卷组中的物理卷数量。删除卷组
vgremove 命令用于删除卷组以及卷组中的逻辑卷。删除后,卷组中的物理卷仍保留 LVM 物理卷标签,可重新用于其他卷组。警告:
删除卷组会删除其中的全部逻辑卷及其数据,且不可恢复。执行前请您卸载卷组内逻辑卷对应的文件系统,确认相关数据已备份,并优先使用测试模式验证。
命令语法如下:
vgremove [options] <VG>
其中,
<VG> 表示需要删除的卷组名称。常用选项如下:-f, --force:强制执行操作并绕过部分确认,不建议在常规场景使用。-t, --test:测试操作,不写入卷组元数据。示例命令如下:
1. 使用测试模式检查删除卷组
vg01 的操作:vgremove -t vg01
2. 确认无误后,删除卷组
vg01:vgremove vg01
输出示例:
Volume group "vg01" successfully removed
删除完成后,请执行
vgs 确认卷组列表中已无 vg01。逻辑卷管理
创建逻辑卷
lvcreate 命令用于从卷组的空闲空间中创建逻辑卷。该命令只创建块设备,不负责创建 ext4、xfs 等文件系统。命令语法如下:
lvcreate -L <size> -n <LV> <VG>
其中,
<size> 表示逻辑卷大小,<LV> 表示逻辑卷名称,<VG> 表示卷组名称。常用选项如下:-L, --size:指定逻辑卷的大小,可使用 K、M、G、T 等单位。-l, --extents:按 PE 数量或卷组空间百分比指定逻辑卷大小。-n, --name:指定逻辑卷名称。-r, --readahead:指定逻辑卷的预读扇区数,也可设置为 auto 或 none。警告:
在逻辑卷上执行
mkfs 会清除该逻辑卷中的现有数据。请您仅对新建或确认无需保留数据的逻辑卷执行格式化操作。示例命令如下:
1. 在卷组
vg01 中创建大小为 10GiB 的逻辑卷 lv01:lvcreate -L 10G -n lv01 vg01
输出示例:
Logical volume "lv01" created.
2. 创建大小为 100MiB 的逻辑卷
lv02,然后创建 ext4 文件系统:lvcreate -L 100M -n lv02 vg01mkfs.ext4 /dev/vg01/lv02
3. 创建大小为 1TiB、预读扇区数为 256 的逻辑卷
lv03:lvcreate -L 1T -n lv03 -r 256 vg01
创建完成后,请执行
lvs -o lv_name,vg_name,lv_size,lv_attr 验证逻辑卷状态。查看逻辑卷
lvdisplay 命令用于查看逻辑卷的名称、路径、大小、状态和卷组等详细信息。示例命令如下:
1. 查看逻辑卷
lv01 的详细信息:lvdisplay /dev/vg01/lv01
输出示例(节选):
--- Logical volume ---LV Path /dev/vg01/lv01LV Name lv01VG Name vg01LV Status availableLV Size 10.00 GiB
2. 查看系统中的全部逻辑卷:
lvdisplay
3. 以冒号分隔格式查看逻辑卷
lv01:lvdisplay -c /dev/vg01/lv01
如需以表格形式查看逻辑卷,建议使用
lvs 命令。扩展逻辑卷
lvextend 命令用于从卷组的空闲空间中为逻辑卷增加容量。常用选项如下:-L, --size:指定扩展后的绝对大小;使用 + 前缀时,表示在当前大小基础上增加容量。-l, --extents:按 PE 数量或卷组空间百分比扩展逻辑卷。-r, --resizefs:扩展逻辑卷后,同时调整受支持的文件系统大小。注意:
扩展前请您确认卷组剩余空间充足,并备份重要数据。若未使用
-r,扩展逻辑卷后还需根据文件系统类型单独扩展文件系统。示例命令如下:
1. 将逻辑卷
lv01 的容量扩展到 20GiB:lvextend -L 20G /dev/vg01/lv01
2. 将逻辑卷
lv02 扩展到 200MiB,并同步调整文件系统大小:lvextend -L 200M -r /dev/vg01/lv02
扩展完成后,请执行
lvs /dev/vg01/lv01 /dev/vg01/lv02 验证逻辑卷容量。若未使用 -r,ext4 文件系统可使用 resize2fs 扩展,已挂载的 xfs 文件系统应使用 xfs_growfs <挂载点> 扩展。调整逻辑卷大小
lvresize 命令既可扩展逻辑卷,也可缩小逻辑卷。常用选项如下:-L, --size:指定调整后的绝对大小;使用 + 或 - 前缀时,表示增加或减少指定容量。-l, --extents:按 PE 数量或卷组空间百分比调整逻辑卷大小。-r, --resizefs:同时调整受支持的文件系统大小。警告:
缩小逻辑卷可能截断文件系统数据并造成不可恢复的数据丢失。执行前请您完成数据备份,确认文件系统支持缩小,并确保文件系统已先安全缩小到不大于目标逻辑卷容量。xfs 文件系统不支持原地缩小。
示例命令如下:
1. 将逻辑卷
lv01 扩展到 20GiB,并同步扩展文件系统:lvresize -L 20G -r /dev/vg01/lv01
2. 以下命令仅适用于已确认可安全缩小的文件系统,将逻辑卷
lv02 缩小到 100MiB,并同步调整文件系统:lvresize -L 100M -r /dev/vg01/lv02
调整完成后,请执行
lvs 和对应文件系统的检查命令验证逻辑卷与文件系统状态。删除逻辑卷
lvremove 命令用于删除逻辑卷。删除后,逻辑卷中的文件系统和数据也将一并丢失。警告:
删除逻辑卷会永久删除其中的数据,且不可恢复。执行前请您备份重要数据,并先卸载该逻辑卷上的文件系统。
-f 和 -y 会绕过部分确认,请勿在未核对目标逻辑卷时使用。命令语法如下:
lvremove [options] <LV>
常用选项如下:
-f, --force:强制执行操作并绕过部分检查。-y, --yes:对确认提示自动回答“是”。示例命令如下:
1. 卸载逻辑卷
lv01 上的文件系统,然后删除该逻辑卷:umount /dev/vg01/lv01lvremove /dev/vg01/lv01
输出示例:
Logical volume "lv01" successfully removed.
2. 在已确认目标无误的情况下,强制删除逻辑卷
lv02:lvremove -f /dev/vg01/lv02
删除完成后,请执行
lvs 确认逻辑卷列表中已无目标逻辑卷。文件系统管理
逻辑卷创建完成后,可将其作为普通块设备创建文件系统并挂载使用。以下以逻辑卷
/dev/vg01/lv01 和 ext4 文件系统为例。警告:
创建文件系统会清除目标逻辑卷中的全部现有数据,且不可恢复。请您在执行前确认目标逻辑卷正确,并已备份需要保留的数据。
1. 确认逻辑卷存在且状态正常:
lvs /dev/vg01/lv01
输出示例:
LV VG Attr LSizelv01 vg01 -wi-a----- 10.00g
2. 在逻辑卷上创建 ext4 文件系统:
mkfs.ext4 /dev/vg01/lv01
输出示例(节选):
Creating filesystem with 2621440 4k blocks and 655360 inodesAllocating group tables: doneWriting inode tables: doneCreating journal: doneWriting superblocks and filesystem accounting information: done
3. 创建挂载点(执行成功时无输出):
mkdir -p /mnt/myfs
4. 将逻辑卷临时挂载到
/mnt/myfs(执行成功时无输出):mount /dev/vg01/lv01 /mnt/myfs
5. 验证文件系统已成功挂载:
findmnt /mnt/myfs
输出示例:
TARGET SOURCE FSTYPE OPTIONS/mnt/myfs /dev/mapper/vg01-lv01 ext4 rw,relatime
上述
mount 命令创建的是临时挂载,系统重启后失效。如需永久挂载,请先执行 blkid /dev/vg01/lv01 获取文件系统 UUID,再将以下配置添加到 /etc/fstab,并将示例 UUID 替换为实际值:UUID=<实际UUID> /mnt/myfs ext4 defaults 0 2
保存后,执行以下命令验证
/etc/fstab 配置。执行成功时无输出:mount -a
如需卸载文件系统,请先确认没有进程正在使用挂载点,再执行:
umount /mnt/myfs
卸载完成后,可执行
findmnt /mnt/myfs 验证;无输出表示该挂载点已卸载。