How exactly are the virtual-machine interface and the TAP device in host machine connected?
qemu
(или программа-оболочка, которая запускаетqemu
или другой симулятор )сначала открывает/dev/net/tun
устройство мультиплексор . Это возвращает дескриптор файла, который можно было бы подключить к интерфейсу TAP, вызвавioctl(TUNSETIFF)
на этом fd с именем интерфейса TAP в полеifreq->ifr.name
.Это не удастся, если TAP-интерфейс с таким именем уже был подключен таким образом.
Затем fd можно использовать для записи пакетов, которые будут отображаться на интерфейсе TAP, как если бы они были получены с удаленной стороны, и чтения пакетов, которые были маршрутизированы ядром через интерфейс TAP.
Если вызывающий процесс имеет возможность
CAP_NET_ADMIN
(, напримерroot
), а TAP-интерфейс с таким именем еще не существует, он будет создан автоматически. Если имя не указано, будет использовано первое свободное имя.Тот факт, что
/dev/net/tun
является мультиплексором, означает, чтоopen()
на нем будет каждый раз возвращать дескриптор другой «удаленной половины». И эта «удаленная половина» может быть подключена к одному TAP-интерфейсу.Кроме того, как и любой другой файловый дескриптор, он может быть передан другой программе, если эта программа может использовать его таким образом (, как
qemu
с опцией-netdev tap,fd=FD
).См. пример очень простой
opentap
функции в этом ответе .Дополнительные сведения + пример кода в tuntap.txt из документации ядра.
Or is there only one TAP device? If yes, then how are the MAC addresses different?
Нет, для каждого клиента существует отдельное устройство. Вы можете подключить несколько TAP-устройств к одному и тому же интерфейсу с помощью моста на хосте.
However, there is a TAP device in host machine with the same vnet0 name.....but with different MAC address:
Интерфейсы хоста и гостя совершенно разные; думайте об этом как о виртуальном кабеле UTP --, где каждое устройство на обоих концах имеет свой собственный MAC-адрес.
-device...,mac=...
устанавливает аппаратный адрес эмулируемого устройства на гостевой , а не TAP-устройства на хосте.