ゲストが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アドレスはどのように異なりますか?
ホストマシンの仮想マシンインターフェイスと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上のエミュレートされたデバイスのハードウェアアドレスを設定します。