linux vgcreate命令

vgcreate 是 LVM(Logical Volume Manager,逻辑卷管理器)工具集的一部分,用于将多个物理卷(PV)组合成一个卷组(VG),形成统一的存储池。

一、Vgcreate 简介

vgcreate 命令用于创建 LVM 卷组。卷组是 LVM 架构中的核心组件,它将一个或多个物理卷组合成一个逻辑存储池,为创建逻辑卷(LV)提供空间。

LVM 架构层次
物理卷 (PV)
pvcreate 创建
卷组 (VG)
vgcreate 创建
逻辑卷 (LV)
lvcreate 创建

二、基本语法

vgcreate [选项] 卷组名称 物理卷...

三、常用选项

选项 说明
-l, --maxlogicalvolumes 数量 最大逻辑卷数量
-p, --maxphysicalvolumes 数量 最大物理卷数量
-s, --physicalextentsize 大小 设置物理区域(PE)大小
--alloc 策略 分配策略:contiguous, cling, normal, anywhere
--autobackup y|n 是否自动备份元数据
--metadatatype 类型 元数据类型:lvm1 或 lvm2
--vgmetadatacopies 数量 元数据副本数量(0, 1, 2)
--addtag 标签 为卷组添加标签
--dataalignment 大小 数据对齐大小
--dataalignmentoffset 偏移 数据对齐偏移量
--setautoactivation y|n 设置自动激活
--zero y|n 是否清零元数据区域
-f, --force 强制创建,跳过确认
-v, --verbose 详细输出
-q, --quiet 安静模式
--version 显示版本信息
-h, --help 显示帮助信息

四、物理区域(PE)大小说明

物理区域(Physical Extent,PE)是 LVM 中的最小分配单位,所有逻辑卷空间都以 PE 为单位进行分配和管理。

PE 大小 推荐用途 最大卷组大小
1MB(默认) 小规模存储,兼容性好 256GB
4MB 一般用途,平衡性能 1TB
8MB 中等规模存储 2TB
16MB 大规模存储,减少元数据开销 4TB
32MB 超大存储,最少元数据 8TB
64MB 巨型存储系统 16TB

五、常用实例

1. 创建基本卷组

# 创建包含单个物理卷的卷组
sudo vgcreate vg_data /dev/sdb

# 创建包含多个物理卷的卷组
sudo vgcreate vg_storage /dev/sdb /dev/sdc /dev/sdd

# 查看创建结果
sudo vgs
sudo vgdisplay vg_data

2. 设置物理区域(PE)大小

# 设置PE大小为4MB(默认为4MB)
sudo vgcreate -s 4M vg_data /dev/sdb

# 设置PE大小为16MB
sudo vgcreate -s 16M vg_large /dev/sde

# 设置PE大小为64MB(适合超大存储)
sudo vgcreate -s 64M vg_huge /dev/sdf

3. 设置限制参数

# 设置最大逻辑卷数量
sudo vgcreate -l 256 vg_data /dev/sdb

# 设置最大物理卷数量
sudo vgcreate -p 32 vg_data /dev/sdb

# 同时设置多个参数
sudo vgcreate -s 8M -l 128 -p 16 vg_data /dev/sdb

4. 设置分配策略

# 设置分配策略为contiguous(连续分配)
sudo vgcreate --alloc contiguous vg_data /dev/sdb

# 设置分配策略为cling(粘附分配)
sudo vgcreate --alloc cling vg_data /dev/sdb

# 设置分配策略为normal(普通分配)
sudo vgcreate --alloc normal vg_data /dev/sdb

# 设置分配策略为anywhere(任意分配)
sudo vgcreate --alloc anywhere vg_data /dev/sdb

5. 设置元数据参数

# 设置元数据副本数量为2(提高可靠性)
sudo vgcreate --vgmetadatacopies 2 vg_data /dev/sdb

# 设置自动备份元数据
sudo vgcreate --autobackup y vg_data /dev/sdb

# 设置不自动备份元数据
sudo vgcreate --autobackup n vg_data /dev/sdb

# 设置LVM1格式元数据(兼容旧系统)
sudo vgcreate --metadatatype lvm1 vg_data /dev/sdb

六、完整LVM配置流程

场景1:标准LVM配置

#!/bin/bash
# 完整的LVM配置流程
DEVICES=("/dev/sdb" "/dev/sdc")
VG_NAME="vg_data"
LV_NAME="lv_data"
MOUNT_POINT="/data"

echo "=== Step 1: 准备物理卷 ==="
for DEVICE in "${DEVICES[@]}"; do
    echo "创建物理卷: $DEVICE"
    sudo pvcreate "$DEVICE"
done

echo "=== Step 2: 创建卷组 ==="
sudo vgcreate -s 4M "$VG_NAME" "${DEVICES[@]}"

echo "=== Step 3: 查看卷组信息 ==="
sudo vgdisplay "$VG_NAME"

echo "=== Step 4: 创建逻辑卷 ==="
sudo lvcreate -L 100G -n "$LV_NAME" "$VG_NAME"

echo "=== Step 5: 创建文件系统 ==="
sudo mkfs.ext4 "/dev/$VG_NAME/$LV_NAME"

echo "=== Step 6: 挂载使用 ==="
sudo mkdir -p "$MOUNT_POINT"
sudo mount "/dev/$VG_NAME/$LV_NAME" "$MOUNT_POINT"

echo "=== Step 7: 配置自动挂载 ==="
echo "/dev/$VG_NAME/$LV_NAME $MOUNT_POINT ext4 defaults 0 0" | sudo tee -a /etc/fstab

echo "=== 配置完成 ==="
sudo df -h "$MOUNT_POINT"

场景2:多磁盘条带化配置

#!/bin/bash
# 多磁盘条带化配置(提高性能)
DEVICES=("/dev/sdb" "/dev/sdc" "/dev/sdd")
VG_NAME="vg_fast"
LV_NAME="lv_fast"
MOUNT_POINT="/fast"

echo "=== 高性能条带化配置 ==="

# 创建物理卷
for DEVICE in "${DEVICES[@]}"; do
    sudo pvcreate "$DEVICE"
done

# 创建卷组(大PE大小减少元数据开销)
sudo vgcreate -s 16M "$VG_NAME" "${DEVICES[@]}"

# 创建条带化逻辑卷(3个条带,64KB条带大小)
sudo lvcreate -i 3 -I 64 -L 500G -n "$LV_NAME" "$VG_NAME"

# 创建XFS文件系统(高性能)
sudo mkfs.xfs "/dev/$VG_NAME/$LV_NAME"

# 挂载并优化挂载选项
sudo mkdir -p "$MOUNT_POINT"
sudo mount -o noatime,nodiratime,allocsize=1G "/dev/$VG_NAME/$LV_NAME" "$MOUNT_POINT"

echo "条带化配置完成"
sudo vgdisplay "$VG_NAME"

场景3:卷组标签和属性配置

#!/bin/bash
# 卷组标签和属性配置
DEVICE="/dev/sdb"
VG_NAME="vg_backup"

echo "=== 高级卷组配置 ==="

# 创建物理卷
sudo pvcreate "$DEVICE"

# 创建卷组并添加标签
sudo vgcreate --addtag "backup" --addtag "important" "$VG_NAME" "$DEVICE"

# 设置卷组属性
sudo vgchange --autobackup y "$VG_NAME"
sudo vgchange --alloc anywhere "$VG_NAME"

# 设置卷组激活模式
sudo vgchange --setautoactivation y "$VG_NAME"

# 查看卷组信息
echo "卷组标签:"
sudo vgs -o vg_tags "$VG_NAME"

echo "卷组属性:"
sudo vgdisplay "$VG_NAME" | grep -E "VG Status|VG Access|VG Tags"

七、卷组管理操作

1. 查看卷组信息

# 查看所有卷组摘要信息
sudo vgs

# 详细查看所有卷组
sudo vgdisplay

# 查看特定卷组信息
sudo vgdisplay vg_data

# 查看卷组标签
sudo vgs -o +vg_tags

# 查看卷组物理卷
sudo pvs -o +pv_tags

# 查看卷组元数据信息
sudo vgck vg_data

2. 扩展卷组

# 添加新物理卷到卷组
sudo pvcreate /dev/sde
sudo vgextend vg_data /dev/sde

# 同时添加多个物理卷
sudo vgextend vg_data /dev/sde /dev/sdf

# 查看扩展后的卷组
sudo vgdisplay vg_data

3. 缩小卷组

# 从卷组中移除物理卷(确保没有数据)
sudo pvmove /dev/sdb
sudo vgreduce vg_data /dev/sdb

# 强制移除物理卷(可能有数据丢失风险)
sudo vgreduce --removemissing vg_data

# 查看缩小后的卷组
sudo vgdisplay vg_data

4. 修改卷组属性

# 修改卷组名称
sudo vgrename vg_old vg_new

# 修改卷组PE大小(需要先卸载逻辑卷)
sudo vgchange -s 8M vg_data

# 添加卷组标签
sudo vgchange --addtag "production" vg_data

# 移除卷组标签
sudo vgchange --deltag "test" vg_data

# 激活/停用卷组
sudo vgchange -a y vg_data  # 激活
sudo vgchange -a n vg_data  # 停用

5. 卷组备份与恢复

# 备份卷组配置
sudo vgcfgbackup vg_data

# 备份到指定文件
sudo vgcfgbackup -f /backup/vg_data.conf vg_data

# 查看备份文件
ls -l /etc/lvm/backup/

# 从备份恢复卷组
sudo vgcfgrestore -f /etc/lvm/backup/vg_data vg_data

# 导出卷组配置
sudo vgexport vg_data

# 导入卷组配置
sudo vgimport vg_data

八、高级配置

1. 创建精简配置卷组

#!/bin/bash
# 创建精简配置(Thin Provisioning)卷组
VG_NAME="vg_thin"
POOL_NAME="thin_pool"
DEVICE="/dev/sdb"

# 创建物理卷
sudo pvcreate "$DEVICE"

# 创建卷组
sudo vgcreate "$VG_NAME" "$DEVICE"

# 创建精简池(Thin Pool)
sudo lvcreate --type thin-pool -L 100G -n "$POOL_NAME" "$VG_NAME"

# 创建精简逻辑卷
sudo lvcreate -V 50G -n lv_thin1 --thinpool "$VG_NAME/$POOL_NAME"
sudo lvcreate -V 50G -n lv_thin2 --thinpool "$VG_NAME/$POOL_NAME"

# 查看精简配置信息
sudo lvs -a "$VG_NAME"

2. 创建缓存卷组

#!/bin/bash
# 创建缓存卷组(SSD缓存加速)
SSD_DEVICE="/dev/nvme0n1"
HDD_DEVICE="/dev/sdb"
VG_NAME="vg_cache"

# 创建物理卷
sudo pvcreate "$SSD_DEVICE" "$HDD_DEVICE"

# 创建卷组
sudo vgcreate "$VG_NAME" "$SSD_DEVICE" "$HDD_DEVICE"

# 创建缓存逻辑卷
sudo lvcreate -L 100G -n lv_cache "$VG_NAME" "$SSD_DEVICE"
sudo lvcreate -L 1T -n lv_data "$VG_NAME" "$HDD_DEVICE"

# 将SSD缓存附加到HDD逻辑卷
sudo lvconvert --type cache --cachepool "$VG_NAME/lv_cache" "$VG_NAME/lv_data"

echo "缓存卷组配置完成"
sudo lvs -a "$VG_NAME"

3. 卷组镜像配置

#!/bin/bash
# 卷组镜像配置(数据冗余)
DEVICES=("/dev/sdb" "/dev/sdc" "/dev/sdd")
VG_NAME="vg_mirror"
LV_NAME="lv_mirror"

# 创建物理卷
for DEVICE in "${DEVICES[@]}"; do
    sudo pvcreate "$DEVICE"
done

# 创建卷组
sudo vgcreate "$VG_NAME" "${DEVICES[@]}"

# 创建镜像逻辑卷(2个镜像副本)
sudo lvcreate --type mirror -m 1 -L 100G -n "$LV_NAME" "$VG_NAME"

# 查看镜像状态
sudo lvs -a "$VG_NAME" -o +devices

# 监控镜像同步
sudo lvs "$VG_NAME/$LV_NAME" -o sync_percent

九、故障排除

# 原因:卷组名称已存在
# 解决方法:

# 1. 检查现有卷组
sudo vgs
sudo vgdisplay

# 2. 删除已存在的卷组(如果不再需要)
sudo vgremove vg_data

# 3. 或者使用不同的卷组名称
sudo vgcreate vg_data_new /dev/sdb

# 4. 检查LVM缓存
sudo vgscan --cache

# 5. 如果卷组已导出,需要先导入
sudo vgimport vg_data

# 原因:多种可能原因
# 解决方法:

# 1. 检查物理卷是否存在
sudo pvs
sudo pvdisplay /dev/sdb

# 2. 检查物理卷是否已属于其他卷组
sudo pvdisplay /dev/sdb | grep "VG Name"

# 3. 检查设备是否可用
sudo lsblk /dev/sdb
sudo fdisk -l /dev/sdb

# 4. 检查LVM过滤器配置
cat /etc/lvm/lvm.conf | grep filter

# 5. 强制创建(谨慎使用)
sudo vgcreate -f vg_data /dev/sdb

# 6. 检查磁盘空间
sudo pvcreate /dev/sdb
sudo pvdisplay /dev/sdb

# 原因:物理卷空间不足或PE大小设置不当
# 解决方法:

# 1. 检查物理卷可用空间
sudo pvdisplay /dev/sdb | grep "Free PE"

# 2. 检查PE大小设置
# 如果PE太大,可能导致空间浪费

# 3. 调整PE大小(重新创建卷组)
sudo vgremove vg_data
sudo vgcreate -s 4M vg_data /dev/sdb

# 4. 添加更多物理卷
sudo pvcreate /dev/sdc
sudo vgextend vg_data /dev/sdc

# 5. 清理物理卷空间
# 如果物理卷有残留数据,可能需要擦除
sudo wipefs -a /dev/sdb
sudo pvcreate /dev/sdb

十、相关命令对比

命令 用途 关联命令
vgcreate 创建卷组 vgextend, vgreduce
pvcreate 创建物理卷 pvremove, pvscan
lvcreate 创建逻辑卷 lvextend, lvreduce
vgextend 扩展卷组 pvcreate, vgs
vgreduce 缩小卷组 pvmove, vgdisplay

十一、最佳实践

卷组配置建议
  • 规划PE大小:根据存储规模选择合适的PE大小(4MB或8MB适合大多数场景)
  • 命名规范:使用有意义的卷组名称,如vg_data, vg_backup
  • 卷组标签:为卷组添加标签,便于管理和筛选
  • 元数据备份:启用自动元数据备份(--autobackup y
  • 冗余配置:生产环境考虑使用镜像或RAID提供数据冗余
  • 性能优化:对于高IO场景,考虑使用条带化或缓存加速
  • 监控告警:监控卷组空间使用,设置自动告警阈值(如80%)
  • 测试环境:生产环境变更前在测试环境验证

十二、卷组配置示例

Web服务器存储
# Web服务器卷组配置
sudo pvcreate /dev/sdb
sudo vgcreate -s 8M \
  --alloc normal \
  --autobackup y \
  vg_web /dev/sdb

# 创建逻辑卷
sudo lvcreate -L 100G -n lv_www vg_web
sudo lvcreate -L 50G -n lv_logs vg_web
数据库服务器存储
# 数据库卷组配置
sudo pvcreate /dev/sdb /dev/sdc
sudo vgcreate -s 16M \
  --alloc cling \
  vg_db /dev/sdb /dev/sdc

# 创建条带化逻辑卷
sudo lvcreate -i 2 -I 64 \
  -L 500G -n lv_mysql vg_db
提示: 卷组是 LVM 架构的核心,合理的卷组规划可以为后续的逻辑卷管理打下良好基础。掌握 vgcreate 命令及其高级选项,可以帮助你构建灵活、可扩展的存储解决方案。