다양한 아티팩트를 테스트하기 위해 지속적인 통합 파이프라인에 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에게 큰 감사를 드립니다.
인용하다: