Eu instalei a máquina virtual Debian de virt-install
forma que o convidado tenha uma interface Ethernet chamada vnet0
:
$ virsh domiflist git-server
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 bridge br-ext rtl8139 52:54:00:a8:32:d7
$
Isso pode ser confirmado ao inspecionar a qemu
linha de comando:
-netdev tap,fd=27,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:a8:32:d7,bus=pci.0,addr=0x2
No entanto, há um dispositivo TAP na máquina host com o mesmo vnet0
nome:
$ 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
$
..mas com endereço MAC diferente:
$ 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
$
Como exatamente a interface da máquina virtual e o dispositivo TAP na máquina host estão conectados? Ou existe apenas um dispositivo TAP? Se sim, como os endereços MAC são diferentes?
qemu
(ou um programa wrapper que iniciaqemu
ou outro simulador) primeiro abre o multiplexador/dev/net/tun
de dispositivo . Isso retorna um descritor de arquivo, que pode ser anexado a uma interface TAP chamando esse fd com o nome da interface TAP no campo.ioctl(TUNSETIFF)
ifreq->ifr.name
Isso falhará se a interface TAP com esse nome já estiver conectada dessa maneira.
O fd pode então ser usado para escrever pacotes que aparecerão na interface TAP como se fossem recebidos do lado remoto e ler pacotes que foram roteados através da interface TAP pelo kernel.
Se o processo de chamada tiver a
CAP_NET_ADMIN
capacidade (por exemplo, isroot
), e uma interface TAP com esse nome ainda não existir, ela será criada automaticamente. Se nenhum nome for fornecido, o primeiro nome livre será usado.O fato de
/dev/net/tun
ser um multiplexador significa que umopen()
on ele retornará cada vez que um handle para uma "metade remota" diferente. E essa "metade remota" poderia ser anexada a uma única interface TAP.Além disso, como qualquer outro descritor de arquivo, que pode ser passado para outro programa, se esse programa puder usá-lo dessa maneira (como
qemu
é com sua-netdev tap,fd=FD
opção).Veja um exemplo de uma
opentap
função muito simples nesta resposta .Mais detalhes + código de exemplo no tuntap.txt da documentação do kernel.
Não, há um dispositivo separado para cada cliente. A maneira como você pode conectar vários dispositivos TAP à mesma interface é usando uma ponte no host.
A interface do host e a do convidado são completamente diferentes; pense nisso como um cabo UTP virtual - com cada dispositivo em ambas as extremidades tendo seu próprio MAC.
O
-device ...,mac=...
define o endereço de hardware do dispositivo emulado no convidado , não do dispositivo TAP no host.