понедельник, 22 ноября 2010 г.

Проблема при добавлении виртуальной сетевой карты на физический интерфейс Hyper-V

Некоторое время назад для моделирования одной ситуации, мне понадобилось соединить виртуальную машину с MS Windows 7 Home Premium с Wi-fi роутером. Поскольку подключить его к рабочей сети не представлялось возможным, по причине ограничения 1 mac-адреса на 1 розетку, единственным адекватным (на тот момент) решением стало подключение 2-ого физического сетевого интерфейса в хост-машину под управлением Hyper-V Server 2008 RC2.


В имеющихся запасах был найдем относительно не новый Realtek RTL8139/810x Family Fast Ethernet NIC. После подключения и загрузки Hyper-V обнаружилось, что Realtek в списке сетевого оборудования консольной оснастки отстуствует.

По факту, в Hyper-V, который стоял у меня, не было ни, по сути, графического интерфейса (что для человека, постоянно работающий с nix-ами, не особо страшно), но хуже того, в нем не было почти никаких штатных средств для исправления положения, или хотя бы его понимания.
Поэтому, в первую очередь был найден и установлен дистрибутив Microsoft Support Tools, для Win 2003 x 64 (для 2008 так и не нашел), который включал в себя утилиту devcon.exe – аналог гуевого диспетчера устройств.

С помощью него, я определил нужный мне VID&DEV Realtek-а, и занялся поисками драйвера.
C:\> devcon.exe status PCI\*
Сам драйвер удалось найти от Windows 7 x64.

Устанавливаем:
C:\> devcon update C:\realtek\Netrtl64.inf "PCI\VEN_10EC&DEV_8139"
Updating drivers for PCI\VEN_10EC&DEV_8139 from C:\realtek\Netrtl64.inf 
Drivers installed successfully.
Устройство, заработало и выдало APIPA (кабель к сетевой карте подключен не был).

Не предвещая беды, я попробовал добавить виртуальную сетевую карту, на физический realtek, через удаленную оснастку Hyper-V Manager.
Результатом было сообщение:

Setup switch failed.
The wait operation timed out.

Исходя из опыта, прошлой настройки, когда также при добавлении виртуального адаптера я получил ошибку:

There was an error enumerating the machines network switches.

я воспользовался командой полного удаления и последующей переустановки драйвера витруального свитча:
C:\> net stop nvpswmi
C:\> netcfg -u vms_pp
Перезагрузка хостовой машины.
netcfg -l c:\windows\winsxs\amd64_wvms_pp.inf_31bf3856ad364e35_6.1.7600.16385_none_
beda85050b13680c\wvms_pp.inf -c p -i vms_pp
Но в этот раз, все так хорошо не вышло.
После переустановки драйвера, ситуация с ошибкой не изменилась, более того, поскольку Microsoft Hyper-V Network Switch Default Miniport был удален, созданный ранее виртуальный интерфейс, который смотрел в физический интерфейс интегрированной карты, также удалился. То есть пришел я к тому, что выход в сеть все гостевые ОС потеряли.
Realtek-овскую сетевуху я вынул сразу, дабы избежать ухудшения и без того не простой ситуации.
Далее была найдена и скачена утилита nvspbind для работы с биндингом сетевых карт Hyper-V.
Команда nvspbind.exe -n выводит все сетевые подключения, включая виртуальный свитч, и главное, их GUID и Vendor и Device ID устройств.

Поиск Realtek-овской карты:
C:\> devcon.exe status PCI\*
Если ее там нет, то:
C:\> devcon.exe findall PCI\*
Ищем драйвер, после чего удаляем:
C:\> devcon.exe -r remove *PCI\VID_[realtek VID here]&PID_[realtek PID here]*
Для удаления какого-либо подключения нужно ввести nvspbind.exe -u {GUID}
Именно это я проделал, первым делом, избавившись от всех подключений, кроме интегрированной карты.
Ситуацию это разумеется не исправило, и результатом некоторого времени поиска стал путь к лог-файлам -

C:\Windows\Inf\setupapi.app.log
C:\Windows\Inf\setupapi.dev.log

Которые рассказали много интересного, например:
>>> [DIF_REGISTERDEVICE - ROOT\*6TO4MP\0000]
>>> Section start 2010/11/09 13:32:59.403
cmd: C:\Windows\system32\svchost.exe -k netsvcs
!!! dvi: Loading module 'C:\Windows\system32\wlaninst.dll' failed.
!!! dvi: Error 126: The specified module could not be found.
!!! dvi: Error 126 loading CoInstaller(wlaninst.dll,WlanDeviceClassCoInstaller)
!!! dvi: Error 126: The specified module could not be found.
!!! dvi: Loading module 'C:\Windows\system32\wwaninst.dll' failed.
!!! dvi: Error 126: The specified module could not be found.
!!! dvi: Error 126 loading CoInstaller(wwaninst.dll,WwanDeviceClassCoInstaller)
!!! dvi: Error 126: The specified module could not be found.
<<< Section end 2010/11/09 13:32:59.403
<<< [Exit status: SUCCESS]
Скопировал с Win7 x64 wlaninst.dll и wwaninst.dll, забросил в C:\Windows\System32\
Ошибка пропала. Идем дальше:
>>> [DIF_INSTALLDEVICE - ROOT\*6TO4MP\0000]
>>> Section start 2010/11/11 09:45:45.393
cmd: C:\Windows\system32\svchost.exe -k netsvcs
cci: NdisCoinst: Guid of the adapter is {C0709BAD-CB39-42FA-9E14-CA7DBF7D15FE}
cci: NdisCoinst: IfType 131, Characteristics 0x9, IsIrdaDevice 0, PhysicalMediaType 0, MediaType 15, IsBridge 0, FoundGuidInDownlevel 0, EnableDhcp 2
cci: NdisCoinst: Connection name is Local Area Connection* 1938
!!! cci: NdisCoinst: NcipAllocateNetLuidIndex failed with error 0x5aa
!!! dvi: CoInstaller 1: failed(0x000005aa)!
!!! dvi: Error 1450: Insufficient system resources exist to complete the requested service.
<<< Section end 2010/11/11 09:46:03.739
<<< [Exit status: FAILURE(0x000005aa)]
А это уже серьезнее.
В nvspbind и реестре GUID-а {C0709BAD-CB39-42FA-9E14-CA7DBF7D15FE} не ищется.
Спустя несколько часов поисков, похожая проблема было найдена в блоге одного словака (спасибо Google Translate). Решение (которое нам с гугл-транслэйтом далось очень не легко) заключалось в следующем:
Проверить значение ключа Computer → HKEY_LOCAL_MACHINE → SYSTEM → CurrentControlSet → services → NDIS → IfTypes → Произвольный номер → IfUsedNetLuidIndices, и если оно вида “FF FF FF FF...”, то заменить его на значение из аналогичного ключа, другой папки.

Сделал бэкап ключа, после чего сменил его на 01. Перезагрузился. Не полегчало. Теперь в логе было следующее:
>>> [DIF_INSTALLDEVICE - ROOT\*ISATAP\0000]
>>> Section start 2010/11/15 10:16:54.578
cmd: C:\Windows\system32\svchost.exe -k netsvcs
cci: NdisCoinst: Guid of the adapter is {9D5A8A89-01A8-49D2-B8E8-5EE14588C937}
cci: NdisCoinst: IfType 131, Characteristics 0x9, IsIrdaDevice 0, PhysicalMediaType 0, MediaType 15, IsBridge 0, FoundGuidInDownlevel 0, EnableDhcp 2
cci: NdisCoinst: Connection name is Local Area Connection* 1940
cci: NdisCoinst: Allocated NetLuidIndex is 1
!!! cci: NdisCoinst:NcipCreatePersistedInterface DeviceIoControl failed with error 0x1f
!!! cci: NdisCoinst: NcipCreatePersistentInterface failed with error 0x1f
cci: NdisCoinst: Freeing the allocated NetLuid IfType 131 NetLuidIndex 1
!!! dvi: CoInstaller 1: failed(0x0000001f)!
!!! dvi: Error 31: A device attached to the system is not functioning.
<<< Section end 2010/11/15 10:17:14.718
<<< [Exit status: FAILURE(0x0000001f)]
Пробовал удалить каталог реестра, в которой лежал ключ IfUsedNetLuidIndices со значениями “ff ff ff ff...”, после перезагрузки он создается заного.
И все же речь идет об устройстве, которое не является физическим.

Дальнейшие поиски это подтвердили:
Система по какой-то причине не могла найти драйвер на Microsoft ISATAP Adapter.
Протокол устройств Microsoft ISATAP (Inter Site Automatic Tunneling Address Protocol) используется для облегчения перехода предприятий к инфраструктуре IP версии 6 (IPv6). Адаптер ISATAP инкапсулирует IPv6-пакеты, используя заголовок IPv4. Эта функция позволяет клиентам передавать трафик IPv6 через инфраструктуру IPv4.
© Microsoft
Лично я IPv6 не использую, и мне данный протокол мне не сильно нужен. Так что решение было кардинальным:

Ищем драйвер в системе:
C:\> devcon.exe findall @root\*
ROOT\*ISATAP\0000
Удаляем:
C:\> devcon.exe -r remove *ISATAP*
После вновь открываем regedit, ищем там:
Computer → HKEY_LOCAL_MACHINE → SYSTEM → CurrentControlSet → services → TCPIP6 → Parameters

Далее создаем DWORD 32-bit со следующими данными:

Value name: DisabledComponents
Value data: 0xffffffff
Base: Hex

Перезагружаемся.

Вставляем 2-ую сетевую карту.
Повторяем операцию по ее установке.

Еще раз перезагружаемся.
После этого ошибки в логе исчезли, виртуальные сетевые адаптеры создались без проблем.

Problem Solved. Читать дальше...

1 комментарий: