跳转到内容

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
lvs

lvs 的输出里能看到 data、root、swap 三个逻辑卷,data 那行的 Attr 以 t 开头(thin pool),Data% 列显示已用百分比。

各自放什么 ​

存储默认内容类型实际存放
localISO、容器模板、备份、片段/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。

调整方案按难度排序:

  1. 最简单:把备份和 ISO 放到别的盘/网络存储上,不动分区。
  2. 中等:缩小 thin pool、扩大 root。涉及 lvresize 和文件系统调整,有风险。
  3. 最彻底:重装,在安装向导的 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/data

thin pool 扩容不需要再调整文件系统。

卷组里没有空闲空间时,不能凭空扩容

VFree 是 0 的话,扩容需要先加一块物理盘进卷组(pvcreate + vgextend),或者缩小其他逻辑卷。后者有风险,操作前先备份。加盘的做法见加一块新盘。

检查结果 ​

建立一个每月看一眼的习惯:

sh
# 系统盘(local)
df -h /

# thin pool(local-lvm)
lvs -a

# 各存储概览
pvesm status

三条都在安全水位(低于 80%),就没问题。

延伸阅读 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。