Skip to main content

Windows: чистка системного диска

Проблема: забился системный диск, далее у меня диск C:. Чистка кэшей браузеров и использование системной утилиты результатов не дало. Пришлось прибегнуть к развернутому анализу.

Установил WizTree, portable - версию. 

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

Вопрос: что находится в файле $MFT (трогать его не надо)?

Файл $MFT (Master File Table) — это не обычный файл с документами или программами, а главная служебная база данных файловой системы NTFS, которая хранит информацию абсолютно обо всех файлах и папках на диске.

Сам по себе $MFT тоже физически оформлен как файл, который лежит в начале каждого диска NTFS.

Что именно записано внутри $MFT?

Каждому файлу и папке на диске (включая скрытые и системные) выделяется отдельная запись в этой таблице размером обычно 1 КБ. Внутри этой записи хранится вся метаинформация:

  1. Атрибуты файла: Полное имя файла, путь к нему и родительский каталог.

  2. Временные метки (Timestamps): Точное время создания, последнего изменения, доступа и модификации файла (поэтому этот файл так любят программы для цифровой криминалистики).

  3. Права доступа (Security Descriptors): Информация о том, какому пользователю или группе разрешено открывать или менять этот файл.

  4. Физическое расположение (Указатели/Pointers):

    • Если файл очень маленький (например, текстовый файл на пару строчек), то его содержимое может поместиться прямо внутри самой записи $MFT.

    • Если файл большой, $MFT хранит карту секторов (кластеров) диска, где физически разбросаны кусочки этого файла.

Почему программы вроде WizTree используют $MFT?

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

Утилиты вроде WizTree поступают хитрее: они напрямую считывают весь файл $MFT целиком. Поскольку $MFT — это уже готовая, структурированная таблица, где собраны размеры и имена всех файлов на диске, программа мгновенно «видит» всю структуру за пару секунд и сразу понимает, какие папки занимают больше всего места.

Вопрос: файл $MFT заполнен на 25%, можно ли его сжать (я не сжимал, оставил как есть)?

Нет, штатно средствами Windows уменьшить (сжать) физический размер файла $MFT на работающем диске нельзя.

Почему так происходит?

  1. Архитектура NTFS: Когда файловая система Windows создает новые файлы, $MFT автоматически расширяется под их количество. Однако когда вы удаляете файлы, их записи в таблице помечаются как «пустые» и могут использоваться заново, но физически выделенное под $MFT дисковое пространство назад не возвращается и размер файла не уменьшается.

  2. Ограничения ОС: Windows не умеет «усекать» (shrink) занятые зоны $MFT "на лету", так как этот файл критически важен для работы всей файловой системы и закреплен за определенными областями диска.

Что можно сделать?

  • Стороннее ПО: Существуют специализированные утилиты для работы с разметкой дисков (например, Paragon Hard Disk Manager), в которых есть функции оптимизации и дефрагментации/сжатия $MFT. Они умеют переносить служебные записи и усекать пустые хвосты.

  • Радикальный способ: Полное уменьшение физического размера $MFT без сторонних рискованных утилит достигается только одним путем — полным форматированием раздела или переустановкой системы, после чего размер таблицы сбросится до минимального начального значения.

Примечание: Если $MFT заполнен всего на 25%, это абсолютно нормальное рабочее состояние (система держит большой запас на будущее, чтобы избежать сильной фрагментации таблицы при создании новых файлов). Сами по себе эти «пустые» 75% внутри $MFT не блокируют свободное место на диске критическим образом, если у вас не стоит задача высвободить каждый мегабайт под сжатие самого раздела.

Вопрос: в папке с MS SQLServer есть папка PYTHON_SERVICES_20f02472-8f99-49e8-b8c0-5059b8cf545b большого размера, что это такое?

Папка PYTHON_SERVICES_<уникальный_id> связана с компонентом SQL Server Machine Learning Services.

Что это такое?

Этот каталог создается службой расширения SQL Server (Launchpad). Когда в базе данных запускаются скрипты на Python (например, через процедуру sp_execute_external_script), SQL Server изолирует выполнение кода и автоматически создает временные рабочие директории для каждого сеанса или задачи.

Почему папка стала большого размера?

  1. Зависание сеансов или утечка данных: Иногда при выполнении тяжелых скриптов (обработка больших датафреймов через Pandas/NumPy, сохранение моделей машинного обучения или кэширование) временные файлы не удаляются автоматически после завершения скрипта.

  2. Накопление мусора: Со временем в таких папках могут оставаться временные файлы сессий, лог-файлы или кэш пакетного менеджера, если скрипты выполнялись часто.

Что с этим делать?

  1. Безопасная очистка: Сначала убедитесь, что в данный момент не выполняются активные расчеты или хранимые процедуры с использованием Python.

  2. Перезапуск службы: Перезапустите службу SQL Server Launchpad (через оснастку services.msc), чтобы она сбросила текущие активные процессы.

  3. Удаление: Если служба остановлена и файлы не заблокированы системой, содержимое старых неактивных папок с длинными GUID-номерами можно удалить вручную для освобождения места на диске.

Вопрос: для чего нужна служба SQL Server Launchpad (я остановил службу и отключил)

Служба SQL Server Launchpad (её системное имя в Windows — MSSQLLaunchpad) — это специальный менеджер изоляции и запуска внешних скриптов.

Она появилась в SQL Server вместе с компонентом Machine Learning Services и выполняет следующие задачи:

1. Безопасный запуск внешнего кода

Когда вы пишете хранимую процедуру в базе данных с использованием языков Python или R, SQL Server сам по себе не умеет их выполнять. Вместо этого он обращается к службе Launchpad, а та берет на себя всю работу по запуску интерпретатора.

2. Изоляция процессов (Песочница)

Чтобы сторонний код на Python или R не мог «уронить» сам сервер баз данных или получить несанкционированный доступ к файловой системе, Launchpad создает для каждого выполнения изолированные рабочие процессы (отдельные учетные записи-изоляторы и те самые временные папки с длинными ID).

3. Контроль ресурсов

Служба следит за тем, сколько памяти и процессорного времени потребляют скрипты машинного обучения, чтобы они не исчерпали все ресурсы, предназначенные для самого SQL Server.

Нужно ли она вам?

  • Если вы активно используете Machine Learning Services в базах данных (например, запускаете сложные математические модели, анализ данных или нейросети прямо внутри SQL): служба нужна, отключать её нельзя.

  • Если вы не используете Python или R в SQL Server, но эта служба установлена и работает (или даже запускается автоматически при старте Windows), она просто тратит оперативную память. Её можно перевести в «Ручной» (Manual) режим запуска в диспетчере служб (services.msc), чтобы она не запускалась зря и не плодила временные файлы.

Вопрос: в папке PYTHON_SERVICES_20f02472-8f99-49e8-b8c0-5059b8cf545b большую часть места занимают библиотеки, можно как-то отказаться от этой службы?

Да, от этой службы можно полностью отказаться, если вы не используете Python или R внутри баз данных MS SQL.

Поскольку стандартные библиотеки Python (особенно для машинного обучения, такие как NumPy, Pandas, Scikit-learn и т.д.) весят несколько гигабайт, отключение этой службы и удаление компонента поможет существенно разгрузить диск C:.

Как полностью отключить и удалить этот компонент:

1. Остановка и отключение службы
Сначала остановите службу, чтобы она перестала занимать файлы и ресурсы:

  1. Нажмите комбинацию клавиш Win + R, введите services.msc и нажмите Enter.

  2. Найдите в списке службу SQL Server Launchpad (MSSQLLaunchpad) (она может содержать имя вашего экземпляра SQL Server, например, MSSQLLaunchpad$SQLEXPRESS).

  3. Нажмите по ней правой кнопкой мыши -> «Остановить» (Stop).

  4. Затем зайдите в её «Свойства» и измените «Тип запуска» с Автоматически на «Отключено» (Disabled).

2. Удаление компонента через установщик MS SQL
Чтобы папки и тяжелые библиотеки больше не создавались при обновлениях, лучше официально удалить Machine Learning Services через официальный деинсталлятор:

  1. Откройте Панель управления -> Установка и удаление программ (или «Установленные приложения» в Windows 10/11).

  2. Найдите в списке Microsoft SQL Server (версия) и нажмите «Изменить / Удалить» (Uninstall/Change).

  3. В появившемся окне мастера установки выберите пункт «Удалить» (Remove).

  4. Выберите нужный экземпляр SQL Server.

  5. На шаге выбора компонентов найдите и снимите галочку с Machine Learning Services (Database In-Database) (или компонента интеграции Python/R).

  6. Завершите работу мастера.

3. Ручная очистка хвостов
После удаления службы и компонента вы можете вручную удалить оставшуюся папку PYTHON_SERVICES_... (и аналогичные ей, если их несколько), чтобы вернуть свободное место на диске C:. Если система напишет, что файлы заняты, перезагрузите компьютер и повторите удаление.

Я остановил и отключил службу и вручную удалил папку через проводник. Через MS SQL Installer удалить не получилось.

Вопрос: у MS SQL Server есть папка Upate Cache, что в ней находится (я почистил)?

Папка Update Cache (обычно находится по пути вроде C:\Program Files\Microsoft SQL Server\140\Setup Bootstrap\Update Cache для SQL Server 2017) хранит резервные копии файлов обновлений (кумулятивных патчей и пакетов исправлений), которые когда-либо устанавливались на ваш сервер.

Зачем она нужна?

Каждый раз, когда вы ставите патч (Cumulative Update или Service Pack), установщик сохраняет в эту папку старые версии файлов. Это делается для того, чтобы в будущем администратор мог:

  1. Корректно откатить обновление (удалить конкретный патч через Панель управления, если он вызвал сбой).

  2. Вернуть систему к предыдущей сборке (build).

Можно ли её удалить?

  • Официальная позиция Microsoft: Удалять эту папку не рекомендуется. Если вы её очистите, то пункт «Удалить обновление» для SQL Server в панели управления перестанет работать, так как установщик больше не найдет файлы для отката. Сама база данных и текущая версия SQL Server от этого не сломаются и работать хуже не станут.

  • На практике для экономии места: Многие администраторы удаляют содержимое этой папки, если на диске критически мало места и они точно уверены, что откатывать установленные обновления назад никто не планирует.

Если вы решите её почистить ради освобождения места, учтите, что при установке следующих новых кумулятивных патчей для SQL Server эта папка снова начнет заполняться новыми данными.

Вопрос: имеется docker под windows, несколько контейнеров, томов и образов находится на диске C:, как перенести все на другой диск

В итоге я перенес через настройки Docker Desktop. Папки хранилища почистились при переносе.

Перенести Docker с диска C: на другой диск (например, D:) можно двумя способами в зависимости от версии Docker Desktop.

Способ 1. Через настройки Docker Desktop (Самый простой и официальный)

В относительно свежих версиях Docker Desktop разработчики добавили удобную кнопку переноса прямо в интерфейсе.

  1. Откройте Docker Desktop.

  2. Нажмите на иконку шестеренки (Settings) в правом верхнем углу.

  3. В левом меню выберите раздел Resources (Ресурсы) -> вкладка Advanced.

  4. Найдите поле Disk image location.

  5. Нажмите кнопку Browse и выберите пустую папку на другом диске (например, D:\DockerData).

  6. Нажмите Apply & restart.

    • Примечание: Docker сам автоматически скопирует все ваши виртуальные диски (ext4.vhdx), контейнеры и образы в новое место и переключит пути. Это может занять некоторое время в зависимости от объема данных.

Способ 2. Через терминал WSL (Если первая кнопка недоступна или зависает)

Если интерфейс не позволяет сделать перенос автоматически, можно перенести данные вручную с помощью встроенного механизма WSL 2, на котором работает Docker.

  1. Полностью закройте Docker Desktop: кликните правой кнопкой мыши по иконке Docker в трее (возле часов) и выберите Quit Docker Desktop.

  2. Откройте PowerShell от имени администратора.

  3. Убедитесь, что WSL полностью остановлен:

    PowerShell
    wsl --shutdown
    
  4. Экспортируйте данные основных виртуальных машин Docker в архивные .tar файлы на другой диск (замените D:\Docker на ваш реальный путь, предварительно создав эту папку):

    PowerShell
    wsl --export docker-desktop-data D:\Docker\docker-desktop-data.tar
    wsl --export docker-desktop D:\Docker\docker-desktop.tar
    
    (Процесс экспорта может занять несколько минут, так как файлы образов и томов обычно весят много).

  5. Удалите (отвяжите) старые дистрибутивы из WSL (это удалит старые тяжелые файлы с диска C:, но ваши данные уже сохранены в .tar архивах):

    PowerShell
    wsl --unregister docker-desktop-data
    wsl --unregister docker-desktop
    
  6. Импортируйте их заново, указав новый путь на другом диске:

    PowerShell
    wsl --import docker-desktop-data D:\Docker\data D:\Docker\docker-desktop-data.tar --version 2
    wsl --import docker-desktop D:\Docker\distro D:\Docker\docker-desktop.tar --version 2
    
  7. Запустите Docker Desktop заново. Все ваши контейнеры, тома (volumes) и образы появятся на новом диске.

После того как вы убедитесь, что всё работает корректно, архивные файлы .tar из папки D:\Docker можно удалить, чтобы они не занимали место.