Подсистема 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
В нашем примере установлена только Ubuntu-20.04. Выполните следующую команду PowerShell, чтобы получить название UWP приложения с вашим дистрибутивом Linux:
Get-AppxPackage -Name "*Ubuntu20*" | Select PackageFamilyName
В моем примере название UWP пакета — CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc. Файловая система WSL данного дистрибутива Linux хранится в VHD файле ext4.vhdx в каталоге %USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx
Чтобы получить размер файла с помощью PowerShell, выполните:
$path= $env:USERPROFILE+ ”\AppData\Local\Packages\” + (Get-AppxPackage -Name "*Ubuntu20*").PackageFamilyName + “\LocalState\ext4.vhdx”
Get-ChildItem -Path $path | fl @{Label="SizeGb"; Expression={$_.Length / 1Gb}}
optimize-vhd -Path <PATH_TO_VHD> -Mode full
Путь к VHD файлу данного дистрибутива WSL хранится в параметре BasePath ветки реестра
HKCU\Software\Microsoft\Windows\CurrentVersion\Lxss\{UUID}
.
Можно остановить WSL, переместить ext4.vhdx на другой диск и изменить путь к каталогу в реестре. Но этот сценарий не рекомендуется!
В современных билдах Windows 10 и 11 можно выполнить корректный перенос среды WSL с помощью встроенной процедуры экспорта и импорта.
Запустите среду wsl и проверьте имя пользователя:
wsl
whoami
В нашем примере это sysops.
Закройте все приложения, запущенные в среде Linux и консоли WSL:
wsl --shutdown
Чтобы создать резервную копию (экспортировать) вашу среду WSL и поместить ее на отдельный диск E:, выполните команды:
mkdir e:\backup
wsl --export Ubuntu-20.04 e:\backup\ubuntu.tar
Дождитесь окончания экспорта WSL (может занять длительное время). В целевом каталоге появится TAR архив с вашей средой WSL.
Теперь можно удалить файлы среды WSL на исходном диске:
wsl --unregister Ubuntu-20.04
Создайте каталог для вашего образа Linux на новом диске и импортируйте tar архив в WSL командой:
mkdir E:\WSL
wsl --import Ubuntu-20.04 E:\WSL\ E:\backup\ubuntu.tar
Для входа в Ubuntu по умолчанию используется root. Чтобы сменить его на другое имя пользователя (мы получили его ранее), выполните:
cd $env:USERPROFILE\AppData\Local\Microsoft\WindowsApps
.\ubuntu2004.exe config --default-user sysops
Запустите вашу среду WSL:
wsl -d Ubuntu-20.04
Этот же сценарий можно использовать для переноса настроенного образа 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
Перенос WSL образ на другой диск:
lxrunoffline move -n Ubuntu-20.04 -d d:\wsl2\Ubuntu-20.04
После окончания переноса, запустите дистрибутив WSL. Командой:
wsl -d Ubuntu-20.04
или
lxrunoffline run -n Ubuntu-20.04 -w