控制台 退出登录

解决Unraid虚拟机libvirt丢失问题

Unraid 7.x,ZFS 池,重启之后虚拟机页面打不开,libvirt 服务起不来。我翻遍了官方文档、论坛、Reddit,也问了好几个 AI,给出的答案要么是"检查磁盘阵列",要么是"重新分配 cache 盘",要么就是"重装 libvirt 插件"。没有一个是真正对症的。折腾了大半天,最后发现解决方案简单得离谱。

原因

硬盘重建的过程中,/mnt/user/system/libvirt/libvirt.img 被删了。这个文件是 libvirt 的核心存储,里面存着所有虚拟机的定义——CPU、内存、磁盘路径、NVRAM,全在里面。文件没了,libvirtd 起不来,VM 页面自然就是废的。重建硬盘的时候 Unraid 会重新格式化目标盘,如果你的 libvirt.img 恰好落在那块盘上(或者重建过程中路径发生了变动),这个文件就没了。官方文档里对这种情况没有任何说明,论坛里也几乎没人提过。

解决方法

打开 Unraid WebUI 右上角的终端(或者 SSH 进去),按顺序执行:

# 在 ZFS 池上创建目录结构
# system/libvirt 放 libvirt 镜像文件
# isos 放系统安装镜像
# domains 放虚拟机磁盘文件
mkdir -p /mnt/zfs/system/libvirt
mkdir -p /mnt/zfs/isos
mkdir -p /mnt/zfs/domains

# 创建 10G 稀疏文件作为 libvirt 存储
# 稀疏文件:ls 看是 10G,du 看是 0
# 只有实际写入数据时才占磁盘空间,不用担心浪费
truncate -s 10G /mnt/zfs/system/libvirt/libvirt.img
ls -lh /mnt/zfs/system/libvirt/libvirt.img
du -h /mnt/zfs/system/libvirt/libvirt.img

truncate 建的是稀疏文件,看着 10G,实际占用 0,写入多少占多少,不用担心空间。

然后去 Settings → VM Manager,把 Libvirt 存储位置 改成:/mnt/zfs/system/libvirt/libvirt.img
顺手把 ISO 路径和虚拟机存储路径也改了:

  • 虚拟机存储:/mnt/zfs/domains/

重启系统,完事。

验证

重启后 SSH 进去跑一下:

mount | grep libvirt
pgrep -a libvirtd
virsh list --all

三条都有正常输出就行了。virsh list --all 显示空列表是正常的,因为这是新建的 libvirt.img,之前的 VM 定义在旧文件里。磁盘文件(qcow2)还在的话,重新建个 VM 指过去就行,数据不丢。

为什么网上找不到这个答案

搜了官方文档、论坛、Reddit,也问了好几个 AI,全是在绕圈子。后来想明白了,这个问题之所以没人写,是因为它同时踩了好几个"搜索盲区":

第一,Unraid 官方文档压根没覆盖这个场景。 官方 VM 文档里写得很清楚,推荐把虚拟机放在 cache pool 的 SSD 上,默认路径是 /mnt/user/system/libvirt/libvirt.img。文档假设你的存储架构是"array + cache pool",对于"纯 ZFS 池用户"的 VM 配置,基本是空白。你按文档搜,搜到的全是 cache pool 相关的内容,跟你的情况对不上。

第二,报错信息完全误导人。 libvirt.img 被删之后,Unraid 不会告诉你"文件不存在"。VM 页面就是转圈,日志里写的是 libvirtd failed to start 之类的泛泛错误。你拿这个错误去搜,搜出来的全是"检查权限""重启服务""重装插件"——全是治标不治本的废话。真正的问题是文件没了,但没有任何一条日志明确告诉你这一点。

第三,"硬盘重建会删 libvirt.img"这件事,官方没提过。 重建硬盘的时候 Unraid 会格式化目标盘,如果 libvirt.img 恰好在那块盘上,它就没了。但官方文档里关于重建操作的说明,一个字都没提到对 /mnt/user/system/ 下文件的影响。你不知道文件会被删,自然也不会往这个方向去搜。

第四,解决方案太简单了,简单到没人觉得值得写。 就是建个目录、truncate 一个文件、改个路径。没有复杂的排查流程,没有高深的原理。大部分人遇到这个问题,要么折腾半天放弃了,要么在论坛里问了一句没人回,就没了。没有人会专门写一篇帖子说"我建了个文件就好了"。

第五,这个用户群体本身就小。 用 ZFS 池的 Unraid 用户是少数,在 ZFS 池上跑 VM 的更少,跑 VM 的同时还经历了硬盘重建的更是极少数。这几个条件叠在一起,能遇到这个问题的人可能全网就几十个。

所以如果你也是重建完硬盘之后 VM 没了,别搜了,直接按上面的来。


本文采用 CC BY-NC-SA 4.0 协议发布

相关文章

Proxmox VE 9.2 正式发布:引入动态负载均衡器与全新 SDN 功能

Proxmox VE 9.2 正式发布:引入动态负载均衡器与全新 SDN 功能

解决通达OA数据报表显示数据空白,原因权限分配不足

解决通达OA数据报表显示数据空白,原因权限分配不足

解决Halo2.x版本升级后启动卡死,MySQL 5.7版本兼容性及索引报错解决方案

解决Halo2.x版本升级后启动卡死,MySQL 5.7版本兼容性及索引报错解决方案