系统相关
首页 > 系统相关> > linux – 我可以让Qemu退出内核恐慌失败吗?

linux – 我可以让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

…如果我在init脚本中执行此操作,则导致qemu-system-x86_64以状态0退出:

# poweroff -f

这是有效的,因为init脚本不会退出 – 它会调用poweroff -f并“永远”睡眠或直到Qemu执行“Power Down”:

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

我希望能够通过set -eu强制退出错误来检测init脚本中的问题.退出init脚本(正确)导致内核崩溃,但qemu-system-x86_64进程永远挂起.

怎么能让它永远不挂?如何让Qemu主机在Qemu guest中检测内核恐慌?

进一步澄清:

我的应用程序的性质是安全敏感的;即,“允许”配置/编译linux内核,但不传递内核参数.为了说明问题,启用了CMDLINE_OVERRIDE.

解决方法:

我有一些有用的东西:

>使用CONFIG_PVPANIC = y配置(并构建)内核;这会生成一个内核,其中包含对pvpanic设备的编译支持.
>使用-device pvpanic选项调用qemu-system-x86_64;这指示Qemu捕获(并退出)内核恐慌.

内核崩溃导致qemu-system-x86_64成功退出(返回状态0),但至少它不再挂起.

非常感谢@ dsstorefile1指出我正确的方向.

参考文献:

> https://cateee.net/lkddb/web-lkddb/PVPANIC.html
> https://github.com/qemu/qemu/blob/master/docs/specs/pvpanic.txt

标签:linux,linux-kernel,qemu,init-script,kernel-panic
来源: https://codeday.me/bug/20190814/1654594.html