Пока OneGet собирается стать package manager для винды, в винде уже некоторое время есть работающий менеджер пакетов. Называется он CBS (Component-Based Servicing). Он работает так, как положено нормальному менеджеру: помнит, какой файл кто перезаписал, и может удалить пакет А, если некоторые его файлы перезаписаны пакетом Б. Даже лучше, он хранит все версии файла с помощью WinSxS (Side-by-side assemblies). Он поддерживает обновление всех установленных пакетов через Windows Update (это та самая галочка “Получать обновления для других продуктов Майкрософт”).
Он содержит хоть и не исчерпывающую компонентизацию Windows, но гораздо большую, чем видно в системе на первый взгляд. Более подробной была только компонентизация XP Embedded в билдере. Вершину этого айсберга можно увидеть в “Установке и удалении программ”, “установка компонентов Windows”. Представленный там список – это так называемые Features. В CBS каждый пакет может содержать одну или несколько отключаемых опций, как компоненты установки в MSI. А число пакетов гораздо больше, большинство из них не содержат никаких Features.
Но как обычно, кто-то в Майкрософт сделал полезное дело, а другой приказал всё спрятать и запретить. Большая часть пакетов скрыта, а сам CBS запрятан так глубоко в недра системы, что о нём почти никто не слышал. Прежде, чем им пользоваться, нужно посрывать некоторые предохранители. Считайте это проверкой, как в Гарри Поттере: некоторые заклинания можно использовать только тем волшебникам, которые сумели до них додуматься.
Пакеты перечислены в
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\
Чтобы нормально с ними работать, нужно взять ownership всего раздела Component Based Services с детьми + дать на него с детьми право записи Администраторам.
Большая часть системных пакетов скрыта, у них Visibility=2. Чтобы пакеты были видны в dism.exe, нужно поставить 1.
У любого пакета может быть подключ Owner, где перечислены родительские пакеты. В таком случае самостоятельно его удалить нельзя. Большая часть системных пакетов входит в состав родительских “гранд-пакетов” Windows Home, Windows Pro и Windows Enterprise. Чтобы их можно было удалять, нужно их оттуда исключить и сделать самостоятельными пакетами. Массово это делает утилита install_wim_tweak (видимость она тоже включает):
install_wim_tweak /o
Для управления пакетами есть утилита dism.exe:
dism /Online /Get-Packages
Показывает все установленные пакеты, у которых в параметре Visibility стоит 1.
dism /Online /Get-Features
Показывает все отключаемые компоненты (те, что видно в “Удаление компонентов Windows”). Компоненты группируются по пакетам, но у большинства пакетов компонентов нет, а видимые компоненты на самом деле лежат в паре виртуальных пакетов. В общем, простым взведением флагов компонентизировать остальные пакеты нельзя.
dism /Online /Get-Features /Packagename=[имя]
Можно убедиться, что у большинства пакетов выключаемых компонентов нет, и их можно только удалять.
dism /Online /Remove-Package /Packagename=[имя]
Удаляет пакет из системы навсегда. Чтобы восстановить его, /Add-Package придётся скормить установочный .cab-файл, которого у вас нет, так что думайте. Существует слабый шанс выдрать этот файл из установочного диска винды, но обычно там всё уже в распакованном виде. Скорее всего, для восстановления удалённых пакетов придётся делать repair-install системы.
Обновления по удалённым пакетам приходить не будут.
Почему /Online – потому, что dism может редактировать оффлайн-образы системы в папке. Также dism заодно умеет просматривать установки MSI с помощью /Get-Apps и устанавливать-удалять пакеты Appx (/Get-AppxPackage), чем все пользуются для удаления установленных в винду стильных модных калькуляторов.
Часто удалить достаточно только ведущий пакет, а всевозможные языковые его версии и поддерживающие пакеты удалятся автоматически.
Как понять, какие пакеты что значат? Это сложно, у большинства пакетов названия неговорящие, а часто и не такие, как у конечного продукта. Пакеты также описаны в:
C:\Windows\servicing\Packages
На каждый там лежит XML-файл с описанием пакета, компонентов и обновлений, иногда есть описание (description), хотя редко. По ряду пакетов есть информация в MSDN, хотя она больше касается unattended installation и того, какие параметры пакета можно настроить. Кроме этого остаётся гуглить, часто название технологии что-нибудь подсказывает.
Также во время обслуживания пакетов подключается ключ HKLM\COMPONENTS из C:\Windows\system32\config\COMPONENTS, который содержит много непонятной информации. Как с его помощью сопоставить файлы (assemblies) пакетам я пока не выяснил.
Логи к CBS ведутся в C:\Windows\Logs\CBS, это волшебное место и при диагностике ошибок Windows Update.
Пакеты, которые можно с удовольствием удалить:
Ненужные фичи:
Microsoft-Windows-OneDrive-Setup-Package
– окончательно добивает OneDrive, который дедка бил-бил, не разбил.
Microsoft-Windows-OfflineFiles-Package
– кто-нибудь этим пользуется?
Microsoft-Windows-Shell-HomeGroup-Package
Microsoft-Windows-Shell-HomeGroup-Package-printscan
Microsoft-Windows-EnterpriseClientSync-Host-Package
– это WorkFolders.
Microsoft-Windows-WorkplaceJoin-Package
– ещё одна разновидность “синхронизации папок с работой”. Briefcase, OfflineFiles, WorkFolders, WorkplaceJoin, кто больше?
Microsoft-Windows-PeerDist-Client-Package
– BranchCache, если у вас сервера BranchCache-документов нет, то не нужен.
Ненужные свистелки и бренчалки:
Microsoft-Windows-Cortana-Package
– но осторожно: возможно, удалится и поиск вообще
Microsoft-OneCore-Networking-XboxLive-Package
– некоторые другие пакеты по Xbox, возможно, не стоит удалять – какие-то игры могут на них рассчитывать
Microsoft-OneCore-Networking-XboxLive-WOW64-Package
Ненужные технологии:
Microsoft-Hyper-V-*
– Пакетов 30 на эту тему. Если адреналин задул в паруса души, можно поудалять.
Microsoft-Windows-IIS-WebServer-Package
– впрочем, отключается и из Features.
Microsoft-Windows-IIS-WebServer-AddOn-Package
Microsoft-Windows-IIS-WebServer-AddOn-2-Package
Майкрософт следит за тобой:
Microsoft-WindowsFeedback-Package
Microsoft-Windows-Prerelease-Client-Package
[он же Microsoft-Windows-DiagTrack-Package]
CBS просто замечательны в том, что разбивают Винду на пакеты. Чего же в них недостаёт?
1. Зависимостей между пакетами. Сейчас можно удалить пакет, который нужен другому пакету. В компонентизаторе Windows XP Embedded зависимости были, хотя зачастую пакеты и тянули за собой всё подряд потому, что их зависимости были плохо компонентизированы.
2. Установки из онлайн-репозиториев. Здесь преуспевает OneGet, а CBS умеет устанавливать только cab-файлы.
3. Регистрации нескольких репозиториев. Не все хотят обновляться только через Windows Update, какие-то программы хотели бы выкладывать обновления в собственных репозиториях.
4. Подробной информации о содержимом пакета. Куча пакетов непонятно зачем нужна.
Бонус!
Пока я писал эту заметку, я написал свою собственную утилиту для управления пакетами! Называется CBSEnum:
Она представляет их в виде дерева (хотя вообще в реестре они лежат кучей), позволяет удалять пачками, показывает какую-то справку, какую удалось добыть из Windows\servicing. Также может скрывать/восстанавливать пакеты от DISM.