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インターフェースに接続できます。
また、他のファイル記述子と同様に、そのプログラムがこの方法で使用できる場合は、他のプログラムに渡すこともできます(qemu
optionsと同様)。-netdev tap,fd=FD
opentap
この記事で非常に簡単な関数の例をご覧ください。回答。
詳しくは、サンプルコードについては以下をご覧ください。トンタフー.txtカーネル文書から。
それともTAPデバイスは1つしかありませんか?では、MACアドレスはどう違いますか?
いいえ。各クライアントには別々のデバイスがあります。複数のTAPデバイスを同じインターフェイスに接続する方法は、ホストでブリッジを使用することです。
ただし、ホストには vnet0 名は同じですが、MAC アドレスには異なる TAP デバイスがあります。
ホスト側とゲスト側のインターフェイスはまったく異なります。これを仮想UTPケーブルと考えてください。両端の各デバイスには独自のMACがあります。
-device ...,mac=...
シミュレートされたデバイスのハードウェアアドレスの設定ゲスト、ホストのTAPデバイスではありません。