Linux

我可以讓 Qemu 在核心恐慌失敗時退出嗎?

  • October 19, 2019

我正在嘗試將 Qemu 添加到我的持續集成管道中以測試各種initrd工件。我已經發現我可以像這樣執行 Qemu:

qemu-system-x86_64 \
   -machine q35 \
   -drive if=pflash,format=raw,file=OVMF_CODE.fd,readonly \
   -drive if=pflash,format=raw,file=OVMF_VARS.fd \
   -kernel vmlinuz-4.4.0-121-generic \
   -initrd my-initramfs.cpio.xz \
   -nographic

…如果我在腳本中執行此操作,則會導致qemu-system-x86_64退出狀態:0``init

# poweroff -f

這是有效的,因為 init 腳本不會退出——它會poweroff -f“永遠”呼叫並休眠,或者直到 Qemu 執行“Power Down”:

ACPI: Preparing to enter system sleep state S5
reboot: Power down

我希望能夠init通過強制exit打開錯誤來檢測腳本中的問題set -eu。退出init腳本(正確)會導致核心崩潰,但qemu-system-x86_64程序會永遠掛起。

我怎樣才能讓它永遠不會掛起?如何讓 Qemu 主機檢測 Qemu 客戶機中的核心恐慌?

進一步澄清:

我的應用程序的性質是安全敏感的;即,“允許”配置/編譯 linux 核心,但不允許傳遞核心參數。啟用它CMDLINE_OVERRIDE

我有一些工作:

  • CONFIG_PVPANIC=y使用;配置(和建構)核心 這會生成一個核心,該核心具有對該設備的編譯支持pvpanic
  • qemu-system-x86_64使用選項呼叫-device pvpanic;這指示 Qemu 擷取(並退出)核心恐慌。

核心恐慌導致qemu-system-x86_64成功退出(返回狀態0),但至少它不再掛起。

非常感謝@dsstorefile1 為我指明了正確的方向。

參考:

QEMU -no-reboot+ 核心 CLIkernel.panic=-1

它也返回0like pvpanic,但具有以下優點:

  • 無需重新編譯任何東西,只需一個引導參數
  • 適用於 arm 和 aarch64-M virt以及 x86,而 pvpanic 似乎是 x86 特定的,因為它在arch/x86

使用此設置進行了測試。

使用 GDB跟踪panic符號

另一種解決方法可能是檢測何時panic到達函式的地址,然後嘗試讓 QEMU 退出。

您絕對可以panic按照以下說明中斷 GDB:https ://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu/33203642#33203642

但是 TODO:如何讓 QEMU 以狀態 1 退出?從 GDB 內部使用monitor quit, 從 GDB 轉發quit到 QEMU 監視器,非常接近,但不是很接近,因為它不會以 status 退出0

gem5預設情況下會在本地進行這種跟踪,這非常棒。

這發生在:https ://github.com/gem5/gem5/blob/1da285dfcc31b904afc27e440544d006aae25b38/src/arch/arm/linux/system.cc#L73

也許 QEMU 開發人員可以從這種技術中獲得一些靈感並實現類似的東西。

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