Управление дисковой областью WSL

В этом руководстве описывается, как управлять дисковое пространство, используемое дистрибутивами Linux, установленными с помощью WSL 2, в том числе:

подсистема 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 и введите следующую команду (заменив <distribution-name> фактическое имя дистрибутива):

wsl.exe --system -d <distribution-name> 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 ГБ).

  1. Завершите работы всех экземпляров WSL с помощью команды wsl.exe --shutdown.

  2. Скопируйте путь к каталогу в файл ext4.vhdx , связанный с дистрибутивом Linux, установленным на компьютере. Сведения о том, как найти VHDX-файл и путь к диску для дистрибутива Linux.

  3. Откройте командную строку Windows с правами администратора, а затем откройте интерпретатор команды diskpart, введя следующее:

    diskpart
    
  4. Теперь появится DISKPART> запрос. Введите следующую команду, заменив <pathToVHD> путь каталога к ext4.vhdx файлу, связанному с дистрибутивом Linux (скопированным на шаге 2).

    Select vdisk file="<pathToVHD>"
    
  5. Отображение сведений, связанных с этим виртуальным диском , включая размер виртуального диска, представляющего текущий максимальный размер виртуального жесткого диска:

    detail vdisk
    
  6. Необходимо преобразовать размер виртуальной машины в мегабайты. Например, если размер виртуальной машины: 512 ГБ, это равно 512000 МБ. Новое вводимое значение должно быть больше этого исходного значения. Чтобы увеличить размер виртуальной машины размером 512 ГБ до 1024 ГБ, введите значение в МБ как: 1024000. Будьте осторожны, чтобы не вводить значение выше, чем вы на самом деле хотите, так как процесс уменьшения размера виртуального диска гораздо сложнее.

  7. Введите значение нового максимального размера, которое вы хотите выделить для этого дистрибутива Linux с помощью командной строки DISKPART> Windows:

    expand vdisk maximum=<sizeInMegaBytes>
    
  8. Выйти из DISKPART> запроса:

    exit
    
  9. Запустите этот дистрибутив Linux. (Убедитесь, что он работает в WSL 2. Это можно подтвердить с помощью команды: wsl.exe -l -v WSL 1 не поддерживается).

  10. Убедитесь, что WSL может расширить размер файловой системы для этого распределения, выполнив эти команды из командной строки дистрибутива WSL. В ответ на первую команду mount может появиться такое сообщение: /dev: none already mounted on /dev. Это сообщение можно спокойно игнорировать.

    sudo mount -t devtmpfs none /dev
    mount | grep ext4
    
  11. Скопируйте имя этой записи, которая будет выглядеть следующим образом: /dev/sdX (где X обозначает любой символ). В следующем примере значение X равно b:

   sudo resize2fs /dev/sdb <sizeInMegabytes>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$\<distribution-name>\. Откройте дистрибутив 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 следующих действий.

  1. Завершите работу всех дистрибутивов WSL, открыв PowerShell и введя команду:

    wsl.exe --shutdown
    
  2. Откройте PowerShell от имени администратора (в командной строке с повышенными привилегиями) и введите команду подключения, заменив <path-to-ext4.vhdx> путь к VHDX-файлу дистрибутива. Сведения о поиске этого файла см. в статье "Как найти VHD-файл и путь к диску для дистрибутива Linux".

    wsl.exe --mount <path-to-ext4.vhdx> --vhd --bare
    
  3. wsl.exe lsblk Используйте команду Из PowerShell, чтобы определить имя блочного устройства для дистрибутива (sd[a-z]), а затем введите следующую команду, чтобы восстановить диск (заменив <device> правильное имя устройства блока, например sdc). Команда e2fsck проверка файловых систем ext4 (тип, используемый дистрибутивами, установленными с WSL) для ошибок и исправит их соответствующим образом.

    wsl.exe sudo e2fsck -f /dev/<device>
    

Примечание.

Если у вас установлен только один дистрибутив Linux, может возникнуть ошибка "ext file in use" и потребуется установить дополнительное распределение для запуска wsl.exe lsblk. После завершения восстановления можно удалить дистрибутив.

  1. После завершения восстановления отключите диск в PowerShell, введя следующее:

    wsl.exe --unmount
    

Предупреждение

Вы можете использовать команду: sudo mount -o remount,rw / чтобы вернуть доступное только для чтения распределение в доступное или доступное для записи состояние, но все изменения будут в памяти и поэтому будут потеряны при перезапуске дистрибутива. Рекомендуется использовать описанные выше шаги для подключения и восстановления диска.

Как найти VHDX-файл и путь к диску для дистрибутива Linux

Чтобы найти VHDX-файл и путь к каталогу для дистрибутива Linux, откройте PowerShell и используйте следующий скрипт, заменив <distribution-name> фактическое имя дистрибутива:

(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '<distribution-name>' }).GetValue("BasePath") + "\ext4.vhdx"

В результате будет отображаться путь, который выглядит примерно так %LOCALAPPDATA%\Packages\<PackageFamilyName>\LocalState\<disk>.vhdx. Например:

C:\Users\User\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ext4.vhdx

Это путь к ext4.vhdx файлу, связанному с перечисленным дистрибутивом Linux.