Поскольку в современных версиях операционной системы Windows (начиная с Vista) компонентная модель является одной из ключевых системных структур, обеспечивающих бесперебойную работу операционной системы, поддержание её в рабочем состоянии крайне критично для нормального функционирования исполнительной подсистемы Windows. Дело в том, что на протяжении жизненного цикла операционной системы, хранилище компонентов претерпевает постоянные изменения и время от времени может повреждаться. Основные причины рассогласованного состояния хранилища компонентов заключаются в том, что:
- в процессе обновления операционной системы могут повреждаться/удаляться файлы компонентов в местоположениях: %SYSTEMROOT%\Servicing\Packages и %SYSTEMROOT%\WinSxS;
- в процессе обновления операционной системы могут повреждаться/удаляться ветви/ключи реестра по путям: HKLM\Components, HKLM\Schema и HKLM\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing;
описанные причины могут быть следствием более глобальных сбоев:
- Ошибки при передаче файлов по сетевому интерфейсу;
- Ошибки дисковой/файловой подсистем;
- Аппаратные сбои: ошибки чтения/записи оперативной памяти, сбои в любых иных аппаратных компонентах;
- Ошибки в работе сторонних инструментов оптимизации: средства очистки реестра, оптимизации файловой системы, оптимизации хранилища компонентов, оптимизации каталога распространения и прч.
- Ошибки в коде модулей компонентов Центра обновления Windows;
Подобные дефекты хранилища компонентов WinSxS могут выявляться при попытках пользователя произвести обновление системы (например, через установку обновления безопасности):
Или же могут быть выявлены в процессе работы разнообразных диагностических и сервисных утилит (модули, входящие в состав Центра обновления Windows), о чем в лог-файлах нам красноречиво сигнализирует статус ERROR_SXS_COMPONENT_STORE_CORRUPT. Описанные выше проблемы впоследствии становятся причиной возникновения различного рода отказов установки обновлений. Чаще всего повреждаются *.cat
, *.mum
, *.manifest
и *.dll
-файлы. Все найденные методы восстановления хранилища компонентов я решил выделить в отдельные статьи, а тут попробовать организовать что-то вроде своеобразного хаба.
Этапы восстановления хранилища компонентов
Итак, для восстановления хранилища компонентов у нас в распоряжении имеется целая серия разнообразных методик. Рекомендуется выполнить в указанном порядке следующие действия:
- Запустить проверку целостности системных файлов командой: sfc /scannow. Если результатом явились сообщения о том, что утилита нашла ошибки, но не смогла восстановить ошибки в автоматическом режиме, то на данном этапе их можно проигнорировать.
- Произвести восстановления хранилища компонентов:
- для Windows 8/10+: Восстановление хранилища компонентов при помощи DISM
- для Windows Vista/7: Восстановление хранилища компонентов при помощи SURT
- Запустить утилиту SFCFix: Восстановление хранилища компонентов при помощи SFCFix
- Выполнить синхронизацию оригинальных файлов с рабочими папками и пересоздание жёстких ссылок повторным запуском команды: sfс /scannow.
- Произвести перезагрузку операционной системы
Ну и напоследок методики, напрямую не относящиеся к восстановлению хранилища компонентов, но позволяющие устранить некоторые ошибки, связанные с обновлениями:
Выводы
В общем случае, стратегия автоматического и ручного восстановления хранилища компонентов заключается в поэтапном выявлении поврежденных зависимостей, имен отсутствующих/поврежденных файлов и их планомерном восстановлении с использованием разнообразных методик. Иногда для проведения всех этих манипуляций в ручном режиме требуется довольно существенное время, поскольку чаще всего операции приходится повторять для каждого сбойного файла. Часто в этой кропотливой работе требуются еще и довольно хорошие знания устройства компонентной модели. Отдельно стоит отметить системы, представляющие собой "кастомные" любительские сборки, поскольку на них риск убить компонентную модель многократно повышается.
Теоретически, в самом крайнем случае, восстановление хранилища компонентов можно было бы провести путем переноса (с использованием LiveCD) с работоспособной машины (имеющей аналогичную версию операционной системы) следующих частей:
- Всех вложенных файлов/директорий в папке %WinDir%\WinSxS;
- Всех вложенных файлов/директорий в папке %WinDir%\Servicing;
- Все содержимое ветвей реестра: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing и HKEY_LOCAL_MACHINE\COMPONENTS;
но на деле подобный глобальный поход может привести к падению системы в синий экран смерти, так что будьте предельно аккуратны!!
Бывает когда "dism /Online /Cleanup-Image /ScanHealth" отрабатывает ошибок нет, установка KB947821 тоже без ошибок, а обновление не ставится но обнаруживается какой то из компонентов WinSxS поврежден - помогает запуск стандартной очистки системного диска с выбором "Очистка обновлений" и прочих системных файлов. Но это помогло раза два из десяти.
а вот это ценная информация!! надо будет изучить вопрос и добавить одним из методов. спасибо!
Если обновления или обновление не ставится я делаю так:
1) загружаюсь в безопасном режиме и удаляю папку C:\Windows\SoftwareDistribution
2) в нормальном режиме делаю очистку диска стандартными средствами windows, выбираю обычно все ( в том числе очистка обновлений ), перезагружаюсь.
3) ставлю нужные обновления которые не ставились или через центр обновлений делаю поиск обновлений, обычно находит что-то новое, а обновления которые не ставились пропадают.
4) повторять пункты с 1 по 3 до сообщения "нет доступных обновлений" (не нужные обновления скрывать)
спасибо за еще один метод. надо будет проверить.