さまざまな成果物をテストするために、継続的な統合パイプラインに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が「電源オフ」を実行するまでです。
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
qemu-system-X -no-reboot
QEMU CLIオプション:ゲストが再起動しようとしたときにQEMUが終了するようにします。panic=-1
カーネルブートパラメータ:Linuxにパニックが発生した直後に再起動を試みます。https://github.com/torvalds/linux/blob/v4.17/Documentation/admin-guide/kernel-parameters.txt#L2931
0
また、同様のものを返しますpvpanic
が、次の利点があります。
- 何も再コンパイルする必要はなく、起動パラメータだけが必要です。
- armとaarch64は
-M virt
もちろんx86でも動作しますが、pvpanicはx86に固有のようです。arch/x86
試験用この設定。
panic
GDBを使用したシンボルの追跡
panic
別のアプローチは、関数のアドレスに達した時点を検出してQEMUを終了しようとすることです。
次のようにGDBを確実に破ることができますpanic
:https://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu/33203642#33203642
しかし、TODO:ステータス1でQEMUを終了する方法は? GDB内で使用すると、GDBからQEMUモニターへmonitor quit
の転送は非常に近いですが、状態で終了しないため、そうではありません。quit
0
ジュエリー5基本的な追跡は基本的に行われますが、これは素晴らしいです。
これは次の場合に発生します。https://github.com/gem5/gem5/blob/1da285dfcc31b904afc27e440544d006aae25b38/src/arch/arm/linux/system.cc#L73
おそらく、QEMU開発者はこの技術に触発され、同様のものを実装できます。
答え2
私は働くものがあります:
- を使用してカーネルを構成(およびビルド)します。
CONFIG_PVPANIC=y
これにより、デバイスのコンパイル済みサポートを含むカーネルが作成されますpvpanic
。 qemu-system-x86_64
オプションとともに呼び出されます-device pvpanic
。これにより、Qemuにカーネルパニックを捕捉して終了するように指示します。
カーネルパニックのためにqemu-system-x86_64
正常に終了しましたが(statusを返す0
)、少なくとも中断されません。
正しい方向を教えてくれた@dsstorefile1に感謝します。
引用: