qemu loop infinito na inicialização

0

Atualmente, estou tentando configurar uma máquina virtual emulando um ARMv7 Cortex-A8 em um host x64 executando o qemu. Eu tenho um zImage que foi construído com o defconfig realview e um rootfs no formato cpio.

Quando eu executo o seguinte comando:

$ qemu-system-arm -machine realview-pb-a8 -cpu cortex-a8 -m 256 -kernel zImage
pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument

Eu esperaria que o kernel inicializasse e falhasse porque ainda não especifico o rootfs. Em vez disso, ele não gera saída e fica paralisado (usando 100% do núcleo da CPU em que está sendo executado.

Eu descobri (prepending strace para o comando) que ele está preso em um loop infinito ... Aqui está a parte do loop:

tgkill(14936, 14937, SIGUSR1)           = 0
futex(0x7faef8beb1e0, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0x7faef8beb1a0, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0x7faef8beb1a0, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7faef8beb1a4, FUTEX_CMP_REQUEUE_PRIVATE, 1, 2147483647, 0x7faef8beb1e0, 254) = 0
recvmsg(10, 0x7ffe1d2a8dd0, 0)          = -1 EAGAIN (Resource temporarily unavailable)
select(11, [10], NULL, NULL, {0, 0})    = 0 (Timeout)
write(5, "
$ qemu-system-arm -machine realview-pb-a8 -cpu cortex-a8 -m 256 -kernel zImage
pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument
tgkill(14936, 14937, SIGUSR1)           = 0
futex(0x7faef8beb1e0, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0x7faef8beb1a0, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0x7faef8beb1a0, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7faef8beb1a4, FUTEX_CMP_REQUEUE_PRIVATE, 1, 2147483647, 0x7faef8beb1e0, 254) = 0
recvmsg(10, 0x7ffe1d2a8dd0, 0)          = -1 EAGAIN (Resource temporarily unavailable)
select(11, [10], NULL, NULL, {0, 0})    = 0 (Timeout)
write(5, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 8)         = 8
futex(0x7faef8beb1e0, FUTEX_WAKE_PRIVATE, 1) = 0
ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 29609869}, NULL, 8) = 1 ([{fd=5, revents=POLLIN}], left {0, 29606726})
write(6, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 8)         = 8
read(5, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 512)        = 8
ppoll([{fd=5, events=POLLIN|POLLERR|POLLHUP}], 1, {0, 0}, NULL, 8) = 0 (Timeout)
write(6, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 8)         = 8
ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 0}, NULL, 8) = 1 ([{fd=6, revents=POLLIN}], left {0, 0})
ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 0}, NULL, 8) = 1 ([{fd=6, revents=POLLIN}], left {0, 0})
read(6, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 16)         = 8
ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 0}, NULL, 8) = 0 (Timeout)
%pre%%pre%%pre%%pre%%pre%", 8) = 8 futex(0x7faef8beb1e0, FUTEX_WAKE_PRIVATE, 1) = 0 ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 29609869}, NULL, 8) = 1 ([{fd=5, revents=POLLIN}], left {0, 29606726}) write(6, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 8) = 8 read(5, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 512) = 8 ppoll([{fd=5, events=POLLIN|POLLERR|POLLHUP}], 1, {0, 0}, NULL, 8) = 0 (Timeout) write(6, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 8) = 8 ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 0}, NULL, 8) = 1 ([{fd=6, revents=POLLIN}], left {0, 0}) ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 0}, NULL, 8) = 1 ([{fd=6, revents=POLLIN}], left {0, 0}) read(6, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 16) = 8 ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 0}, NULL, 8) = 0 (Timeout)

Eu nunca depurei usando strace, mas " recvmsg (10, 0x7ffe1d2a8dd0, 0) = -1 EAGAIN (Recurso temporariamente indisponível) " não parece certo ...

Alguma ideia? Qualquer ajuda é bem vinda.

    
por Vincent Pasquier 31.05.2016 / 10:42

1 resposta

0

O QEMU emula máquinas sintéticas que não são cópias estritas de suas contrapartes reais. Se o kernel do Linux não gostar de algo sobre isso, é possível que ele falhe mais cedo ou simplesmente seja interrompido porque não está ciente das mudanças repentinas na arquitetura esperada.

Você pode tentar ajudar o problema com o mecanismo do kernel early printk e tentar redirecionar o console para o dispositivo serial emulado, se um for suportado pelo destino. Veja qemu-doc.html para detalhes. Note que alguns kernels muito agressivos como o android e o openwrt são difíceis de lidar, mesmo que eles tenham early printk habilitado, então eles são esperados para travar e não serem emulados corretamente se eles não direcionarem máquinas sintéticas QEMU .

O erro strace recvmsg == EAGAIN não é nada sobre o erro, mas o comportamento esperado quando não há dados disponíveis no soquete para receber. Você precisa ver para qual objeto 10 fd do processo qemu se refere. Use lsof -p pid , onde pid é um qemu pid para ver fds abertos e de onde eles são.

Algumas chamadas de sistema que terminam com -1 errno não são erros, mas, dessa forma, indicam alguns eventos em objetos com os quais o processo lida.

    
por 31.05.2016 / 14:41