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, dmesg
aparece 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
Respuesta2
Puede agregar -serial file:console.log
y qemu-system
agregar console=ttyS0,115200 ignore_loglevel
pará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.