linux lvcreate命令

lvcreate 是 LVM(Logical Volume Manager,逻辑卷管理器)工具集的核心命令,用于在卷组中创建逻辑卷,提供灵活的存储空间管理。

一、Lvcreate 简介

lvcreate 命令用于在 LVM 卷组中创建逻辑卷。逻辑卷是从卷组中分配出来的逻辑存储单元,可以像普通分区一样格式化和挂载使用。

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

二、基本语法

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

三、常用选项

选项 说明
-L, --size 大小 指定逻辑卷大小(如 10G, 500M)
-l, --extents 数量 指定逻辑卷扩展块数量
-n, --name 名称 指定逻辑卷名称
-i, --stripes 数量 条带数量(RAID 0)
-I, --stripesize 大小 条带大小(KB)
-m, --mirrors 数量 镜像副本数量(RAID 1)
--type 类型 逻辑卷类型(linear, striped, raid1, thin, cache等)
-C, --contiguous y|n 是否连续分配空间
-Z, --zero y|n 是否清零新逻辑卷
-a, --activate y|n 激活逻辑卷
-k, --setactivationskip y|n 设置激活跳过标志
-r, --readahead 策略 设置预读策略(auto, none, 数字)
--addtag 标签 添加标签到逻辑卷
--alloc 策略 分配策略(normal, anywhere, contiguous, cling)
--thin 创建精简配置逻辑卷
--thinpool 池名称 指定精简池
-V, --virtualsize 大小 精简逻辑卷的虚拟大小
-c, --chunksize 大小 缓存逻辑卷的块大小
--cachemode 模式 缓存模式(writethrough, writeback, passthrough)
--cachepolicy 策略 缓存策略
--cachemetadataformat 格式 缓存元数据格式

四、常用实例

1. 创建基本逻辑卷

# 创建指定大小的逻辑卷
sudo lvcreate -L 10G -n lv_data vg_data

# 使用所有可用空间
sudo lvcreate -l 100%FREE -n lv_data vg_data

# 使用卷组空间的50%
sudo lvcreate -l 50%VG -n lv_data vg_data

# 使用特定物理卷的空间
sudo lvcreate -L 5G -n lv_data vg_data /dev/sdb

# 查看创建结果
sudo lvs
sudo lvdisplay /dev/vg_data/lv_data

2. 创建条带化逻辑卷(RAID 0)

# 创建2个条带的逻辑卷
sudo lvcreate -i 2 -I 64 -L 100G -n lv_striped vg_data

# 指定条带大小(默认为64KB)
sudo lvcreate -i 3 -I 128 -L 200G -n lv_fast vg_data

# 查看条带信息
sudo lvdisplay -m /dev/vg_data/lv_striped

3. 创建镜像逻辑卷(RAID 1)

# 创建镜像逻辑卷(1个镜像副本)
sudo lvcreate -m 1 -L 50G -n lv_mirror vg_data

# 创建多个镜像副本
sudo lvcreate -m 2 -L 100G -n lv_mirror2 vg_data

# 指定镜像日志类型
sudo lvcreate -m 1 --mirrorlog core -L 50G -n lv_mirror_core vg_data

# 查看镜像状态
sudo lvs -a -o +devices vg_data

4. 创建精简配置逻辑卷

# 先创建精简池
sudo lvcreate --type thin-pool -L 100G -n thin_pool vg_data

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

# 查看精简配置信息
sudo lvs -a vg_data
sudo lvdisplay --maps vg_data/thin_pool

5. 创建缓存逻辑卷

# 创建缓存逻辑卷
sudo lvcreate -L 100G -n lv_cache vg_data /dev/sdb
sudo lvcreate -L 1T -n lv_data vg_data /dev/sdc

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

# 查看缓存状态
sudo lvs -a vg_data
sudo lvdisplay --maps vg_data/lv_data

五、完整LVM配置流程

场景1:标准LVM配置

#!/bin/bash
# 完整的LVM配置流程
VG_NAME="vg_data"
LV_NAMES=("lv_root" "lv_home" "lv_var")
LV_SIZES=("20G" "50G" "30G")
MOUNT_POINTS=("/data/root" "/data/home" "/data/var")

echo "=== Step 1: 准备卷组(假设已存在)==="
sudo vgs "$VG_NAME" || echo "卷组 $VG_NAME 不存在,请先创建"

echo "=== Step 2: 创建多个逻辑卷 ==="
for i in "${!LV_NAMES[@]}"; do
    echo "创建 ${LV_NAMES[$i]} (${LV_SIZES[$i]})"
    sudo lvcreate -L "${LV_SIZES[$i]}" -n "${LV_NAMES[$i]}" "$VG_NAME"
done

echo "=== Step 3: 创建文件系统 ==="
for LV_NAME in "${LV_NAMES[@]}"; do
    echo "格式化 $LV_NAME"
    sudo mkfs.ext4 "/dev/$VG_NAME/$LV_NAME"
done

echo "=== Step 4: 挂载逻辑卷 ==="
for i in "${!LV_NAMES[@]}"; do
    echo "挂载 ${LV_NAMES[$i]} 到 ${MOUNT_POINTS[$i]}"
    sudo mkdir -p "${MOUNT_POINTS[$i]}"
    sudo mount "/dev/$VG_NAME/${LV_NAMES[$i]}" "${MOUNT_POINTS[$i]}"
done

echo "=== Step 5: 配置自动挂载 ==="
for i in "${!LV_NAMES[@]}"; do
    echo "/dev/$VG_NAME/${LV_NAMES[$i]} ${MOUNT_POINTS[$i]} ext4 defaults 0 0" | sudo tee -a /etc/fstab
done

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

场景2:高可用数据库存储配置

#!/bin/bash
# 数据库高可用存储配置
VG_NAME="vg_db"
DEVICES=("/dev/sdb" "/dev/sdc" "/dev/sdd")

echo "=== 数据库高可用存储配置 ==="

# 1. 创建物理卷和卷组
for DEVICE in "${DEVICES[@]}"; do
    sudo pvcreate "$DEVICE"
done
sudo vgcreate -s 8M "$VG_NAME" "${DEVICES[@]}"

# 2. 创建镜像逻辑卷(数据卷)
sudo lvcreate -m 1 -L 500G -n lv_mysql_data "$VG_NAME"

# 3. 创建条带化逻辑卷(日志卷)
sudo lvcreate -i 3 -I 64 -L 100G -n lv_mysql_log "$VG_NAME"

# 4. 创建文件系统
sudo mkfs.ext4 -O dir_index,extent "/dev/$VG_NAME/lv_mysql_data"
sudo mkfs.ext4 "/dev/$VG_NAME/lv_mysql_log"

# 5. 挂载配置
sudo mkdir -p /var/lib/mysql
sudo mount -o noatime,nodiratime "/dev/$VG_NAME/lv_mysql_data" /var/lib/mysql
sudo mkdir -p /var/log/mysql
sudo mount "/dev/$VG_NAME/lv_mysql_log" /var/log/mysql

echo "数据库存储配置完成"
sudo lvs -a "$VG_NAME"

场景3:虚拟化环境精简配置

#!/bin/bash
# 虚拟化环境精简配置
VG_NAME="vg_virt"
THIN_POOL="thin_pool"

echo "=== 虚拟化环境精简配置 ==="

# 1. 创建精简池
sudo lvcreate --type thin-pool -L 500G -n "$THIN_POOL" "$VG_NAME"

# 2. 为虚拟机创建精简逻辑卷
VMS=("vm_web1" "vm_db1" "vm_app1")
VM_SIZES=("50G" "100G" "80G")

for i in "${!VMS[@]}"; do
    echo "创建虚拟机磁盘: ${VMS[$i]} (${VM_SIZES[$i]})"
    sudo lvcreate -V "${VM_SIZES[$i]}" -n "lv_${VMS[$i]}" --thinpool "$VG_NAME/$THIN_POOL"

    # 创建虚拟机磁盘文件
    sudo qemu-img create -f qcow2 "/var/lib/libvirt/images/${VMS[$i]}.qcow2" \
        -o backing_file="/dev/$VG_NAME/lv_${VMS[$i]}"
done

echo "虚拟机磁盘创建完成"
echo "精简池使用情况:"
sudo lvs -a "$VG_NAME"

六、逻辑卷管理操作

1. 查看逻辑卷信息

# 查看所有逻辑卷摘要
sudo lvs

# 详细查看逻辑卷信息
sudo lvdisplay

# 查看特定逻辑卷信息
sudo lvdisplay /dev/vg_data/lv_data

# 查看逻辑卷段映射
sudo lvdisplay -m /dev/vg_data/lv_data

# 查看精简池使用情况
sudo lvs -a -o +lv_size,data_percent,metadata_percent

# 查看逻辑卷标签
sudo lvs -o +lv_tags

2. 扩展逻辑卷

# 扩展逻辑卷大小(增加10G)
sudo lvextend -L +10G /dev/vg_data/lv_data

# 扩展到指定大小
sudo lvextend -L 50G /dev/vg_data/lv_data

# 使用所有可用空间
sudo lvextend -l +100%FREE /dev/vg_data/lv_data

# 扩展后需要扩展文件系统(ext4为例)
sudo resize2fs /dev/vg_data/lv_data

# XFS文件系统扩展
sudo xfs_growfs /mount/point

3. 缩小逻辑卷

# 重要:先缩小文件系统,再缩小逻辑卷

# 对于ext4文件系统
sudo umount /dev/vg_data/lv_data
sudo e2fsck -f /dev/vg_data/lv_data
sudo resize2fs /dev/vg_data/lv_data 30G
sudo lvreduce -L 30G /dev/vg_data/lv_data
sudo mount /dev/vg_data/lv_data /mnt

# 查看缩小结果
sudo lvdisplay /dev/vg_data/lv_data

4. 创建逻辑卷快照

# 创建逻辑卷快照
sudo lvcreate -s -L 10G -n lv_snapshot /dev/vg_data/lv_data

# 挂载快照(只读)
sudo mkdir /mnt/snapshot
sudo mount -o ro /dev/vg_data/lv_snapshot /mnt/snapshot

# 合并快照
sudo lvconvert --merge /dev/vg_data/lv_snapshot

# 删除快照
sudo lvremove /dev/vg_data/lv_snapshot

5. 逻辑卷重命名和删除

# 重命名逻辑卷
sudo lvrename vg_data lv_old lv_new

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

# 强制删除逻辑卷
sudo lvremove -f /dev/vg_data/lv_data

# 删除未使用的精简逻辑卷
sudo lvremove --type thin vg_data

七、高级配置

1. RAID 逻辑卷配置

#!/bin/bash
# 创建RAID 5逻辑卷(需要4个以上物理卷)
VG_NAME="vg_raid"
DEVICES=("/dev/sdb" "/dev/sdc" "/dev/sdd" "/dev/sde")

# 创建RAID 5逻辑卷
sudo lvcreate --type raid5 -L 500G -i 3 -n lv_raid5 "$VG_NAME"

# 创建RAID 6逻辑卷(双磁盘容错)
sudo lvcreate --type raid6 -L 1T -i 4 -n lv_raid6 "$VG_NAME"

# 创建RAID 10逻辑卷(镜像+条带)
sudo lvcreate --type raid10 -L 200G -m 1 -i 2 -n lv_raid10 "$VG_NAME"

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

2. 缓存逻辑卷高级配置

#!/bin/bash
# 缓存逻辑卷高级配置
VG_NAME="vg_cache"
SSD="/dev/nvme0n1"
HDD="/dev/sdb"

# 创建物理卷和卷组
sudo pvcreate "$SSD" "$HDD"
sudo vgcreate "$VG_NAME" "$SSD" "$HDD"

# 创建缓存逻辑卷(写回模式)
sudo lvcreate -L 100G -n lv_cache "$VG_NAME" "$SSD"
sudo lvcreate -L 2T -n lv_data "$VG_NAME" "$HDD"

# 配置缓存策略
sudo lvconvert --type cache --cachepool "$VG_NAME/lv_cache" \
    --cachemode writeback \
    --cachepolicy smq \
    "$VG_NAME/lv_data"

# 查看缓存统计
sudo lvdisplay --maps "$VG_NAME/lv_data"
sudo lvs -a -o +cache_total_blocks,cache_used_blocks "$VG_NAME"

3. 精简配置高级管理

#!/bin/bash
# 精简配置高级管理
VG_NAME="vg_thin"
THIN_POOL="thin_pool"

# 创建带元数据预留的精简池
sudo lvcreate --type thin-pool \
    -L 500G \
    --poolmetadatasize 16G \
    -n "$THIN_POOL" \
    "$VG_NAME"

# 设置精简池属性
sudo lvchange --discards passdown "$VG_NAME/$THIN_POOL"
sudo lvchange --zero n "$VG_NAME/$THIN_POOL"

# 监控精简池使用
while true; do
    sudo lvs -a "$VG_NAME" -o lv_name,data_percent,metadata_percent
    echo "---"
    sleep 5
done

# 自动扩展精简池
sudo lvextend -L +100G "$VG_NAME/$THIN_POOL"

八、故障排除

# 原因:卷组空间不足
# 解决方法:

# 1. 检查卷组可用空间
sudo vgs vg_data
sudo vgdisplay vg_data | grep -E "Free PE|VG Size"

# 2. 检查PE大小
sudo vgdisplay vg_data | grep "PE Size"

# 3. 扩展卷组(添加新物理卷)
sudo pvcreate /dev/sde
sudo vgextend vg_data /dev/sde

# 4. 清理未使用的逻辑卷
sudo lvs
sudo lvremove /dev/vg_data/unused_lv

# 5. 使用百分比而不是绝对值
sudo lvcreate -l 100%FREE -n lv_data vg_data

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

# 1. 检查现有逻辑卷
sudo lvs vg_data
sudo lvdisplay vg_data

# 2. 重命名现有逻辑卷
sudo lvrename vg_data lv_data lv_data_old

# 3. 或者使用不同的名称
sudo lvcreate -L 10G -n lv_data_new vg_data

# 4. 删除不再使用的逻辑卷
sudo lvremove /dev/vg_data/lv_data_old

# 5. 检查是否逻辑卷已激活
sudo lvchange -an /dev/vg_data/lv_data

# 原因:镜像同步失败或不同步
# 解决方法:

# 1. 检查镜像状态
sudo lvs -a vg_data -o +devices,sync_percent

# 2. 手动开始同步
sudo lvchange --syncaction check /dev/vg_data/lv_mirror

# 3. 修复镜像
sudo lvconvert --repair /dev/vg_data/lv_mirror

# 4. 如果磁盘故障,替换镜像磁盘
sudo pvcreate /dev/sdf
sudo vgextend vg_data /dev/sdf
sudo lvconvert --replace /dev/sde vg_data/lv_mirror

# 5. 查看镜像日志
sudo dmsetup status vg_data-lv_mirror_mlog

九、性能调优

场景 推荐配置 说明
数据库存储 条带化 + 适当条带大小 -i 2 -I 64-i 4 -I 128
虚拟化存储 精简配置 + 缓存 节省空间 + 提高IO性能
文件服务器 普通线性逻辑卷 简单稳定,维护方便
备份存储 镜像逻辑卷 数据安全,防止磁盘故障
高性能计算 RAID 0 条带化 最大化IO性能(无冗余)
SSD加速 缓存逻辑卷 SSD作为HDD的缓存

十、最佳实践

逻辑卷创建建议
  • 命名规范:使用有意义的逻辑卷名称,如 lv_data, lv_backup
  • 预留空间:不要使用100%卷组空间,预留10-20%用于扩展
  • 性能考量:根据应用需求选择合适的逻辑卷类型(条带化、镜像等)
  • 监控告警:设置逻辑卷空间使用监控和告警(80%阈值)
  • 备份策略:定期备份重要的逻辑卷数据
  • 测试环境:生产环境变更前在测试环境验证
  • 文档记录:记录逻辑卷的用途、大小、挂载点等信息
  • 安全考虑:敏感数据考虑使用加密逻辑卷

十一、实用脚本示例

1. 批量创建逻辑卷

#!/bin/bash
# 批量创建逻辑卷
VG_NAME="vg_app"
LV_CONFIG="/etc/lvm/lv_config.csv"

# 配置文件格式:名称,大小,文件系统,挂载点
# lv_web,20G,ext4,/var/www
# lv_db,50G,xfs,/var/lib/mysql

while IFS=, read -r LV_NAME LV_SIZE FSTYPE MOUNT_POINT; do
    # 跳过注释行和空行
    [[ "$LV_NAME" =~ ^# ]] && continue
    [[ -z "$LV_NAME" ]] && continue

    echo "创建逻辑卷: $LV_NAME ($LV_SIZE)"

    # 创建逻辑卷
    sudo lvcreate -L "$LV_SIZE" -n "$LV_NAME" "$VG_NAME"

    # 创建文件系统
    case "$FSTYPE" in
        ext4)
            sudo mkfs.ext4 "/dev/$VG_NAME/$LV_NAME"
            ;;
        xfs)
            sudo mkfs.xfs "/dev/$VG_NAME/$LV_NAME"
            ;;
        *)
            echo "不支持的文件系统: $FSTYPE"
            continue
            ;;
    esac

    # 创建挂载点并挂载
    sudo mkdir -p "$MOUNT_POINT"
    sudo mount "/dev/$VG_NAME/$LV_NAME" "$MOUNT_POINT"

    # 添加到fstab
    echo "/dev/$VG_NAME/$LV_NAME $MOUNT_POINT $FSTYPE defaults 0 0" | sudo tee -a /etc/fstab

done < "$LV_CONFIG"

echo "批量创建完成"
sudo df -h

2. 逻辑卷监控脚本

#!/bin/bash
# 逻辑卷监控脚本
ALERT_THRESHOLD=80
REPORT_FILE="/var/log/lvm_monitor.log"

# 检查逻辑卷使用情况
check_lv_usage() {
    date >> "$REPORT_FILE"
    echo "=== 逻辑卷使用情况检查 ===" >> "$REPORT_FILE"

    # 获取所有逻辑卷信息
    sudo lvs --units g --noheadings -o lv_name,vg_name,lv_size,data_percent 2>/dev/null | \
    while read LV_NAME VG_NAME LV_SIZE USAGE; do
        USAGE=${USAGE%.*}  # 移除百分号

        if [ "$USAGE" -ge "$ALERT_THRESHOLD" ]; then
            echo "警告: $VG_NAME/$LV_NAME 使用率 $USAGE% 超过阈值 $ALERT_THRESHOLD%" >> "$REPORT_FILE"

            # 发送告警
            # send_alert "$VG_NAME/$LV_NAME" "$USAGE%"
        fi

        echo "$VG_NAME/$LV_NAME: ${LV_SIZE}G, 使用率: $USAGE%" >> "$REPORT_FILE"
    done

    echo "=== 检查完成 ===" >> "$REPORT_FILE"
    echo "" >> "$REPORT_FILE"
}

# 定期运行
while true; do
    check_lv_usage
    sleep 3600  # 每小时检查一次
done
提示: lvcreate 提供了强大的逻辑卷管理能力,包括线性、条带化、镜像、精简配置、缓存等多种类型。合理使用这些功能可以构建高性能、高可用的存储解决方案。