在 QEMU 来宾中禁用帧缓冲区

max*_*zig 9 terminal framebuffer console qemu drm

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

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

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

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

附录

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

最方便的是一些 QEMU 配置,它强制内核只检测最基本的文本模式 - 因为来宾不必修改。

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

Fedora 访客示例

使用 Fedora 25 作为来宾,切换到帧缓冲区发生在 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
Run Code Online (Sandbox Code Playgroud)

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

max*_*zig 8

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

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

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

console=tty0 console=ttyS0
Run Code Online (Sandbox Code Playgroud)

或者

console=tty0 console=ttyS0,115200
Run Code Online (Sandbox Code Playgroud)

(来宾的内核参数,默认速度为 9600,这两个设置都适用于 qemu,通过将它们分配给GRUB_CMDLINE_LINUXin/etc/sysconfig/grub并执行grub2-mkconfig -o /etc/grub2.cfgor使设置在 Fedora 中持久化grub2-mkconfig -o /etc/grub2-efi.cfg

如果没有其他工作,则可以通过 Alt+3 在 qemu 内部切换到串行控制台。

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

bochs_drm.fbdev=off
Run Code Online (Sandbox Code Playgroud)

黑名单替代方案

或者,bochs_drm模块可以被列入黑名单 - 即通过在/etc/modprobe.d-下创建配置- 说 - bochs.conf

blacklist bochs_drm
Run Code Online (Sandbox Code Playgroud)

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

# dracut -f
Run Code Online (Sandbox Code Playgroud)

UEFI 引导

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

串行控制台

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

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

-display none -serial mon:stdio -echr 2
Run Code Online (Sandbox Code Playgroud)

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

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

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

多用户目标

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

# systemctl set-default multi-user.target
Run Code Online (Sandbox Code Playgroud)

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