Proxmox VM 直通声卡导致宿主机无法正常启动的解决方法

Proxmox VM 直通声卡导致宿主机无法正常启动的解决方法

故障原因

使用 PVE 虚拟的 Windows 10 通过远程桌面方式播放视频,在播放的过程中音频有时断时续的现象。分析可能是虚拟的声卡性能差导致,想仿照 PVE 直通 GPU 的方式直通宿主机声卡给 Windows 10,但经过一顿操作后直通还是失败了并且导致宿主机网络功能异常无法再通过远程访问 PVE 的管理界面。这时候一定会想到可以通过宿主机外接显示器操作啊,对不起,宿主机的显卡已经直通给 Windows 10 了接上也没有信号!还有一个致命的点就是虚机是随宿主机开机启动的,宿主机重启也没有用,事情陷入了僵局……

  1. 宿主机硬件直通失败导致宿主机网络发生问题无法进入 PVE 管理界面
  2. 虚机随宿主机开机启动,无法通过重启宿主机解决
  3. 由于宿主机的显卡已经直通给客户机,所以无法通过外接显示设备的方式操作宿主机

初步解决方案

远程访问 PVE 是没戏了,网络完全 Down 了起不来。因为 PVE 是基于 Linux 的并且 Bootloader 是 GRUB,想到了编辑 Grub 启动菜单进入 Recovery mode 然后修改 PVE 虚机的配置文件不让 windows 10 自动启动。具体操作步骤如下:

宿主机外接显示器,显示 GRUB 开机菜单(这时候客户机还没有启动,显卡没有被直通过去)

进入 recovery mode

  1. 在开机菜单出现时,键盘按e键进入编辑模式
    proxmox grub
  2. 找到linux /vmlinuz-...那一行
    grub editor
  3. 在后面输入init=/bin/bash
  4. CTRL + x会自动进行引导,稍等一会儿就引导完成就进入了 recovery mode
    recovery mode

使根文件系统可写

Recovery mode 默认以只读方式挂载根文件系统(rootfs),我们需要修改文件所以需要以读写方式重新挂载。

1
mount -rw -o remount /

修改 PVE 虚机配置失败

上面重新挂载了根文件系统后我们就可以去找找 PVE 的虚机配置文件了,经过查找在这个文件夹下:/etc/pve。但是,坑爹的来了,这文件夹就是空的什么也没有,挠头…
经过 Google 发现 PVE 的虚机配置文件是通过其特有的 pmxcfs[1]方式进行管理,它是通过一个 SQLite 数据库文件/var/lib/pve-cluster/config.db来存储配置文件的,PVE 启动后查询该数据库然后将配置文件数据加载进内存后挂载到/etc/pve目录下。
由于我们在 Recovery mode 下,上述挂载过程不会发生所以看不到虚机的配置文件,这就尴尬了 😂。

转个弯就能解决问题的方案

上面说到我们即使进入 Recovery mode 下也看不到虚机的配置,事情看似陷入了僵局。但是我们把问题再过一下脑子:

  1. 为什么要费这么大功夫进入 recovery mode?
    为了去改虚机的配置,不让这台错误配置直通的虚机启动
  2. 现在遇到什么问题?
    虚机的配置被 pmxcfs 管理,无法直接操作
  3. 现在有什么方案?
    1. 尝试在 recovery mode 下挂载 pmxcfs
    2. 备份然后删除 pmxcfs 数据库文件/var/lib/pve-cluster/config.db

上面 3.1 的方案官方给的教程是把 pmxcfs 数据库文件拷贝到一台健康的 PVE node 上去挂载然后修改,我仅此一个 PVE Node 无法实施。就只剩 3.2 的方案了。

具体操作如下:

删除 pmxcfs 数据库让 PVE 宿主机正常启动

以下操作在 Recovery mode 根文件系统可写环境下完成。

1
2
3
4
cd /var/lib
mkdir backup
mv pve-cluster/* backup/
sync

然后重启

恢复 pmxcfs 数据库

重启之后网络就可以进入 PVE 管理 UI 了,因为 pmxcfs 被清的缘故,这时 UI 中是没有任何虚机的。我们需要进行恢复 pmxcfs 数据库操作:

以下操作在 PVE node Shell 完成。

1
2
3
4
5
6
7
8
9
# 清理新生成的pmxcfs数据库文件
rm -rf /var/lib/pve-cluster/*

# 恢复
mv /var/lib/backup/* /var/lib/pve-cluster/
rm -rf /var/lib/backup

# 重启pve-cluster服务挂载恢复后的pmxcfs
systemctl restart pve-cluster

挂载之后,去/etc/pve/qemu-server文件夹下就能找到对应虚机的配置文件。比如本文中 windows 10 的虚机 id 是 100 对应配置文件就为 100.conf,编辑此文件删除掉错误的配置保存即可。

问题解决

完成上面的步骤,重启宿主机后 PVE 就正常工作了。


  1. Proxmox Cluster File System (pmxcfs) ↩︎

Proxmox VM 直通声卡导致宿主机无法正常启动的解决方法

https://0916app.com/2020/04/11/proxmox_passthrough_issue/

作者

m3m0ry

发布于

2020-04-11

更新于

2020-09-20

许可协议

评论