web-dev-qa-db-ja.com

virt-installがホストマシンのイーサネットインターフェイスをクエストのイーサネットインターフェイスに接続する方法を理解していますか?

ゲストがvirt-installという名前のイーサネットインターフェイスを1つ取得するように、vnet0を使用してDebian仮想マシンをインストールしました。

$ virsh domiflist git-server
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     br-ext     rtl8139     52:54:00:a8:32:d7

$ 

これは、qemuコマンドラインを調べるときに確認できます。

-netdev tap,fd=27,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:a8:32:d7,bus=pci.0,addr=0x2

ただし、ホストマシンには同じvnet0名のTAPデバイスがあります。

$ ethtool -i vnet0                                                                                  
driver: tun
version: 1.6
firmware-version: 
expansion-rom-version: 
bus-info: tap
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no
$ 

..ただし、MACアドレスが異なる場合:

$ ip l sh vnet0                                                                                     
56: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br-ext state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether fe:54:00:a8:32:d7 brd ff:ff:ff:ff:ff:ff
$ 

ホストマシンの仮想マシンインターフェイスとTAPデバイスはどの程度正確に接続されていますか?または、TAPデバイスは1つだけですか?はいの場合、MACアドレスはどのように異なりますか?

2
Martin

ホストマシンの仮想マシンインターフェイスとTAPデバイスはどの程度正確に接続されていますか?

qemu(またはqemuまたは別のシミュレーターを起動するラッパープログラム)は、最初に_/dev/net/tun_デバイスマルチプレクサ。これにより、ファイル記述子が返されます。この記述子は、_ifreq->ifr.name_フィールドにTAPインターフェイスの名前を指定してそのfdでioctl(TUNSETIFF)を呼び出すことにより、TAPインターフェイスにアタッチできます。

その名前のTAPインターフェイスがすでにこの方法で接続されている場合、これは失敗します。

次に、fdを使用して、リモート側から受信したかのようにTAPインターフェイスに表示されるパケットを書き込み、カーネルによってTAPインターフェイスを介してルーティングされたパケットを読み取ることができます。

呼び出しプロセスに_CAP_NET_ADMIN_機能があり(たとえば、root)、その名前のTAPインターフェイスがまだ存在しない場合は、自動的に作成されます。名前が指定されていない場合は、最初のフリーネームが使用されます。

_/dev/net/tun_がマルチプレクサであるという事実は、その上のopen()がハンドルが異なる「リモートハーフ」に戻るたびに戻ることを意味します。そして、その「リモートハーフ」を単一のTAPインターフェイスに接続できます。

また、他のファイル記述子と同様に、そのプログラムがこの方法で使用できる場合は、別のプログラムに渡すことができます(qemuには_-netdev tap,fd=FD_オプションがあるため)。

この answer の非常に単純なopentap関数の例を参照してください。

詳細+カーネルドキュメントの tuntap.txt のサンプルコード。

または、TAPデバイスは1つだけですか?はいの場合、MACアドレスはどのように異なりますか?

いいえ、クライアントごとに個別のデバイスがあります。複数のTAPデバイスを同じインターフェイスに接続する方法は、ホスト上のブリッジを使用することです。

ただし、ホストマシンには同じvnet0名のTAPデバイスがありますが、MACアドレスは異なります。

ホストのインターフェースとゲストのインターフェースは完全に異なります。これは、仮想UTPケーブルのように考えてください。両端の各デバイスに独自のMACがあります。

_-device ...,mac=..._は、ホスト上のTAPデバイスではなく、guest上のエミュレートされたデバイスのハードウェアアドレスを設定します。

2
pizdelect