如何從 qemu guest vm 將 dmesg 輸出列印到主機

如何從 qemu guest vm 將 dmesg 輸出列印到主機

命令
這就是我正在做的事情

# 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

我不認為這是一個嚴重警告,但看到它很煩人,而且在我看來,有幾個日誌被忽略了。

我想知道是否有更好的方法來獲取日誌而不需要來自虛擬機器的任何警告。我覺得這個警告是不對的。我解決這個問題的方法是定期登入並重定向醜陋的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,所有核心訊息都會列印到控制台(此處為序列裝置),無論其日誌等級為何。

相關內容