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 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を使っている環境が一番多いと思うけど、その設定方法は調べてないのでよくわかりません。
よくわからなかったり、そんな定常的にブリッジネットワーク使わないってのなら上記のブリッジネットワークを作成するコマンドをスクリプトにしておいてもいいと思います。
コメント