Почему при копировании виртуальной машины не сохраняются сетевые настройки?
За последние пару месяцев мне несколько раз задавали вопрос, почему при копировании виртуальной машины сбрасываются настройки сетевых интерфейсов. Если честно, изначально я не придавал ему большого значения, но когда он прозвучал из нескольких независимых источников — решил разобраться. В Virtual Server 2005 мы просто копировали файлы виртуальных дисков (VHD) и настроек виртуальных машин (VMC) на любой другой сервер, или даже просто создавали новую ВМ на основе старого виртуального диска — и все настройки внутри ВМ сохранялись. В Hyper-V для этого потребуется экспортировать виртуальную машину отдельной командой, а затем импортировать ее соответствующим образом. Но иногда этой процедурой приходится пренебречь и просто скопировать файл виртуального диска. Например, когда этот файл вам передали на внешнем носителе, не экспортировав предварительно ВМ. Что же произойдет в этом случае? Вы создадите новую ВМ, включите ее, она загрузится — но все сетевые настройки: адрес IP, серверы WINS и DNS, суффикс подключения будут потеряны. Почему это происходит? Сразу скажу, новая модель безопасности и изоляции ВМ в Hyper-V тут ни при чем. Подумайте — что будет, если вы в физическом сервере замените сетевую карту? Или даже перенесете жесткий диск в другой сервер — что, собственно, и происходит при создании новой ВМ на основе имеющегося файла виртуального диска. Вот тут-то и зарыта собака! Случится то же самое: потеряются настройки подключения. Ведь изменится GUID сетевой карты, и для нового устройства ОС создаст новое подключение. Давайте разберемся, что с этим можно сделать, куда исчезает старое подключение, исчезает ли вообще и можно ли вернуть настройки обратно.
Предположим, что я получил виртуальный диск с виртуальной машиной Windows Server 2008. Разумеется, получил без остальных экспортированных настроек. Я создал новую виртуальную машину (она получила новые GUID и SID) и настроил ее на использование полученного мною диска в качестве загрузочного. Загрузив ОС, я вижу, что сетевые настройки сбросились в состояние по умолчанию. Однако я знаю, какие именно настройки у этой ОС должны быть — и присваиваю сетевому интерфейсу те же адреса IP, которые были настроены ранее. И неожиданно получаю следующее предупреждение.
Интересно! При попытке применить настройки, ОС предупреждает меня о том, что они уже заданы для другого сетевого интерфейса. Но ведь интерфейс у нас всего один! Значит, Windows «помнит» о старом интерфейсе — и его настройках. Существует даже статья Базы знаний номер 315539, которая рассказывает о том, как эту информацию можно удалить. Она рассказывает про Windows XP, но процедура аналогична и для более новых версий ОС.
Итак, мы поняли, что же происходит. При создании новой виртуальной машины создается новый сетевой интерфейс, который получает настройки по умолчанию. Старые настройки хранятся в ОС, но нам не видны. Дальше я расскажу чуть глубже о подходе Hyper-V к хранению информации, об оборудовании виртуальных машин и дает практические советы о том, что же теперь делать.
Что у нас имеется на данный момент:
- Виртуальный диск от машины с Windows Server 2008. В настройках ее сетевого интерфейса был задан адрес IP 192.168.1.8.
- Новая виртуальная машина с одним синтетическим сетевым интерфейсом, к которой мы добавили этот диск.
- ОС в виртуальной машине задала настройки по умолчанию для нового сетевого подключения «Local Area Connection N» в списке (Network Connections, ncpa.cpl). Причем N здесь — это порядковый номер, и он отличается от того, что был в исходной ВМ.
Теперь пройдем по шагам, предлагаемой в статье 315539. Запустим командную строку с повышенными привилегиями (Elevated Command Prompt, то есть выберем пункт «Запустить как Администратор» в контекстном меню ярлыка) и выполним в ней следующие команды.
- set devmgr_show_nonpresent_devices=1;
- start devmgmt.msc.
Затем в меню «View» выберем пункт «Show hidden devices» и раскроем в дереве секцию «Network Adapters».
Обратим внимание на то, что в теперь в списке присутствуют два сетевых интерфейса. Действующий (выделен на скриншоте) и отсутствующий старый (сразу под ним). Сравним свойства текущего интерфейса и старого.
Глядите, подсвеченные GUID у интерфейсов отличаются. У моей текущей конфигурации GUID начинается на 2a55878c.... В принципе, эти GUID можно посмотреть и в реестре ВМ в дебрях HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses.
Теперь немного технической информации. Настройки всех виртуальных машин хранятся в формате XML в виде файлов, которые по умолчанию расположены на системном диске в каталоге \programdata\microsoft\windows\hyper-v\virtual machines. Редактирование этих файлов вручную — это совершенно не поддерживаемая операция. Для этого потребовалось бы производить такие сомнительные манипуляции, как остановка служб и махинации с правами. Да к тому же формат этих файлов может быть изменен в будущем без каких-либо уведомлений и предупреждений. Однако, изучить файл в режиме чтения можно смело. Ниже я привожу пример своего файла, где выделенный элемент <ChannelInstanceGuid> как раз задает GUID интерфейса — 2a55878c-e56f-41a6-bf6e-12efd752a202.
<_66f9a54b-b048-40ec-8f61-9efd82feffc9_>
<ChannelInstanceGuid type="string">{2a55878c-e56f-41a6-bf6e-12efd752a202}</ChannelInstanceGuid>
<FriendlyName type="string">Network Adapter</FriendlyName>
<IsConnected type="bool">True</IsConnected>
<MacAddress type="string">00-15-5D-01-01-15</MacAddress>
<MacAddressIsStatic type="bool">False</MacAddressIsStatic>
<PortName type="string">67cd48a1-9b19-455e-b66e-745d0d4e5737</PortName>
<SwitchName type="string">a27d201a-a5f4-43e7-9b56-43788a13d96a</SwitchName>
</_66f9a54b-b048-40ec-8f61-9efd82feffc9_>
Теперь вы примерно представляете себе, где находится «корень всех бед». Если вы вручную замените здесь GUID на старый (в моем случае — на тот, что начинается на f05ba01d...), то получите в ОС старые настройки. Однако, поскольку эта операция не поддерживается, я такого советовать не буду. А вместо этого предложу вам разобраться с WMI — почитав о модели WMI в Hyper-V и исследовав массив Msvm_SyntheticEthernetPortSettingData.VirtualSystemIdentifiers[]. Готовых сценариев предлагать не буду — может быть, кто-то попробует справиться с такой задачкой самостоятельно?
А если вы просто захотите посмотреть старые настройки из новой ВМ — вдруг вы их не знаете — обратите внимание на ветвь реестра HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces в ОС вашей виртуальной машины. Все необходимые сведенья можно извлечь оттуда.
Comments
Anonymous
May 19, 2009
написано очень хорошо!!!! хотелось бы узнать нас4ет изменений в продак кейсAnonymous
October 30, 2013
Спасибо за статью. Я решаю данный вопрос сбросом параметров протокола (TCP/IP)на виртуалке, командой "netsh int ip reset c:resetlog.txt". После чего можно смело вписывать необходимые сетевые настройкиAnonymous
October 31, 2013
Для Hyper-V 2012/2012R2 это уже не так нужно, - если вы копировали не только VHD диск, но и XML конфигурации, вы можете импортировать машину, не выполняя операций предварительного экспорта. При импорте выбирайте первую опцию - register in-place. Она подхватит те же сетевые интерфейсы и адреса.