Linux lvm命令

LVM(Logical Volume Manager) 是Linux系统中一个强大的逻辑卷管理器,它允许将多个物理磁盘分区组合成卷组,然后从卷组中创建逻辑卷,实现对存储空间的灵活管理和动态调整。

LVM简介

LVM(逻辑卷管理器)是Linux内核的一部分,它提供了一个抽象层,允许将物理存储设备(如硬盘、SSD、RAID阵列等)组合成逻辑存储池,然后从这个池中动态地分配逻辑卷。

主要优点
  • 灵活性:动态调整逻辑卷大小
  • 在线扩展:无需停机即可调整存储
  • 快照功能:创建逻辑卷的时间点副本
  • 数据迁移:在线迁移数据到新磁盘
  • 条带化:提高I/O性能
  • 镜像:提供数据冗余
注意事项
  • 需要理解LVM概念和架构
  • 错误的操作可能导致数据丢失
  • 某些操作需要卸载文件系统
  • 需要预留足够的元数据空间
  • 性能可能略低于直接使用物理分区
  • 恢复数据可能更复杂

LVM基本概念

LVM层次结构
物理卷 (PV)

/dev/sda1, /dev/sdb, etc.

卷组 (VG)

vg_data, vg_system, etc.

逻辑卷 (LV)

lv_home, lv_root, etc.

组件 说明 示例
物理卷 (PV) 物理磁盘或分区,被LVM识别和管理的基础存储单元 /dev/sda1, /dev/sdb
卷组 (VG) 一个或多个物理卷的集合,形成存储池 vg_system, vg_data
逻辑卷 (LV) 从卷组中分配的存储空间,可以格式化和挂载使用 lv_root, lv_home
物理扩展 (PE) 物理卷被划分的基本单元,默认为4MB PE大小:4MB, 8MB, 16MB, 32MB, 64MB
逻辑扩展 (LE) 逻辑卷被划分的基本单元,与PE大小相同 LE大小与PE大小相同
LVM设备路径:
  • 物理卷:/dev/sda1/dev/sdb
  • 卷组:/dev/vg_system
  • 逻辑卷:/dev/vg_system/lv_root/dev/mapper/vg_system-lv_root

安装方法

LVM工具通常包含在 lvm2 包中:

Ubuntu/Debian
sudo apt update
sudo apt install lvm2
CentOS/RHEL
sudo yum install lvm2
检查是否已安装: 运行 which lvmlvm version 2>/dev/null || echo "未安装"

语法格式

LVM命令有两种使用方式:

1. 直接使用子命令:
命令 子命令 [选项] [参数]

例如:pvcreate /dev/sdb1, vgcreate vg_data /dev/sdb1

2. 进入LVM交互式shell:
lvm
lvm> help
lvm> pvdisplay
lvm> exit

常用命令

命令类别 命令 说明
物理卷 (PV) pvcreate 初始化物理卷
pvdisplay 显示物理卷详细信息
pvs 显示物理卷摘要信息
pvremove 删除物理卷
卷组 (VG) vgcreate 创建卷组
vgdisplay 显示卷组详细信息
vgs 显示卷组摘要信息
vgextend 扩展卷组(添加物理卷)
vgreduce 缩减卷组(移除物理卷)
逻辑卷 (LV) lvcreate 创建逻辑卷
lvdisplay 显示逻辑卷详细信息
lvs 显示逻辑卷摘要信息
lvextend 扩展逻辑卷大小
lvreduce 缩减逻辑卷大小
lvremove 删除逻辑卷
lvrename 重命名逻辑卷
lvresize 调整逻辑卷大小(扩展或缩减)
快照 lvcreate -s 创建逻辑卷快照
lvconvert 合并快照
lvs 查看快照信息
其他 lvmdiskscan 扫描所有磁盘和分区
lvchange 更改逻辑卷属性
lvscan 扫描所有逻辑卷

使用示例

以下示例需要谨慎操作,建议在测试环境中练习。操作前请备份重要数据。
示例1:创建LVM(完整流程)

从物理磁盘创建LVM的完整流程:

# 1. 准备物理磁盘分区(假设使用/dev/sdb1)
sudo fdisk /dev/sdb  # 创建分区并设置类型为8e(Linux LVM)

# 2. 创建物理卷
sudo pvcreate /dev/sdb1

# 3. 创建卷组(名为vg_data)
sudo vgcreate vg_data /dev/sdb1

# 4. 创建逻辑卷(从卷组分配10G空间,名为lv_data)
sudo lvcreate -L 10G -n lv_data vg_data

# 5. 格式化逻辑卷(使用ext4文件系统)
sudo mkfs.ext4 /dev/vg_data/lv_data

# 6. 挂载使用
sudo mkdir /mnt/data
sudo mount /dev/vg_data/lv_data /mnt/data

# 7. 添加到fstab实现开机自动挂载
echo "/dev/vg_data/lv_data /mnt/data ext4 defaults 0 0" | sudo tee -a /etc/fstab
示例2:查看LVM信息

查看各种LVM组件的信息:

查看所有物理卷:

sudo pvs
sudo pvdisplay

查看所有卷组:

sudo vgs
sudo vgdisplay

查看所有逻辑卷:

sudo lvs
sudo lvdisplay

查看详细LVM信息:

# 查看所有LVM组件的详细信息
sudo lvm fullreport

# 查看特定卷组的详细信息
sudo vgdisplay vg_data
示例3:扩展逻辑卷

当逻辑卷空间不足时,可以动态扩展:

# 1. 首先扩展逻辑卷(增加5G空间)
sudo lvextend -L +5G /dev/vg_data/lv_data

# 2. 然后扩展文件系统(对于ext2/ext3/ext4)
sudo resize2fs /dev/vg_data/lv_data

# 对于xfs文件系统,使用xfs_growfs
# sudo xfs_growfs /mnt/data

# 3. 验证扩展结果
df -h /mnt/data

如果需要从卷组中扩展逻辑卷,但卷组空间不足,需要先扩展卷组:

# 1. 添加新的物理卷到卷组
sudo vgextend vg_data /dev/sdc1

# 2. 然后再扩展逻辑卷
sudo lvextend -L +10G /dev/vg_data/lv_data
sudo resize2fs /dev/vg_data/lv_data
示例4:创建快照

创建逻辑卷快照用于备份或测试:

# 1. 创建快照(需要卷组有足够的空间)
sudo lvcreate -s -n lv_data_snap -L 2G /dev/vg_data/lv_data

# 2. 挂载快照(以只读方式)
sudo mkdir /mnt/snapshot
sudo mount -o ro /dev/vg_data/lv_data_snap /mnt/snapshot

# 3. 查看快照信息
sudo lvs --all

# 4. 使用后卸载并删除快照
sudo umount /mnt/snapshot
sudo lvremove /dev/vg_data/lv_data_snap

快照使用注意事项:

  • 快照卷大小应足够容纳原始卷的变化数据
  • 快照会降低原始卷的性能
  • 快照不是备份的替代品
  • 及时删除不再需要的快照
示例5:移除和迁移

迁移数据并移除物理卷:

# 1. 检查卷组中的物理卷使用情况
sudo pvs -o+pv_used

# 2. 如果物理卷上有数据,需要迁移到其他物理卷
sudo pvmove /dev/sdb1

# 3. 从卷组中移除物理卷
sudo vgreduce vg_data /dev/sdb1

# 4. 删除物理卷(可选)
sudo pvremove /dev/sdb1

# 5. 如果整个卷组不再需要
sudo vgremove vg_data

安全移除整个LVM:

# 1. 卸载所有逻辑卷
sudo umount /mnt/data

# 2. 删除逻辑卷
sudo lvremove /dev/vg_data/lv_data

# 3. 删除卷组
sudo vgremove vg_data

# 4. 删除物理卷
sudo pvremove /dev/sdb1

高级功能

条带化(提高性能)

创建条带化的逻辑卷以提高I/O性能:

# 创建条带化逻辑卷(使用2个条带,条带大小256KB)
sudo lvcreate -L 20G -i 2 -I 256 -n lv_striped vg_data
参数 说明
-i--stripes 条带数量(需要相应数量的物理卷)
-I--stripesize 条带大小(KB),默认为64KB
镜像(数据冗余)

创建镜像逻辑卷以提供数据冗余:

# 创建镜像逻辑卷(需要至少2个物理卷)
sudo lvcreate -L 10G -m 1 -n lv_mirrored vg_data /dev/sdb1 /dev/sdc1

检查镜像状态:

sudo lvs -a -o +devices

如果镜像中的一个物理卷失效:

# 标记物理卷为丢失
sudo lvconvert --repair vg_data/lv_mirrored

# 或者手动修复
sudo vgreduce --removemissing vg_data
精简配置(Thin Provisioning)

创建精简配置的逻辑卷,允许过量分配存储空间:

# 1. 创建精简池
sudo lvcreate -L 100G -T vg_data/thin_pool

# 2. 从精简池创建逻辑卷
sudo lvcreate -V 50G -T vg_data/thin_pool -n lv_thin1

# 3. 可以创建超过池实际大小的逻辑卷
sudo lvcreate -V 200G -T vg_data/thin_pool -n lv_thin2

查看精简池使用情况:

sudo lvs -o lv_name,data_percent,metadata_percent,thin_count

实用技巧

安全操作
  • 操作前备份重要数据
  • 使用--test选项测试命令
  • 记录所有LVM配置变更
  • 定期备份LVM元数据
  • 在生产环境中操作前先在测试环境验证
性能优化
  • 根据需求调整PE大小
  • 使用条带化提高I/O性能
  • 合理规划物理卷布局
  • 监控LVM使用情况
  • 定期整理碎片
脚本示例:LVM监控脚本
#!/bin/bash
# LVM监控脚本

echo "LVM系统监控报告"
echo "================"
echo "生成时间: $(date)"
echo ""

# 检查LVM2服务状态
if systemctl is-active lvm2-lvmetad >/dev/null 2>&1; then
    echo "✅ LVM服务运行正常"
else
    echo "❌ LVM服务未运行"
fi

echo ""

# 物理卷信息
echo "物理卷统计:"
echo "------------"
sudo pvs --units g --nosuffix | tail -n +2 | while read line; do
    pv_name=$(echo "$line" | awk '{print $1}')
    pv_size=$(echo "$line" | awk '{print $5}')
    pv_free=$(echo "$line" | awk '{print $6}')
    echo "  $pv_name: 大小=${pv_size}G, 空闲=${pv_free}G"
done

echo ""

# 卷组信息
echo "卷组统计:"
echo "------------"
sudo vgs --units g --nosuffix | tail -n +2 | while read line; do
    vg_name=$(echo "$line" | awk '{print $1}')
    vg_size=$(echo "$line" | awk '{print $6}')
    vg_free=$(echo "$line" | awk '{print $7}')
    echo "  $vg_name: 大小=${vg_size}G, 空闲=${vg_free}G"
done

echo ""

# 逻辑卷信息
echo "逻辑卷统计:"
echo "------------"
sudo lvs --units g --nosuffix | tail -n +2 | while read line; do
    lv_name=$(echo "$line" | awk '{print $1}')
    vg_name=$(echo "$line" | awk '{print $2}')
    lv_size=$(echo "$line" | awk '{print $4}')
    echo "  $vg_name/$lv_name: 大小=${lv_size}G"
done

echo ""
echo "监控完成"
常见问题处理

LVM无法识别新磁盘:

  1. 运行sudo pvscan扫描物理卷
  2. 运行sudo vgscan扫描卷组
  3. 运行sudo lvscan扫描逻辑卷
  4. 运行sudo lvmdiskscan扫描所有磁盘

恢复丢失的卷组:

  1. 使用sudo vgscan扫描卷组
  2. 使用sudo vgchange -a y vg_name激活卷组
  3. 备份LVM元数据:sudo vgcfgbackup vg_name
  4. 如果元数据损坏,尝试恢复:sudo vgcfgrestore vg_name
磁盘管理命令
  • fdisk - 磁盘分区工具
  • parted - 高级分区工具
  • lsblk - 列出块设备
  • blkid - 显示块设备属性
  • mkfs - 创建文件系统
文件系统工具
  • resize2fs - 调整ext2/ext3/ext4文件系统大小
  • xfs_growfs - 扩展XFS文件系统
  • fsck - 检查修复文件系统
  • mount - 挂载文件系统
  • umount - 卸载文件系统
学习资源
  • LVM2官方文档 - Red Hat LVM管理指南
  • Linux内核文档 - LVM内核部分
  • lvm2源码 - 学习LVM实现原理
  • Linux逻辑卷管理 - 各种Linux发行版的LVM指南
重要注意事项
  • LVM操作可能导致数据丢失,操作前务必备份重要数据
  • 缩减逻辑卷可能导致数据丢失,需要先缩减文件系统
  • 某些操作需要卸载文件系统或进入单用户模式
  • 在生产环境中进行重大变更前,应在测试环境中充分验证
  • 定期备份LVM配置和元数据
  • 监控LVM使用情况,避免空间耗尽
  • 理解条带化、镜像等高级功能的适用场景和限制