跳转到内容

LVM 管理

LVM(Logical Volume Manager,逻辑卷管理器)是 Linux 中非常强大的磁盘管理工具,它在物理磁盘与文件系统之间增加了一层抽象,使得存储空间的分配和调整更加灵活。

LVM 由三个层次组成:

层次缩写说明
物理卷PV (Physical Volume)底层磁盘或分区,是 LVM 的基础构建块
卷组VG (Volume Group)由一个或多个 PV 组合而成的存储池
逻辑卷LV (Logical Volume)从 VG 中分配的逻辑分区,可格式化挂载使用

层次关系如下:

磁盘/分区 --> PV --> VG --> LV --> 文件系统
/dev/sdb1 --> PV1 -+
+--> vg_data --> lv_app --> /app
/dev/sdc1 --> PV2 -+ --> lv_backup --> /backup

大多数企业 Linux 发行版已预装 LVM,如未安装:

Terminal window
sudo dnf install lvm2 -y

物理卷是 LVM 的基础层,需要先将磁盘或分区初始化为 PV。

先使用 fdisk 或 gdisk 创建分区,并将分区类型设为 8e(Linux LVM):

Terminal window
sudo fdisk /dev/sdb
# n -> p -> 1 -> 回车 -> 回车 -> t -> 8e -> w
sudo partprobe /dev/sdb
Terminal window
sudo pvcreate /dev/sdb1
sudo pvcreate /dev/sdc1

也可以直接在整个磁盘上创建 PV(无需事先分区):

Terminal window
sudo pvcreate /dev/sdd
Terminal window
# 简洁列表
sudo pvs
# 详细信息
sudo pvdisplay /dev/sdb1

卷组将多个 PV 汇聚为一个统一的存储池。

Terminal window
sudo vgcreate vg_data /dev/sdb1 /dev/sdc1
Terminal window
# 简洁列表
sudo vgs
# 详细信息
sudo vgdisplay vg_data

后续添加新磁盘时,可以将新的 PV 加入现有 VG:

Terminal window
sudo pvcreate /dev/sdd1
sudo vgextend vg_data /dev/sdd1
Terminal window
# 先迁移数据到其他 PV
sudo pvmove /dev/sdc1
# 再从 VG 中移除
sudo vgreduce vg_data /dev/sdc1

逻辑卷是从卷组中划分出来的可用存储空间,可以格式化并挂载使用。

Terminal window
sudo lvcreate -L 50G -n lv_app vg_data
Terminal window
# 使用卷组剩余空间的 100%
sudo lvcreate -l 100%FREE -n lv_backup vg_data
Terminal window
# 简洁列表
sudo lvs
# 详细信息
sudo lvdisplay /dev/vg_data/lv_app
Terminal window
# 格式化为 XFS
sudo mkfs.xfs /dev/vg_data/lv_app
# 创建挂载点并挂载
sudo mkdir -p /app
sudo mount /dev/vg_data/lv_app /app
# 验证
df -hT /app
Terminal window
# 获取 LV 的 UUID(也可以直接使用 LV 路径)
sudo blkid /dev/vg_data/lv_app
# 编辑 fstab
echo '/dev/vg_data/lv_app /app xfs defaults 0 0' | sudo tee -a /etc/fstab

LVM 最强大的功能之一就是在线扩展逻辑卷。

使用 -r 参数可以在扩展 LV 的同时自动扩展文件系统:

Terminal window
# 增加 20G 空间
sudo lvextend -r -L +20G /dev/vg_data/lv_app
Terminal window
# 将 LV 扩展到 100G
sudo lvextend -r -L 100G /dev/vg_data/lv_app
Terminal window
sudo lvextend -r -l +100%FREE /dev/vg_data/lv_app

分步扩展(手动扩展文件系统)

Section titled “分步扩展(手动扩展文件系统)”

如果不使用 -r 参数,需要手动扩展文件系统:

Terminal window
# 第一步:扩展 LV
sudo lvextend -L +20G /dev/vg_data/lv_app
# 第二步:扩展文件系统
# XFS 文件系统
sudo xfs_growfs /app
# EXT4 文件系统
sudo resize2fs /dev/vg_data/lv_app

这三个命令是日常运维中最常用的 LVM 状态查询命令。

Terminal window
sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 vg_data lvm2 a-- <50.00g 0
/dev/sdc1 vg_data lvm2 a-- <50.00g 30.00g
Terminal window
sudo vgs
VG #PV #LV #SN Attr VSize VFree
vg_data 2 2 0 wz--n- 99.99g 30.00g
Terminal window
sudo lvs
LV VG Attr LSize Pool Origin Data% Meta%
lv_app vg_data -wi-ao---- 50.00g
lv_backup vg_data -wi-ao---- 19.99g
Terminal window
# 显示 LV 名称、大小、卷组和设备路径
sudo lvs -o lv_name,lv_size,vg_name,lv_path

LVM 快照可以在某一时刻创建逻辑卷的只读或读写副本,常用于备份和测试。

Terminal window
# 为 lv_app 创建一个 10G 的快照
sudo lvcreate -s -L 10G -n lv_app_snap /dev/vg_data/lv_app

参数说明:

  • -s:表示创建快照
  • -L 10G:快照空间大小(存储变化数据)
  • -n lv_app_snap:快照名称
Terminal window
sudo lvs

快照卷会显示 Origin(源卷)和 Data%(已使用的快照空间百分比)。

挂载快照(只读方式访问历史数据)

Section titled “挂载快照(只读方式访问历史数据)”
Terminal window
sudo mkdir -p /mnt/snap
sudo mount -o ro /dev/vg_data/lv_app_snap /mnt/snap

可以从快照中复制需要的文件:

Terminal window
sudo cp /mnt/snap/important-file.conf /app/important-file.conf

或者合并快照以回滚整个逻辑卷:

Terminal window
# 先卸载源卷和快照
sudo umount /app
sudo umount /mnt/snap
# 合并快照(回滚到快照时刻的状态)
sudo lvconvert --merge /dev/vg_data/lv_app_snap
# 重新挂载
sudo mount /dev/vg_data/lv_app /app
Terminal window
sudo umount /mnt/snap
sudo lvremove /dev/vg_data/lv_app_snap

删除时需要按照 LV -> VG -> PV 的顺序逐层操作。

  1. 卸载并删除逻辑卷:

    Terminal window
    sudo umount /app
    sudo lvremove /dev/vg_data/lv_app
  2. 删除卷组:

    Terminal window
    sudo vgremove vg_data
  3. 删除物理卷:

    Terminal window
    sudo pvremove /dev/sdb1 /dev/sdc1

以下演示使用两块新磁盘 /dev/sdb/dev/sdc 搭建 LVM 存储的完整流程。

  1. 在两块磁盘上创建分区:

    Terminal window
    sudo parted /dev/sdb mklabel gpt
    sudo parted /dev/sdb mkpart primary 0% 100%
    sudo parted /dev/sdc mklabel gpt
    sudo parted /dev/sdc mkpart primary 0% 100%
    sudo partprobe
  2. 创建物理卷:

    Terminal window
    sudo pvcreate /dev/sdb1 /dev/sdc1
    sudo pvs
  3. 创建卷组:

    Terminal window
    sudo vgcreate vg_data /dev/sdb1 /dev/sdc1
    sudo vgs
  4. 创建逻辑卷:

    Terminal window
    sudo lvcreate -L 80G -n lv_app vg_data
    sudo lvcreate -l 100%FREE -n lv_logs vg_data
    sudo lvs
  5. 格式化并挂载:

    Terminal window
    sudo mkfs.xfs /dev/vg_data/lv_app
    sudo mkfs.xfs /dev/vg_data/lv_logs
    sudo mkdir -p /app /var/applogs
    sudo mount /dev/vg_data/lv_app /app
    sudo mount /dev/vg_data/lv_logs /var/applogs
  6. 配置开机自动挂载:

    Terminal window
    sudo cp /etc/fstab /etc/fstab.bak
    cat <<EOF | sudo tee -a /etc/fstab
    /dev/vg_data/lv_app /app xfs defaults 0 0
    /dev/vg_data/lv_logs /var/applogs xfs defaults 0 0
    EOF
    sudo mount -a
  7. 验证结果:

    Terminal window
    df -hT /app /var/applogs
    sudo pvs && sudo vgs && sudo lvs

LVM 的灵活性使其成为企业 Linux 环境中管理存储的首选方案。熟练掌握 PV、VG、LV 的操作以及在线扩展和快照功能,将极大提升存储管理效率。