1. 问题场景
安装 Ubuntu Server 时,如果安装程序使用了 LVM 默认配置,通常只会分配磁盘的一部分给 root 逻辑卷(Logical Volume),剩余空间留在 Volume Group 中未使用。例如:
- 磁盘总容量 200GB
- root 分区仅分配了 98.5GB
- VG 中还有 98.5GB 空闲
此时需要将剩余空间在线扩充到 / 分区,无需重启、无需卸载。
2. 前置知识
在动手之前,理解 LVM 的三层抽象有助于你排查更复杂的场景:
| 层 | 组件 | 类比 |
|---|---|---|
| PV (Physical Volume) | /dev/sda3 |
一块硬盘原料 |
| VG (Volume Group) | ubuntu-vg |
一个"存储池",由若干 PV 组成 |
| LV (Logical Volume) | ubuntu-lv |
从池中切出的"虚拟分区",格式化后挂载 |
扩容的本质就是:池(VG)里有空闲空间 → 划给虚拟分区(LV)→ 通知文件系统去用新空间。
PE (Physical Extent) 是 LVM 的最小分配单位,默认 4MiB。
lvextend -l +100%FREE中的-l就是以 PE 为单位分配——+100%FREE表示"把 VG 中所有空闲 PE 全给这个 LV"。
3. 检查当前磁盘布局
使用 lsblk 查看分区和挂载点:
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,FSAVAIL,FSUSE%
输出示例:
NAME SIZE TYPE FSTYPE MOUNTPOINT FSAVAIL FSUSE%
sda 200G disk
├─sda1 1G part vfat /boot/efi 1G 1%
├─sda2 2G part ext4 /boot 1.7G 5%
└─sda3 196.9G part LVM2_member
└─ubuntu--vg-ubuntu--lv 98.5G lvm ext4 / 79.5G 12%
可以看到:
sda3是整个 LVM 物理卷(PV),大小 196.9Gubuntu--vg是 Volume Groupubuntu--lv是 Logical Volume,只用了 98.5G- 还有约 98.5G 空闲空间在 VG 中未被分配
再用 vgs / lvs / pvs 确认 LVM 状态:
vgs && lvs && pvs
输出示例:
VG #PV #LV #SN Attr VSize VFree
ubuntu-vg 1 1 0 wz--n- <196.95g 98.47g
LV VG Attr LSize
ubuntu-lv ubuntu-vg -wi-ao---- 98.47g
PV VG Fmt Attr PSize PFree
/dev/sda3 ubuntu-vg lvm a-- <196.95g 98.47g
关键信息:VFree = 98.47g,说明 VG 中有大量空闲空间等待分配。
💡 小技巧: 如果
lsblk输出太杂乱,可以只看 LVM 相关行:lsblk | grep -E '(lvm|disk$)'
4. 一步扩容:LV + 文件系统
Ubuntu 默认使用 ext4 文件系统,支持在线 resize。只需两条命令:
# 将 VG 中所有剩余空间分配给 LV
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
# 在线扩展 ext4 文件系统
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
命令详解
| 参数 | 含义 | 常见误区 |
|---|---|---|
-l +100%FREE |
用 PE 数量表示:VG 所有空闲全给 | -l 是 PE 单位,-L 才是容量单位(如 -L +50G) |
-L +50G |
只增加 50G,而非全部 | 如果不知道剩余多少,用 -l +100%FREE 最安全 |
resize2fs |
扩展 ext3/ext4 文件系统 | 仅适用于 ext 家族,XFS 用 xfs_growfs |
⚠️ 文件系统差异: 如果文件系统是 XFS(如 CentOS/RHEL 默认),需使用
xfs_growfs /而非resize2fs。Ubuntu 默认是 ext4,所以用resize2fs。如果不确定,用df -T /查看 Type 列。
执行输出示例:
Size of logical volume ubuntu-vg/ubuntu-lv changed from 98.47 GiB (25209 extents) to <196.95 GiB (50418 extents).
Logical volume ubuntu-vg/ubuntu-lv successfully resized.
resize2fs 1.47.2 (1-Jan-2025)
Filesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required
old_desc_blocks = 13, new_desc_blocks = 25
The filesystem on /dev/ubuntu-vg/ubuntu-lv is now 51628032 (4k) blocks long.
5. 验证结果
df -h /
lsblk /dev/sda
最终输出:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv 194G 12G 173G 7% /
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot/efi
├─sda2 8:2 0 2G 0 part /boot
└─sda3 8:3 0 196.9G 0 part
└─ubuntu--vg-ubuntu--lv 252:0 0 196.9G 0 lvm /
/ 从 98.5G → 196.9G,剩余空间全部并入,零停机、零重启。
6. 与 CentOS 方案的区别
之前写过一篇 CentOS 7 磁盘扩容,流程复杂得多——需要 fdisk 手动创建新分区、partprobe 重读分区表、pvcreate 创建 PV、vgextend 扩展 VG,最后才 lvextend + xfs_growfs。
而 Ubuntu 安装器(subiquity)在安装时已经将整块磁盘作为一个 PV 加入了 VG,只是 LV 没有分配全部空间。所以只需要一步 lvextend + resize2fs 即可,无需操作分区表。
| 步骤 | CentOS 7 | Ubuntu 26.04 |
|---|---|---|
| 创建分区 | fdisk 手动创建 |
无需(安装时已整盘 PV) |
| 重读分区表 | partprobe |
无需 |
| 创建 PV | pvcreate /dev/sda3 |
无需 |
| 扩展 VG | vgextend centos /dev/sda3 |
无需 |
| 扩展 LV | lvextend -l +100%FREE |
lvextend -l +100%FREE |
| 扩展文件系统 | xfs_growfs / |
resize2fs /dev/... |
7. 排障指南
7.1 resize2fs 报错 “No space left on device”
原因: VG 中已经没有空闲空间了,或者 LV 已经占满了 VG。
排查: vgs 看 VFree 是否为 0。如果 VFree 有值但 resize2fs 报错,检查 LV 大小是否已经等于 VG 大小。
7.2 磁盘没有整盘作为 PV
如果你的 lsblk 输出中 sda3 的大小明显小于磁盘总容量(比如 200G 磁盘只有 100G 的 sda3),说明安装时没有把整盘分给 LVM。此时需要:
fdisk或gdisk创建新分区pvcreate创建新 PVvgextend加入 VG- 再执行
lvextend+resize2fs
步骤与上面 CentOS 7 方案一致。
7.3 文件系统是 XFS 不是 ext4
# 先确认文件系统类型
df -T /
# 如果是 xfs,用这个替代 resize2fs
sudo xfs_growfs /
XFS 的 xfs_growfs 只能以挂载点为参数(/),不能指定设备路径。
8. 安全提示
- LVM 操作有风险,虽然
lvextend和resize2fs非常成熟,但生产环境操作前建议备份重要数据 - 如果使用了 LVM 快照(
lvcreate -s),需要在扩容前确认快照不会因 COW 写满 - 扩容是安全的(只增加不减少),缩容(
lvreduce/resize2fs缩小)才危险——必须先缩文件系统再缩 LV,顺序错了直接丢数据
9. 总结
Ubuntu LVM 磁盘扩容的核心思路:
- lsblk 看磁盘布局,确认 PV 已覆盖整盘
- vgs 确认 VG 中有空闲空间(VFree)
- lvextend 将空闲空间分配给 LV
- resize2fs 在线扩展文件系统
整个过程 30 秒完成,无需重启,适合生产环境在线操作。
扩展阅读: