WSL 2 – это виртуальная среда для запуска Linux программ на Windows созданая Microsoft. До WSL 2 для запуска linux-програм программисты использовали cygwin или git bash, но учитывая невероятную совместимость WSL 2 со средой Linux и простоту его установки на любую машину с Windows 10, можно признать cygwin и его аналоги навсегда ненужными.

Дело в том что активировав WSL 2 у себя на машине и установив из Microsoft Store пакет Ubuntu вы получаете практически полноценную Ubuntu у себя на Windows 10, при этом с хорошей производительностью и без нужды вручную запускать виртуальные машины и пробрасывать папки.

WSL 2. Ubuntu 20.04 на Windows 10

Да, вы сможете писать в терминале

sudo apt install mysql-server

И на ваш компьютер будет установлен сервер баз данных MySQL. Точно такой же как на Ubuntu с конфигами которые расположены в том же месте что и на Ubuntu, например /etc/mysql/my.cnf . У вас есть точно такойже терминал bash как на ваших серверах с Ubuntu и весь софт включая nodejs, python и даже docker контейнеризация работает точно также (мы говорим про консольный софт конечно же без UI интерфейса, UI вы можете использовать в виде exe файлов под Windows).

Кроме того у вас будет интеграция с Visual Studio Code - вы сможете в нем видеть файловую систему из WSL 2 и хранить все проекты в ней.

В этом хинте я расскажу самый простой способ установики и минимальной настройки WSL 2, советую прочитать все, так как в этом процессе есть пару подводных камней и простых но важных предостережений которые важно знать перед началом работы в WSL 2 чтобы не допустить нескольки популярных проблем с производительностью.

📒 Об авторе хинта: Иван Борщев – основатель компании Devforth, которая занимаеться разработкой современного программного обеспечения. В этом хинте он делиться многолетним проффесиональным опытом полученым во время разработки Linux-совместимых приложений на Windows WSL.

Предыстория: WSL1 vs WSL2 (важно знать)

WSL 1 появился в 2016 году и был представлен как "слой совместимости с linux для Windows 10". Все что он делал на тот момент - это всего лишь давал возможность запуска бинарных файлов Linux (ELF формата) на Windows. При этом он также создавал файловую систему подобную linux (с папками /etc, /bin, /home ) которая хранилась в самом Windows 10, в виде дерева папок и располагалось где-то в дебрях каталога пользователя в Windows. Уже тогда мы отказались от cygwin и использовали apt install и успешно запускали софт который использовался на продакшен серверах. Это позволяло существнно поднять эффективность разработчиков которые использовали Windows. Мы запускали python, pipenv, node+npm, gcc, mysql , postgresql на Windows.

Но была проблема - Docker. Учитывая отсутствие ядра Linux, WSL 1 не давал запускать демон Dockerd. А костыльные настройки через VirtualBox мало у кого вызывали желание это настраивать, особенно когда этот опыт нужно донести сотрудникам.

Но с Июня 2019 в Windows 10 выпустили следующую версию WSL 2. Она потерпела драматические изменения - было добавлено настоящее ядро Linux и запускаться все стало через встроенную виртуальную машину Hyper-V (Virtual Machine Platform в компонентах Windows). Только в отличае от VirtualBox - вы даже не знаете о ее существовании. Ее не нужно запускать или даже знать что она запущена - вы просто работаете в терминале или VSCode когда нужно и получаете Ubuntu. Просадка по производительности я не заметил.

Единственный ньюанс который вызван переходом на Hyper-V - это изменение типа файловой системы - теперь в WSL 2 она стала в системе Windows выглядить как один файл-образ диска а не как дерево папок как это было в WSL 1:

ext4.vhdx - Образ файловой системы WSL2

Но WSL 2 монтирует его как сетевой диск, поэтому проблем нет. Мы рассмотрим как с этим жить легко и просто, но чуть позже.

Как установить WSL 2

Чтобы вам было проще повторять действия за мной, я использовал чистую Windows 10 Version: 20H2, OS Build 19042 (Проверить версию можно в Пуск ➡ Параметры ➡ About ➡ Windows Specifications). Минимальной версией для x64 систем есть Version: 1903 и больше с OS Build 18362 и больше.

Для надежности советую обновиться перед установкой WSL.

Шаг 1 - включаем "Windows Subsystem for Linux 1"

Запускаем коммандную строку от имени администратора:

Коммандная строка от имени администратора

Выполняем команду которая включит WSL 1:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
📒Если выполнить эту команду не запустив Командную Строку от администратора получим ошибку Error: 740 Elevated permissions are required to run DISM. Use an elevated command prompt to complete these tasks.

В случае успешного выполнение будет напиано что-то вроде:

Deployment Image Servicing and Management tool
Version: 10.0.19041.746

Image Version: 10.0.19042.746

Enabling feature(s)
[==========================100.0%==========================]
The operation completed successfully.

Если вы хотите остаться с WSL 1, на этом этапе можно перезагрузить машину и идти в стор за дистрибутивом Ubuntu. Но я советую вам продолжить и установить WSL 2 (пока можно не презагружать)

Шаг 2. Включаем VirtualMachinePlatform для WSL 2

Теперь включаем виртуальную машину необходимую для запуска WSL 2. Когда-то она называлась Hyper V, теперь VirtualMachinePlatform. В той же командной строке:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

После того как увидите The operation completed successfullyперезагружаем компьютор

Шаг 3. Скачиваем и устанавливаем ядро Linux для WSL 2 и указываем предпочитаемую версию

Скачиваем и устанавливем вот этот msi wsl_update_x64.msi .

📒 Cылка ведет на официальный сайт, проверить валидность ссылки вы можете на оффициальной странице майкрософта Windows Subsystem for Linux Installation Guide for Windows 10 в разделе Step 4)
📒 Если у вас ARM процессор а не x86 (бывает намного реже), ипспользуйте этуссылку wsl_update_arm64.msi

После успешной установки вы должны увидеть:

wsl_update_x64.msi

Ну и осталось сделать версию WSL 2 основной для всех устанавливаемых далее дистрибутивов. Повторно запустите Командную Строку от имени администратора и выполните:

wsl --set-default-version 2

В выводе будет написано:

C:\Windows\system32>wsl --set-default-version 2
Для получения сведений о ключевых различиях с WSL 2 перейдите на страницу https://aka.ms/wsl2

Шаг 4. Устанавливаем дистрибутив Ubuntu из Microsoft Store

Открываем стор, находим Ubuntu (я выбрал 20.04 LTS, на нее будут выходить обновления до 2022ого года)

Ubuntu 20.04 в Windows на WSL 2

Параллельно, пока дистрибутив устанавливаесться, советую установить еще Windows Terminal из того же Microsoft Store:

Windows Terminal в Microsoft Store

Это более удобная версия стандартной оболочки Командной строки/Powershell, умеет работать с WSL дистрибутивами.

После установки запускаем Ubuntu. При первом запуске будет выполнена установка, она может занять несколько минут

Ubuntu WSL в Пуск

После успешной настройки вы должны увидеть следубщее и ввести логин/пароль к пользователю WSL

Windows WSL distribution username setup

Если в командной строке вы получили ошибку: WslRegisterDistribution failed with error

Если в командной строке вы получили ошибку: WslRegisterDistribution failed with error: 0x80370102, Error: 0x80370102 The virtual machine could not be started because a required feature is not installed, то, вполне может быть что технология виртуализации не включена в BIOS вашего компьютера. Это опция которая в биос может называться как AMD VT или Intel VT. Просто зайдите в BIOS, найдите эту опцию, включите ее и сохраните настройки. Проверить влючена ли VT иможно в Диспетчере Задач:

Проверка Виртальной Машины в Диспетчере Задач

Если включив виртуализацию в BIOS, вы все еще испытываете проблему, попробуйте выполненить команду bcdedit /set hypervisorlaunchtype auto start в Командной строке от администратора и перезагрузить
🙃Если вдруг вы пытаетесь включить WSL 2 в виртуальной машине Windows 10 запускаемой из VirtualBox, вам нужно включить опцию Enable Nested VT-x/AMD-V в настройках виртуальной машины либо выполните
cd "c:\Program Files\Oracle\VirtualBox\" и затем VBoxManage modifyvm НазваниеМашины --nested-hw-virt on

Полезные команды

Проверить список Дистрибутивов и версии WSL:

wsl -l -v 

Если так случилось что у вас есть Дистрибутив с версией WSL1, вы можете сконвертировать его в версию WSL 2:

wsl --set-version Ubuntu-20.04 2 

Как приостановить Hyper-V (Feature:VirtualMachinePlatform)

Если вам нужно по какой либо причине выключить Hyper-V (например несовместимость с другими виртуальными машинами), то просто выполните:

DISM /Online /Disable-Feature:VirtualMachinePlatform
PowerShell Disable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -All
bcdedit /set hypervisorlaunchtype off

Потом перезагрузитесь и можете работать без Hyper-V. Для того чтобы вернуть все на место и включить его, нужно выполнить:

DISM /Online /Enable-Feature:VirtualMachinePlatform
PowerShell Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -All
bcdedit /set hypervisorlaunchtype auto start