QEMU не может открыть устройство Tap на хосте Windows 10 - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь подключить виртуальную машину QEMU к локальному адаптеру на моем хосте Windows 10, но QEMU жалуется на то, что имя интерфейса, предоставленное параметром ifname для аргумента -netdev, не может быть открыто. Я следовал за ответом в https://superuser.com/questions/1317652/how-to-set-up-nat-for-qemu-with-tap-backend-windows-10, но безуспешно. Я кросс-скомпилировал QEMU из исходного кода для отладки этого поведения, для того, можно ли определить имя интерфейса, и, очевидно, QEMU может найти имя адаптера, но не файл устройства TAP. Чтобы пояснить мою точку зрения, здесь приведен фрагмент кода из net/tap-win32.c:595 из исходного кода QEMU 4.2.0 (последняя версия на момент написания этой статьи), в частности функция tap_win32_open, и я выделю, где в этой функции произошел сбой ( ищите // THIS IS WHERE IT WILL FAIL. комментариев):

  1. Тестирование с корректным существующим сетевым интерфейсом:
static int tap_win32_open(tap_win32_overlapped_t **phandle,
                          const char *preferred_name)
{
    ...

    rc = get_device_guid(device_guid, sizeof(device_guid), name_buffer, sizeof(name_buffer));
    if (rc)
        return -1;

    snprintf (device_path, sizeof(device_path), "%s%s%s",
              USERMODEDEVICEDIR,
              device_guid,
              TAPSUFFIX);

    handle = CreateFile (
        device_path,
        GENERIC_READ | GENERIC_WRITE,
        0,
        0,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED,
        0 );

    if (handle == INVALID_HANDLE_VALUE) {
        return -1; // THIS IS WHERE IT WILL FAIL.
    }

    ...
Тестирование с неверным (несуществующим) сетевым интерфейсом:
static int tap_win32_open(tap_win32_overlapped_t **phandle,
                          const char *preferred_name)
{
    ...

    rc = get_device_guid(device_guid, sizeof(device_guid), name_buffer, sizeof(name_buffer));
    if (rc)
        return -1; // THIS IS WHERE IT WILL FAIL.

    snprintf (device_path, sizeof(device_path), "%s%s%s",
              USERMODEDEVICEDIR,
              device_guid,
              TAPSUFFIX);

    handle = CreateFile (
        device_path,
        GENERIC_READ | GENERIC_WRITE,
        0,
        0,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED,
        0 );

    if (handle == INVALID_HANDLE_VALUE) {
        return -1;
    }

    ...

QEMU использует префикс USERMODEDEVICEDIR, равный \\.\Global\, и суффикс .tap к GUID устройства создать путь к устройству в Windows. Например, сетевой адаптер, с которым я имею дело, приводит к следующему пути к устройству: \\.\Global\{990DA322-3986-4854-AE93-1D6FB0BFA137}.tap. Любая идея, почему CreateFile всегда приводит к INVALID_HANDLE_VALUE на пути устройства? Кстати, GetLastError() возвращает 2, что от docs.microsoft.com означает следующее:

...
ERROR_FILE_NOT_FOUND

2 (0x2)

The system cannot find the file specified.
...

1 Ответ

0 голосов
/ 21 января 2020

Я прошу прощения. Я подключался к адаптеру без TAP, думая, что он получит адрес от него, так же, как VirtualBox. Раньше я не совсем понимал концепцию мостового соединения в QEMU, но теперь мне нужно подключиться к адаптеру TAP и подключить этот адаптер к другому предпочтительному адаптеру.

...