Восстановление хранилища компонентов

Метки:  , , , , , , ,

Поскольку в современных версиях операционной системы Windows (начиная с Vista) компонентная модель является одной из ключевых системных структур, обеспечивающих бесперебойную работу операционной системы, поддержание её в рабочем состоянии крайне критично для нормального функционирования исполнительной подсистемы Windows. Дело в том, что на протяжении жизненного цикла операционной системы, хранилище компонентов претерпевает постоянные изменения и время от времени может повреждаться. Основные причины рассогласованного состояния хранилища компонентов заключаются в том, что:

  • в процессе обновления операционной системы могут повреждаться/удаляться файлы компонентов в местоположениях: %SYSTEMROOT%\Servicing\Packages и %SYSTEMROOT%\WinSxS;
  • в процессе обновления операционной системы могут повреждаться/удаляться ветви/ключи реестра по путям: HKLM\Components, HKLM\Schema и HKLM\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing;

описанные причины могут быть следствием более глобальных сбоев:

  • Ошибки при передаче файлов по сетевому интерфейсу;
  • Ошибки дисковой/файловой подсистем;
  • Аппаратные сбои: ошибки чтения/записи оперативной памяти, сбои в любых иных аппаратных компонентах;
  • Ошибки в работе сторонних инструментов оптимизации: средства очистки реестра, оптимизации файловой системы, оптимизации хранилища компонентов, оптимизации каталога распространения и прч.
  • Ошибки в коде модулей компонентов Центра обновления Windows;

Подобные дефекты хранилища компонентов WinSxS могут выявляться при попытках пользователя произвести обновление системы (например, через установку обновления безопасности):

unable-to-install-kb

Или же могут быть выявлены в процессе работы разнообразных диагностических и сервисных утилит (модули, входящие в состав Центра обновления Windows), о чем в лог-файлах нам красноречиво сигнализирует статус ERROR_SXS_COMPONENT_STORE_CORRUPT. Описанные выше проблемы впоследствии становятся причиной возникновения различного рода отказов установки обновлений. Чаще всего повреждаются *.cat, *.mum, *.manifest и *.dll-файлы. Все найденные методы восстановления хранилища компонентов я решил выделить в отдельные статьи, а тут попробовать организовать что-то вроде своеобразного хаба.

Этапы восстановления хранилища компонентов

Итак, для восстановления хранилища компонентов у нас в распоряжении имеется целая серия разнообразных методик. Рекомендуется выполнить в указанном порядке следующие действия:

  1. Запустить проверку целостности системных файлов командой: sfc /scannow. Если результатом явились сообщения о том, что утилита нашла ошибки, но не смогла восстановить ошибки в автоматическом режиме, то на данном этапе их можно проигнорировать.
  2. Произвести восстановления хранилища компонентов:
  3. Запустить утилиту SFCFix: Восстановление хранилища компонентов при помощи SFCFix
  4. Выполнить синхронизацию оригинальных файлов с рабочими папками и пересоздание жёстких ссылок повторным запуском команды: sfс /scannow.
  5. Произвести перезагрузку операционной системы
Дополнение: если на каком-либо из выполненных вами шагов (1-4) обнаружены поврежденные файлы, которые соответствующие утилиты не смогли автоматически восстановить, то рекомендации по восстановлению были даны в соответствующих статьях. Например утилита sfc может сообщать нам, что выявлены повреждения и она не смогла их устранить, то идем в статью про sfc и там изучаем раздел Анализ результатов (в нем даны рекомендации по ручному восстановлению файлов).

Ну и напоследок методики, напрямую не относящиеся к восстановлению хранилища компонентов, но позволяющие устранить некоторые ошибки, связанные с обновлениями:

Выводы

В общем случае, стратегия автоматического и ручного восстановления хранилища компонентов заключается в поэтапном выявлении поврежденных зависимостей, имен отсутствующих/поврежденных файлов и их планомерном восстановлении с использованием разнообразных методик. Иногда для проведения всех этих манипуляций в ручном режиме требуется довольно существенное время, поскольку чаще всего операции приходится повторять для каждого сбойного файла. Часто в этой кропотливой работе требуются еще и довольно хорошие знания устройства компонентной модели. Отдельно стоит отметить системы, представляющие собой "кастомные" любительские сборки, поскольку на них риск убить компонентную модель многократно повышается.
Теоретически, в самом крайнем случае, восстановление хранилища компонентов можно было бы провести путем переноса (с использованием LiveCD) с работоспособной машины (имеющей аналогичную версию операционной системы) следующих частей:

  1. Всех вложенных файлов/директорий в папке %WinDir%\WinSxS;
  2. Всех вложенных файлов/директорий в папке %WinDir%\Servicing;
  3. Все содержимое ветвей реестра: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing и HKEY_LOCAL_MACHINE\COMPONENTS;

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

Комментарии: 4

  1. Denis

    Бывает когда "dism /Online /Cleanup-Image /ScanHealth" отрабатывает ошибок нет, установка KB947821 тоже без ошибок, а обновление не ставится но обнаруживается какой то из компонентов WinSxS поврежден - помогает запуск стандартной очистки системного диска с выбором "Очистка обновлений" и прочих системных файлов. Но это помогло раза два из десяти.

    1. shofixti

      а вот это ценная информация!! надо будет изучить вопрос и добавить одним из методов. спасибо!

  2. magistrgm

    Если обновления или обновление не ставится я делаю так:
    1) загружаюсь в безопасном режиме и удаляю папку C:\Windows\SoftwareDistribution
    2) в нормальном режиме делаю очистку диска стандартными средствами windows, выбираю обычно все ( в том числе очистка обновлений ), перезагружаюсь.
    3) ставлю нужные обновления которые не ставились или через центр обновлений делаю поиск обновлений, обычно находит что-то новое, а обновления которые не ставились пропадают.
    4) повторять пункты с 1 по 3 до сообщения "нет доступных обновлений" (не нужные обновления скрывать)

    1. einaare

      спасибо за еще один метод. надо будет проверить.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *