Если инфорация оказалась интересна и/или полезна, не побрезгуйте, оставьте комментарий ;)

понедельник, 26 сентября 2022 г.

Запуск WSL (Windows Subsystem for Linux) с systemd под Windows 11

В новостях прошла весть, что теперь WSL поддерживает демон systemd. В качестве преимущества использования systemd предлагается установка и запуск приложений и сервисов через snap. Для примера приведены Nextcloud, LXD, MySQL, MicroK8s и Docker. Я пока в преимущества самого snap не вникал. Но возможность запуска и управления демонами через systemd привлекает.

Начинаем с установки "Virtual Machine Platform". Запускать команду надо от имени администратора в консоли PowerShell:

PS C:\> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all
Cистема DISM
Версия: 10.0.22000.653
Версия образа: 10.0.22000.1042
Включение функций
[==========================100.0%==========================]
Операция успешно завершена.

Для запуска systemd нужна WSL версия 0.67.6. Статья на сайте Microsoft рекомендует установить предварительную версию WSL из магазина приложений. Проблема в том, что в магазине версия 0.66. Для установки WSL Preview требуется Windows 11 (сборка 22000 или более новая).

Поступаем следующим образом. Ставим из магазина приложений "устаревшую" версию (0.66), чтобы в дальнейшем получать обновления на нее. А дальше качаем с GitHub нужную нам версию 0.67.6. Она последняя доступная на момент написания статьи. Возможно, на момент прочтения выйдут версии поновее. При запуске скаченного с GitHub пакета Менеджер установки предложит обновить WSL до нужной нам версии, то есть распознает, что WSL Preview у вас уже установлен. Это позволит в будущем обновлять WSL Preview автоматически встроенными в магазин приложений средствами

Какие команды могут помочь. Проверка версии WSL.

PS C:\> wsl.exe --version
Если команда не распознает параметр "--version", значит у вас старая версия WSL (0.65 и ниже).
Недопустимый параметр в командной строке: --version
(c) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.
Использование: wsl.exe [Аргумент] [Параметры...] [Командная строка]
....
В этом случае будет работать параметр "--status":
PS C:\> wsl --status
Распределение по умолчанию: Ubuntu-20.04
Версия по умолчанию: 2
Подсистема Windows для Linux в последний раз обновлена 21.06.2022
Включены автоматические обновления WSL.
Версия ядра: 5.10.102.1
В версии 0.66 параметр "--version" (-v) и статус "--status" дают следующий вывод:
PS C:\> wsl --status
Default Distribution: Ubuntu-20.04
Default Version: 2
WSL version: 0.66.2.0
Kernel version: 5.15.57.1
WSLg version: 1.0.42
MSRDC version: 1.2.3401
Direct3D version: 1.606.4
DXCore version: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows version: 10.0.22000.978
PS C:\> wsl --version
WSL version: 0.66.2.0
Kernel version: 5.15.57.1
WSLg version: 1.0.42
MSRDC version: 1.2.3401
Direct3D version: 1.606.4
DXCore version: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows version: 10.0.22000.978
А вот в версии 0.67 вывод параметра "--status" меняет формат:
PS C:\> wsl --status
Default Distribution: Ubuntu-20.04
Default Version: 2
Итого, надо добиться того, чтобы версия WSL ("WSL version" в выводе команды) была 0.67.6.0.
PS C:\> wsl -v
WSL version: 0.67.6.0
Kernel version: 5.15.62.1
WSLg version: 1.0.44
MSRDC version: 1.2.3401
Direct3D version: 1.606.4
DXCore version: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows version: 10.0.22000.1042
PS C:\> wsl --status
Default Distribution: Ubuntu-20.04
Default Version: 2

Я предполагаю, что уже есть созданная виртуальная среда в WSL. Кратко, как создать, если еще нет. Смотрим список доступных систем в WSL:

PS C:\> wsl.exe --list --online
The following is a list of valid distributions that can be installed.
Install using 'wsl.exe --install '.
NAME               FRIENDLY NAME
Ubuntu             Ubuntu
Debian             Debian GNU/Linux
kali-linux         Kali Linux Rolling
SLES-12            SUSE Linux Enterprise Server v12
SLES-15            SUSE Linux Enterprise Server v15
Ubuntu-18.04       Ubuntu 18.04 LTS
Ubuntu-20.04       Ubuntu 20.04 LTS
OracleLinux_8_5    Oracle Linux 8.5
OracleLinux_7_9    Oracle Linux 7.9
Далее ставим выбранный дистрибутив параметром "--install", пример:
PS C:\> wsl.exe --install Ubuntu
В конце установки предложат ввести имя пользователя Linux и пароль для него.

После установки надо в файл /etc/wsl.conf добавить ключ для запуска systemd. В моем случае файл /etc/wsl.conf не существовал и был создан при редактировании:

user@DESKTOP:~$ sudo vim /etc/wsl.conf
[boot]
systemd=true
Важно, файл редактируется в гостевой системе Linux, не на хосте.

Перезапускаем WSL:

PS C:\> wsl.exe --shutdown
В консоли Linux появится сообщение:
user@DESKTOP:~$
[process exited with code 1 (0x00000001)]
Вообще рекомендую команду "wsl.exe --shutdown" вводить после каждого изменения в WSL. Чтобы запустить WSL после остановки, нужно открыть заново консоль гостевой ОС.

Проверяем, что всё получилось:

user@DESKTOP:~$ systemctl list-unit-files --type=service
UNIT FILE                                  STATE           VENDOR PRESET
accounts-daemon.service                    masked          enabled
apparmor.service                           enabled         enabled
apport-autoreport.service                  static          -
apport-forward@.service                    static          -
apport.service                             generated       -
apt-daily-upgrade.service                  static          -
apt-daily.service                          static          -
atd.service                                masked          enabled
autovt@.service                            alias           -
blk-availability.service                   enabled         enabled
bolt.service                               static          -
clickhouse-server.service                  masked          enabled
cloud-config.service                       enabled         enabled
cloud-final.service                        enabled         enabled
cloud-init-hotplugd.service                static          -
.........
И, например, так
user@DESKTOP:~$ systemctl status networkd-dispatcher.service
● networkd-dispatcher.service - Dispatcher daemon for systemd-networkd
     Loaded: loaded (/lib/systemd/system/networkd-dispatcher.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2022-09-25 23:57:28 MSK; 37s ago
   Main PID: 133 (networkd-dispat)
      Tasks: 1 (limit: 9390)
     Memory: 16.8M
     CGroup: /system.slice/networkd-dispatcher.service
             └─133 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
Sep 25 23:57:27 DESKTOP systemd[1]: Starting Dispatcher daemon for systemd-networkd...
Sep 25 23:57:28 DESKTOP networkd-dispatcher[133]: No valid path found for iwconfig
Sep 25 23:57:28 DESKTOP networkd-dispatcher[133]: No valid path found for iw
Sep 25 23:57:28 DESKTOP systemd[1]: Started Dispatcher daemon for systemd-networkd.
Sep 25 23:57:28 DESKTOP networkd-dispatcher[133]: WARNING:Unknown index 7 seen, reloading interface list

Всё, можно пользоваться. Примеры использования есть на видео и в статье выше:

Эта же статья на Хабре

Комментариев нет: