Ideal Reality

興味の赴くままに

QEMUでブリッジネットワークを使用する

QEMUでブリッジネットワークを使う方法を調べるといろいろ情報は出てくるけれど、古かったりしてイマイチ何が本当に必要なのか分からないので、ここにまとめます

Contents
スポンサーリンク

始める前に

ネットワークを自動で設定してくれる系のdaemonが動いてると、ブリッジの設定とケンカしてネットワークにうまく繋がらなくなったりします。なので、そういうの使ってる場合は止めておいた方がいいでしょう。

(自分の場合、Raspberry Pi OSでやろうと思ったらdhcpcdが邪魔してきたのでsudo systemctl stop dhcpcdで止めなきゃいけなかった)

ブリッジの作成

ブリッジとはマシン内に構築する仮想的なスイッチングハブみたいなものです。今回はbr0を作成して、そこにeth0を繋ぎます。仮想マシンは仮想NICをbr0に繋ぐことでeth0と同じネットワークに存在できる感じです。

調べるとbrctlを使う方法がたくさん出てきますが、brctlは現在非推奨です。後継としてiproute2を使うのが主流になっています。なので、ここで紹介するコマンドもiproute2を使ったものになっています。

eth0は各自の環境に応じて変えてください。br0はお好みで。もしeth0のネットワーク経由で遠隔操作しているなら、一度eth0がダウンして別のIPアドレスが振られるので、ローカル環境で作業してください。

# ip address flush dev eth0
# ip link add br0 type bridge
# ip link set br0 up
# ip link set eth0 master br0

これでブリッジは作成できたので、bridgeコマンドで確認しましょう。

# bridge link show
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4 

ただし、このままではIPアドレスが割り当てられてないので設定しましょう。

DHCPの場合は

# dhclient -v br0

固定IPの場合は

# ip addr add dev bridge_name 192.168.x.x/24

で設定してください。確認はip addr

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.14/24 brd 192.168.0.255 scope global dynamic br0
       valid_lft 82383sec preferred_lft 82383sec

eth0は何もなし、br0にIPアドレスが割り振られていれば成功です。

スポンサーリンク

QEMUでbr0の使用を許可する

/etc/qemu/bridge.confを用意するだけです。

# mkdir -p /etc/qemu
# echo "allow br0" >> /etc/qemu/bridge.conf

QEMUの起動

以上で準備は完了です。あとはネットワークにbr0を指定して起動しましょう。

br0の指定は-netdev bridge,id=hn0 -device virtio-net-pci,netdev=hn0,id=br0,mac=00:16:3e:3f:a3:9cのようなオプションで指定します。MACアドレスは仮想マシンのNICに使うものを。困ったら 9.8. 固有の MAC アドレスを新たに生成する にあるスクリプトでランダム生成するのがいいでしょう。

例えば、ここにあるAlpine Linuxを起動するコマンドでbr0を使いたかったら

qemu-system-aarch64 \
	-M virt -cpu cortex-a57 \
	-m 1G \
	-kernel share/vmlinuz-virt \
	-initrd share/initramfs-virt \
	-drive if=none,file=storage.qcow2,id=hd0 -device virtio-blk-device,drive=hd0 \
	-append "console=ttyAMA0 modules=ext4 root=/dev/vda" \
	-nographic \
	-netdev bridge,id=hn0 \
	-device virtio-net-pci,netdev=hn0,id=br0,mac=00:16:3e:3f:a3:9c

こんな感じですね。追加するだけでいいです。

あとは仮想マシン内からネットワークに無事繋げればOKです

スポンサーリンク

ブリッジの永続化

これに関してはとても環境依存なので、僕ではちゃんとした方法を提供することはできません。例えば、僕のサーバーではネットワークの設定にsystemd-networkdを使っているので、systemd-networkd#ブリッジインターフェイス の方法で簡単に設定できました。

おそらくNetworkManagerを使っている環境が一番多いと思うけど、その設定方法は調べてないのでよくわかりません。

よくわからなかったり、そんな定常的にブリッジネットワーク使わないってのなら上記のブリッジネットワークを作成するコマンドをスクリプトにしておいてもいいと思います。

参考

Virtual Machine (VM) Bridge Network Interface

ネットワークブリッジ

スポンサーリンク

コメント

投稿されたコメントはありません

名前

メールアドレス(任意)

コメント

関連する投稿

virt-manager(libvirt)で自分でビルドしたQEMUを使用する

Raspberry PiでKVMを動かす

OVMFをビルドする

NO IMAGE

QEMU(KVM)でNVMe SSDをPCIパススルーして使用する

NO IMAGE

Raspberry PiでKVMを動かす (旧版)