СЕРВИСНЫЕ УСЛУГИ
СТУДИЯ В ЛИПЕЦКЕ

Советы · Windows · 7 минут

В WSL удалили файлы, но место на C не вернулось: что происходит с ext4.vhdx

Почему удаление файлов в Linux не всегда уменьшает ext4.vhdx на диске Windows: измерения, проверяемый экспорт, перенос в новую среду и условное сжатие отключённого VHDX.
Microsoft Windows: официальный пример сведений о хранилище. Свободное место тома Windows сравнивают отдельно с использованием файловой системы Linux внутри WSL2.

Microsoft Windows: официальный пример сведений о хранилище. Свободное место тома Windows сравнивают отдельно с использованием файловой системы Linux внутри WSL2.
© Microsoft. Used with permission from Microsoft. · источник и условия использования · Microsoft screenshot permissions

У WSL2 есть несколько разных размеров

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

Кроме того, виртуальная ёмкость диска — верхний предел роста, а не объём, уже выделенный на SSD. Показываемый Linux размер в сотни гигабайт или терабайт не доказывает такой же расход места Windows. Microsoft отдельно описывает виртуальный диск WSL2 и его отображаемую ёмкость. [1]

Три разных показателя
  1. Файлы LinuxЧто занято внутри ext4
  2. Виртуальная ёмкостьДо какого объёма может расти диск
  3. Место WindowsСколько выделено под VHDX на томе

Размер файла и «размер на диске» у разреженного файла также могут отличаться.

Схема редакции «Мы из 90х».

Измерьте Linux и Windows раздельно

Внутри нужного дистрибутива:

Linux · WSL2

df -h /
du -xhd1 "$HOME"

df показывает использование файловой системы, du — доступные файлы выбранного каталога. Они не обязаны совпадать: есть другие каталоги, служебные данные и удалённые, но ещё открытые процессом файлы. Ключ -x не переходит на другие файловые системы; так вы не смешиваете домашний Linux-диск и примонтированный диск Windows.

На стороне Windows посмотрите свободное место тома и свойства именно нужного VHDX. У разреженного файла логическая длина может значительно превышать физическое выделение. Поэтому одно свойство Length из PowerShell не является достаточным измерением реально занятого SSD. Зафиксируйте и «Размер», и «На диске» в свойствах файла. [1], [2]

Что сравнивать до и после
ПоказательГде посмотреть
Использовано внутри Linuxdf нужной файловой системы
Каталоги с даннымиdu по выбранным каталогам
Размер и выделение VHDXСвойства точного файла в Windows
Свободно на томе хостаСвойства тома Windows или Get-Volume

Бланк наблюдений, без вымышленных результатов очистки.

Учебная таблица редакции.

На стороне Windows сведения о томе доступны в Параметры → Система → Память. Они описывают хранилище Windows; соответствующий экран не заменяет df внутри Linux. [10]

Найдите диск по зарегистрированному дистрибутиву

Сначала в PowerShell:

PowerShell · заменить имя дистрибутива

wsl --list --verbose
$Distro = 'Ubuntu'
$Entries = @(Get-ChildItem 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss' |
  Where-Object { $_.GetValue('DistributionName') -eq $Distro })
if ($Entries.Count -ne 1) {
  throw 'Дистрибутив не найден однозначно.'
}
$Entries[0].GetValue('BasePath')

Откройте полученный путь и подтвердите файл VHDX этой установки. Базовый способ определения пути опубликован Microsoft; в примере добавлена проверка единственного совпадения. Не используйте первый найденный ext4.vhdx: на компьютере могут быть несколько сред и отдельные данные Docker. [1]

Папка BasePath, профиль пользователя Windows и дистрибутив должны соответствовать друг другу. Консоль под другой записью читает её HKCU. Не редактируйте эти записи реестра ради переноса файла вручную.

Сначала получите резервную копию, которую можно проверить

Завершите приложения и базы внутри WSL, остановите зависимые программы, сохраните работу во всех дистрибутивах. Выберите другой том с достаточным свободным местом и создайте папку резервной копии. В PowerShell:

PowerShell · заменить имя и путь

wsl --shutdown
wsl --export "Ubuntu" "D:\WSL-Backup\Ubuntu.tar"

Экспорт по умолчанию создаёт tar. Дождитесь успешного завершения, проверьте существование и размер файла. Само наличие tar не доказывает полноту восстановления; более сильная проверка — импорт под новым именем и открытие важных данных. Экспортируемые файлы на внешних монтированиях и дисках Windows нужно резервировать отдельно. [3]

Если на C совсем мало места, сначала освободите рабочий запас безопасными способами Windows и выберите подходящий другой том. Не заполняйте исходный диск нулями ради уплотнения: это способно исчерпать место и сорвать работу.

Проверяемый вариант: импортировать копию под новым именем

Когда есть место для отдельной среды, создайте новый каталог назначения и импортируйте tar без удаления исходной Ubuntu:

PowerShell · учебные имя и пути

wsl --import "Ubuntu-Rebuilt" "D:\WSL\Ubuntu-Rebuilt" "D:\WSL-Backup\Ubuntu.tar" --version 2
wsl -d "Ubuntu-Rebuilt" -- ls /home

Новые имя и каталог должны быть свободны. Импорт создаёт отдельный виртуальный диск из содержимого архива; это даёт возможность проверить данные и занятый объём на выбранном томе. Если хранилище D — раздел того же SSD, это перенос между томами, а не независимая резервная копия от отказа устройства. [3]

Проверьте файлы, права, рабочие приложения и пользователя входа. Импортированная среда может запускаться от root, если не настроен пользователь по умолчанию; это регулируется поддерживаемыми параметрами WSL и wsl.conf. Не запускайте одновременно обе копии серверной службы с одинаковыми портами и внешними ресурсами.

Исходная среда остаётся на месте и продолжает занимать место C. Освобождение C наступит только после отдельного решения о её удалении или поддерживаемом переносе, когда новая копия проверена. Команда unregister удаляет исходные данные, поэтому здесь она не включена в автоматическую последовательность. [3], [4]

Резервная копия считается практически проверенной, когда новая среда запускается и вы открыли действительно важные файлы, а не только увидели папку /home. Для базы данных проверьте её собственную процедуру резервирования и восстановления: экспорт после корректной остановки приложения полезнее снимка незавершённой записи. Сохраните исходную копию до такого теста.

Когда допустимо уплотнение исходного VHDX

Другой путь — уплотнить динамически расширяемый виртуальный диск. Microsoft описывает compact vdisk для отключённого диска или диска, подключённого только для чтения. Это общая операция с VHD, а не гарантия, что каждый освобождённый блок любой WSL немедленно вернётся Windows. [5]

Перед ней нужны проверенная копия, точный путь и прекращённые обращения к диску. Если поддерживается, Linux может передать сведения о свободных блоках через fstrim:

Linux · только в нужном дистрибутиве, при поддержке

sudo fstrim -v /

Команда не удаляет живые файлы, а передаёт сведения о неиспользуемых блоках. Её вывод не равен гарантированно возвращённому месту SSD; неподдерживаемая операция должна быть зафиксирована как ограничение. Описание fstrim опубликовано в исходном проекте util-linux. [6]

Затем завершите WSL через wsl --shutdown и убедитесь, что Docker или другая программа не запускает её снова. Не подключайте VHDX на запись и не открывайте Linux-среду параллельно уплотнению.

Проводите DiskPart по шагам, проверяя выбранный файл

В повышенной командной строке запустите DiskPart. Подставьте подтверждённый путь; приведённый ниже путь учебный:

Повышенная командная строка → DiskPart

diskpart
select vdisk file="C:\Exact\Path\ext4.vhdx"
detail vdisk

Остановитесь и прочитайте подробности. Продолжать можно только для нужного поддерживаемого динамического диска, который отключён либо подключён read-only. Если он занят или выбран не тот файл, уплотнение не запускают. При соблюдении условий:

DiskPart · после проверки

compact vdisk
exit

Здесь нет команд select disk, clean, format, convert или подключения на запись: они не относятся к этой задаче. Если DiskPart сообщает ошибку, сохраните её и остановитесь, не меняя атрибуты наугад. Вариант Optimize-VHD требует доступного модуля Hyper-V и также имеет требования к состоянию диска; это не команда, гарантированно присутствующая в любой Windows Home. [5], [7], [8]

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

Разреженный режим проверяйте по установленной версии

Возможности автоматического освобождения блоков и параметры sparseVhd или wsl --manage менялись между версиями. Сначала смотрят wsl --version, wsl --help и документацию именно установленного выпуска. Разреженный файл и уменьшение его логической длины — разные вещи. [3], [4]

В истории WSL есть версии, предупреждавшие о риске повреждения при переводе существующей среды в sparse и требовавшие отдельного небезопасного флага. Наличие такого сообщения — повод остановиться и выбрать проверяемую копию; обход предупреждения не нужен для этой инструкции. История изменения сообщения сохранена в официальном репозитории проекта. [9]

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

Что не является уплотнением VHDX
ДействиеПочему этого недостаточно
Уменьшить memory в .wslconfigЭто лимит оперативной памяти
Сократить виртуальную ёмкость наугадМожно затронуть границы данных; задача другая
Включить NTFS-сжатие папкиЭто другой механизм и возможная несовместимость
Удалить зарегистрированный дистрибутивУдаляются сами данные, а не только свободные блоки

Учебная таблица редакции.

Made on
Tilda