Proxmox VE 的 local 存储到底能不能装虚拟机?踩坑实录

问题背景

我装了一台 Proxmox VE 9 服务器,NVMe 硬盘,安装时 PVE 自动划分了 local 存储(挂载在 /var/lib/vz)作为默认存储。我在这个 local 上创建虚拟机,分配了 200G 磁盘空间,AlmaLinux 能正常安装完成,但一安装管理面板软件(比如宝塔、1Panel 这类)就卡住,报 IO-ERROR 错误。

换了一台服务器,同样的现象。这就不是偶发了,肯定是我哪里配置不对。

第一个排查阶段:硬件没问题

先排查硬件。在宿主机上跑了 dmesg 查内核错误,干干净净,没有任何硬盘、NVMe 或 SCSI 相关的报错。检查 pvesm status 看存储状态:

Name         Type     Status     Total (KiB)      Used (KiB) Available (KiB)        %
local         dir     active      1007942528        14603904       993338624    1.45%

local 存储类型是 dir(目录),可用空间还有 900 多 G,不是空间不足的问题。

但注意到系统里还有一个 lvmthin 类型的存储(hdb1),大量空间未使用。这就奇怪了——为什么 PVE 默认把我虚拟机建在了 dir 存储上,而 lvmthin 却空着?

第二个阶段:原来 local 存储不是给虚拟机用的

查了一圈资料才发现,Proxmox 的 local(目录类型)存储,设计用途根本不是运行虚拟机磁盘的。PVE 官方文档写得很清楚,local 存储默认只配置了三种内容类型:

  • ISO 镜像:安装系统用的光盘镜像
  • 容器模板:LXC 容器用的模板文件
  • 备份文件:虚拟机和容器的备份

也就是说,local 就是一个 "仓库"、一个 "资料库",用来存放静态文件的。而虚拟机系统盘这种需要高频读写的东西,应该放在专门的存储上。

为什么 local 不适合跑虚拟机

local 是宿主机文件系统上的一个普通目录,虚拟机磁盘在里面以 qcow2 文件形式存在。这意味着每次磁盘读写都要经过两层转换:

  1. 虚拟化层翻译指令
  2. 宿主机文件系统再处理一次

而专门为虚拟机设计的存储(lvmthin、ZFS)直接提供块设备,虚拟机读写几乎直达硬件,延迟低得多。

更重要的是,目录存储不支持快照、克隆、精简配置这些虚拟化高级功能,而 lvmthin 和 ZFS 天生就支持这些。

对比表格

特性local(目录存储)lvmthin / ZFS(专用存储)
本质普通目录下的 qcow2 文件块设备(接近裸盘)
性能低,两层转换开销大高,直通硬件
快照/克隆不支持原生支持
设计用途ISO、模板、备份仓库虚拟机磁盘运行

第三个阶段:那 PVE 默认创建 local 的意义何在?

这是一个很自然的疑问。既然 local 不适合装虚拟机,PVE 为什么默认创建它?我当初也这么想——默认的存储总该是最合理的吧?

实际上 PVE 默认创建两个存储是有明确分工的:

  • local(目录):管理系统文件——ISO 镜像、容器模板、备份数据。这些都是读多写少、对性能不敏感的文件。
  • local-lvm(LVM-Thin):这才是跑虚拟机的地方。专门为虚拟机磁盘设计的高性能池。

问题是,很多新手在创建虚拟机时,存储下拉列表里两个都显示,如果对原理不了解,很自然地就会选第一个(local),然后踩坑。

我的情况是压根没有 local-lvm(因为我手动分了其他存储),所以所有的虚拟机都创建在了 local 上,不卡才怪。

最终的解决方案

把虚拟机建在正确的存储上

把虚拟机磁盘创建在 lvmthin(或 ZFS)上,问题立即解决。安装软件不再卡死,IO-ERROR 彻底消失。

如果只有一块硬盘,怎么规划最合理?

方案一:安装时专家模式分区(推荐重装时用)

在 PVE 安装界面按 Ctrl + Alt + F2 进入 shell,输入 debug 后切回图形界面,会看到 "专家模式" 选项。在这里可以自定义分区:

  • NVMe 上只分 50-100G 给根目录(/)
  • 剩余 NVMe 空间留空,安装完成后在 Web 界面创建为 lvmthin 或 ZFS 池
  • 如果有多块硬盘,把 HDD 挂载到 /var/lib/vz 做仓库

方案二:安装后迁移 local 到 HDD(不重装)

如果已经装好了,可以这样操作:

  1. 格式化 HDD 为 ext4:mkfs.ext4 /dev/sdX1
  2. 复制 /var/lib/vz 到 HDD:cp -a /var/lib/vz/* /mnt/temp_hdd/
  3. 在 /etc/fstab 添加自动挂载 HDD 到 /var/lib/vz
  4. 修改 /etc/pve/storage.cfg 确认路径正确
  5. 重启验证

这样 /var/lib/vz(仓库)放在 HDD 上,NVMe 就可以全部释放出来做 lvmthin,虚拟机跑在上面享受 NVMe 的高性能。

最终布局

用途放在哪说明
PVE 系统、根目录NVMe 分区只分 50-100G
仓库(ISO、模板、备份)HDD 挂载到 /var/lib/vz对性能不敏感
虚拟机磁盘NVMe 上创建 lvmthin/ZFS享受 NVMe 高性能

总结

Proxmox 这个 "坑" 说大不大,说小不小。local 存储不应该是用来跑虚拟机的,但新手很容易被 "默认存储" 这个标签误导。理解了存储类型的设计哲学后,布局就很清晰了:

  • 仓库放仓库该放的东西
  • 虚拟机跑在虚拟机该跑的存储上

希望后来人能少走这个弯路。

Last modification:May 21st, 2026 at 05:33 pm
如果觉得我的文章对你有用,请随意赞赏