我正在尝试将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