Главная > DPM 2012 R2 > Проблема с UR7 для Data Protection Manager 2012 R2

Проблема с UR7 для Data Protection Manager 2012 R2

patchesНесколько дней назад в мой почтовый ящик упало письмо от TechNet Wiki с комментарием пользователя к статье List of Build Numbers for System Center Data Protection Manager в котором он жаловался на невозможность отредактировать страницу и добавить ссылку на исправление к UR7 для DPM 2012 R2. Уже через несколько минут, сменив 2 браузера, я понял, что возможности сохранить изменения в статье нет и у меня… В это же самое время другой русскоязычный специалист по DPM — Евгений Лейтан уже вносил необходимые правки. Итогом наших совместных стараний стало то, что пришел Денис Дягилев и… Все стер, заявив, что исправление не изменяет номер версии DPM. Это событие заставило меня заострить свое внимание на самой проблеме, возникшей с данным пакетом обновления, связанных с ней действиями группы разрабочиков DPM, и сказать «Денис, ты не прав!» провести небольшой разбор полетов.

Итак, в Update Rollup 7 для System Center Data Protection Manager 2012 R2 было представлено две новых возможности:

  • Поддержка защиты Windows 10
  • Использование альтернативного сервера DPM для восстановления данных из Azure Backup Vault

Под вторым подразумевается возможность использовать Azure как централизованное хранилище резервных копий данных для множества DPM серверов. Единственным требованием является лишь наличие у DPM сервера пакета обновления 7 и последней версии агента Azure Backup. Подробности вы можете изучить сами в описании UR7. И именно внедрение этой, весьма ценной для крупных заказчиков, «фичи» вызвало серьезный сбой в цепочке выпуска обновлений для DPM.

Выпуск пакета обновления был официально объявлен 29.07.15 в блоге команды DPM. Новые возможности были очень положительно восприняты специалистами по System Center, администраторы начали производить первые установки. Но что-то пошло не так… Уже через несколько дней стали появляться сообщения о том, что вышедшие за пределы диапазона хранения точки восстановления не удаляются. Многие столкнулись с переполнениями томов, выделенных для хранения данных DPM. Таким образом, поспешившие с обновлением администраторы столкнулись с невозможностью обеспечить защиту данных предприятия, ведь новые точки восстановления не создаются при переполнении хранилища DPM… И лишь 19.08.15, спустя 20 (двадцать, Карл!) дней после выпуска UR с ошибкой, было опубликовано официальное решение проблемы Fix for a known issue with Update Rollup 7 for System Center 2012 R2 Data Protection Manager.

За громким и длинным названием Fix for a known issue… скрывалось жалкое добавление в 2ух строчках PowerShell скрипта PruneShadowCopiesDpm2010.ps1, ответственного за ежедневное удаление старых точек восстановления, имени параметра Datasource…

Facepalm

Для отзыва и перевыпуска всего пакета обновления №7 потребовался месяц http://blogs.technet.com/b/dpm/archive/2015/09/02/dpm-2012-r2-ur7-re-released.aspx

Для того, чтобы понять, что именно пошло не так, заглянем «за занавес». Посмотрим, как именно внутри DPM 2012 R2 UR7 реализуется возможность использования альтернативного сервера DPM, и как это отразилось на скрипте PruneShadowCopiesDpm2010.ps1.

Нам потребуется:

  • Инструмент для декомпиляции JetBrains dotPeek
  • ObjectModelCmdlet.dll (%DPMInstallationFolder%\DPM\Bin) для DPM 2012 R2 UR6, DPM 2012 R2 UR7 и DPM 2010
  • PruneShadowCopiesDpm2010.ps1 (%DPMInstallationFolder%\DPM\Bin) для DPM 2012 R2 UR6, DPM 2012 R2 UR7 и DPM 2010

Почему именно эта dll? Нас интересует командлет Get-RecoveryPoint, на который ссылается ошибка при выполнении изначальной, неисправленной версии PruneShadowCopiesDpm2010.ps1. Текст ошибки:

Get-DPMRecoveryPoint : Parameter set cannot be resolved using the specified
named parameters.
At C:\Program Files\Microsoft System Center 2012 
R2\DPM\DPM\bin\pruneshadowcopiesDpm2010.ps1:208 char:19
+ $rplist = get-recoverypoint $ds
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-DPMRecoveryPoint], Par
ameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.Internal.Enterpr
iseStorage.Dls.UI.Cmdlet.RecoveryCmdLets.GetRecoveryPoint

Узнать, где хранится исходный код командлета мы можем командой

(Get-Command Get-RecoveryPoint).dll

Воспользуемся декомпилятором dotPeek и посмотрим на реализацию командлета Get-RecoveryPoint в ObjectModelCmdlet.dll для DPM 2010:

namespace Microsoft.Internal.EnterpriseStorage.Dls.UI.Cmdlet.RecoveryCmdLets
{
  [Cmdlet("Get", "RecoveryPoint")]
  public sealed class GetRecoveryPoint : DpmCmdletBase
  {
    [Parameter(Mandatory = false, ParameterSetName = "Datasource")]
    public SwitchParameter Async = new SwitchParameter(false);
    [ValidateNotNull]
    [Parameter(Mandatory = true, ParameterSetName = "Datasource", Position = 0, ValueFromPipeline = true)]
    public Datasource Datasource;
    [ValidateNotNull]
    [Parameter(Mandatory = true, ParameterSetName = "Tape", Position = 0, ValueFromPipeline = true)]
    public Media Tape;

Все просто. Никакой путаницы. Командлет ожидает на входе лишь Datasource и Tape. Никаких вам облаков и прочих атрибутов современности… Теперь смотрим внутрь версии DPM 2012 R2 UR6:

namespace Microsoft.Internal.EnterpriseStorage.Dls.UI.Cmdlet.RecoveryCmdLets
{
  [Cmdlet("Get", "DPMRecoveryPoint")]
  public sealed class GetRecoveryPoint : DpmCmdletBase
  {
    [Parameter(Mandatory = false, ParameterSetName = "Datasource")]
    public SwitchParameter Async = new SwitchParameter(false);
    [Parameter(Mandatory = false, ParameterSetName = "Datasource")]
    public SwitchParameter Online = new SwitchParameter(false);
    [Parameter(Mandatory = false, ParameterSetName = "Datasource")]
    public SwitchParameter OnlyActive = new SwitchParameter(false);
    [Parameter(Mandatory = true, ParameterSetName = "Datasource", Position = 0, ValueFromPipeline = true)]
    [ValidateNotNull]
    public Datasource Datasource;
    [Parameter(Mandatory = true, ParameterSetName = "Tape", Position = 0, ValueFromPipeline = true)]
    [ValidateNotNull]
    public Media Tape;

Уже появились ключики для Online защиты и выдачи только непросроченных точек восстановления. Но никакой путаницы и проблем нет, все работает так, как было задумано еще в версии 2010. Хотя, внимательный читатель заметит, что в версии 2012 командлет изменил свое написание с Get-RecoveryPoint на Get-DPMRecoveryPoint, а первое перешло в категорию Alias.

Настал черед версии 2012 R2 UR7:

namespace Microsoft.Internal.EnterpriseStorage.Dls.UI.Cmdlet.RecoveryCmdLets
{
  [Cmdlet("Get", "DPMRecoveryPoint")]
  public sealed class GetRecoveryPoint : DpmCmdletBase
  {
    [Parameter(ParameterSetName = "ExternalDPMServer")]
    [Parameter(Mandatory = false, 
     ParameterSetName = "Datasource")]
    public SwitchParameter Async = new SwitchParameter(false);
    [Parameter(Mandatory = false, ParameterSetName = "Datasource")]
    public SwitchParameter Online = new SwitchParameter(false);
    [Parameter(Mandatory = false, ParameterSetName = "Datasource")]
    public SwitchParameter OnlyActive = new SwitchParameter(false);
    [Parameter(Mandatory = true, ParameterSetName = "Datasource", Position = 0, ValueFromPipeline = true)]
    [ValidateNotNull]
    public Datasource Datasource;
    [Parameter(Mandatory = true, ParameterSetName = "Tape", Position = 0, ValueFromPipeline = true)]
    [ValidateNotNull]
    public Media Tape;
    [Parameter(Mandatory = true, ParameterSetName = "ExternalDPMServer", Position = 0, ValueFromPipeline = true)]
    [ValidateNotNull]
    public Datasource CloudDatasource;

В июле 2015ого в командлете появляется новый сет ExternalDPMServer для работы с альтернативными серверами DPM при восстановлении из хранилища Azure. Новый параметр из данного сета совершенно случайно совпадает по типу с годами существовавшим параметром Datasource. А такую вещь, как DefaultParameterSetName, ответственный за командлет программист попросту забыл! Теперь командлет Get-RecoveryPoint для определения, что же ему отдают на входе, ждет имя параметра… И это полностью ломает сценарий ежедневной зачистки старых точек восстановления.

Сравним версии скриптов PruneShadowCopiesDpm2010.ps1, которые практически не меняются годами.

Для DPM 2010 строка 207

$rplist = get-recoverypoint $ds

Строка 217

$rplist = get-recoverypoint $ds | where { $_.DataLocation -eq 'Disk' }

Для всех последующих версий DPM отличается лишь номер строк. 208 и 218 соответственно. А исправленный скрипт для перевыпущенного UR7 содержит такие строчки.

208 —

$rplist = get-recoverypoint -DataSource $ds

218 —

$rplist = get-recoverypoint -DataSource $ds | where { $_.DataLocation -eq 'Disk' }

Таким образом, где-то мной замеченные объяснения инженеров Microsoft, что теперь указание имени параметра Datasource стало обязательным с выходом UR7 звучат оправдано. Но. Почему в исправлении решили поправить не комадлет, а скрипт, который не менялся годами?

Тут у меня, как и у многих, возникают простые вопросы:

  • Каким образом процедура внутреннего тестирования пропустила такую очевидную ошибку?
  • Почему время реакции на ошибку выполнения PruneShadowCopiesDpm2010.ps1 составило несколько дней, время для выкладывания «эпического» исправления — 20 дней, а замена пакета обновления в каталоге — месяц?

Теперь, когда доверие к обновлениям DPM в очередной раз подорвано, куча народу бегает с проблемами — как скачать из каталога этот обновленный UR7 по ссылке из KB ( да, там есть некоторые проблемы даже с этим), что делать с уже скачанными обновлениями WSUS и нет ли в UR7 других ошибок, разработчикам самое время еще раз подумать над процедурой тестирования.

Реклама
Рубрики:DPM 2012 R2 Метки: , ,
  1. 29.09.2015 в 10:05

    Это круговорот ошибок в System Center Data Protection Manager ! :)

    Егор, спасибо за подробное описание!!!

  1. No trackbacks yet.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: