linux lvcreate命令
lvcreate 是 LVM(Logical Volume Manager,逻辑卷管理器)工具集的核心命令,用于在卷组中创建逻辑卷,提供灵活的存储空间管理。
一、Lvcreate 简介
lvcreate 命令用于在 LVM 卷组中创建逻辑卷。逻辑卷是从卷组中分配出来的逻辑存储单元,可以像普通分区一样格式化和挂载使用。
二、基本语法
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 提供了强大的逻辑卷管理能力,包括线性、条带化、镜像、精简配置、缓存等多种类型。合理使用这些功能可以构建高性能、高可用的存储解决方案。