Домой Гайды, инструкции и лайфхаки Как освободить место на диске, занятое виртуальными дисками WSL

Как освободить место на диске, занятое виртуальными дисками WSL

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

8
0

Использование WSL позволяет работать с Linux в среде Windows, однако у этой технологии есть неочевидная особенность: виртуальные жесткие диски дистрибутивов не высвобождают неиспользуемое пространство автоматически. В результате файл виртуального диска может занимать на SSD значительно больше места, чем реально требуется хранящимся в нем данным.

Папка с файлом виртуального жесткого диска формата VHDX
Скриншот экрана, демонстрирующий работу с виртуальным диском

Почему виртуальный диск WSL не уменьшается

Каждый установленный дистрибутив WSL 2 использует файл формата ext4.vhdx, который хранится на накопителе Windows. Это диски с динамическим расширением: они увеличиваются по мере добавления файлов, но этот процесс является односторонним. При удалении файлов внутри Linux система WSL помечает освободившиеся блоки как свободные, но не отправляет команду Windows на уменьшение размера самого файла .vhdx. В итоге операционная система продолжает считать, что эти блоки заняты.

Проблема заключается в том, что изнутри Linux ситуация выглядит корректно: команда df -h показывает наличие свободного пространства. Однако на уровне файловой системы Windows размер ext4.vhdx остается неизменным, максимально достигнутым за всё время работы. Активные пользователи, которые часто загружают образы Docker, устанавливают и удаляют пакеты или клонируют репозитории, могут столкнуться с тем, что расхождение между объемом данных в Linux и занимаемым местом в Windows достигает десятков гигабайт.

Как определить реальный объем занятого места

Прежде чем приступать к очистке, необходимо подтвердить использование WSL 2, так как сжатие применимо только к этой версии. Откройте PowerShell или командную строку от имени администратора и введите wsl —status. Если установлено несколько дистрибутивов, используйте команду wsl.exe —list —verbose, чтобы увидеть список и версии для каждого из них.

Для поиска пути к файлу виртуального диска можно воспользоваться фрагментом кода PowerShell, который обращается к реестру Windows:

(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue(«DistributionName») -eq ‘Ubuntu’ } | Get-ItemProperty | Select-Object -First 1).BasePath + «\ext4.vhdx»

Замените Ubuntu на точное название вашего дистрибутива, полученное ранее. В результате вы получите полный путь к файлу ext4.vhdx.

Очистка диска с помощью утилиты DiskPart

Для выполнения сжатия необходимо полностью остановить работу WSL, чтобы избежать блокировки файла. В консоли с правами администратора выполните команду wsl.exe —shutdown. После этого можно запустить встроенную утилиту DiskPart:

  • diskpart
  • select vdisk file=»C:\Users\username\AppData\path\to\ext4.vhdx»
  • attach vdisk readonly
  • compact vdisk
  • detach vdisk
  • exit

Использование режима readonly гарантирует, что DiskPart только просканирует пустые блоки, не внося изменений в файловую систему Linux. Процесс сжатия может занять несколько минут в зависимости от размера файла. После завершения операции не забудьте выполнить команду detach vdisk, иначе файл останется заблокированным и WSL не сможет к нему обратиться до перезагрузки системы.

Автоматизация процесса через PowerShell

Если вы хотите избежать ручного ввода команд, можно воспользоваться скриптом WSL-VHDX-Optimizer. Он автоматизирует поиск дистрибутивов в реестре, выполнение команды fstrim внутри Linux, остановку WSL и сжатие дисков через Hyper-V или DiskPart. Чтобы оценить объем потенциально освобождаемого места без внесения изменений, запустите скрипт с параметром -Inventory. Для непосредственной очистки используйте powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Optimize-WslDisk.ps1.

Разработчики скрипта не рекомендуют запускать его автоматически по расписанию. Оптимальный вариант — использовать инструмент после операций, которые приводят к удалению больших объемов данных, например, после очистки контейнеров Docker или крупных пакетов программного обеспечения. Перед первым запуском процесса сжатия рекомендуется создать резервную копию виртуального диска в целях безопасности.

Важные нюансы эксплуатации и предостережения

Несмотря на то, что процесс сжатия виртуальных дисков является достаточно прямолинейным, стоит учитывать несколько технических тонкостей, которые помогут избежать ошибок. Основная причина, по которой Windows не уменьшает файл `.vhdx` автоматически, заключается в архитектуре этих дисков: они являются динамически расширяемыми. Windows не получает уведомлений об удалении данных внутри Linux, поэтому физические блоки, которые когда-то были выделены, продолжают числиться за файлом диска, даже если данные в них были стерты.

При работе с утилитой DiskPart крайне важно не пренебрегать командой `detach vdisk`. Если пропустить этот этап, файл виртуального диска останется заблокированным операционной системой. Как следствие, при попытке запустить дистрибутив после очистки вы столкнетесь с ошибкой доступа, и исправить ситуацию поможет только полная перезагрузка компьютера.

Что касается автоматизированного скрипта `WSL-VHDX-Optimizer`, то важно понимать принципы его работы «под капотом». Инструмент не просто сжимает файл, он предварительно выполняет команду `fstrim` внутри каждого дистрибутива. Это критически важный этап: команда `fstrim` сообщает файловой системе Linux, какие именно блоки данных больше не используются, подготавливая их для корректной обработки утилитой сжатия. Без этой предварительной подготовки DiskPart может не увидеть весь объем доступного для высвобождения пространства. Также при анализе результатов работы скрипта обратите внимание, что отчет формируется на основе данных о реальном распределении файлов, а не просто по логическому размеру, который отображается в свойствах файла средствами Windows.

Риски при автоматизации

Разработчики `WSL-VHDX-Optimizer` настоятельно не рекомендуют настраивать запуск процесса на «автопилоте», например, через Планировщик заданий Windows с жестким интервалом. Основная причина кроется в непредсказуемости процесса сжатия: в редких случаях операция компактизации может привести не к уменьшению, а к увеличению итогового размера файла виртуального диска. Это зависит от того, как файловая система внутри Linux распорядилась фрагментацией блоков. Именно поэтому ручной запуск после «генеральной уборки» (например, после удаления тяжелых образов Docker или очистки кэша менеджера пакетов) является наиболее безопасным и оправданным методом.

Практический результат

На практике экономия места может оказаться весьма внушительной. В реальных условиях эксплуатации у пользователей наблюдались случаи, когда исходный файл `ext4.vhdx` размером 100 ГБ после процедуры сжатия «худел» до 15 ГБ. Для тех, кто использует ноутбуки с SSD ограниченного объема, такая разница в 85 ГБ критически важна. Хотя процесс сжатия в опыте большинства пользователей не приводил к повреждению данных, наличие резервной копии перед первым запуском — обязательное правило безопасности, которым не стоит пренебрегать. По завершении всех манипуляций всегда полезно перезапустить дистрибутив командой `wsl -d <имя_дистрибутива>` и выполнить `df -h`, чтобы удостовериться в целостности файловой системы и корректном отображении свободного пространства внутри среды Linux.

Источник: https://www.makeuseof.com