qemu: pyhtonでゲストとシリアル通信

ゲスト側のLinuxカーネルでシリアルコンソールを有効にしているときに、ホストからpythonでシリアルコンソールにアクセスするときメモです。

ゲスト側はカーネルコマンドラインでシリアルの設定をするのと、qemuのオプションで-serial ptyとしてptyを使うようにする。

$ qemu-kvm -initrd ./initramfs-4.17.2-200.fc28.x86_64.img -kernel ./vmlinuz-4.17.2-200.fc28.x86_64 -m 512 -append "console=ttyS0,115200" -serial pty -nographic
QEMU 2.11.1 monitor - type 'help' for more information
(qemu) qemu-system-x86_64: -serial pty: char device redirected to /dev/pts/2 (label serial0)

pythonのコードは特にパッケージとかはインストールしていなくて、qemu起動時に表示された /dev/pts/Xをオープンしてデータの読み書きを行います。

#!/usr/bin/env python3
#  qemu-system-x86_64 -initrd ./initramfs-4.17.2-200.fc28.x86_64.img  -kernel ./vmlinuz-4.17.2-200.fc28.x86_64 -m 512 -append "console=ttyS0,115200" -serial pty -nographic

import io, os
pty = io.TextIOWrapper(
    io.FileIO(
        os.open(
            "/dev/pts/2", os.O_NOCTTY | os.O_RDWR
        ),
        "w+"
    )
)
pty.write("uname -a\n");
for line in iter(pty.readline, None):
    print(line.strip())

こんな感じで使えます。

f:id:masami256:20180701003342p:plain