max*_*zig 9 terminal framebuffer console qemu drm
QEMU 选项-display curses
和-nographic -device sga
(串行图形适配器)对于在图形环境之外运行 QEMU 非常方便。
(想想:远程 ssh 连接、救援系统等)
但是,这两种模式都无法与帧缓冲区文本模式一起使用。某些 Linux 发行版(例如 Fedora 25)的新默认值似乎是在启动过程中的某个时刻,帧缓冲区文本模式似乎被激活,因此-display curses
QEMU 仅显示“1024x768 图形模式”。使用 SGA 只是不打印任何内容。
因此我的问题是:如何强制内核(以及启动的其余部分)只使用老式的初始文本模式?
添加nomodeset
内核参数(并删除rhgb
一个)并没有什么区别。
最方便的是一些 QEMU 配置,它强制内核只检测最基本的文本模式 - 因为来宾不必修改。
设置串行控制台(例如通过将console=ttyS0
内核参数添加到来宾)在我的环境中有效,但我观察到 Gnome 终端存在一些转义序列问题。此外,这对已经使用帧缓冲区的引导加载程序(例如 Fedora 25 服务器 ISO 上的那个)没有帮助 - 并且需要修改来宾。
使用 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)
这些消息还与nofb
和vga=normal
(来宾)内核参数一起显示。
截至 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_LINUX
in/etc/sysconfig/grub
并执行grub2-mkconfig -o /etc/grub2.cfg
or使设置在 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 固件(例如-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)。