以前、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 のネットワークドキュメントにあります。
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 に対して簡単に転送するのに適しています。
コメント