Безопасная очистка папки WinSXS в Windows Server 2016 / 2012 R2

Безопасная очистка папки WinSXS в Windows Server 2016 / 2012 R2

Прежде чем говорить о безопасном способе очистки папки WinSxS в Windows Server 2012, попробуем понять, что же это за папка такая, что в ней хранится и почему со временем она увеличивается в размерах.

Если вы помните, при установке дополнительных компонентов в Windows Server 2003 мастер установки требовал вставить в CD-Rom установочный диск , либо указать путь к каталогу с дистрибутивом Windows Server 2003. В Windows Server 2008 Microsoft решила изменить подход к установке дополнительных ролей и возможностей Windows. Теперь все бинарные файлы, необходимые для разворачивания любой роли, хранятся в каталоге C:WindowsWinSxS (WinSxS — Windows Side By Side). Это означает, что при установке любой дополнительной роли теперь нет необходимости искать и подключать к серверу диск с дистрибутивом. Естественно, при таком подходе для ОС требует гораздо большего места на диске. Нужно понимать, что в каталоге WinSXS содержаться ключевые компоненты системы, поэтому удалять из нее что-то вручную ни в коем случае нельзя. Почему же размер папки WinSXS постоянно растет? Ответ прост – обновления. При установке обновлений различных компонентов в каталоге WinSXS остаются и старая и новая версия обновленного компонента. Благодаря такой архитектуре, мы в любой момент можем безопасно удалить любое установленное обновление и откатиться на старую версию компонента.

А что же делать, если система запущена и работает, разворачивать дополнительные роли не планируется, а места на диске не хватает? Ведь нелогично, что на системном диске несколько гигабайт занято дистрибутивами, которые никогда не потребуются! В Windows Server 2008, к сожалению, удалить данные файлы без вреда системе довольно сложно. Однако, в новой серверной ОС — Windows Server 2012, Microsft решила исправить этот недостаток и внедрила новую функцию под названием Features on Demand.

Features on Demand в Windows Server 2012

Функция Features on Demand (функции по запросу) позволяет уменьшить размер, занимаемый системой на диске, предоставляя возможность удалений бинарных файлов неиспользуемых ролей из папки WinSxS. В том случае, если в дальнейшем возникнет необходимость вернуть ранее удаленную роль, то все необходимые для работы ролей файлы можно извлечь из образа дистрибутива Windows Server 2012, службы Windows Update или сетевого ресурса с оригинальным содержимым WinSxS.

С помощью следующей команды Powershell можно получить информацию обо всех ролях системы:

Get-WindowsFeature

Вывод списка всех ролей и функций в Windows Server 2012

Как вы видите, в колонке Install State отображается состояние каждой роли. Возможные статусы:

  • Installed: роль или функция установлена и в настоящий момент используется системой
  • Available: роль на сервере не установлена, однако на диске присутствуют все необходимые файлы, позволяющие в любой момент установить/активировать эту роль.
  • Removed: — роль или функция на сервере не установлена, файлы, необходимые для ее установки удалены с диска

Соответственно, при установке любой роли через GUI или Powershell (команда Install-WindowsFeature) ее статус с Available меняется на Installed, а при удалении (команда Uninstall-WindowsFeature) наоборот.

Полностью удалить роль с диска (из папки WinSxS) можно только через Powershell. Для этого нужно использовать специальный аргумент команды Uninstall-WindowsFeatur — Remove.

Например, чтобы удалить бинарные файлы роли DHCP-сервера, выполните команду:

Uninstall-WindowsFeature –Name DHCP –Remove

А чтобы удалить файлы службы каталогов Active Directory Domain Services:

Uninstall-WindowsFeature AD-Domain-Services -Remove

Удалить с диска роль Active Directory

С помощью конвейеров Powershell можно написать более сложную команду, которая удалит с диска инсталляционные файлы всех неиспользуемых ролей и функций Windows Server:

Get-WindowsFeature | Where-Object {$_.InstallState -Eq “Available”} | Uninstall-WindowsFeature -Remove

Очищаем папку wisxs в windows server 2012, удалив неиспользуемые роли

В нашем примере, при условии, что была установлена только роль файл-сервера, размер папки WinSxS уменьшился с 8 до 5.2 Гб. Неплохо, правда? Тем более, что для очистки папки WinSxS нам потребовалась всего одна команда.

После очистки размер папки winsxs уменьшился на 3 Гб

Установка удаленных ролей и функций в Windows Server 2012

Рассмотрим еще один сценарий, предполагающий, что вам потребуется установить некую роль Windows Server 2012, дистрибутив которой был удален из каталога WinSxS. Восстановить роль можно несколькими способами: с помощью GUI Server Manager или с помощью Powershell.

Прежде, чем приступить к восстановлению файлов ролей, необходимо определить индекс установленной редакции Windows Server 2012. Нам понадобятся диск с дистрибутивом Windows Server 2012 (а точнее файл образа install.wim, находящийся в каталоге sources). Выполните следующую Powershell команду:

Get-windowsimage –imagepath sourcesinstall.wim

windows2012 index различных версий

Найдите версию установленного у вас Windows Server и запомните ее индекс (значение в строке Index). В нашем примере это Windows Server 2012 Datacenter с индексом 4. (Мы уже рассматривали особенности работы с различными редакциями Windows 2012 в одном дистрибутиве в статье «Интеграция драйверов в установочный диск Windows Server 2012»).

Ту же самую операцию можно выполнить с помощью утилиты Dism:

dism.exe /get-imageinfo /imagefile:d:sourcesinstall.wim

Вывод версий win2012 помощью dism

Устанавливаем удаленную роль с помощью Server Manager

Откройте консоль Server Manager и запустите мастер установки ролей (Add Roles and Features. Выберите роль или функцию, которую необходимо установить. Мастер предупредит, что некоторые файлы, необходимые для установки данной роли отсутствуют и нужно указать альтернативный путь к местоположению дистрибутива. Нажмите кнопку Specify an alternate source path.

specify alternative source path: восстанавливаем роль

В поле Path укажите полный путь к файлу intall.wim и индекс установленной редакции ОС в таком формате:

WIM:D:SourcesInstall.wim:4

Путь к wim файлу

В случае необходимости, в данной строке можно указать сетевой путь к каталогу с файлом WIM или сетевой путь к каталогу WinSxS. Кроме того путь к данному каталогу можно указать сразу для группы серверов с помощью групповой политики ( Computer Configuration -> Administrative Templates ->System ->Specify settings for optional component installation and component repair). Последний вариант удобен в случае большого количества инсталляций серверов с Windows Server 2012, ведь суммарный эффект от очистки папки WinSxS может достигать сотен Гб.

windows 2012: задаем путь к хранилищу компонентов с помощью групповой политики

После того, как будет нажата кнопка OK, все необходимые файлы для устанавливаемой роли будут скопированы в каталог WinSxS.

Восстановление удаленной роли Windows 2012 с помощью Powershell

Ту же самую операцию можно выполнить с помощью всего одной команды Powershell. Допустим, нам нужно восстановить удаленные файлы роли ADDS. Выполним следующую команду:

Install-WindowsFeature AD-Domain-Services -Source WIM: WIM:D:SourcesInstall.wim:4

Восстановление удаленной роли с помощью powershell

Итак, в этой статье мы разобрались с новой функцией Windows Server 2012 под название Features on Demand, позволяющей удалить дистрибутивы бинарных файлов неиспользуемых серверных ролей из каталога WinSxS. В случае необходимости удаленную роль можно достаточно просто восстановить: все, что для этого понадобится – дистрибутив Windows Server 2012.

В Windows 8 функция Feautere on Demand работает немного по другому, дело в том, что используемый нами командлет Powershell просто напросто отсутствие. Его аналогом (не таким удобным) является команда DISM с параметром /Disable-Feature. Кроме того можно просто сжать содержимое каталога Winsxs. Подробности в статье Как уменьшить размер папки Winsxs в Windows 8

Автоматическая очистка WinSxS с помощью Cleanmgr

Для автоматической очистки файлов обновлений в WinSxs и временных файлов можно использовать стандартную утилиту Disk Cleanup (cleanmgr.exe). Используйте такой скрипт (thnks to Alex Kornev)

:: параметры очистки каталога winsxs
REG ADD "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerVolumeCachesUpdate Cleanup" /v StateFlags0088 /t REG_DWORD /d 2 /f
:: параметры очистки временных объектов
REG ADD "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerVolumeCachesTemporary Files" /v StateFlags0088 /t REG_DWORD /d 2 /f
:: создание запланированной задачи "CleanupWinSxS"
schtasks /Create /TN CleanupWinSxS /RL Highest /SC monthly /TR "cleanmgr /sagerun:88"

Данный скрипт создаст в планировщике задание ежемесячной очистки папки WinSxS с помощью утилиты cleanmgr. Задача будет выполняться автоматически 1 раз в месяц 1-го числа без непосредственного участия. Время запуска задачи будет соответствовать времени создания задачи.

Чтобы задать свое время запуска, добавьте в последнюю строку ключ:

/ST HH:mm
где
HH - часы в формате 24h
mm - минуты

Windows Server 2016
Безопасная очистка папки WinSXS в Windows Server 2016 / 2012 R2