Опыт настройки и использования 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 есть важные различия, о которых мы сейчас кратко поговорим.
Если совсем коротко, суть их такова:
При этом из-за разниц подходов в реализации есть различия и в работе. В первой 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:
В списке есть такие варианты дистрибутивов:
- 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.
Помимо этого, можно загрузить нужный дистрибутив через 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
После скачивания и установки нужно создать имя пользователя и пароль для нового дистрибутива.
При этом важно, что в первой версии 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”
— смотрим содержимое папки с установленными программами (как видим, доступ закрыт, хотя просмотреть можно)
Если запускать приложения Windows прямиком из Linux, это можно сделать командами:
explorer.exe
— «Проводник»calc.exe
— «Калькулятор»notepad.exe
— штатный «Блокнот»wordpad.exe
— WordPadmspaint.exe
— Paint,cal.exe
— календарь
А вот погоду можно посмотреть иначе — curl wttr.in
.
Для удобства можно установить mc — Midnight Commander, который будет работать в оболочке Bash в Linux и в командной строке Windows.
Команда проста:
sudo apt-get install mc
А вот так выглядит двухпанельный файловый менеджер, где с одной стороны Windows, с другой — Linux. Похоже, старая шутка про два диска C
обретает новый смысл.
Если же необходимо запускать 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-подсистемы можно узнать в этих видео:
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: