Orange的运维学习日记–28.Linux逻辑卷详解
文章目录
- Orange的运维学习日记--28.Linux逻辑卷详解
- 为什么使用 LVM
- 基本概念
- 创建物理卷
- 创建卷组
- 创建逻辑卷
- 创建文件系统并挂载
- 清理 LVM 对象
- 扩展与缩减逻辑卷
- 扩展 LV
- 缩减 LV
- 调整文件系统大小
- 扩展 XFS 文件系统
- 扩展 EXT4 文件系统
- 缩减 EXT4 文件系统
- 逻辑卷快照
- 创建 RAID 逻辑卷
- 创建 RAID0 条带卷
- 创建 RAID1 镜像卷
为什么使用 LVM
物理分区方式虽然简单,但存在以下不足
- 分区必须使用连续空间,扩展时经常需要借助额外工具进行挂载区间移动
- 难以跨多块硬盘创建单一文件系统,受单盘容量限制
- 单盘故障将导致该分区上所有数据不可用
LVM 提供了一种逻辑抽象层,将多个物理设备合并为一个存储池,实现灵活的动态扩展、缩减、快照及镜像等功能
基本概念
LVM 由三个核心对象组成
- 物理卷(PV)
基于磁盘、分区或软件 RAID 设备创建,存储 LVM 元数据 - 卷组(VG)
将一个或多个 PV 聚合为一个逻辑存储池,管理员可在池内划分空间 - 逻辑卷(LV)
从 VG 中按需切分出的可挂载块设备,类似于传统分区
LVM 管理流程分为三步
- 在物理设备上创建 PV
- 将 PV 加入 VG
- 从 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 文件系统
缩减需提前卸载,且不能小于当前使用空间
- 卸载文件系统
- 检查文件系统完整性
- 离线缩减文件系统至目标大小
- 缩减 LV
- 挂载并验证
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/sddvgcreate 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/sdcvgcreate 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