[QEMU][Linux] usermode network

以前、boot upstream Linux from U-boot on QEMU にて QEMU の network を有効にしましたが、TUN/TAP を使用していたため、自由度は高いものの host PC の設定に手を入れる必要があり、もう少しお手軽な user mode で network を使うことにします。

QEMU の usermode network

QEMU の usermode network は userland で PPP/SLIP をエミュレートする ”SLIRP” を元にしています。詳細は QEMU のネットワークドキュメントにあります。

Documentation/Networking - QEMU

guest 内のネットワーク構成は決まっていて、IP アドレスは以下のように割り当てられています。

  • gateway (host PC) 10.0.2.2
  • DNS server 10.0.2.3
  • SMB (option) 10.0.2.4
  • default target 10.0.2.15

guest OS 上ではこれらのアドレスにアクセスすることになります。

※ SLIRP は QEMU 7.2 で submodule から削除されました。SLIRP を有効にするには host OS の package で "libslirp-dev" をインストールして、configure で "--enable-slirp" を指定してビルドしてください。

ネットワークを指定した QEMU の起動

QEMU に対して、"-device" でネットワークデバイスを、"-netdev user" で usermode を指定します。ここでは NIC に Intel e1000 を指定しています。("net0" はここで使う共通の文字列)

qemu-system-aarch64 -M virt -cpu cortex-a53 -m 1024 -nographic \
    -kernel Image.gz -initrd rootfs.cpio.gz \
    -device e1000,netdev=net0 -netdev user,id=net0

これで kernel 上では ネットワーク I/F として eth0 が見えるようになります。"dhclient eth0" で上記の 10.0.2.15 が割り当てられ、ネットワークは有効になります。しかし gateway は host PC を指しているものの、ポートは直接扱うことができません。

port forwarding

ポートは forwarding する必要があります。下記のように "hostfwd" を指定することで、host PC の port を guest に forwarding することができます。ただし、予約された port は forwading できないため、空きポート(ここでは 10022) を guest に (22:ssh) 割り当てています。

qemu-system-aarch64 -M virt -cpu cortex-a53 -m 1024 -nographic \
    -kernel Image.gz -initrd rootfs.cpio.gz \
    -device e1000,netdev=net0 -netdev user,id=net0,hostfwd=tcp::10022-:22

guest 上で sshd を立ち上げれば  host PC から ssh で login できるようになります。

tftp emulation

guest 上に何も用意していない場合、QEMU の tftp エミュレーションを使うことができます。"tftp" に host PC のディレクトリを指定することで、guest 上から tftp 転送を行うことができます。

qemu-system-aarch64 -M virt -cpu cortex-a53 -m 1024 -nographic \
    -kernel Image.gz -initrd rootfs.cpio.gz \
    -device e1000,netdev=net0 -netdev user,id=net0,tftp=/tftpboot

usermode network は自由度は低いものの host PC の環境に影響を与えないため、動作確認などでプログラムを guest に対して簡単に転送するのに適しています。


コメント

タイトルとURLをコピーしました