在 QEMU guest 中禁用帧缓冲区

在 QEMU guest 中禁用帧缓冲区

QEMU 选项-display curses-nographic -device sga(串行图形适配器)对于在图形环境之外运行 QEMU 非常方便。

(想想:远程 ssh 连接、救援系统等)

不过,这两种模式都无法与帧缓冲区文本模式一起使用。某些 Linux 发行版(例如 Fedora 25)的新默认设置似乎是在启动过程中的某个时刻,帧缓冲区文本模式似乎被激活,使得-display cursesQEMU 仅显示“1024x768 图形模式”。对于SGA,什么都不打印。

因此我的问题是:如何强制内核(以及启动的其余部分)仅使用老式的初始文本模式?

附录

添加nomodeset内核参数(和删除内核rhgb参数)并没有什么区别。

最方便的是一些 QEMU 配置,它强制内核只检测最基本的文本模式 - 因为不需要修改 guest 虚拟机。

设置串行控制台(例如通过将console=ttyS0内核参数添加到来宾)在我的环境中有效,但我观察到 Gnome 终端存在一些转义序列问题。此外,这对于已经使用帧缓冲区的引导加载程序(例如 Fedora 25 服务器 ISO 上的引导加载程序)没有帮助,并且需要对客户机进行修改。

Fedora 访客示例

使用 Fedora 25 作为 guest 虚拟机,切换到帧缓冲区发生在 initrd 运行时,一些日志消息(来自串行控制台):

[    1.485115] Console: switching to colour frame buffer device 128x48
[    1.493184] bochs-drm 0000:00:02.0: fb0: bochsdrmfb frame buffer device
[    1.502492] [drm] Initialized bochs-drm 1.0.0 20130925 for 0000:00:02.0 on minor 0

nofb这些消息还与和vga=normal(来宾)内核参数一起显示。

答案1

截至 2017 年,qemu 不再为 x86-64 提供仅文本模式的显卡模拟,这会强制来宾保持文本模式。

当前发行版(例如 Fedora 25)附带的bochs_drm内核模块默认启用帧缓冲区(例如 1024x768 图形模式)。与此相反,例如 Debian 8(稳定版)不提供此模块,因此它在完整启动期间保持老式文本模式。

因此,当从终端(例如使用-display curses)运行 qemu 时,启用串行控制台作为故障安全是有意义的:

console=tty0 console=ttyS0

或者

console=tty0 console=ttyS0,115200

(客户的内核参数,默认速度为 9600,两种设置都适用于 qemu,通过将它们分配给并执行或使设置在 FedoraGRUB_CMDLINE_LINUX/etc/sysconfig/grub持久grub2-mkconfig -o /etc/grub2.cfg存在grub2-mkconfig -o /etc/grub2-efi.cfg

如果其他方法都不起作用,则可以通过 Alt+3 在 qemu 内部切换到串行控制台。

第二个措施是通过模块参数禁用帧缓冲区bochs_drm- 即通过在来宾内核命令行上设置它:

bochs_drm.fbdev=off

黑名单替代方案

或者,可以将该模块列入黑名单 - 即通过在- 比如说 -bochs_drm下创建配置:/etc/modprobe.dbochs.conf

blacklist bochs_drm

由于 initramfs 也不能加载 bochs_drm 模块,因此必须确保此配置包含在 initramfs 中。在 Fedora 之类的发行版上,这是通过以下方式实现的:

# dracut -f

UEFI启动

当使用 UEFI 固件(例如-bios /usr/share/edk2/ovmf/OVMF_CODE.fd)启动 qemu 时,禁用 bochs fbdev 是不够的。然后,Fedora 启动在尝试切换到 bochs 帧缓冲区时挂起。将 bochs_drm 列入黑名单可以解决此问题,但这还不够。它只是获得 640 x 480 图形模式,内核不会将其重置为文本模式。因此,对于 UEFI 来宾,必须采用串行控制台路线。

串行控制台

结合使用串行控制台-display curses会产生次优的用户体验,因为诅咒会干扰 vt110/vt220 终端仿真。因此,它只能满足紧急情况。

更好的解决方案是完全关闭显示并使用组合的串行/监视器 Qemu 模式:

-display none -serial mon:stdio -echr 2

(其中Ctrl+b h显示帮助,Ctrl+b c在模式之间切换)

在 Fedora 27 中,Grub2 默认配置有串行控制台支持。因此,它也可以通过串行终端进行控制。

登录后调用resize会更新终端几何形状,因此,生成的终端的行为与本地终端一样好。

多用户目标

如果来宾映像具有图形登录管理器安装程序,则有意义禁用它

# systemctl set-default multi-user.target

否则,每次启动后都必须切换到第一个虚拟控制台(例如,使用 Curses 显示时 Alt+2 或 Alt+3)。

相关内容