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

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

Debian 仮想マシンをインストールする方法は、virt-installゲストに次のイーサネットインターフェイスを提供することですvnet0

$ 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

ただし、ホストに同じ名前のTAPデバイスがありますvnet0

$ 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アドレスはどう違いますか?

答え1

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

qemu(または実行されたラッパーqemuまたは他のエミュレータ)まず、/dev/net/tunデバイスを開きます。マルチプレクサioctl(TUNSETIFF)フィールドにTAPインタフェース名としてfdを呼び出して、TAPインタフェースに添付できるファイル記述子を返しますifreq->ifr.name

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

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

呼び出しプロセスに機能CAP_NET_ADMIN(例:is root)があり、その名前のTAPインターフェースがまだない場合、インターフェースは自動的に作成されます。名前を指定しない場合、最初の無料名が使用されます。

実際、これは/dev/net/tunマルチプレクサです。つまり、open()ハンドルを毎回別の「リモート半分」に戻すということです。この「リモート・ハーフ」は単一のTAPインターフェースに接続できます。

また、他のファイル記述子と同様に、そのプログラムがこの方法で使用できる場合は、他のプログラムに渡すこともできます(qemuoptionsと同様)。-netdev tap,fd=FD

opentapこの記事で非常に簡単な関数の例をご覧ください。回答

詳しくは、サンプルコードについては以下をご覧ください。トンタフー.txtカーネル文書から。

それともTAPデバイスは1つしかありませんか?では、MACアドレスはどう違いますか?

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

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

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

-device ...,mac=...シミュレートされたデバイスのハードウェアアドレスの設定ゲスト、ホストのTAPデバイスではありません。

関連情報