Хорошо, частичный ответ:
Виртуальная машина видит только предоставленное ей оборудование. Это может быть «настоящее» оборудование, «украденное» с физической машины, на которой работает виртуальная машина, или это может быть «симулированное» оборудование, такое как USB-концентратор и мышь VMware.
Не зная вашей ситуации, предполагая, что USB-устройство чтения смарт-карт подключено к физической машине, оно вообще не будет отображаться на виртуальной машине, если только оно не назначено этой машине.
Поэтому вам нужно попросить того, кто управляет виртуальной машиной, назначить ее вашей машине.
Проблема в dhcp.c
/* When bind-interfaces is set, there might be more than one dnsmasq
instance binding port 67. That's OK if they serve different networks.
Need to set REUSEADDR|REUSEPORT to make this possible.
Handle the case that REUSEPORT is defined, but the kernel doesn't
support it. This handles the introduction of REUSEPORT on Linux. */
if (option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND))
{
int rc = 0;
#ifdef SO_REUSEPORT
if ((rc = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &oneopt, sizeof(oneopt))) == -1 &&
errno == ENOPROTOOPT)
rc = 0;
#endif
if (rc != -1)
rc = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &oneopt, sizeof(oneopt));
if (rc == -1)
die(_("failed to set SO_REUSE{ADDR|PORT} on DHCP socket: %s"), NULL, EC_BADNET);
}
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);
saddr.sin_addr.s_addr = INADDR_ANY;
#ifdef HAVE_SOCKADDR_SA_LEN
saddr.sin_len = sizeof(struct sockaddr_in);
#endif
if (bind(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)))
die(_("failed to bind DHCP server socket: %s"), NULL, EC_BADNET);
Сокет привязан к INADDR _ANY (0.0.0.0 )без каких-либо условий.
Похоже, что намерение автора состоит в том, чтобы несколько dnsmasqs совместно использовали 0.0.0.0 :67 с помощью SO_REUSEPORT
. Это нормально для нескольких dnsmasq, но не очень хорошо, когда dnsmasq должен существовать совместно -с другим DHCP-сервером, который не устанавливает SO _REUSEPORT.
Java имеет SO _REUSEADDR, но не SO _REUSEPORT:
packages/modules/NetworkStack/src/android/net/dhcp/DhcpServer.java:642: error: cannot find symbol
Os.setsockoptInt(mSocket, SOL_SOCKET, SO_REUSEPORT, 1);
, но это можно исправить с помощью:
final int SO_REUSEPORT = 15;