カーネルパニック時にQemuが失敗して終了することはできますか?

カーネルパニック時に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は終了します。0init

# poweroff -f

これは、initスクリプトが終了しないために機能します。poweroff -f呼び出して「永久に」スリープ状態にあるか、Qemuが「電源オフ」を実行するまでです。

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有効です。

ベストアンサー1

QEMU -no-reboot+カーネルCLIpanic=-1

0また、同様のものを返しますpvpanicが、次の利点があります。

  • 何も再コンパイルする必要はなく、起動パラメータだけが必要です。
  • armとaarch64は-M virtもちろんx86でも動作しますが、pvpanicはx86に固有のようです。arch/x86

試験用この設定

panicGDBを使用したシンボルの追跡

panic別のアプローチは、関数のアドレスに達した時点を検出してQEMUを終了しようとすることです。

次のようにGDBを確実に破ることができますpanichttps://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu/33203642#33203642

しかし、TODO:ステータス1でQEMUを終了する方法は? GDB内で使用すると、GDBからQEMUモニターへmonitor quitの転送は非常に近いですが、状態で終了しないため、そうではありません。quit0

ジュエリー5基本的な追跡は基本的に行われますが、これは素晴らしいです。

これは次の場合に発生します。https://github.com/gem5/gem5/blob/1da285dfcc31b904afc27e440544d006aae25b38/src/arch/arm/linux/system.cc#L73

おそらく、QEMU開発者はこの技術に触発され、同様のものを実装できます。

おすすめ記事