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 文件形式存在。这意味着每次磁盘读写都要经过两层转换:
- 虚拟化层翻译指令
- 宿主机文件系统再处理一次
而专门为虚拟机设计的存储(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(不重装)
如果已经装好了,可以这样操作:
- 格式化 HDD 为 ext4:
mkfs.ext4 /dev/sdX1 - 复制 /var/lib/vz 到 HDD:
cp -a /var/lib/vz/* /mnt/temp_hdd/ - 在 /etc/fstab 添加自动挂载 HDD 到 /var/lib/vz
- 修改 /etc/pve/storage.cfg 确认路径正确
- 重启验证
这样 /var/lib/vz(仓库)放在 HDD 上,NVMe 就可以全部释放出来做 lvmthin,虚拟机跑在上面享受 NVMe 的高性能。
最终布局
| 用途 | 放在哪 | 说明 |
|---|---|---|
| PVE 系统、根目录 | NVMe 分区 | 只分 50-100G |
| 仓库(ISO、模板、备份) | HDD 挂载到 /var/lib/vz | 对性能不敏感 |
| 虚拟机磁盘 | NVMe 上创建 lvmthin/ZFS | 享受 NVMe 高性能 |
总结
Proxmox 这个 "坑" 说大不大,说小不小。local 存储不应该是用来跑虚拟机的,但新手很容易被 "默认存储" 这个标签误导。理解了存储类型的设计哲学后,布局就很清晰了:
- 仓库放仓库该放的东西
- 虚拟机跑在虚拟机该跑的存储上
希望后来人能少走这个弯路。