一方の VM ゲスト システムから他の VM ゲスト システムやその他のネットワークと通信を行う必要がしばしば発生します。 VM ゲスト 側でのネットワークインターフェイスは独立したデバイスドライバで動作しているものであり、 Dom0 側にそれらの仮想イーサネットデバイスに対応するネットワークインターフェイスが存在していることになります。このインターフェイスは Dom0 内で動作する仮想ネットワークにアクセスするために作られています。このようなブリッジ型の仮想ネットワークは openSUSE Leap のシステム設定内に完全に統合されていて、 YaST からも設定を行うことができるようになっています。
Xen の VM ホストサーバ をインストールすると、通常のネットワーク設定の際にブリッジ型のネットワーク設定を行うよう提案が表示されます。ユーザ側ではインストール時に設定を変更することができるほか、必要に応じてカスタマイズを行うこともできます。
また、システムのインストールを行った後からでも、 YaST 内に用意された ハイパーバイザとツールのインストール
を使用することで、必要に応じて Xen VM ホストサーバ をインストールすることができます。このモジュールは仮想マシンを動作させるためのシステム側の準備を行う仕組みで、既定のネットワークブリッジの構築も行うことができます。
rpm
や zypper
などを利用して手作業で Xen VM ホストサーバ に必要なパッケージをインストールした場合、残りのシステム設定は管理者が手作業で行うか、 YaST を利用して行う必要があります。
Xen 側で提供されているネットワークスクリプトは、 openSUSE Leap の既定では使用されません。これらは念のため用意されているだけであり、無効化されています。 openSUSE Leap の Xen で使用するネットワークの設定は、通常のネットワークインターフェイス設定と同様に、 YaST のシステム設定で行います。
ネットワークブリッジの管理方法に関する一般的な情報については、 8.1.1項 「ネットワークブリッジ」 をお読みください。
Xen ハイパーバイザでは、 VM ゲスト 側に提供することのできるネットワークインターフェイスの種類が複数用意されています。可能であれば準仮想化ネットワークインターフェイスを使用するのが推奨されます。これにより、最低限のシステム要件で最大の伝送速度を得ることができます。また、それぞれの VM ゲスト に対して最大で 8 個までのネットワークインターフェイスを設定することができます。
準仮想化ハードウエアに対応していないシステムの場合、準仮想化ネットワークインターフェイスを使用することができません。この場合、システムをネットワークに接続するには、完全仮想化環境での擬似ネットワークインターフェイスを使用します。下記の擬似ネットワークインターフェイスを使用することができます:
Realtek 8139 (PCI) (既定の擬似ネットワークカードです)
AMD PCnet32 (PCI)
NE2000 (PCI)
NE2000 (ISA)
Intel e100 (PCI)
Intel e1000 およびその派生ハードウエア (e1000-82540em, e1000-82544gc, e1000-82545em) (PCI)
これらのネットワークインターフェイスはいずれも、ソフトウエアインターフェイスです。それぞれのネットワークインターフェイスには、他のものと重複しないユニークな MAC アドレスを設定しなければなりませんが、 Xensource に割り当てられた MAC アドレスの中から使用することになります。
仮想環境内の MAC アドレスの設定は、既定で乱数を使用して設定され、 00:16:3E:xx:xx:xx のような値になります。通常は MAC アドレスの範囲はそれなりに大きいため、重複する可能性はほとんどありませんが、非常に大量のマシンを配置するような場合や、乱数による MAC アドレスの割り当てで発生しうる問題を完全に回避したい場合は、手作業で MAC アドレスを設定してください。
デバッグやシステム管理を行う目的で、ゲスト内で動作しているイーサネットデバイスが Dom0 内の仮想インターフェイスのどれに接続されているのかを知っておくと便利です。この情報は Dom0 内の名前付けルールから判別することができます。仮想インターフェイスの名前は、 vif<ドメイン番号>.<インターフェイス番号>
の形式になります。
たとえば ID=5 の VM ゲスト の 3 番目のインターフェイス (eth2) の Dom0 でのデバイス名は、 vif5.2
になります。利用可能な全てのインターフェイスを表示したい場合は、 ip a
コマンドを実行してください。
デバイスの命名では、そのインターフェイスがどのブリッジに接続されているのかを知ることができません。しかしながら、この情報は Dom0 内で管理されています。ブリッジに接続されているインターフェイスを知りたい場合は、 bridge link
コマンドを実行してください。出力は下記のようになります:
>
sudo
bridge link 2: eth0 state DOWN : <NO-CARRIER,BROADCAST,MULTICAST,SLAVE,UP> mtu 1500 master br0 3: eth1 state UP : <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 master br1
上記の例では br0
, br1
, br2
の 3 つのブリッジが設定されていて、そのうち br0
と br1
には実際のイーサネットデバイス (eth0
と eth1
) が接続されていることになります。
Xen では Dom0 での制御によってホストベースのルーティングを設定することができます。ですが、残念なことに YaST では十分にサポートされておらず、設定ファイルを多数手作業で編集する必要があります。そのため、この設定は知識のあるシステム管理者が行う必要があります。
下記の設定では、固定の IP アドレスを利用した設定を行っています。この設定では VM ゲスト と VM ホストサーバ との間で互いに IP アドレスを知っておく必要があることから、 DHCP 環境での使用には対応していません。
ルーティング型のゲストを構築するのに最も簡単な方法は、ブリッジ型のネットワークをルーティング型のネットワークに変更することです。下記の手順でも、 VM ゲスト に対してあらかじめブリッジ型のネットワークが構成されているものとしています。また下記の説明では、 VM ホストサーバ が earth という名前で 192.168.1.20 というアドレス、そして VM ゲスト が alice という名前で 192.168.1.21 というアドレスであるものとします。
alice がシャットダウンされていることを確認します。 xl
コマンドを実行してシャットダウンとその確認を行ってください。
VM ホストサーバ earth のネットワーク設定を準備します:
トラフィックをルーティングするためのホットプラグ型インターフェイスを作成します。これを実現するには、 /etc/sysconfig/network/ifcfg-alice.0
ファイルを作成して、下記の内容を記述します:
NAME="Xen guest alice" BOOTPROTO="static" STARTMODE="hotplug"
IP 転送を有効化します:
YaST を起動して、
› を開きます。タブ内にある と をそれぞれ選択します。
設定を適用して YaST を終了します。
firewalld
に対して下記のとおり設定を適用します:
public ゾーン内のデバイスに alice.0 を追加します:
>
sudo
firewall-cmd --zone=public --add-interface=alice.0
転送すべきアドレスをファイアウオールに設定します:
>
sudo
firewall-cmd --zone=public \ --add-forward-port=port=80:proto=tcp:toport=80:toaddr="192.168.1.21/32,0/0"
設定を恒久的に保存します:
>
sudo
firewall-cmd --runtime-to-permanent
alice のインターフェイスに対してスタティックルートを追加します。これを行うには、下記の内容を /etc/sysconfig/network/routes
の末尾に追加します:
192.168.1.21 - - alice.0
VM ホストサーバ が接続しているスイッチやルータに対して、ルーティングインターフェイスであることを認識させるため、 earth 側で proxy_arp
を有効化します。下記の内容を /etc/sysctl.conf
に追加します:
net.ipv4.conf.default.proxy_arp = 1 net.ipv4.conf.all.proxy_arp = 1
下記のコマンドを実行して変更点を適用します:
>
sudo
systemctl restart systemd-sysctl wicked
あとは 26.1項 「xl: Xen 管理ツール」 で説明している内容に従って alice 向けの vif インターフェイス設定を変更し、 VM ゲスト の Xen 設定を行います。処理中に生成したテキストファイルに対して、下記の変更を行います:
下記の内容を削除します:
bridge=br0
下記の内容を追加します:
vifname=vifalice.0
もしくは
vifname=vifalice.0=emu
(完全仮想化ゲストの場合)
インターフェイスを設定する際のスクリプトを下記のように変更します:
script=/etc/xen/scripts/vif-route-ifup
新しい設定を適用し、 VM ゲスト を起動します。
残りの設定作業は VM ゲスト 内から実施します。
xl console
仮想マシン名 のように入力して実行し、 VM ゲスト のコンソールを開いてログインします。
ゲスト側の IP アドレスが 192.168.1.21 になっていることを確認します。
VM ホストサーバ に対して VM ゲスト へのホストルートとデフォルトゲートウエイを設定します。具体的には、下記の内容を /etc/sysconfig/network/routes
に追加します:
192.168.1.20 - - eth0 default 192.168.1.20 - -
最後に VM ゲスト からインターネット側へのアクセスを確認するとともに、ネットワーク側から VM ゲスト 側へのアクセスも確認します。
マスカレード型のネットワークの設定はルーティング型の設定に似ていますが、 proxy_arp の設定が不要となるほか、いくつかのファイアウオールルールの設定が異なります。 dolly という名前のゲストが 192.168.100.1 というアドレスで存在し、外部インターフェイスと接続されているブリッジが br0
である場合、下記のように実施します。設定を簡単にするため、インストール済みのゲストに対してマスカレード型ネットワークを設定するものとします:
xl shutdown
仮想マシン名 のように入力して実行し、 VM ゲスト をシャットダウンします。
VM ホストサーバ 側でのネットワーク設定を行います:
トラフィックをルーティングするためのホットプラグ型インターフェイスを作成します。これを実現するには、 /etc/sysconfig/network/ifcfg-dolly.0
ファイルを作成して、下記の内容を記述します:
NAME="Xen guest dolly" BOOTPROTO="static" STARTMODE="hotplug"
/etc/sysconfig/SuSEfirewall2
ファイルを編集し、下記の設定を追加します:
FW_DEV_DMZ のデバイス内に dolly.0 を追加します:
FW_DEV_DMZ="dolly.0"
ファイアウオールでルーティングを有効化します:
FW_ROUTE="yes"
ファイアウオールでマスカレードを有効化します:
FW_MASQUERADE="yes"
ファイアウオールに対して、マスカレード処理を行うように指定します:
FW_MASQ_NETS="192.168.100.1/32"
マスカレードの例外からネットワークを削除します:
FW_NOMASQ_NETS=""
最後にファイアウオールを再起動します:
>
sudo
systemctl restart SuSEfirewall2
dolly のインターフェイスに対してスタティックルートを追加します。これを行うには、下記の内容を /etc/sysconfig/network/routes
の末尾に追加します:
192.168.100.1 - - dolly.0
これまでに行った変更を反映させます:
>
sudo
systemctl restart wicked
あとは VM ゲスト の Xen 設定を行います。
あとは 26.1項 「xl: Xen 管理ツール」 で説明している内容に従って alice 向けの vif インターフェイス設定を変更します。
下記の内容を削除します:
bridge=br0
下記の内容を追加します:
vifname=vifdolly.0
インターフェイスを設定する際のスクリプトを下記のように変更します:
script=/etc/xen/scripts/vif-route-ifup
新しい設定を適用し、 VM ゲスト を起動します。
残りの設定作業は VM ゲスト 内から行います:
xl console
仮想マシン名 のように入力して実行し、 VM ゲスト のコンソールを開いてログインします。
ゲスト側の IP アドレスが 192.168.100.1 に設定されていることを確認します。
VM ホストサーバ に対して VM ゲスト へのホストルートとデフォルトゲートウエイを設定します。具体的には、下記の内容を /etc/sysconfig/network/routes
に追加します:
192.168.1.20 - - eth0 default 192.168.1.20 - -
最後に VM ゲスト からインターネット側へのアクセスを確認します。
Xen ではさまざまなネットワーク設定を行うことができます。下記の設定はいずれも、既定では有効化されていないものです:
Xen では仮想化ゲストに対して、ブリッジにアクセスする際の許可帯域を設定することができます。この設定を行うには、まず 26.1項 「xl: Xen 管理ツール」 に示している手順に従って、 VM ゲスト の設定を変更する必要があります。
設定ファイル内で、仮想ブリッジに接続されているデバイスを探します。設定は下記のようになっているはずです:
vif = [ 'mac=00:16:3e:4f:94:a9,bridge=br0' ]
最大帯域を設定するには、この設定の中に rate
という項目を追加します。たとえば下記のようになります:
vif = [ 'mac=00:16:3e:4f:94:a9,bridge=br0,rate=100Mb/s' ]
なお、帯域の指定は Mb/s
(メガビット毎秒) もしくは MB/s
(メガバイト毎秒) の単位で指定することができます。上記の例では、仮想インターフェイスに対する最大帯域を 100 メガビット毎秒に指定しています。既定では仮想ブリッジに対するゲストの帯域制限はありません。
また、帯域計算の粒度として時間を指定して調整を図ることもできます。たとえば下記のようになります:
vif = [ 'mac=00:16:3e:4f:94:a9,bridge=br0,rate=100Mb/s@20ms' ]
特定のインターフェイスに対してトラフィックを監視するには、 iftop
というプログラムを利用して、端末内でトラフィックの監視を行うとよいでしょう。
Xen の VM ホストサーバ を動作させている場合、監視対象のインターフェイスを指定して動作させる必要があります。ここで指定するインターフェイスは、物理ネットワークが接続されているブリッジデバイスとなります (例: br0
) 。そのため、インターフェイス名はシステムによって異なることになります。全ての物理インターフェイスを監視したい場合は、 root
で端末を起動して、下記のコマンドを実行してください:
iftop -i br0
特定の VM ゲスト のインターフェイスのトラフィックのみを監視したい場合は、仮想インターフェイスを指定して実行します。たとえばドメイン ID が 5 の 1 つめのイーサネットデバイスを監視したい場合は、下記のようなコマンドになります:
ftop -i vif5.0
iftop
を終了させるには Q キーを押します。オプションや用途に関する詳細は、 man 8 iftop
で表示されるマニュアルページをお読みください。