AlmaLinux 9:LVM 扩容与 XFS 增长(真机实测)
在一台 AlmaLinux 9.8 真机(kernel 5.14.0-687.54.1.el9_8,4 vCPU / 3 GB 内存)上,用 2 GB 的文件做 loop 设备,完整执行:pvcreate → vgcreate → lvcreate -L 1G → mkfs.xfs → mount → df → lvextend -L +512M → df(未变)→ xfs_growfs → df(变化)→ 卸载并删除 LV/VG/PV/loop。日志:plans/content-expansion/evidence/logs/alma-storage-lvm.log。
真实磁盘上的分区调整(parted/growpart)未在本页验证,只覆盖「PV 已在、只需扩 LV 和文件系统」这一段。
为什么要用 loop 设备做实验
Section titled “为什么要用 loop 设备做实验”直接在系统盘上练 LVM,一次 pvcreate 写错盘就是事故。用文件做 loop 设备等价于一块独立磁盘,练完 losetup -d 即可回收,不影响真实分区。本页所有输出都来自这样一块 2 GB 的 loop 盘。
建 PV / VG / LV
Section titled “建 PV / VG / LV”sudo dnf install -y lvm2 xfsprogstruncate -s 2G /var/tmp/lvm-lab.imgLOOP=$(sudo losetup -f --show /var/tmp/lvm-lab.img)sudo pvcreate -y "$LOOP"sudo vgcreate vglab "$LOOP"sudo lvcreate -y -L 1G -n lvdata vglabsudo mkfs.xfs -q /dev/vglab/lvdataPhysical volume "/dev/loop0" successfully created.Volume group "vglab" successfully createdLogical volume "lvdata" created.挂载并记录初始容量
Section titled “挂载并记录初始容量”sudo mkdir -p /mnt/lvmlabsudo mount /dev/vglab/lvdata /mnt/lvmlabdf -h /mnt/lvmlab | tail -1/dev/mapper/vglab-lvdata 960M 39M 922M 5% /mnt/lvmlab1 GiB 的 LV 格式化成 XFS 后可用约 960 MB(元数据开销)。
扩 LV:只做 lvextend 时 df 不变
Section titled “扩 LV:只做 lvextend 时 df 不变”sudo lvextend -L +512M /dev/vglab/lvdatadf -h /mnt/lvmlab | tail -1Size of logical volume vglab/lvdata changed from 1.00 GiB (256 extents) to 1.50 GiB (384 extents).Logical volume vglab/lvdata successfully resized.
/dev/mapper/vglab-lvdata 960M 39M 922M 5% /mnt/lvmlab这是最常见的坑:LV 已经变成 1.5 GiB,但文件系统不知道,df 还是 960M。
扩文件系统:xfs_growfs 之后才生效
Section titled “扩文件系统:xfs_growfs 之后才生效”sudo xfs_growfs /mnt/lvmlab | tail -3df -h /mnt/lvmlab | tail -1data blocks changed from 262144 to 393216
/dev/mapper/vglab-lvdata 1.5G 43M 1.4G 3% /mnt/lvmlabxfs_growfs 的参数是挂载点,不是 LV 路径;对 XFS 只能用挂载点。
收尾:卸载并回收 loop 设备
Section titled “收尾:卸载并回收 loop 设备”sudo umount /mnt/lvmlabsudo lvremove -y vglab/lvdatasudo vgremove -y vglabsudo pvremove -y "$LOOP"sudo losetup -d "$LOOP"rm -f /var/tmp/lvm-lab.img顺序是「卸载 → 删 LV → 删 VG → 删 PV → 解绑 loop」。
- 只
lvextend不扩文件系统:df永远不变,这是本节的重点; - 对 ext4 用
xfs_growfs:会直接报错,ext4 要用resize2fs; - 扩容前没确认挂载点:
xfs_growfs /dev/...传错参数会报「not a mounted XFS」。
练习:在任意机器上安全练一遍
Section titled “练习:在任意机器上安全练一遍”sudo dnf install -y lvm2 xfsprogstruncate -s 2G /var/tmp/lab.imgLOOP=$(sudo losetup -f --show /var/tmp/lab.img)sudo pvcreate -y "$LOOP" && sudo vgcreate vglab "$LOOP"sudo lvcreate -y -L 1G -n lvdata vglabsudo mkfs.xfs -q /dev/vglab/lvdatasudo mkdir -p /mnt/lvmlab && sudo mount /dev/vglab/lvdata /mnt/lvmlabsudo lvextend -L +512M /dev/vglab/lvdatasudo xfs_growfs /mnt/lvmlabdf -h /mnt/lvmlab检查:
lvs vglab→ LV 大小 1.50gdf -h /mnt/lvmlab→ 约 1.5Gxfs_info /mnt/lvmlab | grep data→ blocks 变为 393216
常见问题
lvextend 之后 df 为什么没变?
因为扩容分两步:lvextend 扩的是逻辑卷(块设备),文件系统仍按原大小使用。XFS 要再执行 xfs_growfs <挂载点>,ext4 用 resize2fs <设备>。
XFS 能缩小吗?
不能。XFS 只支持在线扩容,不支持缩小;需要更小的文件系统只能备份后重建。选 XFS 时要预留好容量规划。
生产上扩 LV 前要做什么?
先确认 VG 有足够空闲 PE(vgs 看 VFree),确认挂载点与文件系统类型(findmnt),必要时先做快照或备份;扩 LV 本身可在线做,但扩文件系统前不要中断挂载。
- swap 与容量:swap 大小与 swapfile
- 安装后核对:新装系统 7 项核对
- 事务回滚:dnf history undo