Поделиться через


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

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

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

WSL 2 автоматически изменяет размер этих VHD-файлов в соответствии с потребностями хранилища. По умолчанию каждый VHD-файл, используемый WSL 2, изначально выделяется максимальный объем дискового пространства (до 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 в Store с помощью команды wsl --update или попробуйте wsl df -h /.

Выходные данные будут включать:

  • файловая система: идентификатор для файловой системы VHD
  • Размер: общий размер диска (максимально выделенное пространство для виртуального жесткого диска).
  • используемое, объем пространства, используемого в данный момент для VHD
  • доступно: объем свободного места в виртуальном жестком диске (выделенный размер минус использованный объем)
  • использовать%: процент оставшегося места на диске (используемый или выделенный размер)
  • смонтировано на: путь к каталогу, где смонтирован диск

Если вы видите, что вы приближаетесь к достижению доступного объема дискового пространства, выделенного виртуальному жесткому диску, или уже получили ошибку из-за отсутствия свободного места на диске, см. в следующем разделе, посвященном развертыванию максимального объема дискового пространства, выделенного виртуальному жесткому диску, связанному с дистрибутивом Linux. Объем места на диске, выделенного виртуальному жесткому диску WSL, всегда будет отображать максимальное значение по умолчанию (1TB в последней версии WSL), даже если объем дискового пространства на фактическом устройстве Windows меньше этого. WSL подключает виртуальный жесткий диск, который будет расширяться по мере его использования, поэтому дистрибутив Linux видит, что он может увеличиться до выделенного максимального размера 1 ТБ. 

Расширение размера виртуального жесткого диска WSL 2

Чтобы увеличить размер VHD для дистрибутива Linux сверх максимального объема выделенного места на диске по умолчанию в 1 ТБ, вы можете использовать команду wsl --manage или выполнить следующие действия вручную. (В более ранних версиях WSL максимальное значение по умолчанию может быть установлено на уровне 512 ГБ или 256 ГБ).

Увеличьте размер виртуального HDD с помощью wsl --manage

Команда wsl --manage доступна только для WSL выпусков 2.5 и выше.

Чтобы изменить размер выделенного места на виртуальном диске, выполните следующие действия.

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

  2. Запустите wsl --manage <distribution name> --resize <memory string>. Поддерживаемые строки памяти относятся к форме <Memory Value>B/M/MB/G/GB/T/TB. Десятичные значения в настоящее время не поддерживаются (например, 2.5TB).

Выходные данные должны выглядеть примерно так:

e2fsck 1.46.5 (30-Dec-2021)
Pass 1: Checking inodes, blocks, and sizes
resize2fs 1.46.5 (30-Dec-2021)
The operation completed successfully.

Виртуальный диск (ext4.vhdx) для этого дистрибутива Linux теперь успешно развернут до нового размера.

Расширение вручную

Чтобы увеличить размер VHD для дистрибутива Linux вручную, выполните следующие действия.

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

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

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

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

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

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

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

    expand vdisk maximum=<sizeInMegaBytes>
    
  8. Закройте запрос DISKPART>:

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

  10. Убедитесь, что WSL может расширить размер файловой системы для этого распределения, выполнив эти команды из командной строки дистрибутива WSL. Это сообщение может появиться в ответ на первую команду подключения : "/dev: ничего не подключено к /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 . для просмотра этой папки. Дополнительные сведения см. в записи блога: доступ из Windows к файлам Linux.

Как исправить ошибку подключения виртуального жесткого диска

При возникновении ошибки, связанной с "монтажом диска дистрибутива", это может произойти из-за внезапного завершения работы или сбоя питания и может привести к переключению виртуального жесткого диска дистрибутива 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).
  • TYPE: относится к типу устройства (диск в данном случае).
  • 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. Введите команду подключения и замените <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. После завершения восстановления можно удалить дистрибутив. Кроме того, может потребоваться закрыть Рабочий стол Docker в Windows, чтобы избежать ошибки Wsl/Service/CreateInstance/MountVhd/HCS/ERROR_SHARING_VIOLATION при выполнении команды wsl.exe sudo e2fsck -f /dev/sdc.

  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.