Управление дискового пространства 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.

Проверка свободного места на диске

Проверьте объем дискового пространства, доступного на виртуальном жестком диске для дистрибутива Linux, установленного с WSL 2, с помощью команды Linux Df .

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

wsl.exe --system -d <distribution-name> df -h /mnt/wslg/distro

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

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

Если вы видите, что вы приближаетесь к достижению доступного объема дискового пространства, выделенного для виртуального жесткого диска, или уже получили сообщение об ошибке из-за отсутствия свободного места на диске, ознакомьтесь со следующим разделом, чтобы узнать, как расширить максимальный объем дискового пространства, выделенного для виртуального жесткого диска, связанного с дистрибутивом 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

Сведения о блочном устройстве включают:

  • ИМЯ. Для каждого используемого диска будет присвоено имя sd[a-z], обозначающее диск SCSI с буквой. sda всегда является системным распределением.
  • MAJ:MIN: представляет числа, используемые ядром Linux для внутренней идентификации устройств с первым номером, представляющим тип устройства (8 используется для дисков с интерфейсом малого компьютера или дисками SCSI).
  • RM. Дайте нам знать, является ли устройство съемным (1) или нет (0).
  • SIZE: общий размер тома.
  • 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>
    
  4. После завершения восстановления отключите диск в 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.