← 回目录
23 Week 05 · 磁盘与软件

LVM:能在线扩容的分区

面试高频题。你装系统时选的自动分区,用的就是它——今天用昨天那块新盘,走一遍不停机扩容

为什么需要 LVM

先理解问题
传统分区 vs LVM
传统分区的问题
分区大小在格式化时就定死了/ 分了 50G 用满了,旁边 /home 空着 200G——你没法把空间挪过去,只能重装或者做很危险的操作。
LVM 的解法
在物理磁盘和文件系统之间加一层抽象。空间变成一个"池子",逻辑卷可以随时从池子里多要一点,而且不用停机。

三层结构

这个必须记住
PV → VG → LV,自下而上
PV · 物理卷
Physical Volume。一块硬盘或一个分区,被"登记"进 LVM 体系。pvcreate /dev/sdc
VG · 卷组
Volume Group把多个 PV 合成一个大池子。你的 Rocky 上这个池子叫 rl
LV · 逻辑卷
Logical Volume从池子里切一块出来,格式化后挂载使用——它就是你日常看到的那个"分区"。
类比
PV 是一张张钞票,VG 是钱包,LV 是从钱包里拿出来花的那部分。加钱进钱包(vgextend),花的时候就能多拿(lvextend)。
看现状:三条命令
$ sudo pvs
  PV         VG Fmt  Attr PSize   PFree
  /dev/sda2  rl lvm2 a--  <63.00g    0

$ sudo vgs
  VG #PV #LV #SN Attr   VSize   VFree
  rl   1   2   0 wz--n- <63.00g  0       ← 池子里没余量了

$ sudo lvs
  LV   VG Attr       LSize
  root rl -wi-ao---- <62.00g
  swap rl -wi-ao----   1.00g

在线扩容实操

四步,全程不停机

用昨天加的那块盘(如果昨天的 /data 还挂着,先 umount 并从 fstab 里注释掉;或者再加一块 10G 的新盘 sdc)。

① 把新盘变成 PV
$ sudo pvcreate /dev/sdc
  Physical volume "/dev/sdc" successfully created.

$ sudo pvs
  /dev/sdc      lvm2 ---  10.00g 10.00g     ← 还没加入任何 VG
② 加进卷组(往钱包里塞钱)
$ sudo vgextend rl /dev/sdc
  Volume group "rl" successfully extended.

$ sudo vgs
  VG #PV #LV Attr   VSize  VFree
  rl   2   2 wz--n- 72.99g 10.00g    ← 池子里有 10G 可用了
③ 扩逻辑卷
# 加 5G
$ sudo lvextend -L +5G /dev/rl/root

# 或者:把 VG 里剩余的全给它
$ sudo lvextend -l +100%FREE /dev/rl/root

$ sudo lvs
  LV   VG Attr       LSize
  root rl -wi-ao---- 67.00g      ← LV 变大了

$ df -h /
/dev/mapper/rl-root   62G  ...          ← ⚠️ 但 df 还是 62G!
这就是那个分水岭

扩了 LV ≠ 扩了文件系统。LV 是"容器"变大了,但里面的文件系统还是原来的大小,df 看不到变化。

只做前三步就以为完事了——这是最常见的错误,也是面试官用来分辨"背过"和"做过"的地方。

④ 扩文件系统 ← 关键
# xfs 用这个(RHEL 系默认,参数是挂载点)
$ sudo xfs_growfs /

# ext4 用这个(参数是设备名)
# sudo resize2fs /dev/rl/root

$ df -h /
/dev/mapper/rl-root   67G  ...            ← 现在真的变大了
别记混这两个
xfs_growfs
用于 xfs(RHEL/Rocky 默认)。参数是挂载点,比如 //data
resize2fs
用于 ext4(Ubuntu/Debian 常见)。参数是设备名,比如 /dev/rl/root
怎么确认自己是哪种
df -hT 看 Type 那一列。

建一个新的 LV

不只是扩容
从池子里切一块新的出来
$ sudo lvcreate -L 3G -n applv rl       # -n 起名字,rl 是卷组名
$ sudo mkfs.xfs /dev/rl/applv
$ sudo mkdir /app
$ sudo mount /dev/rl/applv /app

# 同样要写 fstab(昨天学的),LVM 的设备名是稳定的,可以直接用
$ echo '/dev/rl/applv /app xfs defaults 0 0' | sudo tee -a /etc/fstab
$ sudo mount -a                          ← 别忘了验证!

能不能缩小

一个重要的限制
xfs 不能缩小

xfs 只支持扩大,不支持缩小。想让 xfs 的 LV 变小,只能备份数据 → 删掉重建 → 恢复数据。

ext4 可以缩小,但必须先卸载(不能在线做),而且顺序和扩容相反:先缩文件系统,再缩 LV——顺序反了会丢数据。

实际工作中,缩容极少做。规划时宁可先分小一点,反正随时能扩。

今天的面试点

这题很常问
「LVM 有什么好处?」

能在线扩容——不用停机,也不用重新分区。空间不够时加块新盘做成 PV、加进 VG,然后 lvextend 就行。」

「还能跨多块物理磁盘组成一个大的逻辑卷,突破单盘容量限制。」

「说一下扩容的完整步骤」

pvcreatevgextendlvextendxfs_growfs。」

然后主动强调最后一步:「注意扩完 LV 还要扩文件系统,只做前面三步的话 df 里根本看不到变化——xfs 用 xfs_growfs 跟挂载点,ext4 用 resize2fs 跟设备名。

这个细节说明你真做过,而不是背的。

「PV、VG、LV 是什么关系?」

PV 是物理卷,就是被纳入 LVM 的硬盘或分区;VG 是卷组,把多个 PV 合成一个空间池;LV 是逻辑卷,从池子里划出来格式化挂载使用。」

能一口气讲清三层关系,这题就满分了。

今天的练习

动手做,约 20 分钟
  • sudo pvssudo vgssudo lvs 各看一遍,认出你系统的卷组名(应该是 rl
  • lsblk 对照着看,理解 sda2 → rl-root 这个层级关系
  • 在 Parallels 里再加一块 10 GB 硬盘(或者把昨天的 /data 卸载腾出来)
  • 完整走一遍扩容pvcreatevgextendlvextend -L +5G
  • 重点体会lvextend 之后先看一次 df -h /(没变),再 xfs_growfs /,再看一次(变了)
  • 选做lvcreate 建一个 2G 的新 LV,格式化挂到 /app,写进 fstab 并 mount -a 验证
明天预告

Day 24 讲 dnf 装软件和配国内源。相对轻松的一天,但里面有个「自建本地仓库」的点,在传统企业内网环境很常见。