Microsoft Windows Subsystem for Linux

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 14:03, 19 июня 2017.
Windows Subsystem for Linux
A component of Microsoft Windows
Bashwin10.png
Bash running on Windows 10
Details
Type Compatibility layer
Included with Windows 10 Anniversary Update
Replaces Microsoft Windows Services for UNIX

Windows Subsystem for Linux (WSL) — слой совместимости для запуска Linux-приложений (бинарных исполняемых файлов в формате ELF) в ОС Windows 10. В рамках сотрудничества компаний Майкрософт и Canonical стало возможным использовать оригинальный образ ОС Ubuntu 14.04 для непосредственного запуска поверх WSL множества инструментов и утилит из этой ОС без какой-либо виртуализации. WSL предоставляет интерфейсы, во многом совместимые с интерфейсами ядра Linux; однако подсистема WSL была полностью разработана корпорацией Майкрософт и не содержит в себе каких-либо исходных кодов ядра Linux. WSL запускает многие немодифицированные приложения, работающие в пространстве пользователя, в частности, оболочку bash, утилиты sed, awk, интерпретаторы языков программирования Ruby, Python и т. д.

Главное предназначение подсистемы WSL состоит в том, чтобы эмулировать Linux (на начальном этапе - Ubuntu) в пользовательском режиме. В результате можно запускать нативную оболочку Bash для Ubuntu под операционной системой Windows. Подсистема WSL еще не готова к повсеместному использованию.

История

С момента своего создания Microsoft Windows NT была разработана, чтобы позволить подсистемам среды, таким как Win32, предоставлять программный интерфейс приложениям, не привязываясь к деталям реализации внутри ядра. Это позволило ядру NT поддерживать подсистемы POSIX, OS / 2 и Win32 при первоначальном выпуске.

Ранние подсистемы были реализованы как модули пользовательского режима, которые выдавали соответствующие системные вызовы NT на основе API, который они представили приложениям этой подсистемы. Всеми приложениями были исполняемые файлы PE / COFF, набор библиотек и служб для реализации подсистемы API и NTDLL для выполнения системного вызова NT. Когда приложение пользовательского режима было запущено, загрузчик вызывал нужную подсистему, чтобы удовлетворить зависимости приложения на основе исполняемого заголовка.

Более поздние версии подсистем заменяли уровень POSIX, чтобы обеспечить подсистему для Unix-приложений (SUA). Он состоит из компонентов пользовательского режима, которые обеспечивают:

  • Управление процессами и сигналами
  • Управление терминалом
  • Системные сервисные запросы и межпроцессная связь

Основная роль SUA заключалась в том, чтобы побудить приложения переносить данные в Windows без существенных переписываний. Это было достигнуто путем реализации API-интерфейса пользовательского режима POSIX с использованием конструкций NT. Учитывая, что эти компоненты были созданы в пользовательском режиме, было сложно иметь семантическую и производительность паритета для системных вызовов режима ядра, таких как fork (). Поскольку эта модель основывалась на необходимости перекомпиляции программ, ей требовалось постоянное портирование функций и было бремя обслуживания.

Со временем эти исходные подсистемы были удалены. Однако, поскольку ядро ​​Windows NT было спроектировано с учетом новых подсистем, мы смогли использовать начальные инвестиции, сделанные в этой области, и расширить их для разработки подсистемы Windows для Linux.

О системе

Компоненты WSL

WSL - это набор компонентов, которые позволяют запускать исполняемые файлы на Linux ELF64 в Windows. Он содержит как пользовательский режим, так и компоненты режима ядра. Прежде всего, состоит из:

  • Служба диспетчера сеансов пользовательского режима, которая обрабатывает жизненный цикл экземпляра Linux
  • Поставщики драйверов Pico (lxss.sys, lxcore.sys), которые эмулируют ядро ​​Linux, переводя системные вызовы Linux
  • Процессы Pico, которые поддерживают немодифицированный пользовательский режим Linux (например, /bin /bash)

Функциональность

Пользователю доступны apt, ssh, rsync, find, grep, awk, sed, sort, xargs, md5sum, gpg, curl, wget, apache, mysql, redis, python, perl, ruby, php, gcc, tar, vim, emacs, diff, patch и большинство бинарных пакетов из архива Ubuntu, содержащих консольные и серверные приложения. При этом некоторые приложения пока остаются неработоспособны, например, из-за неполной эмуляции терминала VT100 невозможно использовать byobu, screen и tmux.

Приложения Ubuntu выполняются в отдельном представлении файловой системы, повторяющей организацию файловой иерархии в Linux. Файловые системы Windows доступны на запись в форме разделов, примонтированных в директории /mnt. Например, директория C:\Users\Kirkland\Downloads доступна как /mnt/c/Users/Kirkland/Downloads. А для Windows-приложений корневая ФС Ubuntu видна как C:\Users\Kirkland\AppData\Local\Lxss\rootfs\. Для установки дополнительных пакетов и обновления системы применяется инструментарий apt с загрузкой штатных пакетов и обновлений из репозиториев Ubuntu.

В WSL подготовлена новая инфраструктура ядра Windows, которая предоставляет слой совместимости с Linux syscall API и специальный загрузчик, что позволяет напрямую запускать уже поставляемые в Ubuntu немодифицированные исполняемые файлы, так же как запускаются обычные программы для Windows. Для WSL в ядре Windows была специально реализована поддержка fork() и некоторых других специфичных системных вызовов POSIX и Linux, что позволило добиться реализации, более эффективной, чем при использовании эмуляции.

Система может запускать серверные приложения (поддержка графических приложений не планируется), но рассчитана скорее на их тестирование, чем на развёртывание замены Linux-серверов для промышленного применения. Однако утилита sysbench демонстрирует практически эквивалентные показатели работы процессора, оперативки и операций ввода-вывода. Система прошла подавляющее большинство LTP-тестов на производительность и работает хорошо. Проект нацелен только на предоставление инструментария командной строки для разработчиков.

Установка

По умолчанию подсистемы WSL в Windows нет. Для того чтобы ее установить, необходимо включить режим разработчика Developer Mode в секции «For developers» раздела «Update & security» системных настроек Windows. Затем необходимо найти «Windows Features», выбрать пункт «Turn Windows features on or off» и включить «Windows Subsystem for Linux (Beta)». После этого нужно запустить командную строку Windows cmd.exe и ввести в ней bash, затем согласиться с установкой Ubuntu, когда появится соответствующий запрос. Пользователь будет уведомлен об окончании процесса установки и запуска новой среды.

Файловая система

Поддержка файловой системы в WSL была разработана для достижения двух целей.

  • Обеспечение среды, поддерживающей полную точность файловых систем Linux.
  • Взаимодействие с дисками и файлами в Windows

Подсистема Windows для Linux поддерживает виртуальную файловую систему, похожую на реальное ядро ​​Linux. Для обеспечения доступа к файлам в пользовательской системе используются две файловые системы: VolFs и DriveFs.

VolFs

VolFs - это файловая система, которая обеспечивает полную поддержку функций файловой системы Linux, включая:

  • Разрешения Linux, которые могут быть изменены с помощью операций, таких как chmod и chroot
  • Символические ссылки на другие файлы
  • Имена файлов с символами, которые обычно не разрешены в именах файлов Windows*
  • Чувствительность к регистру
  • Каталоги, содержащие систему Linux, файлы приложений (/etc /bin /usr и т. д.) И домашнюю папку пользователей Linux, все используют VolFs.

Взаимодействие между приложениями Windows и файлами в VolFs не поддерживается.

DriveFs

DriveFs - файловая система, используемая для взаимодействия с Windows. Требуется, чтобы все имена файлов были допустимыми именами файлов Windows. Файлы чувствительны к регистру, и пользователи не могут создавать файлы, имена которых отличаются только регистром.

Все фиксированные тома Windows монтируются в /mnt /c /mnt /d и т. д. c помощью DriveFs. Здесь пользователи могут получить доступ ко всем файлам Windows. Это позволяет пользователям редактировать файлы с помощью своих любимых редакторов Windows, таких как Visual Studio Code, и одновременно манипулировать ими инструментами с открытым исходным кодом в Bash, используя WSL.

Системные вызовы

WSL выполняет немодифицированные бинарные файлы Linux ELF64, виртуализуя интерфейс ядра Linux поверх ядра Windows NT. Один из интерфейсов ядра, который он предоставляет, - это системные вызовы (syscalls). Системный вызов - это сервис, предоставляемый ядром, который может вызываться из пользовательского режима. И ядро ​​Linux, и ядро ​​Windows NT предоставляют несколько сотен системных вызовов пользовательскому режиму, но они имеют разную семантику и, как правило, несовместимы напрямую. Например, ядро ​​Linux включает в себя такие системные вызовы, как fork, open и kill, а ядро ​​Windows NT имеет сопоставимые NtCreateProcess, NtOpenFile и NtTerminateProcess.

Подсистема Windows для Linux включает драйверы режима ядра (lxss.sys и lxcore.sys), которые отвечают за обработку запросов системного вызова Linux в координации с ядром Windows NT. Драйверы не содержат код из ядра Linux, но вместо этого представляют собой чистую реализацию Linux-совместимых интерфейсов ядра. В native Linux, когда системный вызов сделан из исполняемого файла пользовательского режима, он обрабатывается ядром Linux. В WSL, когда системный вызов сделан из одного и того же исполняемого файла, ядро ​​Windows NT перенаправляет запрос lxcore.sys. Где это возможно, lxcore.sys переводит системный вызов Linux на эквивалентный вызов Windows NT, который, в свою очередь, выполняет тяжелую работу. При отсутствии разумного сопоставления драйвер режима ядра Windows должен обслуживать запрос напрямую.

Например, системный вызов Linux fork () не имеет прямого эквивалентного вызова, документированного для Windows. Когда системный вызов fork выполняется в подсистеме Windows для Linux, lxcore.sys выполняет некоторые из первоначальных работ по подготовке к копированию процесса. Затем он вызывает внутренние API-интерфейсы ядра Windows NT для создания процесса с правильной семантикой и завершает копирование дополнительных данных для нового процесса.

Ссылки/Литература