Linux lvextend命令

lvextend命令 - 扩展逻辑卷(Logical Volume)的大小,支持在线扩展,是LVM(逻辑卷管理)的核心命令之一。
警告:扩展逻辑卷前,请确保卷组有足够的可用空间。扩展文件系统前建议先备份重要数据。

命令简介

lvextend命令用于增加逻辑卷的容量。它可以在逻辑卷已经包含文件系统的情况下进行在线扩展,无需卸载文件系统或重启系统。通常与resize2fs(ext2/3/4)或xfs_growfs(XFS)命令结合使用来扩展文件系统。

语法格式

lvextend [选项] 逻辑卷路径 [大小]

常用选项

选项 说明
-L, --size [+]大小 设置或增加逻辑卷大小(+表示增加,-表示减少)
-l, --extents [+]数量 设置或增加逻辑卷的PE数量
-r, --resizefs 同时扩展文件系统(推荐)
-t, --test 测试模式,不实际执行
-f, --force 强制扩展,跳过安全检查
--alloc 指定分配策略(contiguous, cling, normal, anywhere)
--poolmetadatasize 指定精简池元数据大小
--use-policies 使用分配策略
-n, --nofsck 跳过文件系统检查

大小单位说明

单位 说明 示例
k, K 千字节(Kilobytes) 1024K
m, M 兆字节(Megabytes) 512M
g, G 千兆字节(Gigabytes) 10G
t, T 太字节(Terabytes) 2T
% 百分比 50%VG(卷组空间的50%)
%FREE 剩余空间的百分比 +100%FREE(使用所有剩余空间)
%ORIGIN 原始卷大小的百分比 +50%ORIGIN(增加原始大小的50%)

使用示例

示例1:基本扩展 - 指定绝对大小

将逻辑卷扩展到指定大小:

# 将逻辑卷扩展到20GB
lvextend -L 20G /dev/vg01/lv01

# 如果有足够的空间,输出类似:
#   Size of logical volume vg01/lv01 changed from 10.00 GiB (2560 extents) to 20.00 GiB (5120 extents).
#   Logical volume vg01/lv01 successfully resized.

示例2:增加大小 - 相对扩展

# 增加5GB空间(相对当前大小)
lvextend -L +5G /dev/vg01/lv01

# 减少2GB空间(慎用)
lvextend -L -2G /dev/vg01/lv01

# 输出示例:
#   Size of logical volume vg01/lv01 changed from 20.00 GiB (5120 extents) to 25.00 GiB (6400 extents).

示例3:同时扩展文件系统(推荐)

# 扩展逻辑卷并自动调整文件系统大小(支持ext2/3/4、xfs等)
lvextend -r -L +10G /dev/vg01/lv01

# 输出示例(同时显示文件系统扩展):
#   Size of logical volume vg01/lv01 changed from 25.00 GiB (6400 extents) to 35.00 GiB (8960 extents).
#   Logical volume vg01/lv01 successfully resized.
#   resize2fs 1.45.5 (07-Jan-2020)
#   Filesystem at /dev/mapper/vg01-lv01 is mounted on /data; on-line resizing required
#   old_desc_blocks = 3, new_desc_blocks = 5
#   The filesystem on /dev/mapper/vg01-lv01 is now 9175040 (4k) blocks long.

示例4:使用PE数量扩展

# 查看当前PE大小
vgdisplay vg01 | grep "PE Size"

# 增加256个PE(假设PE大小为4MB,即增加1GB)
lvextend -l +256 /dev/vg01/lv01

# 设置总PE数量为5120
lvextend -l 5120 /dev/vg01/lv01

示例5:使用百分比扩展

# 使用卷组剩余空间的所有空间
lvextend -l +100%FREE /dev/vg01/lv01

# 使用卷组总空间的50%
lvextend -L +50%VG /dev/vg01/lv01

# 增加原始大小的100%(大小翻倍)
lvextend -L +100%ORIGIN /dev/vg01/lv01

示例6:扩展精简卷

# 扩展精简池中的逻辑卷
lvextend -L +5G /dev/vg01/thin_lv

# 扩展精简池本身
lvextend -L +20G /dev/vg01/thin_pool

# 输出示例:
#   Size of logical volume vg01/thin_lv changed from 10.00 GiB (2560 extents) to 15.00 GiB (3840 extents).
#   Logical volume vg01/thin_lv successfully resized.

示例7:测试模式和安全检查

# 测试模式:显示将要执行的操作但不实际执行
lvextend -t -L +5G /dev/vg01/lv01

# 强制扩展(跳过安全检查)
lvextend -f -L +5G /dev/vg01/lv01

# 跳过文件系统检查
lvextend -n -L +5G /dev/vg01/lv01

示例8:指定物理卷扩展

# 指定使用特定的物理卷进行扩展
lvextend /dev/vg01/lv01 /dev/sdb1

# 使用多个物理卷
lvextend /dev/vg01/lv01 /dev/sdb1 /dev/sdc1

# 指定特定区域的扩展
lvextend --alloc anywhere /dev/vg01/lv01 /dev/sdb1

完整的扩展流程

扩展逻辑卷的标准步骤
  1. 检查当前空间使用情况
    df -h /data
    lvs /dev/vg01/lv01
    vgs vg01
  2. 扩展逻辑卷
    lvextend -L +10G /dev/vg01/lv01
  3. 扩展文件系统
    • ext2/ext3/ext4文件系统:
      resize2fs /dev/vg01/lv01
    • XFS文件系统:
      xfs_growfs /data
    • 一步完成(推荐):
      lvextend -r -L +10G /dev/vg01/lv01
  4. 验证扩展结果
    df -h /data
    lvs /dev/vg01/lv01

文件系统特定命令

文件系统 扩展命令 注意事项
ext2/ext3/ext4 resize2fs 设备名 支持在线扩展,不需要卸载
XFS xfs_growfs 挂载点 必须指定挂载点,支持在线扩展
btrfs btrfs filesystem resize 大小 挂载点 支持在线扩展和收缩
swap swapoff → mkswap → swapon 需要先禁用swap

常见问题与解决方案

解决方案:先扩展卷组或添加新的物理卷

# 检查卷组可用空间
vgs

# 扩展卷组(添加新的物理卷)
vgextend vg01 /dev/sdd1

# 然后再次尝试扩展逻辑卷
lvextend -L +10G /dev/vg01/lv01

解决方案:需要手动扩展文件系统

# 对于ext2/3/4文件系统
resize2fs /dev/vg01/lv01

# 对于XFS文件系统
xfs_growfs /data

# 或者使用-r选项一次性完成
lvextend -r -L +10G /dev/vg01/lv01

步骤:

# 1. 检查当前根分区信息
df -h /
lsblk

# 2. 扩展逻辑卷(假设根分区在/dev/centos/root)
lvextend -r -L +5G /dev/centos/root

# 3. 如果使用initrd,可能需要重建
dracut --force

# 4. 重启系统验证
reboot

相关命令

lvreduce

缩小逻辑卷

lvresize

调整逻辑卷大小(扩展或缩小)

vgextend

扩展卷组

resize2fs

扩展ext2/3/4文件系统

自动化脚本示例

自动扩展逻辑卷脚本
#!/bin/bash
# 自动扩展逻辑卷脚本
LV_PATH="/dev/vg01/lv01"
MOUNT_POINT="/data"
EXTEND_SIZE="5G"

echo "开始扩展逻辑卷..."
echo "当前空间使用情况:"
df -h $MOUNT_POINT

# 检查卷组是否有足够空间
VG_NAME=$(echo $LV_PATH | cut -d'/' -f3)
VG_FREE=$(vgs --noheadings --units g -o vg_free $VG_NAME | awk '{print $1}')

if (( $(echo "$VG_FREE < 5" | bc -l) )); then
    echo "错误:卷组 $VG_NAME 可用空间不足(仅剩 ${VG_FREE}G)"
    exit 1
fi

# 扩展逻辑卷和文件系统
echo "正在扩展逻辑卷 $LV_PATH ..."
if lvextend -r -L +$EXTEND_SIZE $LV_PATH; then
    echo "逻辑卷扩展成功"
    echo "扩展后空间使用情况:"
    df -h $MOUNT_POINT
else
    echo "逻辑卷扩展失败"
    exit 1
fi
监控和自动扩容脚本
#!/bin/bash
# 监控磁盘空间并自动扩容
THRESHOLD=80  # 使用率阈值(%)
LV_PATH="/dev/vg01/app_lv"
MOUNT_POINT="/app"

# 获取当前使用率
USAGE=$(df -h $MOUNT_POINT | tail -1 | awk '{print $5}' | sed 's/%//')

if [ $USAGE -gt $THRESHOLD ]; then
    echo "磁盘使用率 $USAGE% 超过阈值 $THRESHOLD%,开始自动扩容..."

    # 计算需要扩展的大小(增加当前大小的20%)
    CURRENT_SIZE=$(lvs --noheadings --units g -o lv_size $LV_PATH | awk '{print $1}')
    EXTEND_SIZE=$(echo "$CURRENT_SIZE * 0.2" | bc | awk '{printf "%.1fG\n", $1}')

    # 扩展逻辑卷
    if lvextend -r -L +$EXTEND_SIZE $LV_PATH; then
        echo "自动扩容成功,增加了 $EXTEND_SIZE"
        # 发送通知
        echo "逻辑卷 $LV_PATH 已自动扩展 $EXTEND_SIZE" | mail -s "磁盘自动扩容通知" admin@example.com
    else
        echo "自动扩容失败"
    fi
else
    echo "磁盘使用率正常:$USAGE%"
fi