Еще до релиза 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
Заключение
На данный момент представлены две реализации подсистемы поддержки Linux. И между WSL и WSL 2 есть важные различия, о которых мы сейчас кратко поговорим.
Если совсем коротко, суть их такова:
При этом из-за разниц подходов в реализации есть различия и в работе. В первой WSL все процессы Linux отображались в «Диспетчере задач», что позволило «убивать» или перезапускать их при необходимости. Во второй версии этого нет (плохая новость), зато там появилось полноценное ядро Linux, ускорение работы системы ввода-вывода, полная совместимость на уровне системных вызовов и так далее (хорошая новость).
Теперь, поняв базовые отличия, переходим к обзору запуска обоих вариантов. Поехали!
Для начала мы поговорим о первой версии WSL, которая появилась в версии Windows 10 Build 14251. Эта версия была первой полноценной системой Linux в «десятке».
Однако она не была лишена проблем. Во-первых, таким образом можно было запустить только консольные приложения, хотя в их числе были ssh, MySQL, Apache — все это устанавливалось через собственный менеджер пакетов. Во-вторых, она позволяла использовать лишь ограниченный набор дистрибутивов. В-третьих, первая WSL могла предложить не слишком высокое быстродействие из-за того, что выполнялась фактически в эмуляторе.
При этом система уже могла запускать почти все консольные программы, обновлять их, работать с bash-скриптами и так далее.
Но давайте перейдем к сути и поговорим о том, как можно установить первую WSL в Windows 10.
Перед установкой любых дистрибутивов Linux в Windows необходимо сначала включить дополнительную функцию «Подсистема Windows для Linux».
Для этого открываем PowerShell от имени администратора (меню Пуск> PowerShell>, правой кнопкой по пункту и «Запуск от имени администратора»). Затем вводим эту команду:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
Можно перегрузить компьютер для гарантии.
Установите желаемый дистрибутив Linux из магазина Microsoft:
В списке есть такие варианты дистрибутивов:
Скачиваем нужный дистрибутив, нажав кнопку «Получить» или 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, к нему мы и переходим.
Здесь все отличается от первой версии, однако ничего радикально сложного нет.
Проверяем требования для запуска WSL 2.
Эта подсистема работает по умолчанию на Windows 10 с разрядностью x64 под номером 1903 или выше, со сборкой 18362 или новее. При этом сборки ниже 18362 не поддерживают WSL 2.
Для проверки нажать хоткей Win + R, ввести команду winver
и нажать ОК или Enter, после чего, при необходимости, обновить Windows 10 до актуальной версии.
Активируем функцию виртуальной машины. Это необходимо сделать до установки WSL 2, поскольку для ее работы во второй версии требуется виртуализация.
Для этого запускаем PowerShell от имени администратора и выполняем команду:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
После перезагружаем компьютер.
Загружаем пакет обновления ядра Linux, устанавливаем его, разрешаем использование повышенных разрешений для новой системы.
Устанавливаем WSL 2 в качестве версии по умолчанию при установке новых дистрибутивов Linux.
Этот шаг можно пропустить, если устанавливать дистрибутивы в старую версию WSL.
В Powershell выполняем команду:
wsl --set-default-version 2
После этого можно переходить к настройке.
Авторизуемся в 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.
Одной из проблем для виртуальных машин является необходимость хорошего взаимодействия между хостом и самой виртуальной машиной. Это нужно для быстрой переброски файлов, ссылок и прочего. И в этом разделе мы обсудим как раз эту тему.
Для начала поговорим о том, где находится файловая система нашей 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. Наоборот — то же самое.
Не секрет, что 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-подсистемы можно узнать в этих видео:
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…