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が「パワーダウン」するまでスリープします。
ACPI: Preparing to enter system sleep state S5
reboot: Power down
set -eu
経由でエラー時にinit
を強制することで、exit
スクリプトの問題を検出できるようにしたいと思います。 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
+カーネルCLI kernel.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また、pvpanic
と同様に0
を返しますが、次の利点があります。
-M virt
とx86で動作しますが、pvpanicはArch/x86
の下にあるため、x86固有のようですthis setup でテストされています。
GDBでpanic
シンボルを追跡します
これに対処する別の方法は、panic
関数のアドレスに到達したことを検出し、QEMUを終了することです。
しかし、TODO:QEMUをステータス1で終了させる方法は? quit
をGDBからQEMUモニターに転送するGDB内からmonitor quit
を使用すると、本当に近づきますが、ステータス0
で終了しないので、完全には近づきません。
gem5 は、デフォルトでこの追跡をネイティブに実行します。
これは次の場所で発生します https://github.com/gem5/gem5/blob/1da285dfcc31b904afc27e440544d006aae25b38/src/Arch/arm/linux/system.cc#L7
たぶんQEMU開発者はこのテクニックからインスピレーションを得て、似たようなものを実装できます。