Знакомство с WSL 2 на Windows 10
Windows 10 Pro 21H2 19044
WSL 2 - это новая версия архитектуры подсистемы Windows для Linux, чтобы запускать двоичные файлы Linux ELF64 в Windows.
Т.е. можно запускать приложения Linux, в том числе c GUI, на Windows.
Однако, это не является полноценной виртуализацией, скорее контейнеризация, поэтому полноценный Linux Desktop заменить не сможет, по крайней мере на данный момент.
На сайте Microsoft довольная хорошая документация, обязательно к ознакомлению:
https://docs.microsoft.com/ru-ru/windows/wsl/about
https://docs.microsoft.com/ru-ru/windows/wsl/faq
Установка WSL 2
https://docs.microsoft.com/ru-ru/windows/wsl/install
В документации нам предлагают использовать wsl --install - эта команда позволяет включить необходимые дополнительные компоненты, скачать последнюю версию ядра Linux, установить WSL 2 в качестве компонента по умолчанию и установить дистрибутив Linux (по умолчанию Ubuntu).
Но это было бы слишком просто, сделаем все по шагам вручную https://docs.microsoft.com/ru-ru/windows/wsl/install-manual
Установка компонентов
Установку компонентов можно выполнить через GUI
Параметры → Приложения и возможности → Дополнительные компоненты → Другие компоненты Windows
Либо через консоль cmd или PowerShell (запустить от имени Администратора)
# cmd dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /norestart # PowerShell Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart
Выполнить перезагрузку
WSL 2 использует архитектуру Hyper-V для включения виртуализации. Эта архитектура будет доступна в качестве дополнительного компонента Virtual Machine Platform (Платформа виртуальной машины)
Если этот компонент не установлен, то будет работать WSL 1, а при попытке использовать WSL 2 выдаст сообщение:
Включите функцию Windows для платформы виртуальной машины и убедитесь в том, что в BIOS включена виртуализация. Дополнительные сведения см. на странице https://aka.ms/wsl2-install
Настройка WSL
Выбор WSL 2 в качестве версии по умолчанию
> wsl --set-default-version 2 Для получения сведений о ключевых различиях с WSL 2 перейдите на страницу https://aka.ms/wsl2 Операция успешно завершена.
Скачать (если выполняется первый раз) и/или обновить Linux ядро для WSL 2
> wsl --update Проверяется наличие обновлений... Скачивание обновлений... Выполняется установка обновлений... Это изменение вступит в силу при следующем полном перезапуске WSL. Чтобы выполнить перезапуск, выполните команду "wsl --shutdown". Версия ядра: 5.10.102.1
Посмотреть статус
> wsl --status Версия по умолчанию: 2 Подсистема Windows для Linux в последний раз обновлена 06.07.2022 Включены автоматические обновления WSL. Версия ядра: 5.10.102.1
Можно создать файл .wslconfig для глобальной настройки параметров WSL 2
%USERPROFILE%\.wslconfig
[wsl2] kernel=<path> # An absolute Windows path to a custom Linux kernel. memory=<size> # How much memory to assign to the WSL2 VM. processors=<number> # How many processors to assign to the WSL2 VM. swap=<size> # How much swap space to add to the WSL2 VM. 0 for no swap file. swapFile=<path> # An absolute Windows path to the swap vhd. localhostForwarding=<bool> # Boolean specifying if ports bound to wildcard or localhost in the WSL2 VM should be connectable from the host via localhost:port (default true). # <path> entries must be absolute Windows paths with escaped backslashes, for example C:\\Users\\Ben\\kernel # <size> entries must be size followed by unit, for example 8GB or 512MB
Например у меня много памяти и я хочу сберечь свой SSD отключив SWAP По умолчанию SWAP file расположен
%USERPROFILE%\AppData\Local\Temp\swap.vhdx
После изменения в .wslconfig требуется перезагрузка
wsl --shutdown
После команды shutdown все запущенные Linux контейнеры будут остановлены.
Или можно перезагрузить службу LxssManager, что будет иметь такой же эффект
# PowerShell Restart-Service LxssManager
Установка дистрибутива
Посмотреть текущие дистрибутивы
> wsl --list --verbose Нет установленных дистрибутивов подсистемы Windows для Linux. Дистрибутивы можно установить из Microsoft Store: https://aka.ms/wslstore
Посмотреть доступные дистрибутивы
> wsl --list --online Ниже приведен список допустимых распределений, которые можно установить. Установите с помощью команды wsl --install -d <Distro>. NAME FRIENDLY NAME Ubuntu Ubuntu Debian Debian GNU/Linux kali-linux Kali Linux Rolling openSUSE-42 openSUSE Leap 42 SLES-12 SUSE Linux Enterprise Server v12 Ubuntu-16.04 Ubuntu 16.04 LTS Ubuntu-18.04 Ubuntu 18.04 LTS Ubuntu-20.04 Ubuntu 20.04 LTS
Дистрибутив Linux устанавливается как приложение Windows app или UWP app
На данный момент в Microsoft Store доступна Ubuntu-22.04, а через консоль нет
Установка Ubuntu-20.04 через консоль
> wsl --install -d Ubuntu-20.04 Загрузка: Ubuntu 20.04 LTS Выполняется установка: Ubuntu 20.04 LTS Установка «Ubuntu 20.04 LTS» выполнена. Запуск Ubuntu 20.04 LTS...
Если сообщение висит долго, нажмите ENTER
Такой баг я встречал и в других диалогах, так что следует это запомнить.
Вводим имя пользователя и пароль для Ubuntu, они произвольные и не как не связаны с Windows логином. Над паролем лучше не мудрить и сделать простым.
Я сразу отключу требование ввода пароля для sudo, например можно отредактировать правило в /etc/sudoers через команду
sudo sed 's/\(^%sudo\s.*\)/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/' /etc/sudoers -i
Посмотреть текущие дистрибутивы
> wsl --list --verbose NAME STATE VERSION * Ubuntu-20.04 Running 2
'*' отмечен дистрибутив по умолчанию, т.е. при выполнении команд wsl они будут применены к нему
Настройка дистрибутива
Можно создать файл /etc/wsl.conf для настройки дополнительных параметров внутри конкретного дистрибутива.
Под Linux я запускал VPN, поэтому мне понадобилось отключить управление файлом /etc/resolv.conf
Почему так происходит и какие подводные камни.
Открыл терминал, запустил VPN, который прописал DNS для использования внутреннего корпоративного домена.
И это работает до момента, когда открываешь еще один терминал или выполняешь команду через wsl, например даже такую
wsl lsВ этот момент WSL актуализирует resolv.conf и перетирает его, точнее это символическая ссылка, а сам файл расположен тут:
/etc/resolv.conf -> ../run/resolvconf/resolv.conf
Нужно создать конфиг
/etc/wsl.conf
[network] generateResolvConf = false
Перезагрузить
wsl --shutdown
Зайти в терминал Linux удалить ссылку, т.к. она уже будет ссылаться на несуществующий файл и создать новый файл
rm /etc/resolv.conf ip -4 route show default | awk '{print "nameserver",$3}' > /etc/resolv.conf
Однако IP адрес в WSL не статический и поменяется после перезагрузки Windows, что же делать в таком случае.
Все зависит от вашего сценария использования, например можно добавить задачу в Планировщик заданий (Task Scheduler) , что бы выполняла настройку после загрузки Windows.
Параметр [boot], для выполнения команд при первой загрузке доступен только в Windows 11.
Импорт дистрибутива
Можно установить любой другой дистрибутив, создать самому или клонировать существующий.
wsl --import <Distro> <Расположение установки> <Имя файла> [Параметры] Импортирует указанный tar-файл как новое распределение. Для стандартной загрузки имя файла может быть «-».
В рамках этой статьи я не буду рассматривать этот функционал см. https://docs.microsoft.com/ru-ru/windows/wsl/use-custom-distro
Удаление дистрибутива
Выполняется очень просто
> wsl --unregister Ubuntu-20.04 Отмена регистрации...
Файловая система
Файловая система WSL дистрибутива Linux хранится в VHD файле в каталоге
%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx
Доступ есть через проводник по адресу
\\wsl$
Из Linux так же есть доступ в дискам Windows
ls -la /mnt/c/ ls -la /mnt/d/
Статический IP адрес
По мере использования WSL, можно столкнуться с этим вопросом.
Обсуждение https://github.com/microsoft/WSL/issues/4210
При первом запуске WSL создается интерфейс «vEthernet (WSL)» с случайной подсетью из диапазона приватной сети 172.16.0.0/12
т.е. после перезагрузки Windows сеть поменяется.
По итогу без костылей обойтись не получится.
Можно использовать скрипты, где каждый раз получать ip адрес и использовать его дальше по сценарию, как пример:
.bat
FOR /F %%i IN ('wsl -d Ubuntu-20.04 hostname -I') DO set WSLIP=%%i echo %WSLIP% netsh interface portproxy add v4tov4 listenport=8088 connectport=80 connectaddress=%WSLIP%
.bashrc
export DISPLAY=$(ip route list default | awk '{print $3}'):0 export LIBGL_ALWAYS_INDIRECT=1
Есть готовые скрипты, которые переконфигурируют интерфейс в Windows, а затем eth0 внутри Linux.
Например можно глянуть https://github.com/skorhone/wsl2-custom-network, https://github.com/ocroz/wsl2-boot
Запуск графических приложений
https://docs.microsoft.com/ru-ru/windows/wsl/tutorials/gui-apps
Для доступа к этой функции потребуется Windows 11 сборке 22000 или более поздней версии.
Т.к. в данной статье у нас Windows 10, то необходимо установить X-сервер для операционной системы Microsoft Window.
Например VcXsrv
Я установил Xming
Для безопасности в файле C:\Program Files (x86)\Xming\X0.hosts указаны хосты, с которых разрешены подключения, но ip адрес у нас динамический, а указать подсеть в файле нельзя, поэтому придется запускать через ярлык XLaunch, т.к. там есть возможность выключить контроль доступа.
Конфиг XLaunch можно сохранить и в дальнейшем запускать через него.
В Linux есть мини программы, как раз подойдут для проверки, установим их
sudo apt-get install x11-apps
Выполним экспорт переменной DISPLAY, в дальнейшем эту команду можно записать в ~/.bashrc
export DISPLAY=$(ip -4 route show default | awk '{print $3}'):0.0
Запустить приложение «x-глаза» для проверки
xeyes
Отлично! Все работает.
Обсуждение