我可以讓 Qemu 在核心恐慌失敗時退出嗎?
我正在嘗試將 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
qemu-system-X -no-reboot
QEMU CLI 選項:當客戶機嘗試重新啟動時使 QEMU 退出kernel.panic=-1
核心啟動參數:使 Linux 在出現恐慌後立即嘗試重新啟動:https ://github.com/torvalds/linux/blob/v4.17/Documentation/admin-guide/kernel-parameters.txt#L2931它也返回
0
likepvpanic
,但具有以下優點:
- 無需重新編譯任何東西,只需一個引導參數
- 適用於 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預設情況下會在本地進行這種跟踪,這非常棒。
也許 QEMU 開發人員可以從這種技術中獲得一些靈感並實現類似的東西。