qemu-kvm ブリッジ接続 仮想ネットワークデバイス
qemu kvm bridge libvirt
qemu-kvmでのブリッジ接続をつかう方法や、仮想ネットワークデバイスのオプションを説明します。
なお以下の手順や設定などはFedora16で行っています。他のディストリビューションでも概略は同じです。
libvirt の インストール
libvirt bridge-utils パッケージのインストール
# yum install libvirt bridge-utils
libvirtd サービス デーモンのGUI管理ツールが必要であれば、virt-manager(仮想マシンマネージャー)もインストール
# yum install virt-manager
libvirtをインストールすると、 virbr0 仮想ネットワークデバイス がデフォルトで設定されているので、 192.168.122.0/24 仮想ネットワークが生成されます。 これはこれから行うブリッジ作成にはまったく関係がないので停止してかまいません。
GUIで停止操作するのであればvirt-manager(仮想マシンマネージャー)で停止することができます。 virt-manager の 「仮想ネットワーク default」を停止、次回から起動しないのであれば「自動起動しない」にすればよいです。
virt-managerをGUIで使う場合の注意
もうひとつ注意点として、サーバ用途のようにサーバシステム起動時に自動的にブリッジ設定・ネットワーク設定ができるようにするには、/etc/sysconfig/network-scripts/ifcfg-eth0 , br0 などに設定すればOKですが、 これは network.service にてネットワークのイニシャライズ処理が実行されます。
network.service からのネットワークのイニシャライズすると、NetworkManager.service が動作しません。(というより不要) そこで、NetworkManager は「サービス停止」または「起動しない」にすると良いのですが、その場合virt-manager認証でNGになります。よってこの辺の「さじ加減」は、それぞれの使用環境に応じて調整していただきたいと思います。
- 動作検証環境
- Fedora16 eth0 –> p4p1 DHCPによるIP動作状態のマシン
デフォルトの稼働状態
# ifconfig
p4p1 Link encap:Ethernet HWaddr 50:E5:49:C5:7A:56
inet addr:192.168.1.175 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::52e5:49ff:fec5:7a56/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:24030 errors:0 dropped:0 overruns:0 frame:0
TX packets:6691 errors:0 dropped:0 overruns:0 carrier:1
collisions:0 txqueuelen:1000
RX bytes:2101329 (2.0 MiB) TX bytes:1014665 (990.8 KiB)
Interrupt:45
ブリッジ インターフェースを作成
ブリッジのインターフェースを作成します。以下のケースではコマンドでbr0という名前のブリッジをつくります。もしサーバなどの用途でシステム起動時に自動でブリッジを作成したい場合は、/etc/sysconfig/network-scripts/ifcfg-eth0 ifcfg-br0 (eth0をbr0でブリッジする場合)記述してください。virt-managerで設定することもできます。virt-managerの設定では、ifcfg-xxxファイルを作るので結果的に同じことです。
- イーサネット p4p1 をプロミスキャスモードにする
- br0という名前でイーサネットブリッジを作成する
- p4p1をbr0ブリッジのポートにする
- br0ブリッジをリンクアップさせる
- br0のIPアドレスをDHCPから取得・設置
# ifconfig p4p1 0.0.0.0 promisc up
# brctl addbr br0
# brctl addif br0 p4p1
# ifconfig br0 up
# dhclient br0
問題なければ以下のようにbr0が確認できる
# ifconfig
br0 Link encap:Ethernet HWaddr 50:E5:49:C5:7A:56
inet addr:192.168.1.175 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::52e5:49ff:fec5:7a56/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6 errors:0 dropped:0 overruns:0 frame:0
TX packets:38 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1061 (1.0 KiB) TX bytes:6956 (6.7 KiB)
p4p1 Link encap:Ethernet HWaddr 50:E5:49:C5:7A:56
inet6 addr: fe80::52e5:49ff:fec5:7a56/64 Scope:Link
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:24283 errors:0 dropped:0 overruns:0 frame:0
TX packets:6797 errors:0 dropped:0 overruns:0 carrier:1
collisions:0 txqueuelen:1000
RX bytes:2125611 (2.0 MiB) TX bytes:1031645 (1007.4 KiB)
Interrupt:45
この段階でブリッジ状態を確認すると
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.50e549c57a56 no p4p1
qemu-kvmでのブリッジ接続準備(TAPデバイス)
qemu-kvmは、ゲストOS起動時に、TAPデバイスを使うように指定すると、親ブリッジ(br0)へのTAPデバイス組み込みの際にスクリプトを実行します。TAPデバイスをどのホストブリッジにどうつなぎ込むかをそのスクリプトで記述するわけです。qemuがデフォルトでは、起動時に /etc/qemu-ifup、停止時に/etc/qemu-ifdownとなります。それぞれスクリプトですので、755などの実行ビットで権限をあたえてください。
/etc/qemu-ifup
#!/bin/bash
echo "Bringing up $1 for bridged mode..."
ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0..."
brctl addif br0 $1
exit 0
/etc/qemu-ifdown
#!/bin/bash
echo "Removing $1 to br0..."
brctl delif br0 $1
echo "Shutting down $1..."
ifconfig $1 down
exit 0
スクリプトに実行ビットを設定
# chmod 755 /etc/qemu-ifup /etc/qemu-ifdown
ユーザー権限でkvmを起動してブリッジを使うには
qemuでのブリッジ接続は、tapデバイスをブリッジのインターフェイスとしてつかいます。
tapデバイスにはroot権限が必要です。qemuをユーザー権限で実行するには、/etc/qemu-ifup /etc/qemu-ifdown に細工をする必要があります。例えば、sudo実行させるなどです。sudoを使うのであれば、/etc/sudoerの設定が必要です。qemuは/dev/net/tunにアクセスに行くので、udevの設定で権限を変更する必要があります。/etc/udev/にそれらの設定があり、/etc/udev/permissions.rulesを以下のように変更することになります。
SUBSYSTEM="misc", SYSFS{dev}="10:200", MODE="0666", GROUP="root"
qemu-kvmでブリッジ接続をつかう
さてブリッジ接続でqemu-kvmを起動してみましょう。今回はtapデバイスをroot権限で実行するので、すべてkvmはsudo起動しています。
-net nic -net tap,ifname=tap0 で tap0をインターフェイス指定
※ USB-F16-KDE.isoは、Fedora16ライブUSBのISOデータです。
# sudo qemu-kvm -m 2048 -cpu core2duo -smp 2 -hda USB-F16-KDE.iso \
-monitor stdio -localtime -net nic -net tap,ifname=tap0
kvm起動後ブリッジ接続の状態を確認
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.4e9479f37dc9 no p4p1
tap0
qemuのコンソールから info network で ネットワーク状態を表示できます。
(qemu) info network
VLAN 0 devices:
tap.0: type=tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
rtl8139.0: type=nic,model=rtl8139,macaddr=52:54:00:12:34:56
Devices not on any VLAN:
どうですか、うまくいきましたか?
qemu-kvmで違うネットワーク・インターフェイスをエミュレートする
これはブリッジ接続とは直接関係ありませんが、qemuは複数のネットワーク・インターフェイスをエミュレートできます。デフォルトでは、rtl8139をエミュレートしていますが、100Mbpsになってしまいます。1Gbps(ギガビット)をエミュレートするのであれば、比較的汎用なe1000をエミュレートするとよいでしょう。
-net nic に model=e1000 を指定
# sudo qemu-kvm -m 2048 -cpu core2duo -smp 2 -hda USB-F16-KDE.iso \
-monitor stdio -localtime -net nic,model=e1000 -net tap,ifname=tap0
(qemu) info network
VLAN 0 devices:
tap.0: type=tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
e1000.0: type=nic,model=e1000,macaddr=52:54:00:12:34:56
Devices not on any VLAN:
typeの指定としては、virtio, pcnetなどあります。どのネットワーク・インターフェイスをエミュレートするのがよいか試すとよいでしょう。
MACアドレスを指定する
デフォルトではMACアドレスは自動的に生成されます。MACアドレスを指定したい場合、macaddr=
# sudo qemu-kvm -m 2048 -cpu core2duo -smp 2 -hda USB-F16-KDE.iso \
-monitor stdio -localtime -net nic,model=e1000,macaddr=52:54:00:12:34:57 -net tap,ifname=tap0
(qemu) info network
VLAN 0 devices:
tap.0: type=tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
e1000.0: type=nic,model=e1000,macaddr=52:54:00:12:34:57
Devices not on any VLAN:
複数のネットワーク・インターフェイスつかう
qemuで複数のネットワーク・インターフェイスをつかいたいケースでは、以下のような -net nic オプションを複数指定しましょう。
2つのネットワーク・インターフェイス、双方ともNAT
# sudo qemu-kvm -m 2048 -cpu core2duo -smp 2 -hda /dev/sda \
-monitor stdio -localtime \
-net nic,vlan=0,model=e1000 -net nic,vlan=1,model=e1000
ここで注意点があります。2つ(複数)で同じブリッジ接続からのTAPデバイスを生成すると、物理的なネットワークの障害を起こす場合があります。私は何度も実験環境で失敗しています。2つのうち一方をブリッジ接続にする、もう一方をVLANのNATにするなど、物理的な干渉を考慮するとよいと思います。
おわりに
本当は、「libvirtのブリッジについて」「TAPデバイスについて」冒頭に説明するべきなのでしょうけど、今回は省略させていただいてます。図のようなもので構成イメージして説明するのがよいと思っていますので、機会がありましたらブログ記事に投稿します。
libvirtは、RedHatが開発を進めていて、RedHatの仮想OS戦略としてKVMだけでなくVMWare,xenも考慮しているようです。libvirtでのブリッジ接続は、qemuだけでなくxenでも使用できるようです。
仮想OS環境下でネットワークをエミュレートする場合、ブリッジ接続かNATポートフォワーディングするか、要件によって使い分けするといいです。
今回は、ネットワークのパフォーマンス検証をしていませんが、ブリッジ接続やNAT構成、そしてネットワーク・インターフェイスのエミュレートするデバイスによって、パフォーマンス(転送スピード)のチェックしたいと思っています。