PVE 存储全盘问号、本地盘读不到的死锁故障排查与虚拟机跨盘导出恢复

引言

在玩 Homelab 或管理 PVE(Proxmox VE)虚拟化集群时,你是否遇到过这样的”惊魂时刻”:登录 PVE 网页端,发现左侧树状图里所有的节点、虚拟机、容器,连同本地硬盘(local、local-lvm)全部变成了一个个灰色的问号(?),不仅虚拟机无法控制,连本地盘的容量都读取不出来了。

遇到这种情况先别慌!只要你的 SSH 还能连上,数据就大概率完好无损。本文将带你完整复盘一次真实的 PVE 存储死锁故障排查过程,并手把手教你如何在本地空间不足的情况下,安全地将数百 G 的虚拟机平滑导出。

一、故障现象与原因分析

1. 现象

  • PVE 网页端所有存储和虚拟机图标全带问号(?)。
  • 执行 pvesm status 检查存储状态时命令彻底锁死,终端无响应。
  • 执行 df -h 查看系统挂载,发现系统底层文件系统其实一切正常。

2. 根源:存储网络死锁引发的连锁雪崩

PVE 内部有一个状态收集守护进程叫 pvestatd,它会定期轮询 storage.cfg 中配置的所有存储后端。

如果你的配置里包含 PBS(Proxmox Backup Server)、NFS 或外部 K8s 存储,一旦这些外部网络存储由于断电、断网或配置变动导致无法连接,pvestatd 在轮询时就会陷入无休止的 I/O 等待。由于 PVE 的管理服务是单线程顺序处理的,一个网络存储死锁,会直接导致整个管理后台无法读取本地的 locallocal-lvm,从而引发网页端全盘问号的假死异象。

二、第一阶段:解开死锁,恢复本地盘读取

既然知道了是外部存储造成的死锁,我们就需要强制结束卡死的进程,并临时禁用有问题的存储。

Step 1:强行终止卡死的服务进程

直接通过 SSH 登录 PVE 后台,强制杀死所有卡住的管理进程(放心,这不会影响正在运行的虚拟机):

1
2
3
4
killall -9 pvesm
killall -9 pvestatd
killall -9 pvedaemon
killall -9 pveproxy

Step 2:修改存储配置,禁用嫌疑存储

编辑 PVE 的存储配置文件:

1
nano /etc/pve/storage.cfg

找到失联的外部存储(例如 pbs-pvek8stor),在它们的配置块末尾手动添加一行 disable 1

1
2
3
4
5
pbs: pbs-pve
datastore backup
server 192.168.1.100
content backup
disable 1 # <-- 添加这一行临时禁用

保存并退出(Ctrl+O 回车,Ctrl+X 退出)。

Step 3:重启 PVE 核心服务

1
2
3
4
systemctl restart pve-cluster
systemctl restart pvestatd
systemctl restart pvedaemon
systemctl restart pveproxy

此时再次运行 pvesm status,命令如果能够秒出结果,回到网页端刷新,本地硬盘的问号就会全部消失,恢复正常!

三、第二阶段:本地空间不足时的虚拟机导出方案

本地盘恢复后,如果你需要将虚拟机迁移到其他节点或做备份,但本地剩余空间不足以存放完整镜像,可以使用以下方案。

方案一:管道直传(本地空间完全不够时)

直接将虚拟磁盘通过管道传输到目标机器,不落盘:

1
2
3
# 将 VM 100 的磁盘直接传输到目标机器
qm list # 查看所有虚拟机
dd if=/dev/pve/vm-100-disk-0 bs=4M status=progress | ssh user@target-host "dd of=/mnt/backup/vm-100-disk-0.raw bs=4M"

方案二:挂载外置存储中转

如果有 USB 硬盘或 NFS 共享,直接挂载后导出:

1
2
3
4
5
6
7
8
9
# 挂载 USB 硬盘
mkdir -p /mnt/usb-backup
mount /dev/sdb1 /mnt/usb-backup

# 或挂载临时 NFS
mount -t nfs 192.168.1.200:/volume1/backup /mnt/nfs-backup

# 导出虚拟机配置
vzdump 100 --dumpdir /mnt/usb-backup --mode stop

方案三:瘦导出(精简置备磁盘可用)

如果虚拟磁盘内部实际使用空间远小于分配空间:

1
2
3
4
5
# 先使用 qemu-img 转换并压缩
qemu-img convert -O qcow2 /dev/pve/vm-100-disk-0 /mnt/backup/vm-100.qcow2 -c

# 然后传输压缩后的文件
rsync -avP /mnt/backup/vm-100.qcow2 user@target-host:/mnt/backup/

提示-c 参数启用压缩,对于内部空闲空间较多的磁盘效果显著。

四、总结与预防建议

故障复盘

阶段 操作 目的
现象 pvesm status 卡死、网页端全盘问号 确认是管理面死锁而非数据面故障
定位 检查 storage.cfg 中外置存储配置 确认是否有不可达的外部存储后端
恢复 killall 卡死进程 → 禁用故障存储 → 重启服务 恢复本地盘读取和管理面可用
导出 管道直传 / 外置存储 / 瘦导出 在空间不足时完成虚拟机迁移

预防建议

  1. 外置存储独立监控:对 PBS、NFS 等外部存储设置独立健康检查,避免单点影响整个 PVE 管理面。
  2. 定期巡检 storage.cfg:确保不使用的存储条目及时移除或设为 disable 1
  3. 预留本地空间:每个 PVE 节点至少预留 50-100GB 的临时空间以应对紧急导出场景。
  4. 配置告警机制:结合 pvesm status 的返回值编写 cron 脚本,出现异常时主动通知。

只要 SSH 还能连上,PVE 的数据就大概率是安全的——牢记这一点,遇事不慌,按步骤排查即可。


PVE 存储全盘问号、本地盘读不到的死锁故障排查与虚拟机跨盘导出恢复
https://blog.952405.xyz/2026/06/pve-storage-deadlock-recovery/
作者
iDing
发布于
2026年6月30日
许可协议
转发请注明出处