Orange的运维学习日记–28.Linux逻辑卷详解

为什么使用 LVM

物理分区方式虽然简单,但存在以下不足

  • 分区必须使用连续空间,扩展时经常需要借助额外工具进行挂载区间移动
  • 难以跨多块硬盘创建单一文件系统,受单盘容量限制
  • 单盘故障将导致该分区上所有数据不可用

LVM 提供了一种逻辑抽象层,将多个物理设备合并为一个存储池,实现灵活的动态扩展、缩减、快照及镜像等功能


基本概念

LVM 由三个核心对象组成

  • 物理卷(PV)
    基于磁盘、分区或软件 RAID 设备创建,存储 LVM 元数据
  • 卷组(VG)
    将一个或多个 PV 聚合为一个逻辑存储池,管理员可在池内划分空间
  • 逻辑卷(LV)
    从 VG 中按需切分出的可挂载块设备,类似于传统分区

在这里插入图片描述

LVM 管理流程分为三步

  1. 在物理设备上创建 PV
  2. 将 PV 加入 VG
  3. 从 VG 上创建 LV

在这里插入图片描述


创建物理卷

创建 PV 时,LVM 会在设备开头和结尾写入元数据,建议新加设备、分区或 RAID 设备上执行

# 单个设备创建 PV
pvcreate /dev/sdb

# 同时对多个设备创建 PV
pvcreate /dev/sd{c,d}

# 查看所有 PV 列表
pvs

# 检查单个 PV 详细属性
pvdisplay /dev/sdb

在 PV 详细信息中,你可以看到 PV 大小、可用物理扩展(PE)数量及 UUID 等关键信息


创建卷组

卷组是物理卷的集合,后续逻辑卷会从中分配空间

# 创建名称为 webapp 的 VG,包含 /dev/sdb
vgcreate webapp /dev/sdb

# 创建名称为 dbapp 的 VG,包含 /dev/sdc 和 /dev/sdd
vgcreate dbapp /dev/sd{c,d}

# 查看所有 VG 列表及其聚合容量
vgs

# 查看卷组 dbapp 详细信息
vgdisplay dbapp

在 vgdisplay 输出中,重点关注 VG 大小(VSize)、空闲空间(VFree)和 PE 大小(默认 4MiB,可用 -s 调整)


创建逻辑卷

逻辑卷相当于传统分区,支持跨盘、在线扩容、镜像及快照等高级功能

# webapp VG 中创建 5G 大小的 LV,名称为 webapp01
lvcreate -n webapp01 -L 5G webapp

# dbapp VG 中创建 25G 跨盘 LV,名称为 data01
lvcreate -n data01 -L 25G dbapp

# 列出所有 LV 及其所属 VG、大小等信息
lvs

逻辑卷有三种常见路径

  • /dev/卷组名/逻辑卷名
  • /dev/mapper/卷组名-逻辑卷名
  • /dev/dm-数字

可通过 ls -l /dev/卷组名/逻辑卷名 查看对应映射


创建文件系统并挂载

在逻辑卷上创建文件系统与普通分区相同,可选 XFS、EXT4 等格式

# 使用 XFS 格式化
mkfs.xfs /dev/webapp/webapp01

# 挂载至目标目录
mount /dev/webapp/webapp01 /var/www/html

持久化挂载需在 /etc/fstab 中添加相应条目,保证重启后自动挂载


清理 LVM 对象

删除操作会清除所有数据,请务必确认无用后再执行

# 卸载挂载点
umount /dev/webapp/webapp01

# 删除 LV
lvremove /dev/webapp/webapp01 /dev/dbapp/data01

# 删除 VG
vgremove webapp dbapp

# 删除 PV
pvremove /dev/sd{b..d}

扩展与缩减逻辑卷

扩展 LV

当 VG 空间充足,需要在线为 LV 增加容量时使用

# 在 webapp01 上增加 2G 空间
lvextend -L +2G /dev/webapp/webapp01

# 查看最新大小
lvs /dev/webapp/webapp01

缩减 LV

缩减前请确保文件系统先缩减且无活跃写操作,避免数据损坏

# 从 webapp01 上减少 2G 空间
lvreduce -L -2G /dev/webapp/webapp01

# 查看最新大小
lvs /dev/webapp/webapp01

调整文件系统大小

扩展 XFS 文件系统

XFS 只支持在线扩展,不支持在线缩减

# 扩展 LV 至 15G
lvextend -L 15G /dev/webapp/webapp01

# 挂载点已挂载情况下在线扩容
xfs_growfs /var/www/html

# 或者一并扩容 LV 和文件系统
lvextend -rL 20G /dev/webapp/webapp01

扩展 EXT4 文件系统

EXT4 支持在线扩展、离线缩减

# 扩展 LV 至 25G
lvextend -L 25G /dev/webapp/webapp01

# 在线扩容文件系统
resize2fs /dev/webapp/webapp01

# 或者一并扩容 LV 和文件系统
lvextend -rL 30G /dev/webapp/webapp01

缩减 EXT4 文件系统

缩减需提前卸载,且不能小于当前使用空间

  1. 卸载文件系统
  2. 检查文件系统完整性
  3. 离线缩减文件系统至目标大小
  4. 缩减 LV
  5. 挂载并验证
umount /var/www/html
e2fsck -f /dev/webapp/webapp01
resize2fs /dev/webapp/webapp01 10G
lvreduce -L 10G /dev/webapp/webapp01
mount /dev/webapp/webapp01 /var/www/html

逻辑卷快照

快照基于写时复制机制,记录原 LV 某一时刻数据状态

# 创建容量 10G 快照,名称 webapp01-snap1
lvcreate -s -n webapp01-snap1 -L 10G /dev/webapp/webapp01

# 卸载原 LV 并挂载快照
umount /dev/webapp/webapp01
mount /dev/webapp/webapp01-snap1 /mnt/snapshot

# 在快照上进行读写测试
echo hello world > /mnt/snapshot/hello.txt
cat /mnt/snapshot/hello.txt

快照可用作临时备份或测试环境,还原后可选择保留或删除


创建 RAID 逻辑卷

创建 RAID0 条带卷

条带卷将数据分散写入多个物理卷,提升并行读写性能,无冗余,任何一块设备故障都会丢失数据

假设存在三个未使用的物理卷 /dev/sdb/dev/sdc/dev/sdd,先将它们加入同一卷组

pvcreate /dev/sdb /dev/sdc /dev/sdd

vgcreate raidvg /dev/sdb /dev/sdc /dev/sdd

使用三条带创建一个 30G 大小的逻辑卷,指定条带数(-i)和条带大小(-I)

lvcreate -n lv_stripe -L 30G -i3 -I64K raidvg

参数说明

  • -i3:将数据分成 3 条带,分别写入三块物理卷
  • -I64K:每条带大小为 64KB,增大并行度需适配实际 I/O 大小

格式化并挂载

mkfs.xfs /dev/raidvg/lv_stripe
mount /dev/raidvg/lv_stripe /mnt/stripe

查看条带卷分布

lsblk /dev/sd{b..d}
# 三个设备下都会出现同一个 lv_stripe 的映射

创建 RAID1 镜像卷

镜像卷将数据写入两块或多块物理卷,提供数据冗余,任一副本设备损坏后仍可读取

假设存在两个物理卷 /dev/sdb/dev/sdc,先加入卷组

pvcreate /dev/sdb /dev/sdc

vgcreate mirrorgroup /dev/sdb /dev/sdc

创建一个带有 1 份镜像的 5G 逻辑卷

lvcreate -n lv_mirror -L 5G -m1 mirrorgroup

参数说明

  • -m1:每个数据块有一份镜像,共两份副本
  • 若要两份镜像(总 3 份),可指定 -m2

格式化并挂载

mkfs.ext4 /dev/mirrorgroup/lv_mirror
mount /dev/mirrorgroup/lv_mirror /mnt/mirror

检查镜像状态

lvs -o +devices mirrorgroup/lv_mirror
# 可见两个物理设备各自映射相同 LV
卷

```bash
lvcreate -n lv_mirror -L 5G -m1 mirrorgroup

参数说明

  • -m1:每个数据块有一份镜像,共两份副本
  • 若要两份镜像(总 3 份),可指定 -m2

格式化并挂载

mkfs.ext4 /dev/mirrorgroup/lv_mirror
mount /dev/mirrorgroup/lv_mirror /mnt/mirror

检查镜像状态

lvs -o +devices mirrorgroup/lv_mirror
# 可见两个物理设备各自映射相同 LV
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐