QEMU 选项-display curses
和-nographic -device sga
(串行图形适配器)对于在图形环境之外运行 QEMU 非常方便。
(想想:远程 ssh 连接、救援系统等)
不过,这两种模式都无法与帧缓冲区文本模式一起使用。某些 Linux 发行版(例如 Fedora 25)的新默认设置似乎是在启动过程中的某个时刻,帧缓冲区文本模式似乎被激活,使得-display curses
QEMU 仅显示“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.d
bochs.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)。