Подсистема Windows для Linux (WSL) - это функция операционной системы Windows, которая позволяет запускать среду GNU / Linux внутри Windows - без затрат на традиционную виртуальную машину или настройку с двойной загрузкой. WSL требует меньше ресурсов (CPU, памяти и места на диске), чем полноценная виртуальная машина. WSL также позволяет запускать инструменты и приложения командной строки Linux наряду с приложениями командной строки Windows, а также получать доступ к файлам Windows из Linux. Это позволяет при желании использовать приложения Windows и инструменты командной строки Linux для одного и того же набора файлов. Поддерживается множество дистрибутивов, включая Ubuntu, Debian, Kali Linux, OpenSUSE и другие. Можно установить свой дистрибутив, импортировав образ в формате tar.gz.
Общие сведения
Установить WSL можно на Windows 10 версии 2004 (сборка 19041) и выше и Windows 11. Для работы с ним лучше всего использовать Windows Terminal.
WSL использует собственную файловую систему, отделённую от файловой системы Windows (так как в Linux дискам не присваиваются буквы, а предоставляются точки монтирования). Корень файловой системы - /
- точка монтирования корневого раздела (или папки в случае с WSL). WSL использует файловую систему Windows как смонтированный диск, и доступ к какому-либо каталогу (к примеру, к диску C:\
) в Windows из WSL можно получить по пути /mnt/c/
.
Из Windows можно получить доступ к приложениям, запущенным в Linux. Например, доступ к сайту можно получить как обычно - localhost:port. Однако в некоторых случаях следует использовать IP-адрес для подключения (ip:port), который можно взять в файле /etc/resolv.conf
- из-за того, что в WSL 2 используется собственный виртуальный адаптер Ethernet со своим уникальным IP-адресом.
Установка
Подсистема WSL поставляется вместе с ОС Windows, однако её необходимо предварительно включить. Можно использовать упрощенную команду, в таком случае подсистема включится и установить дистрибутив Ubuntu (он используется по умолчанию):
1
wsl --install
С параметром --no-distibution
можно только включить WSL, не устанавливая дистрибутив:
1
wsl --install --no-distribution
После первой установки (или включения WSL) может потребоваться перезагрузка компьютера.
В целом установка дистрибутивов доступна несколькими способами:
- через Microsoft Store;
- через Windows Terminal командой
wsl --install
или аналогичной; - через Windows Terminal, экспортировав необходимый дистрибутив.
Список доступных для установки из терминала дистрибутивов можно получить командой:
1
2
wsl --list --online
wsl -l -o
На 7 августа 2023 года список следующий:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
NAME FRIENDLY NAME
Ubuntu Ubuntu
Debian Debian GNU/Linux
kali-linux Kali Linux Rolling
Ubuntu-18.04 Ubuntu 18.04 LTS
Ubuntu-20.04 Ubuntu 20.04 LTS
Ubuntu-22.04 Ubuntu 22.04 LTS
OracleLinux_7_9 Oracle Linux 7.9
OracleLinux_8_7 Oracle Linux 8.7
OracleLinux_9_1 Oracle Linux 9.1
openSUSE-Leap-15.5 openSUSE Leap 15.5
SUSE-Linux-Enterprise-Server-15-SP4 SUSE Linux Enterprise Server 15 SP4
SUSE-Linux-Enterprise-15-SP5 SUSE Linux Enterprise 15 SP5
openSUSE-Tumbleweed openSUSE Tumbleweed
Нужный из списка дистрибутив можно установить командой:
1
2
wsl --install -d <DistName>
wsl --install -d Debian
Установку можно дополнить ключом --no-launch
, тогда WSL не будет запускать дистрибутив сразу после установки. При этом дистрибутив не будет отображаться среди установленных - выполнение команды означает только загрузку дистрибутива для последующего повторного выполнения wsl --install
.
Каждый раз, когда устанавливается новый дистрибутив WSL Linux, для него в Windows Terminal создаётся новый профиль для подключения.
По умолчанию дистрибутивы создаются в каталоге C:\Users\username\AppData\Local\Packages
.
После завершения процесса установки дистрибутива будет предложено создать нового пользователя и установить ему пароль. Этот пользователь относится к каждому устанавливаемому дистрибутиву и не имеет отношения к пользователю Windows. После создания пользователя, он станет пользователем по умолчанию (будет автоматически входить в систему при запуске) и учетная запись будет считаться администратором Linux (с правами выполнения sudo
).
Изменение языка дистрибутива
При установке дистрибутива WSL пытается автоматически определить и применить локаль в соответствии с локализацией Windows. Если ей это сделать не удаётся, можно изменить язык принудительно (после выполнения перезагрузить дистрибутив):
1
sudo update-locale LANG=en_US.UTF8
Дополнительные команды WSL
Работа дистрибутивов
Запустить дистрибутив по умолчанию в домашнем каталоге пользователя можно следующей командой:
1
wsl ~
Для запуска другого дистрибутива (не по умолчанию) следует указать параметр --distribution
:
1
wsl --distribution <DistName>
Можно запустить дистрибутив из-под другого пользователя:
1
wsl --user <Username> # или wsl -u <Username>
Дистрибутив по умолчанию указывается параметров --set-default-version
:
1
wsl --set-default <DistName>
С параметром --set-version
можно указать версию WSL (1 или 2), с которой требуется запустить тот или иной дистрибутив:
1
wsl --set-version <DistName> <VersionNumber>
Завершить работу одного конкретного или сразу всех дистрибутивов можно следующим образом:
1
2
wsl --terminate <DistName> # завершить работу <DistName>
wsl --shutdown # завершает работу всех запущенных дистрибутивов
Удаляется дистрибутив параметров -unregister
:
1
wsl --unregister <DistName>
Параметры WSL
Обновить WSL можно следующей командой:
1
2
wsl --update # версия с Microsoft Store
wsl --update --web-download # версия с Github
Текущая конфигурация WSL выводится при передаче параметра --status
или --version
:
1
2
wsl --status
wsl --version
Установить версию WSL по умолчанию (1 или 2) можно параметром --set-default-version
:
1
wsl --set-default-version <VersionNumber>
Монтировать дополнительные разделы в дистрибутивы можно параметром --mount
. Он содержит следующие ключи:
--vhd
- указывает, что монтируется виртуальный жесткий диск;--name
- монтируется диск с пользовательским именем;--bare
- подключает, но не монтирует диск;--type <Filesystem>
- тип файловой системы, используемый при монтировании (ext4 по умолчанию);--partition <PartNumber>
- порядковый номер раздела при монтировании.
Для монтирования разделов необходимы права администратора
1
wsl --mount C:\Users\Profile\Projects\FirstProject
Размонтировать один конкретный раздел или все можно командой --unmount
:
1
2
wsl --unmount <DiskPath> # размонтировать <DiskPath>
wsl --unmount # размонтировать все диски и разделы
Список дистрибутивов
Команда --list
показывает список дистрибутивов. Дополнительный ключ к команде может отфильтровать вывод:
--all
- показывает все дистрибутивы;--verbose
- показывает установленные дистрибутивы;--running
- показывает только запущенные дистрибутивы;--quiet
- отображает только названия.
1
wsl --list --running
Работа с WSL
Изменение хостнейма
Для начала необходимо добавить нужное имя в файл /etc/wsl.conf
в раздел network
:
1
2
3
[network]
hostname = ubuntu_wsl
generateHosts = false
После этого следует поменять хостнейм в файле /etc/hostname
:
1
2
ubuntu_wsl
/etc/hostname
Взаимодействие с Windows
Для максимальной производительности рекомендуется хранить файлы для работы в Linux в файловой системе WSL - в той же операционной системе, где они используются. Доступ к файлам возможен из разных ОС, но это значительно снижает производительность.
В дистрибутивах можно вызывать приложения WIndows и передавать в параметр файлы и каталоги Linux. Например, чтобы открыть текущий каталог в стандартном проводнике (Explorer), необходимо написать:
1
explorer.exe .
С файлами ситуация аналогичная:
1
notepad.exe .bashrc
В названии приложения обязательно нужно указывать разрешение (exe
).
Это работает и в обратную сторону - утилиты Linux можно запускать напрямую из PowerShell. Например, чтобы отобразить содержимое какого-либо каталога Windows, можно ввести:
1
wsl ls -la
Можно смешивать команды Windows и Linux. Например, можно отобразить список файлов ls -la
и отфильтровать результаты командой PowerShell findstr
или наоборот - отобразить каталоги командой dir
и отфильтровать командой grep
1
2
wsl ls -la | findstr "git"
dir | wsl grep git
Запуск графических приложений Linux
WSL 2 поддерживает запуск приложений с графическим интерфейсом (X11 и Wayland) в Windows с полностью интегрированным интерфейсом для ПК. Их можно запускать из меню “Пуск” Windows, закреплять на панели задач, переключаться между приложениями по Alt+Tab. Приложения поддерживают буфер обмена Windows.
Для запуска графических приложений необходим драйвер vGPU:
- Драйвер графического процессора Intel
- Драйвер графического процессора AMD
- Драйвер графического процессора NVIDIA
Для запуска приложения из консоли достаточно написать только его название или название с файлом (например, для редактирования) на примере gedit:
1
2
gedit
gedit .bashrc
Сетевые приложения
IP-адрес хост-машины и IP-адрес Linux-дистрибутива в WSL могут быть разными. IP-адрес хост-машины - это IP-адрес самого компьютера, а IP-адрес Linux-дистрибутива - это IP-адрес, который присваивается в виртуальной сети WSL. Обычно IP-адрес Linux-дистрибутива настраивается автоматически и не зависит от настроек хост-машины.
1
2
wsl hostname -i # IP-адрес дистрибутива
cat /etc/resolv.conf # IP-адрес компьютера с Windows
Управление дисковым пространством
WSL 2 использует платформу виртуализации для установки дистрибутивов Linux вместе с основной операционной системой Windows, создавая виртуальный жесткий диск (VHD
) для хранения файлов для каждого из устанавливаемых дистрибутивов Linux. Эти жесткие диски используют тип файловой системы ext4
и представлены на жестком диске Windows в виде файла ext4.vhdx
. WSL автоматически изменяет размер этих файлов VHD в соответствии с потребностями хранилища. По умолчанию каждому VHD-файлу, используемому WSL 2, изначально выделяется максимальный объем дискового пространства в 1 ТБ.
Проверить объем дискового пространства, доступного на VHD для дистрибутива Linux, установленного вместе с WSL 2, с помощью команды Linux df
.
1
wsl.exe --system -d <distribution-name> df -h /mnt/wslg/distro
Выходные данные будут включать:
- идентификатор файловой системы VHD;
- общий размер диска;
- используемый объем пространства;
- доступный объём свободного места;
- процент использования;
- путь к каталогу, в который смонтирован диск.
Путь к файлу диска:
1
(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '<distribution-name>' }).GetValue("BasePath") + "\ext4.vhdx"
Конфигурации WSL и дистрибутивов
Файлы wsl.conf
и .wslconfig
используются для настройки дополнительных параметров для каждого дистрибутива (wsl.conf
) или глобально для всех дистрибутивов WSL 2 (.wslconfig
).
- файл
wsl.conf
хранится в каталоге/etc
в виде файла. Используется для настройки параметров каждого дистрибутива WSL 1 и WSL 2; - файл
.wslconfig
хранится в%UserProfile%
каталоге. Используется для настройки всех дистрибутивов Linux, работающих под управлением WSL 2.
WSL обнаруживает существование этих файлов, читает их содержимое и автоматически применяет параметры при каждом запуске. Если файл отсутствует или содержит ошибку, то WSL продолжит запускаться в обычном режиме, но без применения параметров конфигурации.
wsl.conf
Файл wsl.conf
настраивает параметры для каждого дистрибутива отдельно:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[boot] # доступна только на Windows 11 и Server 2022
systemd=true # включает поддержку systemd
command="" # строка команд, которые должны запускаться при запуске экземпляра WSL. Команда запускается от имени root
# command=service docker start
[automount]
enabled=true # автоматически монтировать диски Windows (C:\ и другие) с помощью DrvFs в /mnt/
mountFsTab=true # автоматически обрабатывает /etc/fstab при запуске дистрибутива
root=/mnt/ # устанавливает каталог, куда будут монтироваться диски Windows
options="" # параметры автоматического монтирования
# options = "metadata,uid=1003,gid=1003,umask=077,fmask=11,case=off"
[network]
generateHosts=true # WSL сам генерирует файл /etc/hosts
generateResolvConf=true # WSL сам генерирует файл /etc/resolv.conf
hostname="Hostname" # устанавливает имя Unix-компьютера. По умолчанию - имя компьютера Windows
[interop]
enabled=true # установка этого ключа в true означает поддержку запуска Windows-процессов
appendWindowsPath=true # установка этого ключа определяет, будет ли WSL добавлять элементы пути Windows в переменную окружения $PATH
[user]
default=Username # пользователь по умолчанию
.wslconfig
Файл .wslconfig
настраивает параметры глобально для всех дистрибутивов Linux, работающих с WSL 2.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[wsl2]
kernel=path # абсолютный путь Windows к пользовательскому ядру Linux
memory=4GB # объём выделяемой памяти для WSL (по умолчанию 50% или 8 Гбайт - меньшее из них)
processors=10 # сколько логических процессов назначить WSL. По умолчанию - столько же, сколько и Windows
localhostForwarding=true # логическое значение, указывающее, должны ли порты, привязанные к wildcard или localhost в виртуальной машине, подключаться с хоста через localhost:port
kernelCommandLine=blank # дополнительные аргументы командной строки ядра
safeMode=false # запускает экземпляр WSL в безопасном режиме
swap=25% # сколько виртуальной памяти добавить к дистрибутиву
swapFile=path # абсолютный путь к файлу swal
pageReporting=true # позволяет Windows освобождать неиспользуемую в WSL память
guiApplications=true # включение поддержки графических приложений (только в Windows 11)
debugConsole=false # логическое значение для включения окна консоли вывода, отображающего содержимое dmesg при запуске экземпляра дистрибутива WSL (только в Windows 11)
nestedVirtualization=true # включение вложенной виртуализации (только в Windows 11)
vmIdleTimeout=60000 # количество миллисекунд, в течение которых виртуальная машина простаивает, прежде чем она будет выключена (только в Windows 11)
Резервное копирование и перемещение
Лучший способ создать резервную копию или переместить дистрибутивы (в рамках одного ПК или на другой) - использовать команды экспорта и импорта, доступные в Windows с версии 1809. Можно экспортировать весь дистрибутив в архив с помощью команды wsl --export
. Затем его импортировать обратно в WSL с помощью команды wsl --import
, которая может указать новое расположение для импорта, что также сохранять состояния дистрибутива.
Экспорт дистрибутива требует много места на жестком диске. Если места недостаточно, то можно использовать методы Linux для перемещения всех файлов:
- архивировать домашний и другие необходимые каталоги командой
tar -czf <archiveName> <directory>
. После переноса на новый дистрибутив архив следует разархивировать командойtar -xzf <archiveName>
; - можно экспортировать список установленных пакетов через
apt
:dpkg --get-selections | grep -v deinstall | awl '{print $1}' > packages.txt
, а затем установить все приложения на новом дистрибутиве командойsudo apt install -y $(cat packages.txt)
.
При экспорте можно указать ключ --vhd
, указывающий, что дистрибутив следует экспортировать в виде файла VHDX
.
Команду импорта можно дополнить ключами --version <Version
- указывающий версию WSL (1 или 2) и --vhd
- указывающий, что представленный файл является файлом VHDX
, а не файлом tar.gz.
Файл tar можно получить разными способами, например:
- загрузить с сайта разработчика (при наличии);
- экспортировать контейнер дистрибутива.
Далее файл tar нужно импортировать в WSL:
1
2
3
4
5
6
7
# экспорт
wsl --export <DistName> <Filename>
wsl --export Debian C:\WSLDistros\export.tar.gz
# импорт
wsl --import <DistName> <InstallLocation> <FileName>
wsl --import Debian C:\Users\username\WSL\ C:\Users\username\export.tar.gz