LVM(逻辑卷管理)常用操作详细说明※
LVM(Logical Volume Manager)是Linux系统中灵活管理磁盘分区的工具,通过“物理卷(PV)→卷组(VG)→逻辑卷(LV)”的层级结构,实现磁盘空间的动态调整、跨分区合并等功能。以下是LVM从基础配置到高级操作的完整常用命令及场景说明。
一、LVM基础组件概念※
在操作前需明确三个核心组件:
- 物理卷(PV,Physical Volume):底层存储设备,如磁盘分区(/dev/sdb1)、完整磁盘(/dev/sdc),需先初始化为PV才能纳入LVM管理。
- 卷组(VG,Volume Group):将多个PV合并为一个“存储池”,屏蔽底层硬件差异,LV从VG中分配空间。
- 逻辑卷(LV,Logical Volume):从VG中划分的“虚拟分区”,可直接格式化并挂载使用,支持动态扩容/缩容。
二、LVM初始化操作(从0到1创建LV)※
1. 准备物理设备(分区/磁盘)※
若使用新磁盘,需先创建分区(推荐类型为8e
,即LVM专用类型),或直接使用完整磁盘。
(1)磁盘分区(以/dev/sdb为例)※
# 1. 进入分区工具(fdisk/gdisk,MBR用fdisk,GPT用gdisk)
fdisk /dev/sdb
# 2. 交互操作:创建分区
# - 输入n:新建分区
# - 选择分区类型(主分区/扩展分区,通常选主分区)
# - 指定分区大小(如100G,或默认占满剩余空间)
# - 输入t:修改分区类型
# - 输入8e:将分区类型设为LVM
# - 输入w:保存分区表(会生效,注意数据风险)
# 3. 查看分区结果(确认/dev/sdb1已创建且类型为8e)
fdisk -l /dev/sdb
(2)检查磁盘是否支持LVM※
# 查看磁盘是否已初始化(无输出则未初始化)
pvdisplay /dev/sdb1
2. 创建物理卷(PV)※
将分区/磁盘初始化为LVM可识别的PV,会在设备上添加LVM元数据。
# 1. 初始化单个PV(/dev/sdb1)
pvcreate /dev/sdb1
# 或初始化整个磁盘
pvcreate /dev/sda
# 如果磁盘已有分区表会提示: Cannot use /dev/sda: device is partitioned
# 你可以只添加一个分区,或者选择擦除磁盘fs
# 擦除分区表指令:wipefs -a /dev/sda
# 2. 批量初始化多个PV(/dev/sdb1、/dev/sdc)
pvcreate /dev/sdb1 /dev/sdc
# 3. 强制初始化(若设备有旧数据,需先确认数据已备份,谨慎使用)
pvcreate -f /dev/sdb1
# 4. 查看PV信息(确认状态为“available”,无VG关联)
pvdisplay # 查看所有PV详情
pvs # 简洁查看PV列表(状态、大小、关联VG)
3. 创建卷组(VG)※
将多个PV合并为VG,后续LV从VG中分配空间。
# 1. 创建VG(名称为vg_data,关联PV /dev/sdb1、/dev/sdc)
vgcreate vg_data /dev/sdb1 /dev/sdc
# 2. 自定义PE大小(可选,默认4MB,PE是VG的最小分配单元,最大支持65534个PE)
# 例:PE设为8MB(适合大磁盘,减少元数据开销)
vgcreate -s 8M vg_data /dev/sdb1 /dev/sdc
# 3. 查看VG信息(确认PV已加入、剩余空间等)
vgdisplay vg_data # 查看指定VG详情
vgs # 简洁查看所有VG列表
4. 创建逻辑卷(LV)※
从VG中划分LV,LV可直接格式化并挂载使用。
# 1. 按大小创建LV(名称为lv_web,从vg_data中分配50G空间)
lvcreate -L 50G -n lv_web vg_data
# 2. 按比例创建LV(从vg_data中分配50%的剩余空间)
lvcreate -l 50%FREE -n lv_db vg_data
# 3. 分配所有剩余空间(-l 100%FREE)
lvcreate -l 100%FREE -n lv_backup vg_data
# 4. 查看LV信息(确认路径、大小、关联VG)
lvdisplay /dev/vg_data/lv_web # 查看指定LV详情
lvs # 简洁查看所有LV列表
5. 格式化与挂载LV※
LV创建后需格式化文件系统(如ext4、XFS),再挂载到目录使用。
# 1. 格式化LV(以ext4为例,XFS用mkfs.xfs等,与正常块设备操作无异)
mkfs.ext4 /dev/vg_data/lv_web # ext4格式
# mkfs.xfs /dev/vg_data/lv_web # XFS格式(注意:XFS不支持缩容)
# mkfs.btrfs /dev/somevg/somelv
# 2. 创建挂载点目录
mkdir -p /mnt/web
# 3. 临时挂载(重启后失效)
mount /dev/vg_data/lv_web /mnt/web
# 4. 永久挂载(写入/etc/fstab,重启生效)
# 先查看LV的UUID(避免设备名变化导致挂载失败)
blkid /dev/vg_data/lv_web
# 示例输出:/dev/mapper/vg_data-lv_web: UUID="xxxx-xxxx-xxxx-xxxx" TYPE="ext4"
# 编辑/etc/fstab,添加一行(UUID替换为实际值)
echo 'UUID=xxxx-xxxx-xxxx-xxxx /mnt/web ext4 defaults 0 0' >> /etc/fstab
# 5. 验证挂载(重新加载fstab并查看)
mount -a # 加载fstab配置,无报错则正常
df -h /mnt/web # 查看挂载后的空间使用
三、逻辑卷(LV)动态调整操作※
1. LV扩容(扩展空间,风险低)※
适用于LV空间不足的场景,需确保VG有剩余空间。XFS/ext4均支持在线扩容(无需卸载),但ext4需先检查文件系统。
步骤1:检查VG剩余空间※
vgs vg_data # 查看vg_data的剩余空间(Free列)
# 示例:VG Size 200.00g / Free 100.00g(有100G可扩容)
步骤2:扩展LV容量※
两种指定方式:-L
(绝对大小)、-l
(相对大小/比例)。
# 方式1:扩展到指定大小(将lv_web从50G扩展到80G)
lvextend -L 80G /dev/vg_data/lv_web
# 方式2:增加指定大小(给lv_web额外增加20G)
lvextend -L +20G /dev/vg_data/lv_web
# 方式3:使用VG的所有剩余空间(谨慎,会占满VG)
lvextend -l 100%FREE /dev/vg_data/lv_web
# 可选:扩展时自动检查文件系统(-r参数,推荐,避免后续手动调整)
lvextend -L +20G -r /dev/vg_data/lv_web
步骤3:调整文件系统大小(若未用-lvextend -r)※
LV扩容后,需同步扩展文件系统(否则系统仍识别原大小)。
# 1. ext4文件系统(支持在线调整)
resize2fs /dev/vg_data/lv_web # 自动扩展到LV的最大容量
# 2. XFS文件系统(仅支持在线扩容,需指定挂载点,而非LV路径)
xfs_growfs /mnt/web # 必须用挂载点,XFS会自动识别LV新大小
# 3. 验证扩容结果(查看新大小)
df -h /mnt/web
2. LV缩容(减少空间,风险高!)※
缩容前必须备份数据(操作失误可能导致文件系统损坏),且需注意:
- XFS文件系统不支持缩容(只能通过备份-删除-重建LV-恢复数据的方式);
- ext4/ext3支持缩容,但需先卸载LV(在线缩容风险极高,不推荐);
- 缩容后的LV大小不能小于当前文件系统已使用的空间(否则数据丢失)。
步骤1:检查文件系统使用情况(确认可缩容空间)※
df -h /mnt/web # 示例:已用30G,当前LV大小80G,最多可缩到30G以上
步骤2:卸载LV(必须操作,否则无法缩容)※
umount /mnt/web # 若提示“设备忙”,先关闭占用进程(fuser -m /mnt/web 查看进程,kill 进程号)
步骤3:检查文件系统一致性(关键,避免损坏)※
# ext4文件系统(e2fsck,-f强制检查,即使文件系统显示正常)
e2fsck -f /dev/vg_data/lv_web
# 若检查报错,需先修复(按提示操作,或咨询管理员,不可强制跳过)
步骤4:缩容文件系统(先缩文件系统,再缩LV!顺序不能反)※
# ext4:将文件系统缩到40G(需大于已用空间,如示例已用30G,设为40G)
resize2fs /dev/vg_data/lv_web 40G
步骤5:缩容LV(按文件系统的新大小调整LV)※
# 方式1:缩到指定大小(与文件系统大小一致,40G)
lvreduce -L 40G /dev/vg_data/lv_web
# 方式2:减少指定大小(从80G减少40G,结果也是40G)
lvreduce -L -40G /dev/vg_data/lv_web
# 执行时会提示确认,输入y继续(确保已备份数据)
步骤6:重新挂载LV并验证※
mount /mnt/web # 重新挂载
df -h /mnt/web # 确认大小已缩为40G
四、卷组(VG)调整操作※
1. 给VG添加新PV(扩展VG容量)※
当VG剩余空间不足时,可添加新的PV(分区/磁盘)到VG。
# 1. 先初始化新PV(如/dev/sdd1)
pvcreate /dev/sdd1
# 2. 将PV添加到现有VG(vg_data)
vgextend vg_data /dev/sdd1
# 3. 验证VG容量(查看Free列是否增加)
vgs vg_data
2. 从VG移除PV(需确保PV无数据)※
仅当PV上无LV占用空间时,才能从VG中移除(否则需先迁移数据)。
# 1. 检查PV上是否有LV使用(查看PV的“Allocatable”状态,及关联的LV)
pvdisplay /dev/sdb1
# 2. 若有数据,先迁移PV上的LV数据到其他PV(pvmove命令,安全迁移)
pvmove /dev/sdb1 # 自动将/dev/sdb1的数据迁移到VG内其他PV
# 3. 从VG中移除PV
vgreduce vg_data /dev/sdb1
# 4. (可选)删除PV(若不再使用该设备)
pvremove /dev/sdb1
# 5. 验证VG(确认PV已移除)
vgs vg_data
3. 重命名VG※
# 重命名vg_old为vg_new(需确保VG未被占用,建议先卸载相关LV)
vgrename vg_old vg_new
# 验证(注意:LV路径会变为/dev/vg_new/xxx,需同步更新/etc/fstab中的挂载配置)
vgs
五、物理卷(PV)维护操作※
1. 查看PV详情※
pvdisplay /dev/sdb1 # 查看指定PV的元数据、关联VG、已用/剩余空间
pvs # 简洁列表:PV名称、VG名称、大小、已用、状态
2. 修复损坏的PV※
若PV因磁盘错误导致元数据损坏,可尝试修复(需先卸载LV,备份数据):
# 1. 先从VG中移除损坏的PV(若能识别)
vgreduce --removemissing vg_data # 移除VG中无法访问的PV
# 2. 修复PV元数据(谨慎,需参考官方文档,避免数据丢失)
pvcreate --uuid <原PV的UUID> --restorefile /etc/lvm/backup/vg_data /dev/sdb1
# 说明:/etc/lvm/backup/vg_data 是VG的备份文件,包含PV的原始UUID
3. 查看PV的物理磁盘健康状态※
# 检查磁盘坏道(以/dev/sdb为例,需卸载设备)
badblocks -v /dev/sdb # 只读检查,无输出则无坏道
# badblocks -w -v /dev/sdb # 读写检查(会破坏数据,仅用于空磁盘)
六、LVM快照操作(备份/测试)※
LVM快照是LV的“只读/可写副本”,适用于临时备份(如升级前快照,失败可恢复),快照大小仅需等于LV的预期变更量(无需全量空间)。
1. 创建快照※
# 创建快照(名称为lv_web_snap,从lv_web生成,大小10G,用于临时备份)
lvcreate -L 10G -s -n lv_web_snap /dev/vg_data/lv_web
# -s:表示创建快照;10G为快照的“变更缓存空间”,若LV变更超过10G,快照会失效
# 查看快照状态(确认“Snapshot origin”为lv_web)
lvs
2. 使用快照(挂载查看/恢复数据)※
# 1. 挂载快照(只读挂载,避免修改快照数据)
mkdir -p /mnt/snap
mount -o ro /dev/vg_data/lv_web_snap /mnt/snap
# 可在/mnt/snap中查看快照创建时的LV数据,用于备份或对比
# 2. 从快照恢复数据(需先卸载原LV和快照)
umount /mnt/web /mnt/snap
lvconvert --merge /dev/vg_data/lv_web_snap # 将快照合并到原LV(恢复数据)
# 合并后快照会自动删除,重新挂载原LV即可看到恢复后的数据
3. 删除快照※
# 先卸载快照(若已挂载)
umount /mnt/snap
# 删除快照
lvremove /dev/vg_data/lv_web_snap
七、LVM删除操作(清理无用组件)※
1. 删除LV(需先卸载)※
# 1. 卸载LV
umount /mnt/web
# 2. 从/etc/fstab中删除挂载配置(避免重启报错)
sed -i '/\/mnt\/web/d' /etc/fstab
# 3. 删除LV
lvremove /dev/vg_data/lv_web
# 4. 验证(LV已消失)
lvs
2. 删除VG(需先删除所有LV)※
# 1. 确保VG内无LV(先删除所有LV,参考上述步骤)
lvs vg_data # 无输出则无LV
# 2. 删除VG
vgremove vg_data
# 3. 验证
vgs
3. 删除PV(需先从VG中移除)※
# 1. 确保PV未关联任何VG(pvdisplay查看VG列为空)
pvdisplay /dev/sdb1
# 2. 删除PV(清除LVM元数据,恢复为普通设备)
pvremove /dev/sdb1
# 3. (可选)若需重新分区,可使用fdisk删除原分区并重建
fdisk /dev/sdb
八、关键注意事项※
- 数据备份:缩容、删除、修复操作前必须备份数据,LVM操作失误可能导致文件系统损坏。
- 文件系统兼容性:
- XFS:支持在线扩容,不支持缩容,快照需额外配置;
- ext4/ext3:支持扩容/缩容(缩容需卸载),快照功能完善。
- VG/LV命名规范:名称避免特殊字符,建议按用途命名(如vg_data、lv_db),便于管理。
- 监控LVM状态:定期用
vgs
/lvs
/pvs
检查空间使用,避免VG空间耗尽。 - 系统启动配置:若LV用于根分区(/)或引导分区(/boot),需确保initramfs包含LVM驱动(可通过
dracut -f
重建initramfs),避免启动失败。