外观
local 与 local-lvm 到底是什么
用 ext4/xfs 安装 PVE 后,你会得到两个默认存储。它们看起来像两个盘,实际上住在同一块物理磁盘上,只是切成了两块。搞清楚这一点,「为什么 local-lvm 满了」这类问题就好理解了。
安装程序做了什么
选 ext4 安装时,PVE 把系统盘分成这样:
text
物理磁盘
├── EFI 分区(引导)
└── LVM 卷组 pve
├── root → 挂载在 /,装系统,也是 local 存储的所在地
├── swap → 交换分区
└── data → LVM-Thin 池,就是 local-lvm所以:
| 存储 | 实际是什么 | 挂载在哪 |
|---|---|---|
local | 卷组里 root 逻辑卷上的一个目录 | /var/lib/vz |
local-lvm | 卷组里的 thin pool data | 不挂载,是块设备池 |
用命令看:
sh
lsblk
vgs
lvslvs 的输出里能看到 data、root、swap 三个逻辑卷,data 那行的 Attr 以 t 开头(thin pool),Data% 列显示已用百分比。
各自放什么
| 存储 | 默认内容类型 | 实际存放 |
|---|---|---|
local | ISO、容器模板、备份、片段 | /var/lib/vz/template/iso/、/var/lib/vz/dump/ 等 |
local-lvm | 虚拟机磁盘、容器根文件系统 | LVM 精简卷,每个客户机一个 |
用 ZFS 安装的话没有 local-lvm
选 ZFS 安装时,默认存储是 local(目录)加 local-zfs(ZFS 池)。角色分工一样,但底层机制不同,见 ZFS 入门。
三个常见麻烦
1. local 满了:备份和 ISO 堆积
local 用的是系统盘的 root 分区。它满了会导致整个系统出问题,不只是存不下备份——日志写不进去、服务启动失败。
先看谁占了空间:
sh
df -h /
du -sh /var/lib/vz/* | sort -h常见元凶:
/var/lib/vz/dump/:备份文件。根本解决办法是把备份挪到别的存储。/var/lib/vz/template/iso/:装完就忘了删的 ISO。/var/log/:日志。可以journalctl --vacuum-size=500M收一收。
2. local-lvm 满了:但 df 看不出来
df -h 不会显示 LVM-Thin 池的使用情况,因为它不是挂载的文件系统。用:
sh
lvs -a看 data 那行的 Data% 和 Meta%。
thin pool 写满会让客户机磁盘只读甚至损坏
LVM-Thin 是精简分配:你给虚拟机分了 100 GB,但它只在实际写入时占用空间。这意味着所有客户机分配的总容量可以超过池的物理容量(超额分配)。一旦它们真的写满,thin pool 用尽,正在运行的客户机会遇到写入失败,文件系统可能损坏。
处理方式:把 Data% 当作一个必须盯的指标,超过 80% 就该清理或扩容,不要等到 100%。
清理方向:
- 删掉不用的虚拟机、容器和快照(快照会持续占用空间,而且容易被忘记)。
- 在客户机里开启 discard/TRIM,让删除的空间能回收给 thin pool,见下一节。
- 确认虚拟机磁盘没有被分配得过大。
3. 空间分配不合理:local 太大或太小
安装程序默认的分法对很多人不合适。比如只打算跑几个容器却分了几百 GB 给 local-lvm,或者要存不少 ISO 却只给 local 留了几十 GB。
调整方案按难度排序:
- 最简单:把备份和 ISO 放到别的盘/网络存储上,不动分区。
- 中等:缩小 thin pool、扩大 root。涉及
lvresize和文件系统调整,有风险。 - 最彻底:重装,在安装向导的 Options 里手动设置
hdsize。
重装往往比调分区划算
如果这台机器还没跑正式业务,重装一次是最省事的方案。LVM 在线缩容有风险,而重装只要十几分钟。
开启 discard,让删除的空间回来
客户机里删了文件,thin pool 并不知道,那块空间依然算已用。要让它回收,需要两端配合:
PVE 端:虚拟机 → Hardware → 选中磁盘 → Edit,勾选 Discard。磁盘总线建议用 VirtIO SCSI。
客户机端:Linux 客户机确认 fstrim.timer 已启用:
sh
# 在客户机内部执行
systemctl enable --now fstrim.timer
systemctl status fstrim.timer手动触发一次看效果:
sh
# 在客户机内部执行
fstrim -av然后回宿主机 lvs -a 看 Data% 有没有下降。
Windows 客户机装好 VirtIO 驱动后默认会发 TRIM,一般不用额外配置。
给 local-lvm 扩容
如果同一个卷组里还有未分配空间(vgs 的 VFree 列大于 0):
sh
lvextend -l +100%FREE /dev/pve/datathin pool 扩容不需要再调整文件系统。
卷组里没有空闲空间时,不能凭空扩容
VFree 是 0 的话,扩容需要先加一块物理盘进卷组(pvcreate + vgextend),或者缩小其他逻辑卷。后者有风险,操作前先备份。加盘的做法见加一块新盘。
检查结果
建立一个每月看一眼的习惯:
sh
# 系统盘(local)
df -h /
# thin pool(local-lvm)
lvs -a
# 各存储概览
pvesm status三条都在安全水位(低于 80%),就没问题。