Fixing component store corruption

По следам своего недавнего инцидента: Перестали устанавливаться некоторые обновления на одном из серверов Win2012 R2. Впервые столкнулся ситуацией, когда обновления не ставились не из-за проблем с агентом обновления Windows Update или повреждением папки %windir%\SoftwareDistribution. Неисправность проявлялась очень странно:
часть обновлений устанавливалась без проблем, а установка некоторого подмножества других обновлений всегда стала завершаться одной и той же ошибкой (0x800F0831).

В логе %windir%\windowsupdate.log можно было обнаружить следующие записи:

2015-10-14    17:34:07:457    3432    edc    Handler    :::::::::::::
2015-10-14    17:34:07:459    3432    edc    Handler    :: START ::  Handler: CBS Install
2015-10-14    17:34:07:459    3432    edc    Handler    :::::::::
2015-10-14    17:34:07:462    3432    edc    Handler    Starting install of CBS update 7A77DEF1-B970-48AB-8DCC-02E153CE0691
2015-10-14    17:34:07:504    3432    edc    Handler    CBS session identity: 30475917_1644436486
2015-10-14    17:34:07:515    3432    edc    Handler    CBS package identity: Package_for_KB2967917~31bf3856ad364e35~amd64~~6.3.1.2
2015-10-14    17:34:07:515    3432    edc    Handler    Installing express with source=C:\Windows\SoftwareDistribution\Download\9ba1ab630098b6709dd384e3e155c705, workingdir=C:\Windows\SoftwareDistribution\Download\9ba1ab630098b6709dd384e3e155c705
2015-10-14    17:34:12:385     828    e24    Report    REPORT EVENT: {8C888A44-EF75-422A-AA99-4166F54300C2}    2015-10-14 17:34:07:383+0300    1    181 [AGENT_INSTALLING_STARTED]    101    {3AE68DB3-72A1-4F93-8E68-75BB8E07823E}    201    0    AutomaticUpdatesWuApp    Success    Content Install    Installation Started: Windows has started installing the following update: Обновление для Windows Server 2012 R2 (KB2967917)
2015-10-14    17:34:12:386     828    e24    Report    CWERReporter finished handling 2 events. (00000000)
2015-10-14    17:34:12:741    3432    944    Handler    FATAL: CBS called Error with 0x800f0831, 
2015-10-14    17:34:12:742    3432    edc    Handler    FATAL: Completed install of CBS update with type=0, requiresReboot=0, installerError=1, hr=0x800f0831
2015-10-14    17:34:12:742     828    abc    AU    >>##  RESUMED  ## AU: Installing update [UpdateId = {3AE68DB3-72A1-4F93-8E68-75BB8E07823E}]
2015-10-14    17:34:12:742     828    abc    AU      # WARNING: Install failed, error = 0x800F0831 / 0x800F0831
2015-10-14    17:34:12:946    3432    edc    Handler    :::::::::
2015-10-14    17:34:12:946    3432    edc    Handler    ::  END  ::  Handler: CBS Install
2015-10-14    17:34:12:946    3432    edc    Handler    :::::::::::::

После непродолжительного исследования вопроса стало понятно, что CBS  в данном конкретном случае – это Component-Based Servicing, а более подробную информацию стоит поискать в другом log-файле: %windir%\logs\CBS\CBS.log

В этом логе меня заинтересовали следующие строки:

2015-10-11 17:41:13, Info                  CBS    Plan: Start to process component watchlist
2015-10-11 17:41:13, Info                  CBS    Store corruption, manifest missing for package: Package_30_for_KB3023562~31bf3856ad364e35~amd64~~6.3.1.2
2015-10-11 17:41:13, Error                 CBS    Failed to resolve package 'Package_30_for_KB3023562~31bf3856ad364e35~amd64~~6.3.1.2' [HRESULT = 0x800f0831 - CBS_E_STORE_CORRUPTION]
2015-10-11 17:41:13, Info                  CBS    Mark store corruption flag because of package: Package_30_for_KB3023562~31bf3856ad364e35~amd64~~6.3.1.2. [HRESULT = 0x800f0831 - CBS_E_STORE_CORRUPTION]
2015-10-11 17:41:13, Info                  CBS    Failed to resolve package [HRESULT = 0x800f0831 - CBS_E_STORE_CORRUPTION]
2015-10-11 17:41:13, Info                  CBS    Failed to get next package to re-evaluate [HRESULT = 0x800f0831 - CBS_E_STORE_CORRUPTION]
2015-10-11 17:41:13, Info                  CBS    Failed to process component watch list. [HRESULT = 0x800f0831 - CBS_E_STORE_CORRUPTION]
2015-10-11 17:41:13, Info                  CBS    Perf: InstallUninstallChain complete.
2015-10-11 17:41:13, Info                  CSI    00000039@2015/10/11:14:41:13.746 CSI Transaction @0xd2e2449140 destroyed
2015-10-11 17:41:13, Info                  CBS    Not able to read when the last time auto repair was attempted. [HRESULT = 0x80070490 - ERROR_NOT_FOUND]
2015-10-11 17:41:13, Info                  CBS    Exec: Store corruption found during execution, attempting auto repair.
2015-10-11 17:41:13, Info                  CBS    Exec: Automatic repair feasibility evaluation:
2015-10-11 17:41:13, Info                  CBS    Exec: Network Cost API is not available on this SKU, continue.
2015-10-11 17:41:13, Info                  CBS    Exec: Network detected as Unknown, continue
2015-10-11 17:41:13, Info                  CBS    Exec: Windows Update Auto Update option not available, not using WU to download
2015-10-11 17:41:13, Info                  CBS    Exec: Installation fails with store corruption, but there is no local source available and WU download cannot be used, skip repair.
2015-10-11 17:41:13, Info                  CBS    Failed to execute execution chain. [HRESULT = 0x800f0831 - CBS_E_STORE_CORRUPTION]
2015-10-11 17:41:13, Error                 CBS    Failed to process single phase execution. [HRESULT = 0x800f0831 - CBS_E_STORE_CORRUPTION]
2015-10-11 17:41:13, Info                  CBS    WER: Generating failure report for package: Package_for_KB2967917~31bf3856ad364e35~amd64~~6.3.1.2, status: 0x800f0831, failure source: Execute, start state: Staged, target state: Installed, client id: WindowsUpdateAgent
2015-10-11 17:41:13, Info                  CBS    Not able to query DisableWerReporting flag.  Assuming not set... [HRESULT = 0x80070002 - ERROR_FILE_NOT_FOUND]
2015-10-11 17:41:13, Info                  CBS    Added C:\Windows\Logs\CBS\CBS.log to WER report.
2015-10-11 17:41:13, Info                  CBS    Added C:\Windows\Logs\CBS\CbsPersist_20151011091157.log to WER report.
2015-10-11 17:41:13, Info                  CBS    Added C:\Windows\Logs\CBS\CbsPersist_20151010234916.cab to WER report.
2015-10-11 17:41:13, Info                  CBS    Added C:\Windows\Logs\CBS\CbsPersist_20151010071442.cab to WER report.
2015-10-11 17:41:13, Info                  CBS    Added C:\Windows\Logs\CBS\CbsPersist_20151009084530.cab to WER report.
2015-10-11 17:41:13, Info                  CBS    Added C:\Windows\Logs\CBS\CbsPersist_20151009080804.cab to WER report.
2015-10-11 17:41:13, Info                  CBS    Not able to add %windir%\winsxs\pending.xml to WER report. [HRESULT = 0x80070002 - ERROR_FILE_NOT_FOUND]
2015-10-11 17:41:13, Info                  CBS    Not able to add %windir%\winsxs\pending.xml.bad to WER report. [HRESULT = 0x80070002 - ERROR_FILE_NOT_FOUND]
2015-10-11 17:41:13, Info                  CBS    Reboot mark cleared
2015-10-11 17:41:13, Info                  CBS    Winlogon: Deregistering for CreateSession notifications
2015-10-11 17:41:13, Info                  CBS    Winlogon: Stopping notify server
2015-10-11 17:41:13, Info                  CBS    Winlogon: Unloading SysNotify DLL
2015-10-11 17:41:13, Info                  CBS    FinalCommitPackagesState: Started persisting state of packages
2015-10-11 17:41:13, Info                  CBS    SQM: Reporting package change for package: Package_for_KB2967917~31bf3856ad364e35~amd64~~6.3.1.2, current: Staged, pending: Default, start: Staged, applicable: Installed, target: Installed, limit: Installed, hotpatch status: DisabledBecauseNoHotpatchPackagesInitiated, status: 0x0, failure source: Execute, reboot required: False, client id: WindowsUpdateAgent, initiated offline: False, execution sequence: 331, first merged sequence: 331 reboot reason: REBOOT_NOT_REQUIRED RM App session: -1 RM App name: N/A FileName in use: N/A
2015-10-11 17:41:13, Info                  CBS    SQM: Upload requested for report: PackageChangeBegin_Package_for_KB2967917~31bf3856ad364e35~amd64~~6.3.1.2, session id: 142859, sample type: Standard
2015-10-11 17:41:13, Info                  CBS    SQM: Ignoring upload request because the sample type is not enabled: Standard
2015-10-11 17:41:13, Info                  CBS    SQM: Reporting package change completion for package: Package_for_KB2967917~31bf3856ad364e35~amd64~~6.3.1.2, current: Staged, original: Staged, target: Installed, status: 0x800f0831, failure source: Execute, failure details: "(null)", client id: WindowsUpdateAgent, initiated offline: False, execution sequence: 331, first merged sequence: 331, pending decision: InteractiveInstallFailed, primitive execution context: Interactive 
2015-10-11 17:41:13, Info                  CBS    SQM: execute time performance datapoint is invalid. [HRESULT = 0x80070490 - ERROR_NOT_FOUND]
2015-10-11 17:41:13, Info                  CBS    SQM: Failed to initialize Win SAT assessment. [HRESULT = 0x80040154 - Unknown Error]
2015-10-11 17:41:13, Info                  CBS    SQM: average disk throughput datapoint is invalid [HRESULT = 0x80040154 - Unknown Error]
2015-10-11 17:41:13, Info                  CBS    SQM: Upload requested for report: PackageChangeEnd_Package_for_KB2967917~31bf3856ad364e35~amd64~~6.3.1.2, session id: 142862, sample type: Standard
2015-10-11 17:41:13, Info                  CBS    SQM: Ignoring upload request because the sample type is not enabled: Standard
2015-10-11 17:41:13, Info                  CBS    FinalCommitPackagesState: Completed persisting state of packages
2015-10-11 17:41:13, Info                  CBS    Enabling LKG boot option
2015-10-11 17:41:14, Info                  CBS    Exec: Processing complete.  Session: 30475314_3622992540, Package: Package_for_KB2967917~31bf3856ad364e35~amd64~~6.3.1.2 [HRESULT = 0x800f0831 - CBS_E_STORE_CORRUPTION]
2015-10-11 17:41:15, Info                  CBS    Session: 30475314_3794527143 initialized by client WindowsUpdateAgent.

Из лога следовало, что в хранилище компонентов имеют место быть проблемы с одним из пакетов: Store corruption, manifest missing for package: Package_30_for_KB3023562~31bf3856ad364e35~amd64~~6.3.1.2

Обновление KB3023562 на проблемном сервере, однако, отсутствовало, о чем мне сообщил  Get-HotFix:

PS C:\Users\Администратор> Get-HotFix -id KB3023562
Get-HotFix : Не удается найти запрошенное исправление на компьютере "localhost". Проверьте введенные данные и повторите
 выполнение команды.
строка:1 знак:1
+ Get-HotFix -id KB3023562
+ ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (:) [Get-HotFix], ArgumentException
    + FullyQualifiedErrorId : GetHotFixNoEntriesFound,Microsoft.PowerShell.Commands.GetHotFixCommand

Ок, давайте поглядим: что же это за обновление? Как ни странно, но даже при наличии WSUS это удобнее сделать при помощи каталога Windows Update в интернете:

KB3023562

Как видим есть целых два обновления, которые заменяют наше проблемное, и одно из них (KB3067505) в моей системе уже было установлено (узнать об этом можно при помощи всё того же Get-HotFix):

 

 

 

 

PS C:\Users\Администратор> Get-HotFix -id KB3067505 Source Description HotFixID InstalledBy InstalledOn —— ———– ——– ———– ———– SRV-36 Security Update KB3067505 SRV-36\Админи…

 

 

Попытка установить проблемное обновление (KB3023562) ни к чему не не привела: система резонно сообщила о том, что она не нуждается в этом обновлении.

Обычно, при повреждении хранилища компонентов, которое имеет место быть в рассматриваемом случае, рекомендуют выполнить стандартный набор действий:

1) проверить систему при помощи sfc /scannow

C:\Users\Администратор>sfc /scannow
Начато сканирование системы.  Этот процесс может занять некоторое время.
Начало стадии проверки при сканировании системы.
Проверка 100% завершена.
Защита ресурсов Windows не обнаружила нарушений целостности.

Как можно видеть, система не обнаружила нарушений целостности. На всякий случай можно проверить содержимое лога %windir%\logs\CBS\CBS.log, результаты работы команды  sfc пишутся именно в него и снабжаются тегом “[SR]”. Для парсинга лога можно использовать простой batch-файл, который выбирает из лога все строки, содержащие тег [SR], но не содержащие слова verify:

findstr /i /c:"[SR]" "%windir%\Logs\CBS\CBS.log" | findstr /i /v /c:"verify"

2)  Выполнить ремонт хранилища компонентов при помощи команды

DISM.exe /Online /Cleanup-image /RestoreHealth

Остановлюсь на этом чуть подробнее. Для работ по “ремонту” образа могут использоваться следующие ключи команды DISM:

/CheckHealth – возвращает информацию о состоянии образа (нуждается в ремонте / не нуждается в ремонте)

/ScanHealth – проводит тестирование образа

/RestoreHealth – выполняет восстановление (“ремонт”) образа

IIUC, ключ /CheckHealth не выполняет никаких проверок образа, а только проверяет состояние некоего  флага целый/поврежден и быстро отдает его интерпретацию пользователю. Значение же самого флага изменяется  при помощи запуска DISM с двумя другими ключами или при помощи других манипуляций с хранилищем компонентов: например, как в моем случае, во время установки обновлений. Именно это я никак не мог взять в толк. После установки обновлений я запускал проверку здоровья образа

C:\Users\Администратор>DISM.exe /Online /Cleanup-image /CheckHealth

Cистема DISM
Версия: 6.3.9600.17031

Версия образа: 6.3.9600.17031

Хранилище компонентов подлежит восстановлению.
Операция успешно завершена.

Получал сообщение о том, что хранилище подлежит восстановлению (т.е. флаг неисправности образа установлен)

После запуска тестирования образа DISM внезапно сообщал о том, что повреждения образа не обнаружено (!?):

C:\Users\Администратор>DISM.exe /Online /Cleanup-image /ScanHealth

Cистема DISM
Версия: 6.3.9600.17031

Версия образа: 6.3.9600.17031

[==========================100.0%==========================]
Повреждение хранилища компонентов не обнаружено.
Операция успешно завершена.

Если в этот момент снова запустить DISM с ключом /CheckHealth, то мы так же получим сообщение о том, что “повреждение хранилища компонентов не обнаружено”. Раз повреждений нет, значит проблемное обновление должно установиться? Как бы не так. После очередной попытки установки проблемного обновления – в логах всё та же ошибка, а /CheckHealth сообщает о необходимости ремонта образа. Т.е. в результате запуска сканирования образа была проведена его проверка, повреждений образа не было обнаружено (!) и флаг необходимости ремонта образа был сброшен. Но я то знал, что повреждения есть. Может быть ремонт хранилища изменит ситуацию к лучшему?

C:\Users\Администратор>DISM.exe /Online /Cleanup-image /RestoreHealth

Cистема DISM
Версия: 6.3.9600.17031

Версия образа: 6.3.9600.17031

[==========================100.0%==========================]
Восстановление выполнено успешно. Повреждение хранилище компонентов было устранено.
Операция успешно завершена.

Результат запуска внушал легкий оптимизм, однако надеждам сбыться было не суждено: обновления не ставились, ошибка в логах та же.

Что же делать? Логично было бы вычистить проблемный пакет из хранилища компонентов (он же уже не нужен системе и был заменен другим обновлением). Забегая вперед скажу, что именно этот путь и привел к успеху в конечном итоге.

Ну, раз система ругается на повреждение Package_30_for_KB3023562~31bf3856ad364e35~amd64~~6.3.1.2, я попытался удалить этот самый Package_30… при помощи следующей команды:

dism /online /remove-package /packagename:Package_30_for_KB3023562~31bf3856ad364e35~amd64~~6.3.1.2

Однако эта попытка закончилась неудачей. Затем я попытался сравнить проблемный сервер с беспроблемным на предмет наличия упоминания Package_30… и выяснил, что на проблемном сервере этот пакет не упоминается в реестре, отсутствует в папках %windir%\servicing\Packages\ и %systemroot%\system32\catroot, однако пакеты, имеющие другие номера и содержащие упоминание обновления KB3023562 на проблемном сервере встречались, так же как и на беспроблемном. Заглянув внутрь обновления (последовательно распаковав msu-файл, а, затем, полученный при распаковке msu-файла, cab-файл так, как это описано здесь). После просмотра списка распакованных файлов, стало понятно, что Package_30… является честью обновления KB3023562, а, значит, удалять надо все обновление целиком из хранилища компонентов, что и было проделано при помощи следующей команды:

dism /online /remove-package /packagepath:E:\Distrib\Updates\KB3023562\Windows8.1-KB3023562-x64.cab

 

PS Пара небольших замечаний

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

dism /online /remove-package  /PackageName:Package_for_KB3023562~31bf3856ad364e35~amd64

Команды

DISM.exe /Online /Cleanup-image /ScanHealth
DISM.exe /Online /Cleanup-image /RestoreHealth

Сначала завершались с ошибкой (дословного содержания которой я  уже не помню), но было понятно, что отсутствует доступ к источнику, содержащему в том числе и проблемное обновление (и это не смотря на наличие доступа к WSUS, на котором данное обновление было загружено и одобрено). Ошибку удалось устранить, перенастроив сервер на обновление с сайта Microsoft windowsupdate.microsoft.com. А вот тут прямо написано, что в качестве источника восстановления (для выполнением DISM.exe /Online /Cleanup-image /RestoreHealth  ) нужно использовать что угодно, но только не WSUS.

Windows Update or a network available WIM are valid recovery sources but WSUS installations are not.
This is important because if you have WSUS enabled in your environment, 
there is a chance that your repair operations may be captured by the WSUS Servers
and not be properly serviced.  
You can control this behavior using Group Policy or the /LimitAccess switch

Самое простое решение в данном случае, как мне кажется, перенастроить сервер на обновление с сайта windowsupdate.

Ссылки по теме:

You can’t install updates in Windows Vista, Windows 7, Windows Server 2008, or Windows Server 2008 R2

What’s New in Windows Servicing

How to use DISM to install a hotfix from within Windows

How do I reset Windows Update components?

Fix Windows corruption errors by using the DISM or System Update Readiness tool

Advanced guidelines for diagnosing and fixing servicing corruption

Leave a Reply

Your email address will not be published. Required fields are marked *

Notify me of followup comments via e-mail. You can also subscribe without commenting.