Cómo imprimir la salida de dmesg en la máquina host desde qemu guest vm

Cómo imprimir la salida de dmesg en la máquina host desde qemu guest vm

Dominio
Esto es lo que estoy haciendo

# Step 1. In host machine
$ qemu-system-x86_64 \
        -enable-kvm -nodefaults -nographic -L /usr/share/qemu \
        -m 8G -smp 4 -boot c \
        -netdev user,hostnet0,hostfwd=tcp::5556-:22 \
        -drive file=ubuntu18.04.qcow2,if=virtio,cache=none \
        -device virtio-net-pci,netdev=hostnet0,id=net0,bus=pci.0,addr=0x3\
        -serial pty  

# Step 2. In guest machine
$ sudo vim /etc/default/grub
# Change GRUB_CMDLINE_LINUX="" as GRUB_CMDLINE_LINUX="console=ttyS0"

# Step 3. In host machine
# There should be a printed log showing 
# which pty is being used when the host runs qemu
# Let say, /dev/pts/3
$ sudo cat /dev/pts/3 

# Step 4. Login /dev/pts/3
$ echo "id" > /dev/pts/3
$ echo "password" > /dev/pts/3

# Step 5. Print dmesg in a log file
$ echo dmesg > /dev/pts/3

Lo que quiero es obtener un registro del kernel de la máquina invitada. El código anterior básicamente usa pty como puerto serie, por lo que puedo obtener el registro a través de un determinado tty, pero el problema es que hay una advertencia para este método.

Si ejecuto el comando, dmesgaparece este mensaje:

[ 0.00000] serial8250: too much work for irq4

No creo que esto sea una advertencia crítica pero es bastante molesto de ver y me parece que se ignoran varios registros.

Me gustaría saber si existe una mejor manera de obtener un registro sin previo aviso de la máquina virtual. Siento que esta advertencia no es correcta. La forma de solucionar este problema es iniciando sesión periódicamente y redirigiendo una salida fea de cat.

¿Hay alguna manera de obtener un registro de inmediato sin usar echo dmesg?

Respuesta1

Alternativa

# Using a named pipeline
# Step 1. qemu configuration
$ qemu-system-x86_64 \
        -some options like above \
        -serial pipe:/tmp/guest

# Step 2. To get a log
$ mkfifo /tmp/guest.in /tmp/guest.out
$ cat /tmp/guest.out
$ printf "id\n" > /tmp/guest.in
$ printf "pw\n" > /tmp/guest.in
$ printf "cmd\n" > /tmp/guest.in

Enlace

Respuesta2

Puede agregar -serial file:console.logy qemu-systemagregar console=ttyS0,115200 ignore_loglevelparámetros al kernel invitado.

Con ignore_loglevel, todos los mensajes del kernel se imprimen en la consola (aquí el dispositivo serie) independientemente de su nivel de registro.

información relacionada