LVM(逻辑卷管理器)是Linux内核的一部分,它提供了一个抽象层,允许将物理存储设备(如硬盘、SSD、RAID阵列等)组合成逻辑存储池,然后从这个池中动态地分配逻辑卷。
/dev/sda1, /dev/sdb, etc.
vg_data, vg_system, etc.
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大小相同 |
/dev/sda1、/dev/sdb/dev/vg_system/dev/vg_system/lv_root 或 /dev/mapper/vg_system-lv_rootLVM工具通常包含在 lvm2 包中:
sudo apt update
sudo apt install lvm2
sudo yum install lvm2
which lvm 或 lvm version 2>/dev/null || echo "未安装"
LVM命令有两种使用方式:
命令 子命令 [选项] [参数]
例如:pvcreate /dev/sdb1, vgcreate vg_data /dev/sdb1
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 |
扫描所有逻辑卷 |
从物理磁盘创建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
查看各种LVM组件的信息:
查看所有物理卷:
sudo pvs
sudo pvdisplay
查看所有卷组:
sudo vgs
sudo vgdisplay
查看所有逻辑卷:
sudo lvs
sudo lvdisplay
查看详细LVM信息:
# 查看所有LVM组件的详细信息
sudo lvm fullreport
# 查看特定卷组的详细信息
sudo vgdisplay vg_data
当逻辑卷空间不足时,可以动态扩展:
# 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
创建逻辑卷快照用于备份或测试:
# 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
快照使用注意事项:
迁移数据并移除物理卷:
# 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
创建精简配置的逻辑卷,允许过量分配存储空间:
# 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选项测试命令#!/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无法识别新磁盘:
sudo pvscan扫描物理卷sudo vgscan扫描卷组sudo lvscan扫描逻辑卷sudo lvmdiskscan扫描所有磁盘恢复丢失的卷组:
sudo vgscan扫描卷组sudo vgchange -a y vg_name激活卷组sudo vgcfgbackup vg_namesudo vgcfgrestore vg_namefdisk - 磁盘分区工具parted - 高级分区工具lsblk - 列出块设备blkid - 显示块设备属性mkfs - 创建文件系统resize2fs - 调整ext2/ext3/ext4文件系统大小xfs_growfs - 扩展XFS文件系统fsck - 检查修复文件系统mount - 挂载文件系统umount - 卸载文件系统