Использование моментальных снимков (Snapshots) в Hyper-V

  • Михаил
  • 12 мин. на прочтение
  • 143
  • 12 Dec 2014
  • 12 Dec 2014

Наверняка многие знакомы с достаточно полезной функцией многих продуктов виртуализации – моментальными снимками, в простонародье – «снапшоты» (snapshots). Снапшот виртуальной машины – это как сохранение в игре: в случае, если где-то сильно накосячил (патч Бармина применил, например) – можно вернуться назад и повторить все заново. В этой статье я попытаюсь более-менее подробно рассказать о работе моментальных снимках и о некоторых нюансах их применения. В статье речь пойдет о Microsoft Hyper-V, но с некоторыми натяжками материал статьи применим и для других систем виртуализации (в частности — VMWare).
 
Прежде, чем продолжать – вспомним, из каких компонентов состоит виртуальная машина:
Файл конфигурации – основа виртуальной машины, хранит все настройки, касающиеся виртуалки. Представляет собой XML-файл, имеющий, как ни странно, расширение XML. В VirtualPC/Virtual Server этот файл имел расширение VMC.
Файл виртуального диска. Обычно в качестве жесткого диска виртуальные машины используют специальные файлы-образы, имеющие расширение VHD. Этот формат, изначально разработанный фирмой Connectix, после приобретения ее корпорацией Microsoft стал использоваться в продуктах виртуализации, и не только в них: в частности, они используются в Microsoft Software iSCSI Target, а в ОС Windows 7 и Windows Server 2008 R2 с VHD-дисками можно работать на уровне ОС, вплоть до загрузки с них самой операционки.
Дифференциальные диски – основа технологии снапшотов. При создании снапшота запись в VHD-файл прекращается, и все последующие изменения записываются в отдельный файл, имеющий расширение VHD.
Сохранение состояния (Save State) – одна из полезных функций системы виртуализации. При сохранении состояния все содержимое памяти виртуальной машины, регистров процессора и т.д. сохраняется в специальные файлы, и виртуалка переходит в состояние «Выключено». После этого можно делать все что угодно, вплоть до перезагрузки хостовой машины, а потом снова запустить виртуалку – и она будет работать, как ни в чем не бывало, ровно в том же состоянии, в каком она была до сохранения. Примерно так же работает функция Hibernate в Microsoft Windows с единственным лишь отличием – сохранение состояния происходит на уровне самой виртуальной машины, а не на уровне гостевой ОС. В VirtualPC и Virtual Server для сохранения содержимого памяти использовался файл с расширением VSV, в Hyper-V же их стало аж целых два – BIN и VSV.
Файл экспорта. Если виртуальную машину Hyper-V нужно склонировать, или же перенести на другой хост – необходимо произвести операцию экспорта, а затем импорта. При экспорте конфигурационный XML-файл преобразуется в файл с расширением EXP. В VirtualPC и Virtual Server для этого достаточно просто скопировать файлы виртуальной машины, а в Hyper-V придумали импорт/экспорт – как они сами говорят, в целях безопасности.
Различают два типа моментальных снимков: онлайновый и оффлайновый. Онлайновым называют снапшот, сделанный на виртуальной машине с запущенной гостевой ОС. Соответственно, если виртуальная машина была в состоянии «выключено» — то снапшот будет называться оффлайновым. Для пользователя нет абсолютно никаких различий между онлайновыми и оффлайновыми снапшотами. Различаются они только по составу файлов, потому что при создании снапшота на запущенной виртуалке происходит операция Save State, и данные Save State включаются в состав снапшота
 
 Онлайн-снапшот: 

  • Копия файла конфигурации
  • Дифференциальный диск AVHD
  • Файлы Save State – BIN+VSV

Оффлайн-снапшот: 

  • Копия файла конфигурации
  • Дифференциальный диск AVHD

Что можно и что нельзя делать с моментальными снимками?

Как уже было сказано, снапшоты виртуальных машин – это то же самое, что и сохранение в игре. И единственное их назначение – обеспечение точки возврата на случай возможных ошибок. Снапшоты – это не бэкап, и использовать их для аварийного восстановления не получится. Использовать моментальные снимки в production-среде не рекомендуется, потому что это может привести к падению производительности, почему это так – будет понятно далее из статьи. Если необходимо часто создавать резервные копии для защиты от ошибок пользователей – необходимо использовать другие средства, к примеру – инкрементные бэкапы или журналы транзакций, если речь идет о базах данных.
Помимо этого, необходимо помнить, что управлять снапшотами можно и нужно только через стандартные средства Hyper-V (оснастка MMC Hyper-V Manager, WMI-провайдеры, командлеты PowerShell) и сторонний софт, использующий такие средства – например Microsoft SystemCenter Virtual Machine Manager.
 
Итак, что же происходит при создании снапшота?

Для простоты представим виртуальную машину с одним жестким диском (см. рисунок). Только что мы установили на нее операционную систему, и, прежде чем двигаться дальше – хотим сделать снапшот. При выборе Create Snapshot текущая конфигурация виртуальной машины сохраняется в отдельный файл (Копия конфигурации 1), и создается файл AVHD (Дифференциальный диск AVHD 1). При этом в саму конфигурацию виртуальной машины вносятся изменения, и с этого момента из файла VHD производится только чтение, а вся запись производится только в AVHD-файл (зеленая стрелка). Диск виртуальной машины состоит уже из двух файлов: VHD и AVHD. У нас получился первый моментальный снимок, который для удобства можно назвать «OS Installed» (по умолчанию снапшотам дается имя из имени виртуальной машины с добавлением даты и времени создания).
Теперь, допустим, что мы что-то сделали (к примеру, установили приложение) и делаем еще один снапшот. Точно так же, как и до этого – конфигурация сохраняется в отдельный файл, создается новый AVHD, и запись перенаправляется уже в него (желтая стрелка). Виртуальный диск состоит уже из трех файлов: VHD и двух AVHD. Для простоты получившийся снапшот можно назвать «Apps Installed».
Допустим, мы создали один или несколько моментальных снимков. Что же теперь с ними можно сделать? Выбор тут, в принципе, не слишком богат: снапшот можно либо применить (Apply), либо удалить (Delete). По факту, это означает:
 

  • Apply – возвратиться к точке создания снапшота, при этом все изменения, произошедшие с момента создания снапшота и до настоящего времени будут потеряны.
  • Delete – точка возврата удалится, а все внесенные изменения сохранятся на веки вечные.


Это нужно четко для себя уяснить, чтобы потом не «наломать дров». Как говорил один специалист – «Delete means Apply, Apply means Delete», и даже еще лучше будет сказать в стиле Маяковского: «Мы говорим «Удалить» — подразумеваем «Применить», мы говорим «Применить» — подразумеваем «Удалить».
Посмотрим, как это происходит.
Хотим мы откатиться назад, к моменту окончания установки приложений. Для этого выбираем снапшот «Apps Installed» («Моментальный снимок 2»)и делаем «Apply». Как только мы это делаем – текущая конфигурация виртуалки заменяется копией из состава снапшота (т.е. «Конфигурация» перепишется из «Копии конфигурации 2»). После этого AVHD со внесенными до «отката» изменениями («Дифференциальный диск AVHD 2») удаляется, и создается новый AVHD, в который сразу же перенаправляется запись. 
Теперь, допустим, мы закончили наши эксперименты, и перед вводом виртуальной машины в продакшн хотим удалить все наши снапшоты. Если мы удалим снапшот «Apps Installed» то произойдет следующее:
 

  • Во-первых, удаляется копия файла конфигурации, и сам снапшот исчезает из списка.
  • Если в данный момент виртуальная машина запущена – AVHD, связанный с этим снапшотом остается, и запись в него продолжается.
  • Как только виртуальная машина останавливается (шатдаун или перезагрузка) – все данные из AVHD записываются в предыдущий AVHD, или в VHD, если мы удаляем первый снапшот, а сам AVHD удаляется. Эта операция называется «Объединение» (Merging). Операция объединения может занять определенное время (в зависимости от объемов данных), в течение которого запустить виртуалку нельзя.

Теперь рассмотрим более сложную ситуацию. Допустим, мы установили на нашу виртуалку приложение (скажем, MS SQL Server 2005), «поигрались» с ним, а теперь хотим поиграться с другой версией этого приложения (к примеру, MS SQL Server 2008). Если перед установкой ПО мы сделали снапшот (а мы его сделали, «OS Installed»), то мы просто откатываемся на этот снапшот и ставим уже новое приложение. В результате, у нас образуется новая ветвь снапшотов:
 
При откате к снапшоту «OS Installed» действующий на тот момент AVHD (в составе снапшота «Apps Installed») удаляется, создается новая копия конфигурации и новый AVHD(«Дифференциальный диск AVHD 3»), относящийся, в нашем случае, к самому VHD. Далее, если мы, к примеру, создадим еще один снапшот (для простоты обзовем его «New Snapshot») – то новый AVHD создастся уже на основе «Дифференциального диска AVHD 3»). Таких ветвей может быть и больше – например, от снапшота «OS Installed» может идти и три, и больше ветвей. Операции Delete/Apply при ветвлении происходят так же, как и было описано, но с некоторыми нюансами. К примеру, если мы теперь захотим удалить снапшот «OS Installed» — то он исчезнет из списка, и удалится копия конфигурации, но объединения после останова виртуальной машины не произойдет. Почему? А все очень просто: поскольку от нашего VHD образуются не один, а аж целых два AVHD – перезаписать сам VHD нельзя: если при перезаписи используется AVHD1 – то AVHD3, и соответственно – все, что на него опираются (в нашем случае это AVHD4) при возможном откате на них работать не будут. 
Вот еще одно «исключение из правил»: допустим, мы удаляем снапшот «Apps Installed». Как мы видим, своего AVHD у него нет. Поэтому удален будет предыдущий по времени AVHD1. 
Если же мы захотим вернуться к снапшоту «Apps Installed» — то создастся новый AVHD на основе AVHD1 (ну то есть новый AVHD2, грубо говоря), а удалится активный на данный момент AVHD4. 

Ну и теперь скажу несколько слов в заключение.
Во-первых – как я уже говорил, нужно помнить про «Delete means Apply, Apply means Delete», и думать перед нажатием кнопки, дабы не потерять ничего.
Во-вторых, если виртуальная машина содержит онлайновые снапшоты – ее крайне не рекомендуется экспортировать и переносить на другой сервер. Дело в том, что онлайновый снапшот содержит состояние регистров процессора и содержимое памяти, и применение такого снапшота в другом аппаратном окружении может привести к краху гостевой ОС.
В-третьих, как уже было сказано – снапшоты не рекомендуется использовать в производственной среде. Наверняка вам известно, что для продакшна рекомендуется использовать виртуальные диски фиксированного размера – для того, чтобы избавиться от фрагментации VHD-файла. Создавая же снапшоты, мы искусственно делим наш виртуальный диск на отдельные файлы – VHD и множество AVHD. На высоконагруженных системах это может привести к некоторому падению производительности. Кроме этого, при удалении снапшотов происходит операция объединения, которая тоже может сказаться на общей производительности системы, а к тому же может повысить время простоя при перезагрузках виртуальной машины. К примеру, если вы удалили один или несколько снапшотов на виртуальной машине, а потом потребовалось ее перезагрузить (к примеру – при установке апдейтов), то загрузка ОС не начнется, пока не завершится полностью операция объединения. Поэтому снапшоты можно использовать перед вводом в продакшн, для экономии времени при установке ПО и начальной настройке. После этого все снапшоты нужно удалить, дождаться окончания объединения, и только затем вводить в продакшн.
Еще один небольшой момент: в настройках Hyper-V можно задавать отдельно путь для размещения файлов виртуальных машин и путь для размещения VHD. По умолчанию и то и другое хранится на диске C:. Если для хранения VHD планируется использовать, к примеру, высокоскоростной RAID-массив – необходимо хранить на нем не только VHD, но и файлы виртуальных машин. Дело в том, что при создании снапшотов файлы AVHD будут храниться именно в том месте, которое было выбрано для хранения виртуальных машин. И может получиться так, что сам VHD будет храниться на отдельном дисковом массиве, а куча AVHD будет на диске С:, что не есть хорошо.