Девятый бит: Блог кафедры АСОИУ ОмГТУ

Заморозка системы: история перехода с EWF на dVHD

dVHD

Продолжение темы про заморозку системы.

В предыдущей статье речь велась о сторонних программах для Windows, которые позволяют «замораживать» состояние системы. Эти программы необходимы, т.к. считается, что Windows не имеет подобных встроенных механизмов.

Мало кто знает, что помимо версий Windows для простых смертных (Home, Professional, Ultimate, …), корпоративных  версии (Enterprise), и серверных версий (Windows Server), существуют несколько версий Windows для встраиваемых систем (Embedded). Именно в Windows Embedded присутствует специальный модуль (EWF), который позволяет «заморозить» систему.

Далее описывается история установки и настройки Windows Embedded Standard 7 с EpicFAIL’оми и счастливым концом.

Недавно пришлось создать одну встроенную систему на базе неттоп’а (Intel Atom, NVIDIA Ion, 2 GB DDR3, SSD 64 GB). Изначально планировалось установить на него GNU/Linux из-за лучшей возможности кастомизации, и возможности «заморозки» системы при использовании специальных файловых систем (Aufs, UnionFS). Однако, как всегда, возникли сложности на пути завоевания Linux’ом кремневых сердец. Встраиваемая система состояла не только из неттоп’а, но и из других устройств, разработчики которых написали ПО только для Windows, и, стоит признать, это ПО было написано хорошо. И так, в очередной раз, победила Винда  :cry:  .

Благо, что существует Windows Embedded Standard, который позволяет устанавливать только те компоненты системы, которые будут нужны, что важно при использовании SSD малого объема (установленный Windows Embedded Standard 7 занял 3-4GiB, тогда как обычный Windows 7 занимает 8-10 GiB), и содержит EWF (в статье описывается, как перенести модуль EWF из Windows Embedded в обычную Windows):

Расширенный фильтр записи (Enhanced Write Filter, EWF) — это дополнительный компонент, использующийся в Windows Embedded. EWF делает дисковый том доступным только для чтения. При этом операции записи, которые выполняются с данными, хранящимися на этом дисковом томе, перенаправляются в его наложение, которое может находиться на другом диске или в памяти компьютера. Windows рассматривает наложение EWF и его дисковый том как единое устройство. При этом фактически на дисковом томе не происходит изменений. Все изменения сохраняются только в наложении EWF. Изменения можно сохранить на дисковый том в любой момент времени.

Первый EpicFAIL: спустя несколько дней после установки Windows Embedded Standard 7, вышла финальная версия Embedded Standard 8.

Процесс включения EWF

Во-первых, для работы всех возможностей EWF нужен специальный загрузчик (он выбирается на этапе установки системы).
Во-вторых, желательно перенести pagefile.sys на другой раздел. И создать отдельный раздел для логов, документов, и остальных часто изменяемых файлов, которые не требуется замораживать. Также надо выполнить еще несколько подготовительных действий перед активацией EWF, однако в этой статье они описываться не будут, ибо, как раз в этот момент и произошел EpicFAIL

Main EpicFAIL

Несколько фактов:

  • Вся информация о тонкой настройке EWF была взята из MSDN для Windows Embedded Standard 2009, т.к. без глобального поиска по всему MSDN, раздел про EWF в Windows Embedded Standard 7 не был найден (однако сам модуль EWF присутствует в Windows Embedded Standard 7).
  • Как написано в цитате выше, EWF может размещать наложение либо на диске (Disk Mode), либо в RAM. Планировалось использовать Disk Mode, т.к. хоть оперативки и 2 GiB, её все равно мало для планируемого сценария использования.

При попытке включить EWF Disk Mode выяснилось следующее:

Windows Embedded Standard 7 only supports EWF RAM and RAM Reg modes. Disk mode is not supported.

:evil: :evil:

Эта строчка приводится в документе: Enhanced Write Filter with HORM (Windows Embedded Standard 7 Service Pack 1). И если описание EWF для Windows Embedded Standard 2009 находится по пути: 

Windows Embedded Standard 2009
 |- Developer Reference 
  |- Design a Run-Time Image 
   |- Enhanced Write Filter

, то для Windows Embedded Standard 7 этот путь выглядит иначе: 

Windows Embedded Standard 7 
 |- Windows Embedded Standard 7 Technical Reference 
  |- Embedded Enabling Features Technical Reference 
   |- Enhanced Write Filter with HORM

Спасение

Спустя некоторое время блуждания по просторам сети в поисках ответа на вопрос: «На что MS заменила EWF Disk Mode? Не могли же они просто выкинуть эту фитчу. Или же могли!?», была найдена замечательная статья: «Disk Mode Write Filter or Resetting Differential VHDs» (bat’ники приведенные в той статье отличаются от bat’ников, приведенных в этой статье).
В статье-спасителе предлагается использовать dVHD вместо EWF Disk Mode.

Начиная с Windows 7, загрузчик ядра системы поддерживает загрузку из VHD файлов (Native VHD boot).

Virtual Hard Disk (VHD) — формат файла, содержащий полную структуру и содержание сходные с жёстким диском. Используется для хранения виртуальных операционных систем, программ и других файлов в одном файле-образе, который можно открыть разными программами виртуализации или виртуальными машинами.

EWF -> dVHD

Инструкция:

  1. Делаем бекап системы.
  2. Необходимо очистить систему от EWF:
    1. отключаем FBWF driver
      HKLM\SYSTEM\CurrentControlSet\services\fbwf
      "start" = dword:00000004
    2. читаем раздел «Установка EWF на Windows 7» статьи Внедрение Enhanced Write Filter (EWF), и делаем всё наоборот.
  3. Мы будем использовать dynamically expanding VHD, у которых есть одна особенность — при загрузке с них (Native VHD boot), они «разбухают в размере». Чтобы предотвратить «разбухание», необходимо внести изменения в реестр (Step 12: Prevent the VHD from expanding to its full size; на русском: Ограничение увеличения динамических VHD при загрузке):
    HKLM\SYSTEM\CurrentControlSet\services\
     FsDepends\Parameters 
    "VirtualDiskExpandOnMount"=dword:00000004
  4. Создайте временный (дополнительный) раздел на SSD для временного хранения VHD, либо подключите внешнее хранилище (SSD или HDD). Далее предполагается, что VHD располагается по адресу: 
    Z:\VHD\PROJECTOR_PC.VHD
  5. Перенесите системный (С:\) раздел на VHD (самым быстрым способом является использование утилиты disk2vhd; я настоятельно рекомендую перезагрузить ПК перед запуском disk2vhd). Перед этим этапом лучше удалить весь мусор с системного раздела, и оптимизировать загрузку системы (compact не используйте!).
  6. Сгенерируйте новую подпись диска и запишите ее в MBR VHD. Это произойдет автоматически при монтировании VHD.
  7. После монтирования VHD желательно удалить из него первый (100 MiB) раздел (в оснастке «Управление дисками» команда «Удалить том…»).
  8. Освободите букву системного диска (C:).

    В Windows системному разделу назначается буква диска (C:). Это соответствие (раздел — буква диска) сохраняется в реестре. Если не освободить (удалить запись в реестре) букву диска (C:), то при загрузке с VHD новому системному разделу (на VHD) будет присвоена новая буква. Смена буквы диска не повлияла бы на работу программ, если бы у всех программистов руки росли из нужного места, но мы живем не в идеальном мире, и часть программ продолжает обращаться к старому системному диску (C:).

     Чтобы этого избежать нужно освободить букву диска (C:):

    1. загрузите куст реестра с VHD:
      1. откройте редактор реестра (regedit);
      2. выберите раздел ‘HKEY_LOCAL_MACHINE‘;
      3. в меню ‘Файл’ выберите команду ‘Загрузить куст’;
      4. откройте файл ‘<точка монтирования VHD>:\Windows\System32\SYSTEM‘;
      5. в поле ‘Имя раздела’ введите ‘_temp‘;
    2. удалите букву системного диска:
      1. откройте ‘HKEY_LOCAL_MACHINE\_temp\MountedDevices‘;
      2. удалите или переименуйте ‘\DosDevices\C:‘;
    3. выгрузите куст:
      1. выберите раздел ‘HKEY_LOCAL_MACHINE\_temp‘;
      2. в меню ‘Файл’ выберите команду ‘Выгрузить куст’.
  9. Демонтируем VHD, и пробуем загрузится с него:
    1. создайте запись в BCD (действия происходят в консоли администратора) (составлено на основе статей: 1 2 3 ):
      1. создаем новую запись на основе существующей записи:
        bcdedit /copy {current} /d "Windows VHD"

        BCDEdit вернет GUID вновь созданной записи;

      2. указываем путь к VHD для загрузки (замените GUID на GUID из предыдущего этапа):
        bcdedit /set {GUID} device ^
        vhd=[Z:]\VHD\PROJECTOR_PC.VHD
        bcdedit /set {GUID} osdevice ^
        vhd=[Z:]\VHD\PROJECTOR_PC.VHD
      3. дополнительно, для некоторых систем, необходимо включить detecthal (не забудете заменить GUID):
        bcdedit /set {GUID} detecthal on
    2. перезагрузите систему, и, при загрузке, выберите «Windows VHD»;
    3. если загрузка прошла успешно, то при входе в систему, она сообщит о создании временного файла подкачки, а в оснастке «Управление дисками» будет видно, что старый системный раздел поменял букву диска на D, а новому (на VHD) присвоена буква диска C;
    4. если, что-то пошло не так, то стоит начать паниковать и бить в бубен :-? (шутка, у вас всегда есть бекап системы — шаг 1).
  10. Форматируем старый системный раздел (диск D). При этом важно, чтобы ОС послала на SSD команду TRIM.

    Как показывают тесты, начиная с Windows 7, при быстром форматировании раздела, ОС сама посылает на SSD команду TRIM, и нет необходимости в «ручном» удалении каждого файла для отправки команды TRIM.

    Если система поместила на этот раздел временный файл подкачки, и не дает отформатировать этот раздел, то создайте файл подкачки на любом другом разделе физического (не VHD) диска.

  11. Перенесите файл подкачки на диск D.
  12. Перенесите VHD-файл из ‘Z:\VHD\PROJECTOR_PC.VHD‘ в ‘D:\VHD\PROJECTOR_PC.VHD‘. Так как сейчас система загружена с VHD, то, для его переноса, надо:
    1. создать на диске D директорию VHD;
    2. загрузится с WinPE (подойдет установочный диск Win7 или Win8);
    3. при появлении окна, предлагающего установить Windows, нажать Shift+F10 (откроется консоль);
    4. определить буквы дисков (для этого можно использовать команду dir /A, последовательно перебирая буквы дисков);
    5. скопировать VHD-файл командой:
      copy D:\VHD\PROJECTOR_PC.VHD E:\VHD\

      (замените буквы дисков на свои);

    6. поменять путь к VHD для загрузки:
      bcdedit /set {GUID} device ^
      vhd=[E:]\VHD\PROJECTOR_PC.VHD
      bcdedit /set {GUID} osdevice ^
      vhd=[E:]\VHD\PROJECTOR_PC.VHD
    7. пометить BCD запись, как запись по умолчанию:
      bcdedit /default {GUID}
    8. перезагрузите систему (закройте консоль, и окно установки Windows).
  13. При успешной загрузке, удалите старый VHD-файл: ‘Z:\VHD\PROJECTOR_PC.VHD
  14. Удалим запись исходной системы из BCD:
    1. определите её {old_GUID} вызвав bcdedit;
    2. удалите запись:
      bcdedit /delete {old_GUID} /cleanup
  15. Переходим к настройке дифференциальных VHD:
    1. создайте две новые записи в BCD (и запишите их GUID: {OverGUID1} для ‘Windows VHD 1′, и {OverGUID2} для ‘Windows VHD 2′):
      bcdedit /copy {current} /d "Windows VHD 1"
      bcdedit /copy {current} /d "Windows VHD 2"
      bcdedit /set {OverGUID1} device ^
      vhd=[D:]\VHD\PROJECTOR_PC_over1.VHD
      bcdedit /set {OverGUID2} device ^
      vhd=[D:]\VHD\PROJECTOR_PC_over2.VHD
      bcdedit /set {OverGUID1} osdevice ^
      vhd=[D:]\VHD\PROJECTOR_PC_over1.VHD
      bcdedit /set {OverGUID2} osdevice ^
      vhd=[D:]\VHD\PROJECTOR_PC_over2.VHD
    2. настроим автоматическое переключение между dVHD при загрузке системы:
      1. откройте редактор групповых политик (Win+R -> gpedit.msc);
      2. зайдите в ‘Конфигурация компьютера/Конфигурация Windows/Сценарии (запуск/завершение)‘;
      3. откройте пункт ‘Автозагрузка’;
      4. нажмите на кнопку ‘Показать файлы…’;
      5. скопируйте файл VHD_set_over.bat в открывшуюся папку, предварительно заменив GUID в строках 10, 11, 22 на свои (в 22-й строке указывается GUID основной записи - «Windows VHD»);
      6. добавьте этот bat‘ник в список автозагрузки в окне ‘Свойства: Автозагрузка’;
    3. сохраните в корне диска D bat‘ники, предварительно заменив GUID’s: VHD_first_set_over.batVHD_set_parent.bat .

Теперь, для включения «заморозки» достаточно загрузится с WinPE, и в консоли запустить VHD_first_set_over.bat .

Для отключения «заморозки» запустите VHD_set_parent.bat .

Несколько советов

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

Например, установленная и настроенная система (Windows Embedded 7 + необходимые программы) заняла на системном разделе 2.5 GiB. Система установлена на SSD объемом 64 GiB. Предположим, что для нормального функционирования системы (в режиме 24/7) нужно не более 13.5 GiB свободного места на системном разделе. В данном случае целесообразно уменьшить размер системного раздела до 16 GiB (2.5 + 13.5). В итоге получаем, что максимальный суммарный объем VHD’s будет равен: 2.5 (VHD) + 16 (dVHD) = 18.5 GiB, что, с учетом pagefile.sys (~2 GiB) и остальных системных файлов, будет меньше 64 GiB (объем SSD), и система никогда не упадет из-за нехватки места для расширения dVHD на SSD.

Перед заморозкой обновленной системы (на VHD), советую сделать Compact:

Compact — сжатие диска, позволяющее убрать неиспользуемое место в динамических дисках. Как вы знаете, если на динамический диск записать данные, он расширяется. После этого, мы можем удалить эти данные, но размер VHD диска не уменьшится, и в хост системе начнёт неэффективно растрачиваться полезный объём HDD дисков.

Ссылки «в тему»

  • Скоро выйдет продолжение статьи, в котором будет описан способ, значительно сокращающий время развертывания системы на VHD.

    P.S. небольшой намек: p2p.

  • Обновил ссылки на батники (VHD_set_over, VHD_first_set_over, VHD_set_parent).
    В новой версии улучшена стабильность работы, и включена запись логов.

  • Продолжение статьи наконец вышло (спустя 3 года): http://9b.asoiu.com/2016/3704/ringsync-синхронизируем-на-полной-скорости-с/

You must be logged in to post a comment.