Опыт настройки и использования WSL и WSL 2 в Windows 10

Андрей Галадей

Еще до релиза Windows 10 было известно, что в новой операционной системе появится поддержка Linux. Но только с выходом стало понятно, что это встроенная подсистема, которая позволяет нативно запускать ряд Linux-дистрибутивов внутри Win10.

Если говорить проще — это буквально «имплантированная» в Windows 10 виртуальная машина с Linux (WSL), которая позволяет выполнять многие действия, не перегружаясь в Linux. То есть теперь не нужно устанавливать две системы параллельно, как было раньше.


Содержание:
1. WSL и WSL 2: сравнение возможностей
2. Установка и использование подсистемы Linux (WSL)
3. Установка и использование подсистемы Linux (WSL 2)
4. Настройка WSL/WSL 2 в Windows 10
5. Взаимодействие окружения Windows и окружения подсистемы Linux
Заключение

1. WSL и WSL 2: сравнение возможностей

На данный момент представлены две реализации подсистемы поддержки Linux. И между WSL и WSL 2 есть важные различия, о которых мы сейчас кратко поговорим.

Если совсем коротко, суть их такова:

Источник: microsoft.com

При этом из-за разниц подходов в реализации есть различия и в работе. В первой WSL все процессы Linux отображались в «Диспетчере задач», что позволило «убивать» или перезапускать их при необходимости. Во второй версии этого нет (плохая новость), зато там появилось полноценное ядро Linux, ускорение работы системы ввода-вывода, полная совместимость на уровне системных вызовов и так далее (хорошая новость).

Теперь, поняв базовые отличия, переходим к обзору запуска обоих вариантов. Поехали!

2. Установка и использование подсистемы Linux (WSL)

Для начала мы поговорим о первой версии WSL, которая появилась в версии Windows 10 Build 14251. Эта версия была первой полноценной системой Linux в «десятке».

Однако она не была лишена проблем. Во-первых, таким образом можно было запустить только консольные приложения, хотя в их числе были ssh, MySQL, Apache — все это устанавливалось через собственный менеджер пакетов. Во-вторых, она позволяла использовать лишь ограниченный набор дистрибутивов. В-третьих, первая WSL могла предложить не слишком высокое быстродействие из-за того, что выполнялась фактически в эмуляторе.

При этом система уже могла запускать почти все консольные программы, обновлять их, работать с bash-скриптами и так далее.

Но давайте перейдем к сути и поговорим о том, как можно установить первую WSL в Windows 10.

Шаг 1

Перед установкой любых дистрибутивов Linux в Windows необходимо сначала включить дополнительную функцию «Подсистема Windows для Linux».

Для этого открываем PowerShell от имени администратора (меню Пуск> PowerShell>, правой кнопкой по пункту и «Запуск от имени администратора»). Затем вводим эту команду:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

Можно перегрузить компьютер для гарантии.

Шаг 2

Установите желаемый дистрибутив Linux из магазина Microsoft:

microsoft.com

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

  • Ubuntu 18.04 LTS
  • Ubuntu 20.04 LTS
  • openSUSE Leap 15.1
  • SUSE Linux Enterprise Server 12 SP5
  • SUSE Linux Enterprise Server 15 SP1
  • Kali Linux
  • Debian GNU/Linux
  • Fedora Remix for WSL
  • Pengwin
  • Pengwin Enterprise
  • Alpine WSL
  • Raft(Free Trial)

Шаг 3

Скачиваем нужный дистрибутив, нажав кнопку «Получить» или Get.

microsoft.com

Помимо этого, можно загрузить нужный дистрибутив через Poweshell. Для этого вводим в Powershell команду:

Invoke-WebRequest -Uri https://aka.ms/wslubuntu2004 -OutFile Ubuntu.appx -UseBasicParsing

Вместо «https://aka.ms/wslubuntu2004» подставляем нужную ссылку из списка дистрибутивов выше и ждем скачивания.

После этого, устанавливаем с помощью команды:

Add-AppxPackage .\app_name.appx

Где app_name.appx — это название пакета с дистрибутивом в формате .appx.

Также можно скачать дистрибутив с помощью утилиты cURL. Это делается через обычную командную строку. Команда тогда выглядит так:

curl.exe -L -o ubuntu-2004.appx https://aka.ms/wsl-ubuntu-2004

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

microsoft.com

При этом важно, что в первой версии WSL нельзя использовать «графические» приложения — только консольные. Приложения с полноценным графическим окружением есть в WSL 2, к нему мы и переходим.

3. Установка и использование подсистемы Linux (WSL 2)

Здесь все отличается от первой версии, однако ничего радикально сложного нет.

Шаг 1

Проверяем требования для запуска WSL 2.

Эта подсистема работает по умолчанию на Windows 10 с разрядностью x64 под номером 1903 или выше, со сборкой 18362 или новее. При этом сборки ниже 18362 не поддерживают WSL 2.

Для проверки нажать хоткей Win + R, ввести команду winver и нажать ОК или Enter, после чего, при необходимости, обновить Windows 10 до актуальной версии.

Шаг 2

Активируем функцию виртуальной машины. Это необходимо сделать до установки WSL 2, поскольку для ее работы во второй версии требуется виртуализация.

Для этого запускаем PowerShell от имени администратора и выполняем команду:

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

После перезагружаем компьютер.

Шаг 3

Загружаем пакет обновления ядра Linux, устанавливаем его, разрешаем использование повышенных разрешений для новой системы.

Шаг 4

Устанавливаем WSL 2 в качестве версии по умолчанию при установке новых дистрибутивов Linux.

Этот шаг можно пропустить, если устанавливать дистрибутивы в старую версию WSL.

В Powershell выполняем команду:

wsl --set-default-version 2

После этого можно переходить к настройке.

4. Настройка WSL/WSL 2 в Windows 10

Авторизуемся в Linux и для начала устанавливаем текстовый редактор nano:

apt install nano

Вводить sudo не надо, здесь мы изначально работаем под рутом (потому, осторожно!).

Далее редактируем файл с источниками пакетов:

nano /etc/apt/sources.list

Для зеркал на «Яндексе» это выглядит так:

deb http://mirror.yandex.ru/ubuntu/ xenial main universe restricted
deb-src http://mirror.yandex.ru/ubuntu/ xenial main universe  restricted

deb http://mirror.yandex.ru/ubuntu/ xenial-security main universe restricted
deb-src http://mirror.yandex.ru/ubuntu/ xenial-security main universe restricted

deb http://mirror.yandex.ru/ubuntu/ xenial-updates main universe restricted
deb-src http://mirror.yandex.ru/ubuntu/ xenial-updates main universe restricted

Сохраняем по Ctrl+O, после чего выходим из nano по Ctrl+X. Затем обновляем систему:

apt update && apt upgrade

Создаем основного пользователя с именем user1 (не работай под рутом — помним?). Для этого вводим:

addgroup --gid 1000 user1
adduser --home /home/user1 --shell /bin/bash --uid 1000 -G user1,sudo user1

Затем переходим в папку пользователя, заходим под ним, добавляем пароль и производим другие изменения.

Команды:

cd /home/user1

su user1

passwd

nano .bashrc

Пример .bashrc:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm|xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # We have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
    # a case would tend to support setf rather than setaf.)
    color_prompt=yes
    else
    color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    if [[ ${EUID} == 0 ]] ; then
        PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] '
    else
        PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\] \[\033[01;34m\]\w \$\[\033[00m\] '
    fi
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h \w \$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

Теперь следующий важный шаг.

Установка X-сервера, Xfce и прочих графических приложений Windows
Устанавливаем X-сервер, причем его надо установить в WSL2.

Рекомендуем использовать VcXsrv — это официально портированая версия X11 на Windows.

Устанавливаем его по умолчанию через обычный инсталлятор.

Затем переходим в терминал WSL, набираем exit, чтобы выйти из рута и настраиваем русскую локализацию:

locale-gen ru_RU
locale-gen ru_RU.UTF-8
update-locale

Начинаем устанавливать компоненты Xfce — вот такой большой и страшной командой:

apt install -y xfce4-session xfce4-notifyd xfce4-appfinder xfce4-panel xfce4-quicklauncher-plugin xfce4-whiskermenu-plugin xfce4-xkb-plugin xfce4-settings xfce4-terminal xfce4-taskmanager mousepad

При этом графическое окружение приходится запускать ручками, что неудобно. Потому в Windows создаем папку и три файла для запуска.

Первый — config.xlaunch — файл настроек для VcXsrv.

Его содержимое:

<?xml version="1.0" encoding="UTF-8"?>
<XLaunch
WindowMode="MultiWindow"
ClientMode="NoClient"
LocalClient="False"
Display="0"
LocalProgram="xcalc"
RemoteProgram="xterm"
RemotePassword=""
PrivateKey=""
RemoteHost=""
RemoteUser=""
XDMCPHost=""
XDMCPBroadcast="False"
XDMCPIndirect="False"
Clipboard="True"
ClipboardPrimary="True"
ExtraParams=""
Wgl="True"
DisableAC="False"
XDMCPTerminate="False"
/>

Второй файл под названием x-run.vbs позволяет скрывать (но не закрывать) эмулятор терминала, который запускается вместе с WSL. Его содержимое выглядит так:

WScript.CreateObject("Shell.Application").ShellExecute "wsl", "cd /home/user1; DISPLAY=:0 LANG=ru_RU.UTF-8 su user1 -c xfce4-session", "", "open", 0

Третий файл, назначение которого ясно из названия — start.bat. Его можно даже добавить в автозагрузку.

Содержимое:

start config.xlaunch
wscript x-run.vbs

После этого уже можно запускать WSL сразу с графическим окружением и устанавливать привычные в Linux программы.

К слову, если вы хотите установить KDE Plasma, то команды будут такими:

sudo apt install kubuntu-desktop -y

После устанавливаем русскую локаль:

sudo apt install language-pack-ru language-pack-kde-ru -y
sudo apt install libreoffice-l10n-ru libreoffice-help-ru -y
sudo apt install hunspell-ru mueller7-dict -y
sudo update-locale LANG=ru_RU.UTF-8
sudo dpkg-reconfigure locales #
sudo apt-get install --reinstall locales

Скачиваем и устанавливаем сами «Кеды»:

sudo add-apt-repository ppa:kubuntu-ppa/backports
sudo apt update && sudo apt full-upgrade -y

Теперь для запуска создаем на рабочем столе Windows bat-файл с таким содержимым:

@echo off
echo ===================================== Внимание! ============================================
echo  Для корректной работы GUI Ubuntu 20.04 в WSL2 необходимо использовать X Server.
echo  Примечание: в случае использования VcXsrv Windows X Server необходимо раскомментировать
echo  строки в файле Start-Ubuntu-20.04-plasma-desktop.bat, содержащие "config.xlaunch" и
echo  "vcxsrv.exe", и закомментировать все строки, содержащие "x410".
echo ============================================================================================
rem start "" /B "c:\wsl\vcxsrv\config.xlaunch" > nul
start "" /B x410.exe /wm /public > nul
start "" /B "c:\wsl\pulseaudio-1.1\bin\pulseaudio.exe" --use-pid-file=false -D > nul
c:\wsl\Ubuntu-20.04\Ubuntu2004.exe run "if [ -z \"$(pidof plasmashell)\" ]; then cd ~ ; export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0 ; setxkbmap us,ru -option grp:ctrl_shift_toggle ; export LIBGL_ALWAYS_INDIRECT=1 ; export PULSE_SERVER=tcp:$(grep nameserver /etc/resolv.conf | awk '{print $2}') ; sudo /etc/init.d/dbus start &> /dev/null ; sudo service ssh start ; sudo service xrdp start ; plasmashell ; pkill '(gpg|ssh)-agent' ; fi;"
rem taskkill.exe /F /T /IM vcxsrv.exe > nul
taskkill.exe /F /T /IM x410.exe > nul
taskkill.exe /F /IM pulseaudio.exe > nul

После этого можно запускать WSL.

5. Взаимодействие окружения Windows и окружения подсистемы Linux

Одной из проблем для виртуальных машин является необходимость хорошего взаимодействия между хостом и самой виртуальной машиной. Это нужно для быстрой переброски файлов, ссылок и прочего. И в этом разделе мы обсудим как раз эту тему.

Для начала поговорим о том, где находится файловая система нашей WSL. Ее можно найти по адресу %localappdata%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs. При этом не рекомендуется писать туда файлы, поскольку в Windows используется довольно капризная NTFS, а в Linux — ext3/ext4. Можно ненароком «поломать» что-нибудь. А вот читать можно спокойно.

Возможно, это проблема со временем уйдет в прошлое, когда в ядре Linux появится-таки NTFS-драйвер от Paragon, который не так давно стал открытым. Ожидается, что это произойдет в версии 5.15.

Если нужно получить доступ к диску Windows, то он будет смонтирован в /mnt в соответствии со своими буквами. То есть, системный диск (если у вас Windows на диске C) примонтируется как /mnt/c, условная флешка — как /mnt/f (кто еще помнит, что по умолчанию она получала именно букву F?), а диск с любимыми фильмами и музыкой — /mnt/d (или какая там у вас буква?).

При этом можно делать симлинки, а права автоматом ставятся на максимум. То есть права по дефолту будут обозначены как 0777, а владельцем считается root (и снова повторим, что с учетом этих особенностей нужно быть осторожным).

При этом виндовые папки будут видны в терминале, файлы — будут открываться, а программы — запускаться.

Пример:

dir | wsl grep Sa — смотрим папку

wsl ls ‑la > 123.txt — содержимое файла txt

wsl ls ‑la /proc/cpuinfo — читаем данные.

wsl ls ‑la “/mnt/c/Program Files” — смотрим содержимое папки с установленными программами (как видим, доступ закрыт, хотя просмотреть можно)

winitpro.ru

Если запускать приложения Windows прямиком из Linux, это можно сделать командами:

  1. explorer.exe — «Проводник»
  2. calc.exe — «Калькулятор»
  3. notepad.exe — штатный «Блокнот»
  4. wordpad.exe — WordPad
  5. mspaint.exe — Paint,
  6. cal.exe — календарь

А вот погоду можно посмотреть иначе — curl wttr.in.

Для удобства можно установить mc — Midnight Commander, который будет работать в оболочке Bash в Linux и в командной строке Windows.

Команда проста:

sudo apt-get install mc

А вот так выглядит двухпанельный файловый менеджер, где с одной стороны Windows, с другой — Linux. Похоже, старая шутка про два диска C обретает новый смысл.

winitpro.ru

Если же необходимо запускать Linux приложения напрямую из Windows, то для этого есть три волшебные команды — bash, wsl и ubuntu. По умолчанию они идут от рута, потому лучше использовать su и снизить привилегии.

Для приложений с X-сервером нужно еще передавать переменную окружения DISPLAY=:0. А папку, в которой работает то или иное приложение, надо выбирать уже внутри WSL через cd. Например, cd d:\testdata\file1.txt.

Как мы говорили ранее, в первой версии WSL может просматривать перечень процессов Linux в «Диспетчер задач» Windows. А вот в самой подсистеме видны только Linux-процессы.

Зато команды ifconfig в Linux и ipconfig в Windows дают одинаковые данные, а веб-сервер, запущенный в Linux, окажется доступным и в Windows. Наоборот — то же самое.

Особенности и ограничения WSL и WSL 2

Не секрет, что NT-системы и Linux-системы отличаются во многом. И потому первая версия WSL, созданная Microsoft, была, по сути, попыткой реализации всех интерфейсов ядра Linux в рамках NT. Если проще — все интерфейсы, которые существуют в обеих системах, должны были реализовываться один к одному (да-да, ошибки, баги и прочее — тоже).

Если же в Linux интерфейс был, а в NT его не было, то его и не надо было реализовывать напрямую. А если надо — то с помощью «костылей». Само собой, такой подход сделал первую WSL медленной, хотя и реализовывал многие особенности, например, те же Linux-процессы в «Диспетчере задач».

Также WSL приходилось иметь дело с файловой системой NTFS, которая под Linux пока что работает не очень. Из-за этого падала скорость работы в целом. Однако преимущества такого подхода тоже очевидны — полная открытость и контроль. Ядро NT «знает» о ядре Linux и может отслеживать процессы.

Но маркетинг победил, когда выпустили WSL 2. Это уже полноценная виртуальная машина, которая «вшита» в Windows. Настоящий гибрид. При этом Linux в этом случае был «черным ящиком» для NT, поскольку внутренняя логика никак не отслеживалась. Это позволило ускорить работу, но при этом уменьшило контроль со стороны пользователя.

Иначе говоря, если какой-то вирус попадет в WSL 2, то он может обойти защиту и хост-системы. Очевидно, что удаленно взломать такую гибридную систему можно также попытаться через WSL 2, где все по дефолту установлено с максимальными правами.

Заключение

Как видим, использование подсистемы Linux в Windows 10 и 11 — довольно простая штука. Конечно, придется немного повозиться с настройками, однако ничего особо страшного или сложного здесь нет. В такой реализации Linux точно становится ближе к обычному массовому пользователю Windows.

С учетом всего сказанного, нам кажется, что WSL лучше подходит для новичка в мире Unix, а вот WSL 2 с обилием встроенных возможностей (и потенциальных опасностей тоже) идеально подходит для более опытного спеца, который вполне способен самостоятельно держать все под контролем.

Дополнительно о настройке WSL-подсистемы можно узнать в этих видео:

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023