Befehl
Folgendes mache ich
# 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
Ich möchte ein Kernelprotokoll vom Gastcomputer abrufen. Der obige Code verwendet grundsätzlich pty als serielle Schnittstelle, sodass ich das Protokoll über ein bestimmtes tty abrufen kann. Das Problem ist jedoch, dass für diese Methode eine Warnung angezeigt wird.
Wenn ich den Befehl ausgebe, dmesg
erhalte ich diese Meldung:
[ 0.00000] serial8250: too much work for irq4
Ich glaube nicht, dass dies eine kritische Warnung ist, aber es ist ziemlich ärgerlich, sie zu sehen, und es scheint mir, dass mehrere Protokolle ignoriert werden.
Ich würde gerne wissen, ob es einen besseren Weg gibt, ein Protokoll ohne Warnung von der VM zu erhalten. Ich finde, diese Warnung ist nicht richtig. Ich behebe das Problem, indem ich mich regelmäßig anmelde und eine hässliche Ausgabe von umleite cat
.
Gibt es eine Möglichkeit, sofort ein Protokoll abzurufen, ohne echo dmesg zu verwenden?
Antwort1
Alternative
# 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
Antwort2
Sie können die Kernel-Parameter des Gasts -serial file:console.log
ergänzen qemu-system
oder anhängen .console=ttyS0,115200 ignore_loglevel
Mit ignore_loglevel
werden alle Kernel-Meldungen unabhängig von ihrem Protokolllevel auf der Konsole (hier dem seriellen Gerät) ausgegeben.