字数 2463,阅读大约需 13 分钟

LVM(Logical Volume Manager,逻辑卷管理器)是 Linux 下管理磁盘存储的中间层软件。它在物理磁盘和文件系统之间引入了一层抽象,让分区不再"一次划定、终身受限"——你可以随时扩容缩容、跨盘合并、在线迁移,甚至做快照和镜像。
在讲 LVM 之前,先想一下传统分区有哪些让人头疼的问题。
假设你有一块 500G 的硬盘 /dev/sda,分成了三个分区:
/dev/sda1 → / 100G
/dev/sda2 → /home 150G
/dev/sda3 → /data 250G过了一段时间:
/home 不够用了:但 /data 还有 200G 空闲。你不能直接把 /data 的空间分给 /home,因为分区是连续的物理区域,跨越需要重新分区,还要把数据迁移走。/ 太小了:你只能新增一块硬盘,然后把 /var 拆出来挂到新盘上。整个过程涉及重启、修改 fstab、复制数据,非常痛苦。传统分区的本质问题是:分区大小在创建时就固定了,调整需要复杂的重新分区操作。
LVM 就是要解决这个问题。
LVM = Logical Volume Manager(逻辑卷管理器)。
它在物理硬盘和文件系统之间加了一层"逻辑抽象",让你可以:
简单说:LVM 把"分区大小写死"变成了"弹性伸缩"。
LVM 的核心是 三层模型:
┌─────────────────────────────────────────────┐
│ FS ext4 / xfs / btrfs ... │ ← 文件系统
├─────────────────────────────────────────────┤
│ LV Logical Volume 逻辑卷 │ ← 你当成"分区"用
├─────────────────────────────────────────────┤
│ VG Volume Group 卷组 │ ← 存储池
├─────────────────────────────────────────────┤
│ PV Physical Volume 物理卷 │ ← 物理硬盘/分区
└─────────────────────────────────────────────┘从下往上分别是:
pvcreate 在磁盘(或分区)头部写入 LVM 元数据,使其成为 PVpvcreate /dev/sdbvgcreate vg_data /dev/sdb /dev/sdclvcreate -L 50G -n lv_app vg_data打个比方:
这两个概念是 LVM 实现"动态调整"的基石。
vgcreate -s 8M vg_data 改成 8M、16M 等为什么要有 PE?因为 LVM 的所有扩容、迁移、条带化操作都是在 PE 级别完成的。把磁盘切成小方块的好处是:
你可以用 pvs -o+pv_pe_count 看到 PE 数量。
lvextend,文件系统跟着扩 | |
vgextendlvextend,无需重启 | |
lvcreate -s | |
lvcreate -m 1 | |
pvmove | |
LVM 不是银弹,下列场景要慎重:
下面我们从0开始,完成一个完整的 LVM 部署:创建 PV → VG → LV → 格式化 → 挂载 → 写入 fstab
为了安全起见,建议先在虚拟机里操作:
lsblk 确认硬盘已被识别$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part /
sdb 8:16 0 5G 0 disk # ← 新加的硬盘
sdc 8:32 0 5G 0 disk # ← 新加的硬盘/dev/sdb 和 /dev/sdc 就是我们要用的"原料"。
整个流程一图看懂:
/dev/sdb ─┐
├─ pvcreate ─→ PV
/dev/sdc ─┘ │
↓
vgcreate ─→ VG(vg_data)
│
↓ lvcreate -L 5G -n lv_demo
│
LV(/dev/vg_data/lv_demo)
│
↓ mkfs.xfs
│
文件系统(xfs)
│
↓ mount /mnt/lv
│
可用存储# 确认 lvm2 已安装
$ which lvm
/usr/sbin/lvm
# 确认要用的硬盘
$ lsblk -f /dev/sdb /dev/sdc
NAME FSTYPE LABEL UUID MOUNTPOINT
sdb
sdc如果 which lvm 没结果,装一下:
# RHEL / CentOS / openEuler
$ yum install -y lvm2
# Debian / Ubuntu
$ apt install -y lvm2$ pvcreate /dev/sdb /dev/sdc
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.pvcreate 做的事很轻量:在硬盘开头写一个 LVM 标签(包含 UUID、metadata 等),不破坏原有数据。
警告:如果硬盘上有文件系统或重要数据,
pvcreate不会自动备份。建议先wipefs清掉,再pvcreate。
$ vgcreate vg_data /dev/sdb /dev/sdc
Volume group "vg_data" successfully created这样 /dev/sdb 和 /dev/sdc 就被合并成了 10G 的 VG。
技巧:VG 名字要简洁,一般用业务名,比如
vg_data、vg_app、vg_db。
# 创建 5G 的 LV,名字叫 lv_demo
$ lvcreate -L 5G -n lv_demo vg_data
Logical volume "lv_demo" created.
# 或者用剩余空间的 100%(推荐用于第一个 LV)
$ lvcreate -l 100%FREE -n lv_demo vg_dataLV 创建完毕后,设备文件通常出现在 /dev/vg_data/lv_demo,同时有两个软链接:
$ ls -l /dev/vg_data/lv_demo
lrwxrwxrwx ... /dev/vg_data/lv_demo -> ../dm-0$ mkfs.xfs /dev/vg_data/lv_demo
meta-data=/dev/vg_data/lv_demo isize=512 agcount=4, agsize=327680 blks
...xfs 是 RHEL/CentOS 默认;Ubuntu/Debian 默认是 ext4,按需选择:
$ mkfs.ext4 /dev/vg_data/lv_demo$ mkdir -p /mnt/lv_demo
$ mount /dev/vg_data/lv_demo /mnt/lv_demo
# 验证
$ df -h /mnt/lv_demo
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_demo 5.0G 68M 5.0G 2% /mnt/lv_demo小知识:
/dev/vg_data/lv_demo和/dev/mapper/vg_data-lv_demo是同一个设备。后者是 device-mapper 的实际路径,前者是 udev 自动创建的符号链接,效果一样。
如果重启时不希望挂载丢失,需要写 /etc/fstab:
# 先查 UUID(更稳定)
$ blkid /dev/vg_data/lv_demo
/dev/vg_data/lv_demo: UUID="a1b2c3d4-..." TYPE="xfs"编辑 /etc/fstab,加一行:
UUID=a1b2c3d4-... /mnt/lv_demo xfs defaults 0 0强烈推荐用 UUID,因为设备名(
/dev/sdb)在重启后可能变,UUID 是固定的。
测试 fstab 配置无误:
$ mount -a # 不报错就说明配置 OK$ pvs
PV VG Fmt Attr PSize PFree
/dev/sdb vg_data lvm2 a-- 5.00g 4.99g
/dev/sdc vg_data lvm2 a-- 5.00g 5.00g
$ vgs
VG #PV #LV #SN Attr VSize VFree
vg_data 2 1 0 wz--n- 9.99g 4.99g
$ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_demo vg_data -wi-ao---- 5.00g看到上面的输出,恭喜!第一个 LVM 部署成功。
字段含义速记:
• Attr第二位w= 可写,i= 继承策略,a= active,o= online• Data%/Meta%= thin LV 的占用比例,普通 LV 显示-
pvcreate: Device /dev/sdb excluded by a filterlvm.conf 里过滤了某些设备。检查 /etc/lvm/lvm.conf 的 filter 配置,常见原因:设备被识别为 RAID 成员或已有分区表。
# 临时绕过过滤(慎用!)
$ pvcreate --config 'devices{filter=["a|.*|"]}' /dev/sdbmount: unknown filesystem type 'xfs'xfs 用户态工具没装:
$ yum install -y xfsprogs # RHEL 系
$ apt install -y xfsprogs # Debian 系启动时按 e 编辑内核参数,加 init=/bin/bash 或 rd.break,然后 mount -o remount,rw / 修改 fstab。
# 1. 卸载
$ umount /mnt/lv_demo
# 2. 删 LV
$ lvremove /dev/vg_data/lv_demo
# 3. 删 VG
$ vgremove vg_data
# 4. 删 PV
$ pvremove /dev/sdb /dev/sdc顺序不能反:先 LV → VG → PV。
pvcreate /dev/sdX | ||
vgcreate vg_name /dev/sdX | ||
lvcreate -L 5G -n lv_name vg_name | ||
mkfs.xfs /dev/vg_name/lv_name | ||
mount /dev/vg_name/lv_name /mnt/... | ||
/etc/fstab |
记住这六步,你就掌握了 LVM 80% 的常规操作。