Как вывести вывод dmesg на хост-машину из гостевой виртуальной машины qemu

Как вывести вывод dmesg на хост-машину из гостевой виртуальной машины qemu

Команда
Вот что я делаю

# 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

Я хочу получить журнал ядра с гостевой машины. Код выше в основном использует pty как последовательный порт, поэтому я могу получить журнал через определенный tty, но проблема в том, что для этого метода есть предупреждение.

Если я ввожу команду, dmesgя получаю следующее сообщение:

[ 0.00000] serial8250: too much work for irq4

Я не считаю, что это критическое предупреждение, но его довольно неприятно видеть, и мне кажется, что некоторые журналы игнорируются.

Я хотел бы узнать, есть ли лучший способ получить журнал без предупреждения от VM. Я считаю, что это предупреждение неправильное. Я исправляю это, регулярно входя в систему и перенаправляя уродливый вывод cat.

Есть ли способ получить лог сразу, не используя echo dmesg?

решение1

Альтернатива

# 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

Связь

решение2

Вы можете добавлять -serial file:console.logи qemu-systemдополнять console=ttyS0,115200 ignore_loglevelпараметры гостевого ядра.

При использовании ignore_loglevelвсе сообщения ядра выводятся на консоль (в данном случае на последовательное устройство) независимо от уровня их регистрации.

Связанный контент