Сохранность Registry своими руками

21 апрель, 2012 - 15:22Арсен Бандурян

В предудущем посте, мы выяснили, что за сохранность Registry администрация ответственности не несет. В этом расскажу о том, что можно сделать своими руками по этому поводу с помошью User Profile Hive Cleanup Service (UPHClean) и утилиты ERUNT. В завершение привожу пример того, как это сделал я.

Историческая справка.

Registry, каким мы его знаем, впервые появился в Win95, и сразу стало понятно, что терять/портить его не стоит. Благо, в OC семейства Win9x реестр автоматически бекапился при старте системы. При этом держалось от двух  (Win95) до пяти (Win98/ME) уровней отката. Ручной бакап тоже не представлял проблем, т.к. достаточно было перегрузить компьютер в DOS-режиме и скопировать несколько файлов в безопасное место. Также Microsoft предоставляла утилиту ERU, которая бакапила реестр прямо из Windows.

С приходом Win2000 и ее производных (WinXP/Vistal/7) ситуация изменилась в корне. В системах на основе NT файлы Registry (C:\Windows\System32\Config и %userprofile%\ntuser.dat) всегда открыты и используются. В итоге стали проявляться неприятные баги, некоторые из которых встречаются и по сей день. Почти все они являются последствиями одного сценария: какая-то программка открывает ключ в Registry и забывает его закрыть. В результате, может происходить ряд интересных побочных эффектов:

* Во-первых, если не закрыт ключ в HKCU, logoff\перезагрузка/выключение компьютера может занять оооооочень много времени - Windows терпеливо ждет, пока все программы освободят HKCU, чтобы отлогинить пользователя (чего не происходит, если глючная программка прописана как системный сервис).

* Во-вторых, некоторые изменения так и не "сбрасывались" в реестр, и в итоге не сохранялись после перезагрузки. Особенно сильно это напрягало корпоративных пользователей с Roaming профайлами, которым зачастую приходилось, к примеру, каждый раз наблюдать сообщение "Please wait while Windows configures <программка>" при запуске какого-нибудь офисного приложения. В результате в Vista/W7 мы имеем файлы транзакций реестра (regtrans-ms), которые иногда занимают больше места, чем сами файлы реестра :)

* В худшем случае при перезагрузке нарушалась целостность реестра и можно было лишиться хайва целиком (чаще всего, опять же, HKCU). Это, кстати, продолжается по сей день, довольно много шума поднимается по поводу сервиса обновляющего Google Chrome, который любит открывать много дескрипторов и забывает закрывать некоторые из них.

Проблема была настолько серьезной, что Microsoft выпустила специальный сервис "User Profile Hive Cleanup Service", который насильно отключает всех от registry при перезагрузке (правда, только для HKCU/ntuser.dat). Очень рекомендую.

Все это показало насколько целостность реестра критична для систем на базе WinNT. Тем не менее,

  • В NT/2000 вообще нет автоматического бакапа реестра.
  • В WinXP бакап реестра производится только в процессе общего резервирования системы (если выбрать Backup System State). При этом файлы ОС (~500MB) кладутся в указанный пользователем каталог, а резервная копия реестра оказывается в C:\Windows\Repair, откуда ее надо скопировать ручками (ну, или удалить 500М барахла, если вам нужно было забакапить только реестр). К сожалению, графический интерфейс Windows не позволяет выбирать подкаталоги в NUL :)
  • В Vista/W7 вместо Windows\Repair реестр резервируется в System32\Config\RegBack средствами встроенной задачи Task Sheduler'а (по-умолчанию 10 дней). Прогресс налицо. Но только системный реестр.

Другого простого способа бакапить реестр целиком не было, и его пришлось придумать. Так появилась ERUNT (ERU для NT).

ERUNT.

ERUNT была разработана немецким специалистом по имени Lars Hederer, и, собственно, резервирует реестр любой WinNT-подобной ОС (NT/2K/2K3/XP/Vistal/7) в заданный каталог "по-живому" (т.е. не при перезагрузке, а в любое время в процессе работы ОС).

Подробности применения можно почитать в файле readme, я же расскажу о том, чем она понравилась лично мне, и как я ее использую.

  • Обладает GUI и CLI для резервирования и восстановления. Очень удобно использовать GUI для тестирования, а потом закатать все в параметры командной строки и создать Task (о чем ниже). Аналогично для воостановления: для полного восстановления можно сделать простой батник, для каких-то особенных ситуаций можно запустить GUI и выбрать то, что нужно.
  • Позволяет выбирать хайвы (системные и пользовательские) - можно бакапить: систему, профайл пользователя, профайлы других пользователей, все вместе. Вначале у меня был план "бакапить все раз в неделю, бакапить профайл каждый день", но программка работает настолько быстро, и бакапы занимают настолько мало места, что теперь просто бакаплю все каждый день.
  • Восстанавливает реестр из специального загрузчика или Windows Recovery Console. Обычно, хватает консоли (т.к., фактически происходит банальная перезапись файлов).
  • Устанавливается через инсталлер, но, вроде, никаких файлов за пределы своего каталога не кладет, так что годна к portable-применению. В каталоге хранится .INI файл, в который можно записать значения по умолчанию, что позволяет уменьшить количество задаваемых каждый раз ключей командной строки. В любом случае, утилита восстановления работает полностью независимо.
  • Куча интересных опций автоматизированного бакапа. Для себя сделал следующее:
    • В каталоге D:\Install\__Backups\RegBackup-ERUNT\ создаются подкаталоги с датой-временем в нужном мне формате (прим. RegBackup-ERUNT\2012-04-19-17.00.04\).
    • В каждом таком подкаталоге лежат, собственно, хайвы registry и утилита восстановления (чтобы не напрягаться).
    • Хранится история бакапов за 30 дней (можно настроить по количеству, скажем, 5 последних, или по времени). Старые удаляются автоматически (отключаемо).
    • Если сегодня бакап уже делали - второй (третий, и т.д.) раз пропускается. (полезно, т.к. в Task Scheduler'е стоит опция "если пропущено время запуска задачи - запустить при первой возможности", таким образом могут быть запущены два бакапа за день).
    • Стандартные опции вроде тихого режима и т.д.
    • Особенно впечатлило то, что в тоге я избавился от большей части ключей командной строки, т.к. значения, по умолчанию выставленные автором, делают как раз то, что мне нужно! :) Остальное было выставлено в INI-файле и в итоге огромная командная строка была сведена к AUTOBACK.EXE <имя каталога для бакапов>\#Date#-#Time#.

В завершение прилагаю ERUNT.INI и .XML для Task Scheduler'a (к сожалению, похоже, CMS КО не позволяет грузить на сервер произвольные файлы - только картинки).

ERUNT.INI (в каталог с ERUNT):

[ERUNT]
DefaultDestinationFolder=D:\Install\__Backups
DateFormat=yyyy/mm/dd
DateSeparator=-
TimeFormat=hh:mm:ss
TimeSeparator=.

 

ERUNT.XML (импортируется в Task Scheduler):

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2012-04-01T21:27:40.026817</Date>
<Author>APCNB\apc</Author>
</RegistrationInfo>
<Triggers>
<CalendarTrigger>
<StartBoundary>2012-04-01T17:00:00</StartBoundary>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>APCNB\apc</UserId>
<LogonType>S4U</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>false</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
<Priority>7</Priority>
<RestartOnFailure>
<Interval>PT1H</Interval>
<Count>3</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\bin\ERUNT\AUTOBACK.EXE</Command>
<Arguments>D:\Install\__Backups\RegBackup-ERUNT\#Date#-#Time#</Arguments>
<WorkingDirectory>C:\bin\ERUNT\</WorkingDirectory>
</Exec>
</Actions>
</Task>

В общем, автор утилиты занимается этим вопросом с 2001 года и свое дело знает - очень рекомендую к применению!