Глава 2. Включение WSL

По умолчанию WSL не поставляется разрешённым в Windows; его следует включать через графический интерфейс или командную строку. WSL может быть включён во всех редакциях или "SKU" Windows, включая Windows 10 Home, Professional, Enterprise и Server. Существует множество способов разрешения WSL в Windows 10. Как разрешать WSL зависит от вашего уровня комфортности. Новички могут пожелать воспользоваться вариантом графического интерфейса, а опытные пользователи могут предпочесть применение PwerShell, в то время как управляющие флотилиями машин Windows системные администраторы могут пользоваться DISM.

В программах и функциональных возможностях

В Windows 10, кликните по кнопке Start (Пуск), наберите “features” (компоненты) и выберите “Turn Windows features on or off” (Включение или отключение компонентов Windows). В меню “Windows Features” (Компоненты Windows) (Рисунок 2-1) прокрутите вниз и проверьте “Windows Subsystem for Linux” (Подсистема Windows для Linux) для включения WSL1. Чтобы разрешить и WSL2, выберите также и “Virtual Machine Platform” (Платформа виртуальной машины).

 

Рисунок 2-1


Графическое меню для включения или отключения функциональных возможностей Windows

Кликните “OK” разрешая эти функциональные возможности включёнными и затем перезапуститесь.

Одним из недостатков метода графического интерфейса является то, что WSL1 останется установленным вами по умолчанию даже когда включён WSL2 в Windows 10 1909 и более позднем. Чтобы установить WSL2 в качестве запускаемого по умолчанию (Рисунок 2-2), откройте PowerShell в качестве Администратора и выполните


PS C:\> wsl.exe --set-default-version 2
		
 

Рисунок 2-2


Установка WSL2 в качестве версии WSL по умолчанию

При помощи PowerShell

Для включения WSL при помощи PowerShell (Рисунок 2-3) откройте его от имени Администратора и выполните


PS C:\> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart
		
 

Рисунок 2-3


Включение функциональной возможности WSL1 в Windows 10 при помощи PowerShell

Чтобы затем включить WSL2 в Windows 10 1909 или более позднем (Рисунок 2-4), выполните


PS C:\> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart
		
 

Рисунок 2-4


Включение функциональной возможности WSL2 в Windows 10 при помощи PowerShell

Позвольте этим функциональным возможностям оставаться разрешёнными и затем перезапуститесь:


PS C:\> Restart-Computer
		

Если вы разрешили WSL2, вы можете установить WSL2 в качестве своего выбора по умолчанию (Рисунок 2-5). Откройте как Администратор PowerShell и исполните (Рисунок 2-5):


PS C:\> wsl.exe --set-default-version 2
		
 

Рисунок 2-5


Установка WSL2 в качестве версии WSL по умолчанию

С применением DSIM

Некоторым администраторам может быть более знакомым инструмент DISM (Deployment Image Servicing and Management, Обслуживание образов развёртывания и управление ими). Чтобы разрешить WSL1 с применением DISM (Рисунок 2-6), откройе в качестве Администратора PowerShell и выполните


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

Рисунок 2-6


Включение функционалной возможности WSL1 в Windows 10 при помщи DISM

Далее, чтобы разрешить при помощи DISM WSL2 (Рисунок 2-7), исполните


PS C:\> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
		
 

Рисунок 2-7


Включение функциональной возможности WSL2 в Windows 10 при помощи DISM

Позвольте этим функциональным возможностям оставаться разрешёнными и затем перезапуститесь:


PS C:\> Restart-Computer
		

Если вы разрешили WSL2, вы можете настроить WSL2 своим выбором по умолчанию (Рисунок 2-8). Откройте от имени Администратора PowerShell и запустите


PS C:\> wsl.exe --set-default-version 2
		
 

Рисунок 2-8


Установка WSL2 в качестве версии WSL по умолчанию

Воспользовавшись wsl.exe --install

В сборке 2020 Microsoft анонсировала что в Windows поступит новая функциональная возможность включения WSL на всех пригодных версиях Windows 10. Для разрешения WSL при помощи этого метода (Рисунок 2-9), откройте в качестве Администртаора PowerShell и исполните


PS C:\> wsl.exe --install
		
 

Рисунок 2-9


Включение WSL в Windows 10 при помощи wsl.exe --install

Эта функциональная возможность в конечном счёте будет перенесена на существующие каналы обслуживания Windows 10, которые всё ещё поддерживаются. Она включит WSL2 по умолчанию, обновит ядро WSL2 и установит поддержку графического интерфейса в подходящих версиях Windows 10.

Установка дистрибутива при помощи wsl.exe --install

Ещё одна функциональная возможность утилиты wsl.exe, доступная в сборках Windows с номерами 20211 и выше, это возможность устанавливать дистрибутивы Linux непосредственно из Windows Store, то есть без применения приложения Store для их поиска.

Для просмотра списка доступных дистрибутивов запустите


PS C:\> wsl.exe --list --online
		

Это {Прим. пер.: начиная со сборки 20211 Windows 10!} выдаст на печать таблицу из двух столбцов, перечисляющую все доступные дистрибутивы в Windows Store (Рисунок 2-10). Эта таблица отображает все названия дистрибутивов, которые вы можете применять для установки при помощи wsl.exe, а также “дружественное название” в качестве описания, позволяющего вам ясно видеть чем является каждый дистрибутив.

 

Рисунок 2-10


Вывод wsl.exe --list --online отображает все установленные дистрибутивы

Для установки некого дистрибутива из этого перечня, например, “Ubuntu-16.04”, исполните (Рисунок 2-11)


PS C:\> wsl.exe --install -d Ubuntu-16.04
		
 

Рисунок 2-11


Применение wsl.exe для установки в WSL Ubuntu 16.04

Теперь должно всплыть новое терминальное окно с обычным потоком установки соответствующего дистрибутива. Для Ubuntu-16.04 оно включает в себя настройку имени пользователя и пароля для вашего пользователя Windows.

Применение DSIM для включения WSL в образе

WSL может быть разрешён в неком образе Windows для целей работы с образами при помощи DSIM. Создайте некий образ Windows, включите WSL, загрузите сторонним образом свой дистрибутив WSL из соответствующего .appx и затем следуйте необходимым этапам введения в общее употребление вашего образа и создания установочного производного образа: https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/work-with-windows-images.

В гостевых Hyper-V

WSL поддерживается в гостевых Windows 10 под Hyper-V. Hyper-V может быть полезным при испытании новых функциональных возможностей WSL в сборках канала разработчиков (Dev) и канала Beta Windows 10 прежде чем развёртывать их в промышленное применение.

Hyper-V требует редакций Windows 10 Pro, Enterprise или Education а также процессора Intel с расширениями виртуализации VT-x. Такие расширения виртуализации Intel вначале должны быть разрешены в BIOS/ UEFI вашей системы. На момент написания Microsoft анонсировал предварительную поддержку для вложенной виртуализации в процессорах AMD, причём с последующей поддержкой для вложений KVM.

После того как вы разрешили их в своём BIOS/ UEFI, расширения виртуализации должны быть выставлены в ваш гостевой Hyper-V. Для выставления расширений виртуализации в ваш гостевой Hyper-V откройте PowerShell от имени Администратора в вашем устройстве хоста и выполните (Рисунок 2-12)


PS C:\> Set-VMProcessor -VMName "Virtual Machine Name" -ExposeVirtualizationExtensions $true
		

где “Virtual Machine Name” это название вашего гостевого Hyper-V. Если вы испытываете проблемы запуска своего гостевого Hyper-V или относящиеся к Hyper-V функциональные возможности в вашем госте запрещены, повторно проверьте разрешение расширений виртуализации в своём BIOS| UEFI и то что вы выставили расширения виртуализации для своего правильного гостя Hyper-V.

 

Рисунок 2-12


Выставление расширений виртуализации в некую гостевую виртуальную машину Hyper-V

Установка дистрибутива Linux в WSL

Выбор дистрибутива

После того как WSL разрешена, вы должны установить некий дистрибутив Linux, обычно сокращаемый как “дистро”. На момент публикации для WSL в Microsoft Store были доступны следующие дистрибутивы:

  • Ubuntu

  • Ubuntu 20.04 LTS

  • Ubuntu 18.04 LTS

  • Debian

  • Pengwin

  • Pengwin Enterprise

  • Fedora Remix for WSL

  • SUSE Linux Enterprise Server 15 SP1

  • SUSE Linux Enterprise Server 12 SP5

  • openSUSE Leap 15.2

  • Alpine WSL

Вы можете уже быть знакомы с некоторыми из предыдущих дистрибутивов. Подлежащие рассмотрению стороны при выборе дистрибутива включают в себя

  • Знакомство со специфичными для дистрибутива инструментами - Например, Ubuntu, Debian и Pengwin применяют диспетчер пакетов apt, который пользуется файлами .deb. Fedora применяет в качестве диспетчера пакетов dnf, а openSUSE и SUSE применяют zypper, которые пользуются файлами пакетов .rpm.

  • Поддержка дистрибутива приложениями Linux, которые вы бы желали применять - Вам следует проверить чтобы убедиться что те приложения Linux, которые вы хотели бы применять доступны в репозиторяих того дистрибутива, который вы выбираете. Если это не так, многие восходящие потоки проектов будут предлагать Ubuntu- совместимые файлы .deb или даже свои собственные репозитории apt.

  • Доступность поддержки для WSL применяемого промышленных средах - Платная поддержка доступна от Canonical для Ubuntu и от Фонда Whitewater для Pengwin.

  • Особенные для WSL функциональные возможности в дистрибутивах - Ubuntu, Pengwin и Fedora Remix дл WSL содержат wslutilities, набор утилит с открытым исходным кодом для WSL.

Обсуждение: версия WSL при установке

Когда вы разрешили WSL1 и WSL2, вы имеете вариантом установки дистро либо под 1, либо под 2.

Когда вы устанавливаете дистро из Store или вручную при помощи файла пакета .appx, как это подробно будет описано позднее, он будет установлен в выбранной вами по умолчанию версии WSL.

Для установки выбираемой вами версии WSL по умолчанию, откройте PowerShell и выполните


PS C:\> wsl.exe --set-default-version <version>
		

Чтобы установить в качестве выбранной по умолчанию WSL2 исполните следующее (Рисунок 2-13)


PS C:\> wsl.exe --set-default-version 2
		
 

Рисунок 2-13


Установка WSL2 в качестве версии WSL по умолчанию

Преобразование дистро между WSL1 и WSL2 рассматривается в Главе 3, Управление дистрибутивами WSL.

Установка из Microsoft Store

Рекомендуемым методом установки дистро WSL является их установка из Microsoft Store. Нет необходимости ни в какой учётной записи для выгрузки доступных бесплатно дистрибутивов, таких как Ubuntu. Для установки некого дистрибутива отыщите в Store его запись. После определения её местоположения (Рисунок 2-14), кликните “Get” с последующим “Install”. Дождитесь завершения выгрузки и потом кликните “Launch”.

 

Рисунок 2-14


Ubuntu для WSL в Microsoft Store

Вы также можете запустить необходимый дистрибутив из меню Пустк или его исполняемый псевдоним из PowerShell, например, “ubuntu.exe” для Ubuntu. Эта книга в первую очередь пользуется в примерах Ubuntu.

При своём первом запуске выбранный дистро будет распакован и вы настроите устанавливаемого по умолчанию пользователя не root (Рисунок 2-15). Этот пользователь отличается от имени пользователя и пароля вашего клиента Windows.

 

Рисунок 2-15


Создание нового пользователя по умолчанию для Ubuntu в WSL

В большинстве дистро WSL такой не root пользователь будет добавлен в пользовательскую группу Linux sudo или wheel, поэтому вы можете выдавать привилегированные команды со следующей за ним административной командой. Более подробное обсуждение sudo включено в Главу 4, Сопровождение дистрибутива Linux.

Сторонняя установка файла .appx в режиме разработчика

Если у вас нет доступа к Microsoft Store существуют дополнительные варианты установки дистро WSL. Дистро Linux в Microsoft Store упакованы с применением приложения формата пакетирования .appx. Имеется возможность сторонней загрузки пакетов .appx в устройствах, которые не имеют разрешённого доступа к Microsoft Store. Для разрешения сторонней загрузки приложений Windows 10 должен быть установлен в режим разработчика. Это можно выполнить в Settings ➤ Update & Security ➤ For developers (Параметры ➤ Обновления и безопасность ➤ Для разработчиков) и включите “Install apps from any source, including loose files” (Установка приложений из любого источника, включая свободные файлы) (Рисунок 2-16).

 

Рисунок 2-16


Панель "Для разработчиков" в настройках Windows 10 для включения .appx сторонних разработчиков, также носящего название "режим разработчика"

Вы получите приглашение на ввод с предупреждением относительно наличия риска установки и запуска прикладного приложения извне Microsoft Store (Рисунок 2-17).

 

Рисунок 2-17


Предостерегающее сообщение, отображаемое при включении режима разработчика

В загружаемых со стороны .appx существует риск. Вам следует рассматривать .appx как некий .exe и проверить его источник перед установкой. .appx WSL не содержатся как прочие приложения Store и обладают полным доступом к большинству ваших систем Windows. Вы можете разрешить режим разработчика если у вы предприняли разумные меры предосторожности. Проверенные .appx большинства дистро доступных для WSL могут быть выгружены напрямую с Microsoft https://docs.microsoft.com/en-us/windows/wsl/install-manual.

Вы также можете обнаруживать .appx дистро Linux из проектов GitHub. Проверьте качество репутации такого проекта прежде чем устанавливать .appx WSL, который вы найдёте в Интернете. Вредоносный .appx способен вызвать серьёзные разрушения в вашей системе.

Для устновки некого .appx, дважды кликните по этому .appx в File Explorer (Проводнике) и кликните “Install” (Рисунок 2-18).

 

Рисунок 2-18


Меню установки при сторонней загрузке дистрибутива WSL из .appx

Импорт Tarball при помощи wsl.exe --import

Дистро WSL могут также устанавливаться непосредственно из корневой файловой системы файла tar. Корневая файловая система, именуемая rootfs, это моментальный снимок рабочей установки дистрибутива Linux, доставляемый в файле tar и сжатый как файл gzip. Они бдут иметь расширение файла .tar.gz.

Rootfs может выгружаться напрямую из некоторых дистрибутивов Linux. Также имеются собранные в GitHub сторонние rootfs. Ubuntu предоставляет еженощные сборки rootfs для своих версий LTS (Long Term Support, версий с длительной поддержкой, 18.04, 20.04 и т.п.), которые расположены в Microsoft Store. Ubuntu также предоставляет еженощные сборки rootfs для своих промежуточных версий, которые выпускаются каждые шесть месяцев и и обладают новейшими версиями пакетов. Ubuntu публикует tarball rootfs для WSL в своём сервере облачного образа в https://cloud-images.ubuntu.com/, организованного по кодовым именам выпусков (Рисунок 2-19).

 

Рисунок 2-19


Каталог, перечисляющий образы Ubuntu по кодовым названиям выпусков

Отыщите кодовое название того выпуска Ubuntu, который вы бы желали выгрузить. Чтобы проверить соответствие кодового названия номеру версии Ubuntu, например, 20.04, обратитесь к https://releases.ubuntu.com/ (Рисунок 2-20).

 

Рисунок 2-20


Перечень поддерживаемых в настоящее время выпусков Ubuntu

Подробное обсуждение цикла выпусков Ubuntu можно найти в https://ubuntu.com/about/release-cycle.

В данном примере мы выгрузим Ubuntu Groovy Gorilla, кодовое название промежуточного выпуска Ubuntu 20.10. Мы начнём с https://cloud-images.ubuntu.com/ (Рисунок 2-17). Кликните по “groovy”, а затем “current”, и вы обнаружите себя на странице, перечисляющей сборки для широкого диапазона платформ (Рисунок 2-21).

 

Рисунок 2-21


Перечень сборок Ubuntu для некого диапазона платформ

Сборка для WSL завершается на -<platform>-wsl.rootfs.tar.gz. Определите правильную сборку для архитектуры своей системы, либо amd64, либо arm64. Пользователи процессоров Intel и AMD должны выгружать образ amd64: groovy-server-cloudimg-amd64-wsl.rootfs.tar.gz. Если у вас устройтво ARM, такое как Surface Pro X, вам надлежит выгрузить образ arm64: groovy-server-cloudimg-arm64-wsl.rootfs.tar.gz.

Образы rootfs из Ubuntu обладают “server” в имени своего файла, потому что они собраны из той же основы, что и сервер Ubuntu.

Для выгрузки rootfs под вашу архитектуру откройте PowerSell и исполните


PS C:\> wsl.exe --import <name for distro> <location to unpack rootfs> <location of rootfs> [optionally: --version <version of WSL to install in>]
		

Например, как показаноь на (Рисунке 2-22):


PS C:\> wsl.exe --import UbuntuGroovy-2 C:\WSL\Ubuntu-Groovy-2 $HOME\Downloads\groovy-server-cloudimg-amd64-wsl.rootfs.tar.gz --version 2
		
 

Рисунок 2-22


Импорт сборки Ubuntu groovy из rootfs с последующим перечислением всех установленных дистрибутивов

Имеется возможность установки одного и того же rootfs под различными названиями дистро чтобы обладать множеством дистро для различных целей. На (Рисунке 2-22). вы можете видеть, что имеются установленными множество версий Ubuntu Groovy, под именами Ubuntu-Groovy, Ubuntu-Groovy-2, а также для особой цели я создал версию под работу с GPU, которую я назвал Ubuntu-Groovy-GPU. Дублирующая установка дистро обсуждается в Главе 3, Управление дистрибутивами WSL.

Когда вы устанавливаете некий rootfs при помощи wsl.exe --import, нет никакой создаваемой в меню Пуск (Start) иконки; вам следует запускать такой дистро из PowerShell применяя


PS C:\> wsl.exe -d <name for distro>
		

Тем не менее, если вы пользуетесь новым Терминалом Windows, он автоматически наполняется импортируемыми вами дистрибутивами (Рисунок 2-23).

 

Рисунок 2-23


Установленные дистрибутивы WSL, перечисляемые в новом Терминале Windows

Такой новый Терминал Windows доступен для выгрузки из Microsoft Store и GitHub.

Терминал Windows является значительным обновлением по сравнению с наследуемым приложением консоли в Windows 10. Настоятельно рекомендуется применять его с WSL и PowerShell.

Когда вы устанавливаете rootfs с применением wsl.exe –import, нет никаких дополнительно создаваемых по умолчанию не привилегированных пользователей. Вместо этого вы запускаете такой дистрибутив в качестве root.

Вы можете создать нового пользователя по умолчанию в Ubuntu (Рисунок 2-24) при помощи


$ adduser <username>
		

Например:


$ adduser hayden
		
 

Рисунок 2-24


Создание вручную нового пользователя в Ubuntu

Если вы пожелаете для этого нового пользователя применять команду sudo, вам следует добавить этого нового пользователя в группу sudo:


$ usermod -aG sudo <username>
		

Например:


$ usermod -aG sudo hayden
		

Для переключения на этого нового пользователя с root (Рисунок 2-25), воспользуйтесь


$ su hayden
		
 

Рисунок 2-25


Применение команды su для переключения на нового пользователя с последующим whoami для проверки

Чтобы начинать дистрибутив в качестве созданного вами пользователя выполните из PowerSell (Рисунок 2-26)


PS C:\> wsl.exe -d <distro name> -u <username>
		

Например:


PS C:\> wsl.exe -d Ubuntu-Groovy -u hayden
		
 

Рисунок 2-26


Запуск дистрибутива WSL от имени определённого пользователя из PowerShell

Механики установки WSL

Местоположение установки

Дистрибутивы WSL устанавливаются как образы rootfs, будь то упакованная поставка из Store, в .appx или необработанный rootfs. При установке из Microsoft Store или при сторонней загрузке через .appx, такой rootfs снабжается дополнительным трактом для регистрации этого дистро через API WSL, создания иконок меню Пуск, предоставления некого исполняемого псевдонима (“ubuntu.exe”) и создания пользователя по умолчанию с полномочиями sudo. Такой дополнительный тракт слегка различается на основе дистро. Официальный шаблон от Microsoft доступен с https://github.com/microsoft/WSL-DistroLauncher.

Устанавливаемые из Store или при сторонней загрузке через .appx будут устанавливаться совместно с прочими пакетами UWP Windows в C:\Users\<username>\AppData\Local\Packages\.

В WSL1 rootfs распаковывается при своём первом запуске в файловой системе по адресу C:\Users\<username>\AppData\Local\Packages\<Store package name>\LocalState (Рисунок 2-27).

 

Рисунок 2-27


Перечисление каталогов распакованной файловой системы WSL1

В WSL2 соответствующий rootfs распаковывается в некий файл .vhdx Hyper-V в пути C:\Users\<username>\AppData\Local\Packages\<Store package name>\LocalState\ext4.vhdx (Рисунок 2-28).

 

Рисунок 2-28


Перечисление каталогов расположенной в файле VHDX файловой системы WSL2

[Предостережение]Предостережение

Вам не следует пытаться получать доступ к вашей файловой системе WSL при помощи данного метода; такой подход может вызывать неисправимые разрушения ваших данных. Вам надлежит выполнять доступ к вашей файловой системе WSL исключительно через \\wsl$\<distro name> или через меню быстрого доступа (Quick access) в Проводнике (File explorer) из Windows 10 версии 2010 или старше.

Когда вы устанавливаете rootfs применяя wsl.exe --import, никакие дополнительные тракты помимо регистрации этого дистро в WSL не включается, а создание некого пользователя по умолчанию, отличающегося от root должно, по желанию, выполняться вручную.

Когда вы выполняете импорт rootfs применяя wsl.exe --import, этот rootfs будет распакован в местоположении, предписываемом в вашей команде:


PS C:\> wsl.exe --import <name for distro> <location to unpack rootfs> <location of rootfs> [optionally: --version <version of WSL to install in>]
		

Для WSL1 это распакует необходимую файловую систему Linux, причём, как это описывалось ранее, важно чтобы вы не изменяли это вручную. Для WSL2 распаковка будет выполнена в VHDX, файле образа виртуального жёсткого диска (Рисунок 2-29).

 

Рисунок 2-29


Перечисление индивидуальной файловой системы WSL2, расположенной в файле VHDX

Инструментарий WSL

WSL2 пользуется некоторыми компонентами, располагающимися в %SystemRoot%\system32\lxss\ для выполнения своих базовых функций (Рисунок 2-30).

 

Рисунок 2-30


Перечисление каталога %SystemRoot%\system32\lxss\

%SystemRoot%\system32\lxss\ содержит

  • LxssManager.dll - службы для управления самой средой WSL

  • LxssManagerProxyStub.dll - некая первонаяальная заглушка для загрузки LxssManager.dll позднее в процессе запуска

  • tools/ - папка, содержащая определённые прочие инструменты (смотри далее)

  • lib/ - папка, содержащая определённые библиотеки (смотри далее)

  • wslclient.dll - новая библиотека в сборках 19555+, применяемая для консолидации имеющейся функциональности wsl.exe, bash.exe, wslhost.exe, wslconfig.exe и LxssManager.dll в отдельной библиотеке

  • wslhost.exe - инструмент для сопровождения взаимодействия Windows с задачами фонового режима в WSL1

В папке tools/ имеются некоторые ключевые компоненты WSL2 (Рисунок 2-31).

 

Рисунок 2-31


Перечисление каталога %SystemRoot%\system32\lxss\tools

Подкаталог \tools\ (Рисунок 2-31) является домашним для

  • bsdtar - утилита для преобразования установок WSL в- и из- шариков tar.gz

  • ext4.vhdx.gz - предварительно отформатированная пустая файловая система ext4

  • init - init процесс WSL2, который работает в качестве PID1 в контейнерах WSL2

  • initrd.img - Первоначальный RAM диск, загружаемый ядром WSL ка часть процесса запуска

  • kernel - ядро Linux WSL2

  • license - Копия GNU General Public License 2, покрывающая соответствующее ядро Linux

В папке lib/ имеются определённые библиотеки, используемые в WSL2 для GPU в сборках 20150+ (Рисунок 2-30).

Подкаталог \lib\ (Рисунок 2-32) выступает домашним для:

  • libcuda.so, libnvidia-ml.so.1, libnvwgf2umx.so и связанных с ними библиотек поддержки для CUDA nVidia, машинного обучения и прочих функциональных возможностей вычислений GPU.

  • libdxcore.so, libd3d12.so, libd3d12core.so, libdirectml.so и связанных с ними библиотек, предоставляющих поддержку для ускорения GPU Direct3D, вооружаемого DirectX, а также машинного обучения DirectML.

 

Рисунок 2-32


Перечисление каталога %SystemRoot%\system32\lxss\lib

Этот подкаталог привязывается вовнутрь дистро WSL в /usr/lib/wsl/lib/ (Рисунок 2-33).

 

Рисунок 2-33


Перечисление каталога /usr/lib/wsl/lib, зеркалированного из %SystemRoot%\system32\lxss\lib в Windows

API WSL в Windows 10

Для более тесного исследования того что происходит при установке WSL, Microsoft предоставляет шаблон WSL-DistroLauncher, который способен предоставлять некоторые внутренние моменты. DistroLauncher содержит классическое приложение Win32 C++, launcher.exe, снабжённое ресурсами Store и tarball rootfs в неком пакете UWP. Этот код вызывает API WSL в Windows 10 для проверки значения состояния установки дистро, установки и регистрации этого дистро.

Основной код из launcher.exe располагается в DistroLauncher/DistroLauncher.cpp.

Он проверяет что WSL разрешён и если это не так, выдаёт сообщение:


if (!g_wslApi.WslIsOptionalComponentInstalled()) {
        Helpers::PrintMessage(MSG_MISSING_OPTIONAL_COMPONENT);
It then checks if the WSL distribution is installed and, if not, installs it:
if (!g_wslApi.WslIsDistributionRegistered()) {

// If the "--root" option is specified, do not create a user account.
     bool useRoot = ((installOnly) && (arguments.size() > 1) && (arguments[1] == ARG_INSTALL_ROOT));
     hr = InstallDistribution(!useRoot);
        if (FAILED(hr)) {
            if (hr == HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)) {
            Helpers::PrintMessage(MSG_INSTALL_ALREADY_EXISTS);
            }
        } else {
            Helpers::PrintMessage(MSG_INSTALL_SUCCESS);
        }
        exitCode = SUCCEEDED(hr) ? 0 : 1;
}
 	   

Создание нового пользователя и добавление его в sudo обрабатывается в DistroLauncher/DistributionInfo.cpp и вызывается непосредственно внутри самого дистро WSL:


bool DistributionInfo::CreateUser(std::wstring_view userName)
{
    // Create the user account.
    DWORD exitCode;
    std::wstring commandLine = L"/usr/sbin/adduser --quiet --gecos '' ";
    commandLine += userName;
    HRESULT hr = g_wslApi.WslLaunchInteractive(commandLine.c_str(), true, &exitCode);
    if ((FAILED(hr)) || (exitCode != 0)) {
        return false;
    }
    // Add the user account to any relevant groups.
    commandLine = L"/usr/sbin/usermod -aG adm,cdrom,sudo,dip,plugdev ";
    commandLine += userName;
    hr = g_wslApi.WslLaunchInteractive(commandLine.c_str(), true, &exitCode);
    if ((FAILED(hr)) || (exitCode != 0)) {
        // Delete the user if the group add command failed.
        commandLine = L"/usr/sbin/deluser ";
        commandLine += userName;
        g_wslApi.WslLaunchInteractive(commandLine.c_str(), true, &exitCode);
        return false;
    }
    return true;
}
 	   

Вызовы API WSL доступные в Windows 10 WSL API из wslapi.dll детализацируются в DistroLauncher/WslApiLoader.cpp:


WslIsOptionalComponentInstalled()
WslIsDistributionRegistered()
WslRegisterDistribution()
WslConfigureDistribution()
WslLaunchInteractive()
WslLaunch()
 	   

Эти вызовы API никак иначе не документированы. Тем не менее, сторонние проекты, такие как Docker Desktop и Raft WSL, пользуются ими. Проекты сообщества применяют их для создания настраиваемых пусковиков, собираемых поверх WSL.