WSL в Windows: перенос на другой диск

Подсистема Windows для Linux (Windows Subsystem for Linux, WSL2 ) сегодня широко используется разработчиками, администраторами и простыми пользователями для запуска различных дистрибутивов (Ubuntu, Debian, OpenSUSE, Kali Linux, Alpine), инструментов и приложений Linux в среде Windows без использования виртуализации и двойной загрузки. В этой статье мы рассмотрим, как перенести файлы установленного WSL на другой диск или компьютер.

При установке WSL в Windows все файлы среды сохраняются на системный диск (C: как правило). Если размер системного диска недостаточен (небольшой SSD диск), то со временем размер файловой системы WSL может серьезно вырасти, и вы захотите перенести файлы WSL на другой диск. В Windows 10 и 11 вы можете перенести WSL на другой диск или компьютер несколькими способами.

В первую очередь определите текущий размер файловой системы WSL на вашем диске. Выведите список установленных дистрибутивов WSL на компьютере:

wsl --list --verbose

вывести список доступных образов WSL2 в Windows 10

В нашем примере установлена только Ubuntu-20.04. Выполните следующую команду PowerShell, чтобы получить название UWP приложения с вашим дистрибутивом Linux:

Get-AppxPackage -Name "*Ubuntu20*" | Select PackageFamilyName

В моем примере название UWP пакета — CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc . Файловая система WSL данного дистрибутива Linux хранится в VHD файле ext4.vhdx в каталоге %USERPROFILE%AppDataLocalPackagesCanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgscLocalStateext4.vhdx

Чтобы получить размер файла с помощью PowerShell , выполните:

$path= $env:USERPROFILE+ ”AppDataLocalPackages” + (Get-AppxPackage -Name "*Ubuntu20*").PackageFamilyName + “LocalStateext4.vhdx”
Get-ChildItem -Path $path | fl @{Label="SizeGb"; Expression={$_.Length / 1Gb}}

размер файла ext4.vhdx в Windows WSL

Вы можете попробовать уменьшить размер VHD файла с помощью командлета Optimize-VHD (из PowerShell модуля Hyper-V ). Иногда этого бывает достаточно:

optimize-vhd -Path <PATH_TO_VHD> -Mode full

Путь к VHD файлу данного дистрибутива WSL хранится в параметре BasePath ветки реестра HKCUSoftwareMicrosoftWindowsCurrentVersionLxss{UUID} .

путь к файловой системе WSL в Windows можно получить из реестра

Можно остановить WSL, переместить ext4.vhdx на другой диск и изменить путь к каталогу в реестре. Но этот сценарий не рекомендуется!

В современных билдах Windows 10 и 11 можно выполнить корректный перенос среды WSL с помощью встроенной процедуры экспорта и импорта.

Запустите среду wsl и проверьте имя пользователя:

wsl
whoami

В нашем примере это sysops .

получить имя пользователя в дистрибутиве Ubuntu для Windows WSL

Закройте все приложения, запущенные в среде Linux и консоли WSL:

wsl --shutdown

Чтобы создать резервную копию (экспортировать) вашу среду WSL и поместить ее на отдельный диск E:, выполните команды:

mkdir e:backup
wsl --export Ubuntu-20.04 e:backupubuntu.tar

Дождитесь окончания экспорта WSL (может занять длительное время). В целевом каталоге появится TAR архив с вашей средой WSL.

экспорт и перенос файлов WSL на другой диск

Теперь можно удалить файлы среды WSL на исходном диске:

wsl --unregister Ubuntu-20.04

Создайте каталог для вашего образа Linux на новом диске и импортируйте tar архив в WSL командой:
mkdir E:WSL
wsl --import Ubuntu-20.04 E:WSL E:backupubuntu.tar

Для входа в Ubuntu по умолчанию используется root. Чтобы сменить его на другое имя пользователя (мы получили его ранее), выполните:

cd $env:USERPROFILEAppDataLocalMicrosoftWindowsApps
.ubuntu2004.exe config --default-user sysops

Запустите вашу среду WSL:

wsl -d Ubuntu-20.04

запуск среды WSL из командной строки

Совет . Нужный дистрибутив WSL можно запустить из Windows Terminal. запуск нужного дистрибутива WSL из Windows Terminal

Этот же сценарий можно использовать для переноса настроенного образа WSL на другие компьютеры.

Также для переноса WSL в Windows можно использовать стороннюю утилиту LxRunOffline (доступна на GitHub — https://github.com/DDoSolitary/LxRunOffline ). Можно установить утилиту через Chocolatey:

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
choco install lxrunoffline

Вывести список доступных образов WSL:

lxrunoffline list

Завершаем все процессы:

wsl --shutdown

узнать текущий каталог, в котором хранится образ WSL:

lxrunoffline get-dir -n Ubuntu-20.04

утилита lxrunoffline для переноса файлов WSL

Перенос WSL образ на другой диск:

lxrunoffline move -n Ubuntu-20.04 -d d:wsl2Ubuntu-20.04

После окончания переноса, запустите дистрибутив WSL. Командой:

wsl -d Ubuntu-20.04

или

lxrunoffline run -n Ubuntu-20.04 -w

EnglishRussianUkrainian