QEMUでブリッジネットワークを使用する
QEMUでブリッジネットワークを使う方法を調べるといろいろ情報は出てくるけれど、古かったりしてイマイチ何が本当に必要なのか分からないので、ここにまとめます
始める前に
ネットワークを自動で設定してくれる系の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 82383seceth0は何もなし、br0にIPアドレスが割り振られていれば成功です。
QEMUでbr0の使用を許可する
/etc/qemu/bridge.confを用意するだけです。
# mkdir -p /etc/qemu
# echo "allow br0" >> /etc/qemu/bridge.confQEMUの起動
以上で準備は完了です。あとはネットワークに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を使っている環境が一番多いと思うけど、その設定方法は調べてないのでよくわかりません。
よくわからなかったり、そんな定常的にブリッジネットワーク使わないってのなら上記のブリッジネットワークを作成するコマンドをスクリプトにしておいてもいいと思います。
コメント