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.9G
  • ubuntu--vg 是 Volume Group
  • ubuntu--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。此时需要:

  1. fdiskgdisk 创建新分区
  2. pvcreate 创建新 PV
  3. vgextend 加入 VG
  4. 再执行 lvextend + resize2fs

步骤与上面 CentOS 7 方案一致。

7.3 文件系统是 XFS 不是 ext4

# 先确认文件系统类型
df -T /

# 如果是 xfs,用这个替代 resize2fs
sudo xfs_growfs /

XFS 的 xfs_growfs 只能以挂载点为参数(/),不能指定设备路径。

8. 安全提示

  • LVM 操作有风险,虽然 lvextendresize2fs 非常成熟,但生产环境操作前建议备份重要数据
  • 如果使用了 LVM 快照(lvcreate -s),需要在扩容前确认快照不会因 COW 写满
  • 扩容是安全的(只增加不减少),缩容lvreduce / resize2fs 缩小)才危险——必须先缩文件系统再缩 LV,顺序错了直接丢数据

9. 总结

Ubuntu LVM 磁盘扩容的核心思路:

  1. lsblk 看磁盘布局,确认 PV 已覆盖整盘
  2. vgs 确认 VG 中有空闲空间(VFree)
  3. lvextend 将空闲空间分配给 LV
  4. resize2fs 在线扩展文件系统

整个过程 30 秒完成,无需重启,适合生产环境在线操作。


扩展阅读: