Posso fazer o Qemu sair com falha no kernel panic?

3

Estou tentando adicionar o Qemu ao meu pipeline de integração contínua para testar vários artefatos initrd . Eu já descobri que posso rodar o Qemu assim:

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

... e faça com que qemu-system-x86_64 saia do status 0 se eu fizer isso no meu script init :

# poweroff -f

Isso funciona porque o script de init não sai - ele invoca poweroff -f e dorme "para sempre" ou até que o Qemu faça um "Power Down":

ACPI: Preparing to enter system sleep state S5
reboot: Power down

Gostaria de poder detectar problemas no script init , forçando um exit no erro via set -eu . A saída do script init (corretamente) causa um pânico no kernel, mas o processo qemu-system-x86_64 é interrompido permanentemente.

Como posso evitar que ele seja suspenso para sempre? Como faço para que o host do Qemu detecte um pânico do kernel no convidado do Qemu?

Mais esclarecimentos:

A natureza do meu aplicativo é sensível à segurança; isto é, a configuração / compilação do kernel do Linux é "permitida", mas a passagem dos parâmetros do kernel não é. Para colocar um ponto final nisso, CMDLINE_OVERRIDE está ativado.

    
por rubicks 10.05.2018 / 16:20

2 respostas

2

Eu tenho algo que está funcionando:

  • Configure (e crie) o kernel com CONFIG_PVPANIC=y ; isso produz um kernel com suporte compilado para o dispositivo pvpanic .
  • Invoque qemu-system-x86_64 com a opção -device pvpanic ; isso instrui o Qemu a capturar (e sair) um pânico do kernel.

Um kernel panic faz com que qemu-system-x86_64 saia com sucesso (status de retorno 0 ), mas pelo menos não está mais pendente.

Muito obrigado ao @dsstorefile1 por me apontar na direção certa.

Referências:

por 10.05.2018 / 21:27
2

-no-reboot + kernel.panic=-1

  • qemu-system-X -no-reboot opção QEMU CLI: faz o QEMU sair quando o convidado tenta reinicializar
  • Parâmetro de inicialização do kernel kernel.panic=-1 : faz com que o Linux tente reinicializar imediatamente após um pânico:

Ele também retorna 0 como pvpanic , mas tem as seguintes vantagens:

  • não é necessário recompilar nada, apenas um parâmetro de inicialização
  • funciona em armar e aarque64 -M virt bem como x86, enquanto o pvânico parece específico do x86, pois está abaixo de arch/x86

Testado com esta configuração .

Acompanhe o símbolo panic com o GDB

Outra maneira de fazer isso pode ser detectar quando o endereço da função panic é atingido e tentar fazer com que o QEMU seja encerrado.

Você pode definitivamente quebrar o GDB em panic , conforme explicado em: link

Mas TODO: como fazer o QEMU sair com o status 1? Usando monitor quit , de dentro do GDB, que encaminha quit para o monitor QEMU do GDB, fica muito próximo, mas não exatamente, já que não sai com status 0 .

gem5 faz esse rastreamento por padrão nativamente, o que é bastante impressionante.

Isso acontece em: link

Talvez os desenvolvedores do QEMU possam se inspirar nessa técnica e implementar algo semelhante.

    
por 10.08.2018 / 09:54