这确实是一个比较“冷门”但逻辑清晰的现象。你能通过 Ctrl + Alt + F1 恢复画面,说明 OpenStack 的 VNC 通道、网络和代理服务全都是正常的。
问题的核心在于 飞腾(ARM64)架构下 Linux 内核对“虚拟显示器”的输出策略 导致的。
为什么按了 Ctrl + Alt + F1 就会好?
TTY 激活机制: 许多针对 ARM 优化的 Linux 镜像在启动时,内核会将默认输出挂载到串口(Serial Console,即 ttyAMA0)或者特定的虚拟终端上。当你第一次打开 VNC 时,显示器(图形界面)可能正处于“休眠”或“未分配”状态,屏幕上显示 "Display output is not active"。
强制重绘(Redraw): 按下 Ctrl + Alt + F1 强制 Linux 内核切换虚拟终端。这个动作会触发 QEMU 的显卡驱动重新进行一次 帧缓冲(Framebuffer)初始化。既然你之前按回车有数据波动,说明指令传进去了,只是系统没“画”出来,切换 TTY 相当于手动点亮了显示器。
显卡驱动的“懒加载”: 在飞腾环境下,某些显卡驱动(如 virtio-gpu)在没有检测到物理显示器交互时,可能不会主动向 VNC 发送首个画面帧。
如何永久解决?(不用每次都按快捷键)
既然你已经确认了手动切换能行,可以通过以下优化让它自动“点亮”:
方法 A:修改镜像启动参数(推荐)
通过 SSH 登录虚拟机,修改 /etc/default/grub:
找到 GRUB_CMDLINE_LINUX。
添加或修改:console=tty0(确保它是第一个,或者至少存在)。
关键点:确保没有 nomodeset 这种禁用模式设置的参数。
更新并重启:sudo update-grub。
方法 B:修改 Nova 显卡配置
在计算节点的 /etc/nova/nova.conf 中,尝试将显卡类型固定为 virtio(它是目前 ARM64 下兼容性最好的):
Ini, TOML
[libvirt]
设置默认显卡模型
video_model = virtio
然后对镜像执行:
Bash
openstack image set --property hw_video_model=virtio <镜像ID>
方法 C:禁用屏幕保护/黑屏
如果是因为虚拟机系统内部自动关屏导致的,进入系统后执行:
Bash
禁用控制台自动关闭显示器
setterm -blank 0 -powersave off -cursor on
总结
你搭建的 OpenStack 本身没问题,这是 ARM 架构镜像与 QEMU 虚拟显卡之间的通信默认不够“主动” 造成的。
顺便问一下: 您现在的镜像里面是带图形界面(GUI)的 Ubuntu/Kylin,还是纯命令行模式?如果是纯命令行,建议直接在镜像里把 tty0 设为默认控制台。