НЕ ПРОПУСТИТЬ ИНТЕРЕСНОЕ

Свежие обсуждения

Sorry. No data so far.

Как безопасно уменьшить размер папки WinSxS в Windows

Судя по количеству поисковых запросов, многие пользователи Windows ищут способ уменьшить размер системной папки WinSxS. Об эту папку, которая через некоторое время после начала эксплуатации операционной системы Windows начинает занимать на диске достаточно много места, было сломано немало копий. Народ по-разному пытался бороться с ее размерами, однако, не всегда успешно.

На самом деле, истинный размер папки WinSXS не совсем тот, который показывают файловые менеджеры: Explorer, FAR и другие, или утилиты, наподобие Scanner. А точнее было бы сказать, – совсем не тот. Виноваты в этом жесткие ссылки (Hard Links). Но об этом чуть ниже.

Каталог WinSXS имеет очень большое значение для функционирования операционной системы Windows. Хранятся в этом каталоге, по большей части, динамические библиотеки DLL, но не только. Причем, одна и та же динамическая библиотека может быть сохранена несколько раз в разных версиях.

Записывают их инсталляторы программ и системных обновлений, а вот удалять старые версии файлов никто не торопится. Получается что-то вроде полупроводника — движение только в одну сторону. Могу лишь предположить, почему так происходит. Деинсталляторы, очевидно, не могут определить, нужны ли использовавшиеся программой динамические библиотеки кому-либо еще, и не трогают их.

Способы уменьшения размера папки WinSxS

Удаление файлов Палец вниз

К сожалению, вразумительных критериев того, какие файлы из каталога WinSxS уже можно удалить, а какие нет, не существует. Или, скажем так, доподлинно они не известны. Судя по отзывам пользователей, которые все же рискнули это сделать на основе неких соображений, ничем хорошим для системы такое удаление не закончилось.

Оставлю этот вариант как теоретически возможный, но сам  таким способом уменьшать размер папки WinSxS никогда не буду, и вам не советую.

Скрипт Winsxslite Палец вниз

Большое количество публикаций представляют командный файл от Christian Bering Boegh как чудесное средство уменьшения размера WinSxS. Однако, последнюю заявленную версию WinsxsLite — 1.88 скачать уже не получилось. Видимо, с проектом Winsxslite не все так хорошо.

Смысл работы этого многопроходного скрипта заключается в поиске самых свежих версий библиотек и создании ссылок на них со всех предыдущих с последующим удалением последних.

Ну что же, тут по крайней мере есть идея. Однако, она не гарантирует 100-процентного положительного результата. Я поддался соблазну, потратил достаточно много времени и получил совершенно отрицательный результат. Скрипт отработал первую фазу и «сломался» на второй. После требуемой, по алгоритму работы этого командного файла, перезагрузки компьютера напрочь отказалась работать системная утилита subinacl. На этом все и закончилось. Коль уж сам скрипт не может отработать после внесенных им изменений, то о чем тут вообще можно  говорить.

Если есть желание непременно воспользоваться пакетным файлом WinsxsLite, то в обязательном порядке сделайте предварительно бекап системы!

NTFS-сжатие файлов в папке WinSxS Палец вверх

Если сделать, в общем-то, необоснованное предположение о том, что файлы, размещенные в папке WinSxS, используются системой не так часто, как файлы из других системных папок, таких как: Program Files, ProgramData, system32 и др., то почему бы не попробовать сделать их ntfs-сжатие? Результат заранее не очевиден, но, по крайней мере, это совершенно безопасный вариант.

Microsoft постаралась максимально защитить папку WinSxS от всяческих посягательств на нее извне. Если открыть закладку «Безопасность» в свойствах папки, то можно увидеть, что только пользователь «TrustedInstaller» имеет полный доступ. Все остальные, включая «Система» и «Администраторы», приравнены к рядовым пользователям с правами на чтение и выполнение.

clip_image001

Таким образом, для того, чтобы иметь возможность сделать ntfs-сжатие файлов в этой папке, сначала нужно установить необходимые разрешения.

Запускаем командную строку с правами администратора и последовательно выполняем следующие команды:
takeown /A /R /F C:\Windows\winsxs\*В результате владельцем папок и файлов в WinSxS станет группа пользователей «Администраторы».
icacls C:\Windows\winsxs\* /T /grant Администраторы:(F)Результатом будет добавление прав полного доступа на все папки и файлы в WinSxS.

Не хочется подробно расписывать значение ключей команд. Кому интересно – посмотрите по /? в командах, все достаточно очевидно.

Теперь можно сделать сжатие файлов, но не торопитесь и дочитайте статью до конца.

Самое время вспомнить о том, что в WinSxS лежат не только уникальные файлы, но и большое количество жестких ссылок на файлы, разбросанные по различным системным папкам.

Мы уже несколько раз обращались к теме символьных ссылок, которые использовали для переноса каталогов пользователей на другой диск. (См. «Перенос Windows 7 на твердотельный диск …» Часть 2 и Часть 3).

Тогда мы использовали обычные символические ссылки (Symbolic link), которые представляют собой специальные файлы, содержащие указатели на объекты в файловой системе. При попытке обратиться к объекту, в качестве которого может выступать файл или папка, символьная ссылка передает действительный путь к нему.

В папке WinSxS для файлов используется разновидность символической ссылки, которая называется жесткой ссылкой (Hard Links).

Жесткая ссылка создается командой:
mklink /H “Link” “Target”
Link — путь к виртуальному объекту (первоначальное местоположение объекта);

Target — путь к реальному объекту (относительный или абсолютный).

Жесткая ссылка может быть создана только на файл и в пределах одного раздела.

Название этого типа ссылок, в какой-то степени, говорит само за себя – штука это жестокая. Hard Link создает абсолютно равноправный исходному указатель на файл. Новый указатель и первоначальный могут иметь разные имена и находиться в разных каталогах (в пределах одного раздела), но они указывают на один и тот же объект. Сам объект будет существовать в файловой системе до тех пор, пока на него существует хотя бы один указатель.

После создания жесткой ссылки невозможно определить, какая из ссылок на объект была исходной. Вот тут-то и кроется причина неправильного вычисления объема папки WinSxS файловыми менеджерами. Они включают в расчет суммарный размер всех файлов из других системных папок, на которые имеются жесткие ссылки (а с другой стороны, как иначе? Ссылки то равноправны).

Со ссылками всех типов, включая и жесткие, умеет работать файловый менеджер FAR (Alt/F6). С его помощью можно легко посмотреть количество ссылок, которые имеет файл:

Жесткие ссылки в файловом менеджере FAR

Для этого нужно выбрать 9-й режим отображения любой из панелей. Крайний правый столбец покажет количество ссылок на файлы в текущем каталоге.

В нашем случае, если сделать ntfs-сжатие всех файлов в папке WinSxS, то сжатыми окажутся и файлы в других системных каталогах, на которые имеются жесткие ссылки.

Ничего страшного в этом нет. Если процессор быстрый, а жесткий диск обычный механический, то за счет ntfs-сжатия файлов может быть даже получен общий прирост производительности.

Это произойдет в том случае, если уменьшение времени на запись или считывание более короткого файла будет превалирующим над увеличением процессорного времени на сжатие или распаковку файла. Можно предположить, что для большинства современных компьютеров с традиционными дисками будет иметь место как раз выигрыш.

Сначала я сделал сжатие всех файлов папки WinSxS. Нам понадобится это в дальнейшем для прикидки объемов уникальных файлов и файлов, созданных жесткими ссылками.
Compact /C /A /I /S:C:\Windows\winsxs\
Результат для Windows 7 x64 получился такой:

— исходный размер папки WinSxS составлял 10,1 ГБ,

— после сжатия – 6,85 ГБ.

Выигрыш места на диске составил 3,25 ГБ, или 32% от первоначального размера папки. Очень неплохо, учитывая, что все это делается для небольшого SSD-диска.

Теперь раскрутим файлы назад:
Compact /U /A /I /S:C:\Windows\winsxs
и попробуем сжать только уникальные файлы. Как же это сделать?

Идея такая – для каждого файла в папке WinSxS посчитать количество ссылок. Если ссылка всего одна – сжимаем, если больше – ничего не делаем. Для подсчета количества ссылок используем возможности команды fsutil hardlink list «Имя_файла». Естественно, ручками перебрать 60 тысяч файлов дело нереальное, поэтому создадим командный файл:
@echo off
REM Включаем раскрытие переменных окружения в момент обращения к ним
setlocal enabledelayedexpansion
REM Рекурсивно перебираем все файлы в каталоге C:\Windows\winsxs
for /R "C:\Windows\winsxs" %%i in (*) do (
REM Ищем однострочный вывод fsutil
fsutil hardlink list %%i | find /c /v "" | find /I "1" >nul
REM Если ссылка единичная, сжимаем файл
IF !ERRORLEVEL!==0 Compact /C /A /I %%i
)
@echo FINISH
pause>nul

Внимание! Пакетный файл необходимо запускать строго от имени администратора. В противном случае fsutil начнет выдавать однострочный текст ошибки, который будет благополучно обработан командами find. В результате окажутся сжатыми все файлы в каталоге WinSxS, а не только уникальные.

Скрипт, естественно, работает не так быстро, как «безразборное» сжатие всех файлов. В моем случае на i7 и SSD-диске перебор и сжатие файлов заняли около 20 минут.

Результат получился такой:

— исходный размер папки WinSxS составлял 10,1 ГБ,

— после сжатия только уникальных файлов – 8,25 ГБ.

Выигрыш места на диске составил 1,85 ГБ, или 18,3% от первоначального размера папки. Много меньше, чем после сжатия всех файлов, но тоже неплохо. Для моего 60-гигабайтного SSD-диска вполне различимо.

В заключение вернем разрешения на файлы:
icacls C:\Windows\winsxs\* /T /L /grant:r Администраторы:(RX)

Соотношение уникальных файлов и жестких ссылок в папке WinSxS Windows 7

Прикинем соотношение объемов уникальных и ссылочных файлов. Для этого решим простую математическую задачку (Можно было бы, конечно, написать еще один скрипт и подсчитать все точно, но большого практического смысла в этом я не вижу).

Сделаем допущение, что средняя степень сжатия файлов одинакова для уникальных и неуникальных файлов.
Kc = Vc / Vгде V – исходный объем папки WinSxS, Vc – ее объем после полного сжатия.
F1 + FL = V
KC * F1 + FL = Vc1
F1 – объем уникальных файлов, FL–объем ссылочных файлов, Vc1 – объем WinSxS после сжатия уникальных файлов.

Путем несложных преобразований получим:
F1 = ( V - Vc1 ) / ( 1 - Kc)
После подстановки конкретных значений:
F1 = ( 10,1 – 8,25) / ( 1 – 0,678) = 5,86 ГБ
Оказалось, что уникальные файлы занимают около 60% объема папки WinSxS. Неожиданный результат. А меня уверяли, что их там очень мало.

Заключение

В заключение необходимо отметить:

  • Описанный способ уменьшения размера папки WinSxS является абсолютно безопасным, так как не делает в системе никаких деструктивных изменений и всегда позволяет вернуться к первоначальному состоянию;
  • В процессе эксплуатации системы запуск скрипта нужно будет повторять после новых инсталляций программ и системных обновлений.

_____________________________

P.S.

Появились:

  1. Продолжение, в котором описываются другие методы борьбы с размером папки WinSxS; Подписка на обновления блога www.ithabits.ru
  2. Готовый командный файл для очистки и сжатия каталога WinSxS. Ссылку на бесплатное скачивание скрипта “winsxscompact.cmd” можно найти в уведомлении о подписке на обновления блога по E-Mail.

Комментарии: 31. Присоединяйтесь к обсуждению!

  1. asacrldu:

    Спасибо! Прикольная вещь!!!

    __________________________
    http://uminecraft.org/ | minecraft 1.5.1 wall jump

    • Александр AKS:

      Спасибо, что оценили. На самом деле есть еще одна идейка как можно без лишних проблем уменьшить WinSxS. Я как раз сейчас пишу об этом статью.

  2. павел:

    автор, а вы не допускаете возможность,что данный алгоритм (или подобный) может присутствовать в каком-либо твикере-утилите (платной или бесплатной) ?

  3. Интересный вопрос. В принципе, допускаю, конечно. Думаю даже, что через некоторое время кто-нибудь воспользуется моей идеей в своих корыстных целях. Шучу, конечно, но почему бы и нет?

  4. Виктор:

    При запуске команды на поиск выдает ошибку:
    FIND: Неправильный формат паратметра

    При копировании в Блокнот или сразу в редактор FARа, все это дело копируется с какими-то сдвигами, а Блокнот предлагает сохранить в кодировке Юникод.

    В какой кодировке правильно сохранять данный командный файл?
    И чем лучше его создавать?

    • Файл сделан в кодировке OEM 866 (ДОС). В FAR-е после загрузки файла в редактор нужно сменить кодировку, нажав на F8.
      Можно редактировать в Notepad++, соответственно, выбрав кодировку OEM 866.
      Файл должен открываться в редакторах без каких-либо сдвигов, изначально их нет.
      А зачем что-то куда-то копировать?

    • Виктор:

      ОК, буду пробовать.

      А копировать — имеется в виду содержимое Вашего поста в создаваемый мною командный файл, что бы ручками не набирать и не ошибиться.

    • А зачем? Есть же уже готовый проверенный файл. Если Вы оформили подписку на обновления блога по E-Mail, то ссылка на его скачивание есть в уведомлении о подписке.

    • Виктор:

      Скачал готовый файл и нашел причину ошибки
      FIND: Неправильный формат паратметра

      А вот и причина:
      в Вашем посте вот так
      fsutil hardlink list %%i | find /c /v «» | find /I «1″ >nul

      а в рабочем варианте так
      fsutil hardlink list %%i | find /c /v «» | find /I «1»

      Если можно, отредактируйте ваше сообщение и все будет ОК.

      Также выражаю благодарность за быстрые ответы.

    • Виктор, боюсь, что >nul тут ни при чем. Скорее всего у Вас возникла проблемка с парными кавычками при переносе текста в редактор. Должно быть так:
      fsutil hardlink list %%i | find /c /v "" | find /I "1" >nul

  5. Евгений:

    Александр, а как создать командный файл? Расскажите поподробнее, пожалуйста, а то я ничего в этом не понимаю.

    • Евгений, в данном случае Вам не нужно самостоятельно создавать командный файл — просто скачайте готовый. Для этого нужно лишь подписаться на обновления блога по E-Mail.
      А вообще командные файлы — это обычные текстовые файлы с расширением, как правило, .bat или .com, в которых записаны соответствующие команды. Такой файл можно создать практически в любом текстовом редакторе: notepad (блокнот), notepad++, far и т.д.
      А вот уже применение команд для решения той, или иной задачи — это совершенно отдельная тема. Скорее даже, направление.

  6. павел:

    прочитал статью…ринулся было попробовать у себя…
    посмотрел размер папки winsxs (стоит windows 7 32 бит) -4,8 гб -наверное,
    особой целесообразности сжимать нет в таком случае ?

  7. Виталий:

    Может быть сможете мне помочь разобраться. Стоит Win7HB 64 бит. Делал все как сказано в статье (делал все от имени администратора): сменил владельца, добавляю права доступа. Однако в консоли пишется, что обработано всего 44 файла и это из 9Гб размера папки. В дальнейшем при выполнении скрипта на сжатие на все файлы выводится сообщение «Отказано в доступе». Результат выполнения Вашего скрипта winsxscompact.cmd дает тот же результат. Может быть сможете подсказать куда смотреть и что еще попробовать?

    • Виталий, а 9 Гб это уже после очистки штатными способами?

    • Виталий:

      Да, это после чистки. Было где-то под 10Гб, под 700 Мб удалила очистка системы. Прошу прощения, что не сходятся расчеты, зря я их не записал. Попробовал полное сжатие: 62 файла сжал, примерно 6 Мб освободилось :) Большая часть файлов прошла с той же ошибкой: отказано в доступе.

    • По какой-то причине в вашей системе не удается изменить разрешения на файлы. Однако чудес на свете не бывает. В этой связи такой вопрос — у Вас Windows случайно не английский? У меня все используемые команды расписаны в расчете на русский. Командный файл, соответственно, тоже.
      А вообще, WinSxS 9 Гб для 64-разрядной Windows — это вовсе не запредельный размер. Боюсь, что после очистки штатным способом, поджать за счет ntfs-сжатия получится несильно. Если есть большие проблемы с местом на диске, то имеет смысл посмотреть другие варианты. Например, перенести некоторые файлы и папки на другой диск (если не ноутбук, конечно).

  8. Сергей:

    Александр, спасибо за файлик, скрип отличный. Тестировал на Win7 x64, полет нормальный. Но есть вопрос. Как этот скрипт поведет себя на серверных ОС? В частности интересует Windows Server 2008 R2 Enterprise SP1. И очень хотелось бы, чтобы появился скрипт для англоязычных ОС.

    • Сергей, спасибо за отзыв. Что касается Windows Server 2008 R2 SP1, то ситуация следующая. Скрипт в своем нынешнем виде работать на нем не будет, но так как Server 2008 это фактически Windows 7, то дело легко поправимое.
      Интереснее как раз ситуация с самим сервером. По-умолчанию в Windows Server 2008 не установлена утилита «Очистка диска» (Disk Cleanup). Для того, чтобы она появилась, нужно доустановить компоненту «Возможности рабочего стола» (Desktop Experience). Однако для того, чтобы не делать из рабочего сервера десктоп, можно просто скопировать cleanmgr.exe в %systemroot%\System32 и cleanmgr.exe.mui в %systemroot%\System32\ru-RU (или en-US) из WinSxS. Подробно расписать как это сделать я постараюсь в ближайшее время (добавлю в текст статьи).

    • Сергей! Как и обещал, я добавил в соответствующую статью описание возможности очистки обновлений в Windows Server 2008 R2 SP1.

    • В скрипт добавлена поддержка Windows Server 2008. Локализация опять же русская. Соответственно, сделать штатную очистку можно только в 2008 R2 SP1, для остальных — ntfs-сжатие. Во время тестирования свежеустановленного и полностью обновленного экземпляра сервера WS 2008 R2 SP1 в виртуальной машине за счет ntfs-сжатия получилось освободить на диске ~1,5 Гб. Предварительно была сделана штатная очистка обновлений.

  9. Павел:

    Автору спасибо!
    Но можно сделать проще

    Копируем маленькую утилиту (devxexec.exe) или любую другую, которая умеет запускать приложения от имени другого пользователя
    Создаем папку и кладем туда этот экзешник
    Создаем батник с содержимым (например):

    start devxexec.exe /user:TrustedInstaller «%windir%\system32\Compact.exe /C /A /I /S:%windir%\winsxs\»

    • Спасибо за ссылку на интересную утилиту. Правда сходу не могу для себя придумать где ее можно (или нужно) использовать.
      Как-то не очень уверен, что для большинства пользователей такой вариант окажется проще. Все же есть разница — запустить один командный файл, или скачивать дополнительно некую программу и дальше мудрить с командной строкой. Да и основная идея, если Вы помните, была в том, что сжимаются только уникальные (не имеющие жестких ссылок в других системных папках) файлы, а не вся папка Winsxs. Кстати, последний вариант скрипта изменяет разрешение не на всю папку, а последовательно в цикле только на те файлы, которые предполагается сжать. Так что по скорости, думаю, особого выигрыша тоже получить не удастся.

    • Павел:

      Забыл пояснить для чего эта утилита.
      Утилита запускает приложение/пакетный файл от имени любого пользователя, в данном случает от системной учетной записи TrustedInstaller. В нашем случае TrustedInstaller имеет полные права на папку WinSxS, таким образом убираются действия по подготовке каталога (овладение правами на каталог, добавление разрешений и восстановление в исходное состояние).
      Ничто не мешает запустить Ваш батник с помощью этой утилиты — просто без доп. подготовки папки

    • Что делает утилита я, слава богу, догадался. Можно было и не пояснять. Я имел в виду именно сферу ее конкретного применения в задачах системного администрирования.
      Как я уже сказал выше, права на всю папку Winsxs теперь не изменяются, только на отдельные файлы.

  10. Спасибо за статью, сжал полностью, освободилось 3.2Гб, что просто отлично), назрел вопросик: комманда «Compact /C /A /I /S:C:\Windows\winsxs\» отличается от галочки «сжимать содержимое для экономии места на диске» в свойствах сабжевой папки?

    • /c : Compresses the specified directory or file, /a : Displays hidden or system files, /i : Ignores errors, /s : dir : Specifies that the requested action (compress or uncompress) be applied to all subdirectories of the specified directory, or of the current directory if none is specified.
      Андрей, могу предположить, что ничем не отличается.

  11. Ivanov_ilya:

    Ну а если устаовить не имя администратор или Administrator а SID зачение описание » https://msdn.microsoft.com/en-us/library/cc980032.aspx »

    Пимер применения :
    subinacl.exe /keyreg HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\DPS /grant=S-1-5-32-544=f >>%LogPacked%

    takeown.exe /F %SystemRoot%\system32\systeminfo.exe /A >>%LogPacked% 2>&1
    icacls %SystemRoot%\system32\systeminfo.exe /reset >>%LogPacked% 2>&1
    icacls %SystemRoot%\system32\systeminfo.exe /grant *S-1-5-32-544:F /inheritance:r /q /c >>%LogPacked%

  12. Алекс:

    Спасибо, скрипт отличный. На 7-ке делает работу отлично.
    А вот на 10-ке не запускается. Может автор сможет добавить в столь полезный скрипт и поддержку win10? Спасибо!

  13. Денис:

    SC ControlService: ошибка: 1062
    Служба не запущена.

    Такие записи возникают после запуска файла.
    Не подскажите о какой службе речь, и как это поправить?

Написать комментарий

Subscribe without commenting