指示
私がやっていることはこれです
# 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
、ログ レベルに関係なく、すべてのカーネル メッセージがコンソール (ここではシリアル デバイス) に出力されます。