Управление дисковой областью WSL
В этом руководстве описывается, как управлять дисковое пространство, используемое дистрибутивами Linux, установленными с помощью WSL 2, в том числе:
- Как проверка объем места на диске, доступного на виртуальном жестком диске
- Расширение размера виртуального жесткого диска
- Восстановление виртуального жесткого диска при возникновении ошибки
- Как найти VHDX-файл и путь к диску для всех установленных дистрибутивов Linux
подсистема Windows для Linux (WSL 2) использует платформу виртуализации для установки дистрибутивов Linux вместе с операционной системой Windows, создавая виртуальный жесткий диск (VHD) для хранения файлов для каждого устанавливаемого дистрибутива Linux. Эти виртуальные жесткие диски используют тип файловой системы ext4 и представлены на жестком диске Windows в виде файла ext4.vhdx .
WSL 2 автоматически изменяет размер этих VHD-файлов в соответствии с потребностями хранилища. По умолчанию каждый VHD-файл, используемый WSL 2, изначально выделяется 1 ТБ максимальный объем дискового пространства (до выпуска WSL 0.58.0 этот параметр по умолчанию был установлен на 512 ГБ и максимальное значение 256 ГБ до этого).
Если дисковое пространство, необходимое для файлов Linux, превышает этот максимальный размер, вы увидите ошибки с сообщением о том, что у вас не было места на диске. Чтобы устранить эту ошибку, следуйте приведенным ниже инструкциям по расширению размера виртуального жесткого диска WSL 2.
Как проверка доступное место на диске
Проверьте объем дискового пространства, доступного в VHD для дистрибутива Linux, установленного с WSL 2, с помощью команды Linux Df .
Чтобы проверка доступное место на диске, откройте командную строку PowerShell и введите следующую команду (заменив фактическое имя дистрибутива):
wsl.exe --system -d df -h /mnt/wslg/distro
Если эта команда не работает, обновите версию WSL магазина с помощью wsl —update команды или попробуйте wsl df -h / .
Выходные данные будут включать:
- Файловая система: идентификатор файловой системы VHD
- Размер: общий размер диска (максимальное количество места, выделенного виртуальному жесткому диску)
- Используется: объем пространства, используемого в настоящее время в виртуальном жестком диске
- Доступность: объем свободного места на виртуальном жестком диске (использованный объем выделенного размера минус)
- Использование%: процент оставшегося места на диске (используемый или выделенный размер)
- Подключено: путь к каталогу, в котором подключен диск
Если вы видите, что вы приближаетесь к достижению доступного объема дискового пространства, выделенного виртуальному жесткому диску, или уже получили ошибку из-за отсутствия свободного места на диске, см. в следующем разделе, посвященном развертыванию максимального объема дискового пространства, выделенного виртуальному жесткому диску, связанному с дистрибутивом Linux. Объем места на диске, выделенного для виртуального жесткого диска WSL, всегда будет отображать максимальное значение по умолчанию (1 ТБ в последней версии WSL), даже если объем дискового пространства на фактическом устройстве Windows меньше этого. WSL подключает виртуальный жесткий диск, который будет расширяться по мере его использования, поэтому дистрибутив Linux видит, что он может увеличиваться до выделенного максимального размера 1 ТБ.
Расширение размера виртуального жесткого диска WSL 2
Чтобы развернуть размер виртуального жесткого диска для дистрибутива Linux за пределами по умолчанию 1 ТБ максимальный объем выделенного места на диске, выполните указанные ниже действия. (Для более ранних выпусков WSL, которые еще не обновлены, это максимальное значение по умолчанию может иметь значение 512 ГБ или 256 ГБ).
- Завершите работы всех экземпляров WSL с помощью команды wsl.exe —shutdown .
- Скопируйте путь к каталогу в файл ext4.vhdx , связанный с дистрибутивом Linux, установленным на компьютере. Сведения о том, как найти VHDX-файл и путь к диску для дистрибутива Linux.
- Откройте командную строку Windows с правами администратора, а затем откройте интерпретатор команды diskpart, введя следующее:
diskpart
Select vdisk file=""
detail vdisk
expand vdisk maximum=
exit
sudo mount -t devtmpfs none /dev mount | grep ext4
sudo resize2fs /dev/sdb M
Используя приведенный выше пример, мы изменили размер виртуального жесткого диска на 2048000, поэтому команда будет: sudo resize2fs /dev/sdb 2048000M
Возможно, придется установить приложение resize2fs. Для этого можно использовать такую команду: sudo apt install resize2fs .
Вывод имеет следующий вид:
resize2fs 1.44.1 (24-Mar-2021) Filesystem at /dev/sdb is mounted on /; on-line resizing required old_desc_blocks = 32, new_desc_blocks = 38 The filesystem on /dev/sdb is now 78643200 (4k) blocks long.
Виртуальный диск (ext4.vhdx) для этого дистрибутива Linux теперь успешно развернут до нового размера.
Рекомендуется не изменять, перемещать или получать доступ к связанным файлам WSL, расположенным в AppData папке с помощью средств Или редакторов Windows. Это может привести к повреждению дистрибутива Linux. Если вы хотите обращаться к файлам Linux из Windows, это можно сделать, используя путь \\wsl$\\ . Откройте дистрибутив WSL и введите explorer.exe . , чтобы просмотреть эту папку. Дополнительные сведения см. в записи блога, посвященной получению доступа к файлам Linux из Windows.
Как исправить ошибку подключения виртуального жесткого диска
При возникновении ошибки, связанной с «подключением диска распространения», это может произойти из-за внезапного завершения работы или сбоя питания и может привести к переключении виртуального жесткого диска дистрибутива Linux на доступ только для чтения, чтобы избежать потери данных. Вы можете восстановить и восстановить дистрибутив с помощью e2fsck команды Linux, выполнив приведенные ниже действия.
Используйте команду lsblk для идентификации имени блочного устройства
Когда WSL 2 устанавливает дистрибутив Linux, он устанавливает дистрибутив как виртуальный жесткий диск (VHD) с собственной файловой системой. Linux ссылается на эти жесткие диски как «блоковые устройства», и вы можете просматривать сведения о них с помощью lsblk команды.
Чтобы найти имена блочных устройств, используемых WSL 2, откройте дистрибутив и введите команду: lsblk (Или откройте PowerShell и введите команду: wsl.exe lsblk .) Выходные данные будут выглядеть примерно так:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 363.1M 1 disk sdb 8:16 0 8G 0 disk [SWAP] sdc 8:32 0 1.5T 0 disk sdd 8:48 0 1T 0 disk /mnt/wslg/distro
Сведения о блокируемом устройстве включают:
- NAME: Имя, назначенное устройству, будет sd[a-z], ссылаясь на диск SCSI с обозначением буквы для каждого используемого диска. sda всегда является системным распределением.
- MAJ:MIN: представляет числа, используемые ядром Linux для внутренней идентификации устройств с первым номером, представляющим тип устройства (8 используется для дисков небольшой компьютерной системы и SCSI).
- RM: Давайте узнаем, является ли устройство съемным (1) или нет (0).
- РАЗМЕР: общий размер тома.
- RO: Давайте узнаем, доступно ли устройство только для чтения (1) или нет (0).
- ТИП: относится к типу устройства (диск в данном случае).
- MOUNTPOINTS: ссылается на текущий каталог в файловой системе, где находится блочное устройство (SWAP предназначен для предварительно настроенной неактивной памяти, поэтому точка подключения отсутствует).
Ошибка резервного восстановления только для чтения
Если WSL обнаруживает «ошибку подключения» при открытии дистрибутива Linux, дистрибутив может быть установлен как доступный только для чтения как резервный вариант. В этом случае распределение может отобразить следующую ошибку во время запуска:
An error occurred mounting the distribution disk, it was mounted read-only as a fallback.
При запуске дистрибутива только для чтения любые попытки записи в файловую систему завершаются ошибкой, как показано ниже:
$ touch file touch: cannot touch 'file': Read-only file system
Чтобы восстановить ошибку подключения диска в WSL и восстановить его обратно в состояние, которое можно использовать или снова записать, можно использовать команду для повторного подключения диска с помощью wsl.exe —mount следующих действий.
-
Завершите работу всех дистрибутивов WSL, открыв PowerShell и введя команду:
wsl.exe --shutdown
wsl.exe --mount --vhd --bare
wsl.exe sudo e2fsck -f /dev/
Если у вас установлен только один дистрибутив Linux, может возникнуть ошибка «ext file in use» и потребуется установить дополнительное распределение для запуска wsl.exe lsblk . После завершения восстановления можно удалить дистрибутив.
- После завершения восстановления отключите диск в PowerShell, введя следующее:
wsl.exe --unmount
Вы можете использовать команду: sudo mount -o remount,rw / чтобы вернуть доступное только для чтения распределение в доступное или доступное для записи состояние, но все изменения будут в памяти и поэтому будут потеряны при перезапуске дистрибутива. Рекомендуется использовать описанные выше шаги для подключения и восстановления диска.
Как найти VHDX-файл и путь к диску для дистрибутива Linux
Чтобы найти VHDX-файл и путь к каталогу для дистрибутива Linux, откройте PowerShell и используйте следующий скрипт, заменив фактическое имя дистрибутива:
(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object < $_.GetValue("DistributionName") -eq '' >).GetValue("BasePath") + "\ext4.vhdx"
В результате будет отображаться путь, который выглядит примерно так %LOCALAPPDATA%\Packages\\LocalState\.vhdx . Например:
C:\Users\User\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ext4.vhdx
Это путь к ext4.vhdx файлу, связанному с перечисленным дистрибутивом Linux.
Откуда неадекватный размер ext4.vhdx?
Доброго дня. У меня есть пара проектов, которые я разрабатываю в винде под wsl2. Сами проекты весьма небольшие, но вот недавно заметил, что место на диске начинает кончаться. Выяснилось, что виноваты два файла:
1. . /Docker/wsl/data/ext4.vhdx (30 gb)
2. . /ubuntu/ext4.vhdx (13 gb)
Первый файл относится к Docker Desktop, второй к самому дистрибутиву. Мои проекты со всей обвязкой весят не больше гига. Откуда взялись такие неадекватные размеры и как с этим бороться?
- Вопрос задан более трёх лет назад
- 9354 просмотра
Комментировать
Решения вопроса 2
Начинающий Data scientist
Есть еще один способ уменьшить размер этого файла.
1. зайти в Docker Desktop
2. нажать на Troubleshoot (сверху справа жучок такой)
3. Там выбрать Clean / Purge data
4. и среди вариантов выбрать WSL 2
У меня после этого действия ext4.vhdx уменьшился с 34 гигов до 1,1 гб.
До этого я, правда, снесла все контейнеры и образы, какие там были, т.к. надеялась, что это даст результат, но память как была занята этим файлом, так и оставалась.
Ответ написан более года назад
Нравится 9 3 комментария
sl0 @sl0 Автор вопроса
Да, работает. Но хочу заметить, что ext4.vhdx в системе два. Этот способ действует только на тот, что в AppData\Local\Docker\wsl\data\ext4.vhdx
Способ работает, но удаляет все контейнеры и образы
sl0 @sl0 Автор вопроса
Разобрался. Пишу тут для тех, кто столкнется с той же проблемой.
Решение для очистки в Docker Desktop.
1. Устанавливаем libguestfs-tools в wsl.
2. sudo mkdir -p /mnt/wsl
3. sudo guestmount -o allow_other —add mnt/c/Users/username/путь_к_/ext4.vhdx -i /mnt/wsl
4. Чистим лишнее в /mnt/wsl
5. После этого из винды уже запустить
wsl —shutdown
optimize-vhd -Path путь_к_\ext4.vhdx -Mode full
Ответ написан более трёх лет назад
Комментировать
Нравится 7 Комментировать
Ответы на вопрос 2
Optimize-VHD -Path ‘C:\Users\your_user\AppData\Local\Docker\wsl\data\ext4.vhdx’ -Mode Full
Этот способ — работает.
Ответ написан 10 авг. 2023
Как быть если выбило ошибку что диск зашифрован? Как его расшифровать?
Ошибка: "Указанный файл зашифрован и не может быть расшифрован этим пользователем."
dimirsteel @dimirsteel
Третий вариант заняло по времени полчаса из 30 гигов в 2,5:
1. Производим экспорт дистрибутива (у меня был установлен дистрибутив из магазина Microsoft):
wsl —export Ubuntu-22.04 C:\temp\ubuntu.tar
[ —export [Параметры]
Экспорт дистрибутива в TAR-файл.
Имя файла может быть — for stdout.
Параметры:
—vhd
Указывает, что дистрибутив следует экспортировать как VHDX-файл.
]
2. Удаляем дистрибутивы установленные в системе, через «панель управления» установка/удаление программ.
3. Импортируем дистрибутив:
wsl —import Ubuntu C:\wsl\ubuntu\ C:\temp\ubuntu.tar —version 2
[ —import [Параметры]
Импортирует указанный TAR-файл в качестве нового дистрибутива.
Имя файла может быть — for stdin.
Параметры:
—version
Указывает версию, используемую для нового дистрибутива.
—vhd
Указывает, что предоставленный файл является VHDX-файлом, а не TAR-файлом.
Эта операция создает копию VHDX-файла в указанном расположении установки.
]
4. Enjoy! To Infinity and Beyond!))
З.Ы. есть только минус, возможно, для меня это не проблема. Возможно заново пользователей прописывать в дистрибутиве потребуется. Т.к. я не проверял, работаю из под sudo в единственном лице.))
Ответ написан 06 янв.
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Docker
Почему не работает fetch запрос внутри docker сети?
- 1 подписчик
- час назад
- 16 просмотров

- Windows
Как установить автозапуск приложение для двух пользователей Windows 10?
- 1 подписчик
- 5 часов назад
- 38 просмотров
Что не так с ext4 в vhdx?
делал fstrim и Optimize-VHD -Mode Full ни на байт не сжалось.
- Вопрос задан более года назад
- 208 просмотров
6 комментариев
Простой 6 комментариев
а нулями забивал свободное пространство?
так как если ты что то сначала записал на диск ап потом удалил, с vhd это не удалилось, нужно его заменить нулями, не уверен что можно найти утилиту которая бы это делала выборочно
Quqas @Quqas Автор вопроса
ничего не записывал.
только маунтил. а убунту сама форматила(вот х.з. как)
fstrim разве не зануляет?
Quqas,
Попробуйте зачистить zerofree
manpages.ubuntu.com/manpages/trusty/man8/zerofree.
Ну и опять же, если что-то записано в середину раздела, не факт что начало тоже будет «вырезано» из образа, хоть оно и пустое
Quqas @Quqas Автор вопроса
с нуля создал. уже в самой винде разбил. оставил raw.
запускаю mkfs.ext4 и вижу тоже самое
Quqas @Quqas Автор вопроса
в raw 64 метра
Quqas, просто не пользуйся vhd
Решения вопроса 0
Ответы на вопрос 2
Quqas, весь смысл в том чтобы была принципиальная возможность подмены нулей например дырками файла (по этой причине я бы выбирал бы не vhdx формат, который непонятно как вакуумизировать, ведь это windows specific решения а у тебя ext3 формат
считай все современные файловые системы умеют в sparse files, это когда файл на диске реально занимает только столько места, сколько в него записали, а так же есть сопроводительные утилиты, заменяющие нули на эти дыры
в linux обычный cp с ключом —sparse=always скопирует и подменит нули в файле на дыры
p.s. в твоем случае настоятельно рекомендую другой подход (так как описанный выше потребует сначала раздуть файло до 2тб, что конечно можно уместить на какой-нибудь btrfs/zfs с поддержкой сжатия но сильно не эффективно) лучше сделать резервную копию диска с помощью partclone (поддерживает огромное количество файловых систем) эта утилита умеет копировать блочные устройства (считай как dd) пропуская сектора, помеченные файловой системой как свободные, т.е. создаешь второй пустой диск (даже если он будет raw, я настоятельно рекомендую хранить образы как есть) и из виртуальной машины (так как vhd монтировать напрямую сложно, говорят с большими дисками имеющиеся инструменты глючат) и с помощью clonezilla клонируешь со старого на новый.
Этот подход скорее всего самый эффективный для вакуумирования образов диска которые рассчитывают на дырявое хранение.
Как в Windows 11 перенести подсистему Linux на другой диск или раздел
В 2016 году в Windows 10 появилась новая функция WLS , представляющая собой слой совместимости, позволяющий запускать из командной строки приложения, скомпилированные для Linux. В следующих версиях Windows функционал WSL был существенно расширен, так, в подсистеме Linux второй версии появилась возможность запуска приложений Linux с графическим интерфейсом. По умолчанию все программные файлы этой виртуальный среды устанавливаются на системный диск.
С учетом количества установленных приложений размер среды может занять на диске значительное место и, если диск небольшой, пользователь может задуматься о необходимости переноса WSL на другой накопитель, например, с небольшого SSD на HDD большего объема.
Такая возможность в Windows 10 и 11 присутствует, причем выполнить перенос можно несколькими способами.
Первый способ предполагает ручное перемещение файла-контейнера ext4.vhdx из его расположения по умолчанию:
%USERPROFILE%\AppData\Local\Packages\название_дистрибутива\LocalState

На другой диск с последующим изменением параметра BasePath в ключе реестра:

Значение которого как раз представлено этим самым путем к контейнеру ext4.vhdx .
Вы просто перемещаете контейнер с виртуальной файловой системой и прописываете в параметре BasePath новый путь.
Использовать этот способ, однако, не рекомендуется из-за высокой вероятности получить ошибку.
Для перемещения WSL на другой диск или раздел можно с помощью встроенной процедуры экспорта и импорта, но еще удобнее использовать для этих целей бесплатную тулзу LxRunOffline, скачав ее со страницы разработчика:
Распаковав архив с утилитой и перейдя в запущенной от имени администратора командной строке в папку с исполняемым файлом LxRunOffline.exe (файлы из архива рекомендуется скопировать в папку WSL на диске С) и завершив все процессы WSL, выполните такую команду:
Lxrunoffline.exe move -n Ubuntu-20.04 -d G:\wsl\Ubuntu

Ubuntu-20.04 в данном примере это название дистрибутива Linux, а последняя часть команды — путь к новой папке Ubuntu на диске D.
Если нужно получить названия дистрибутива, используем команду LxRunOffline.exe list .