Terminal

在 QEMU 來賓中禁用幀緩衝區

  • January 25, 2021

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

這些消息還與nofbvga=normal(guest) 核心參數一起顯示。

截至 2017 年,qemu 不提供用於 x86-64 的純文字模式圖形卡仿真,這將迫使客戶保持在文本模式。

目前的發行版(例如 Fedora 25)帶有bochs_drm預設啟用幀緩衝區(例如 1024x768 圖形模式)的核心模組。與此相反,例如 Debian 8 (stable) 不提供此模組,因此它在完整引導期間保持老式文本模式。

因此,當從終端(例如使用 )執行 qemu 時,-display curses將串列控制台啟用為故障安全是有意義的:

console=tty0 console=ttyS0

或者

console=tty0 console=ttyS0,115200

(來賓的核心參數,預設速度為 9600,這兩種設置都適用於 qemu,通過將它們分配給GRUB_CMDLINE_LINUXin/etc/sysconfig/grub並執行grub2-mkconfig -o /etc/grub2.cfg或使設置在 Fedora 中持久化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產生次優的使用者體驗,因為 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

否則,on 必須在每次啟動後切換到第一個虛擬控制台(例如,使用 curses 顯示時 Alt+2 或 Alt+3)。

引用自:https://unix.stackexchange.com/questions/346090