Сравнение WSL 1 и WSL 2

Основные различия между подсистемами Windows для Linux WSL 1 и WSL 2 и причины обновления:

  • повышение производительности файловой системы;
  • поддержка полной совместимости системных вызовов.

WSL 2 использует последнюю и самую новую технологию виртуализации для запуска ядра Linux внутри упрощенной служебной виртуальной машины. Однако WSL 2 не является традиционным функционалом виртуальной машины.

Сравнение возможностей

Функция WSL 1 WSL 2
Интеграция Windows и Linux
Быстрый запуск
Небольшой объем занимаемых ресурсов по сравнению с традиционными Виртуальными машинами
Запуск с использованием текущих версий VMware и VirtualBox
Управляемая виртуальная машина
Полнофункциональное ядро Linux
Полная совместимость системных вызовов
Производительность в файловых системах ОС

Как видно из приведенной выше таблицы, архитектура WSL 2 во многом превосходит архитектуру WSL 1, за исключением показателей производительности при работе с несколькими файловыми системами ОС.

Производительность в файловых системах ОС

Мы не рекомендуем работать с разными операционными системами, если на это нет особой причины. Для ускорения производительности сохраняйте файлы в файловой системе WSL, если используете командную строку Linux (Ubuntu, OpenSUSE и т. д.). Если вы работаете в командной строке Windows (PowerShell, командной строке), сохраняйте файлы в файловой системе Windows.

Например, при хранении файлов проекта WSL:

  • Используйте корневой каталог файловой системы Linux: \\wsl$\Ubuntu-18.04\home\<user name>\Project
  • Не является корневым каталогом файловой системы Windows: C:\Users\<user name>\Project

Все выполняющиеся сейчас дистрибутивы (wsl -l) доступны через сетевое подключение. Нажмите клавиши [WIN+R] или введите \\wsl$ в адресную строку проводника, чтобы найти соответствующие имена дистрибутивов и получить доступ к их корневым файловым системам.

Вы также можете использовать команды Windows в терминале Linux в WSL. Попробуйте открыть дистрибутив Linux (например, Ubuntu). Убедитесь, что вы находитесь в домашнем каталоге Linux, введя команду cd ~. Затем откройте файловую систему Linux в проводнике, введя (не забудьте точку в конце) : powershell.exe /c start .

Важно!

Если возникла ошибка -bash: powershell.exe: command not found (Команда не найдена) перейдите на страницу устранения неполадок с WSL.

Подсистема WSL 2 доступна только в Windows 10 версии 1903, сборки 18362 или выше. Проверьте версию Windows, нажав Windows + R, введите winver, выберите ОК. (Или введите команду ver в командной строке Windows). Может потребоваться выполнить обновление до последней версии Windows. Для сборок ниже 18362 WSL не поддерживается.

Примечание

WSL 2 работает с VMware 15.5.5 и более поздней версии и VirtualBox 6 и более поздней версии. Дополнительные сведения см. в статье Вопросы и ответы по WSL 2.

Новые возможности в WSL 2

WSL 2 — это основная модернизированная версия базовой архитектуры, которая использует технологию виртуализации и ядро Linux для реализации новых возможностей. Основные приоритеты этого обновления — увеличение производительности файловой системы и добавление полной совместимости системных вызовов.

Архитектура WSL 2

Во время обычной работы виртуальная машина может замедляться при загрузке, изолироваться, потреблять много ресурсов и требовать время для управления. В подсистеме WSL 2 нет таких проблем.

WSL 2 предоставляет преимущества WSL 1, включая простую интеграцию между Windows и Linux, быструю загрузку, незначительное потребление ресурсов и не требует настройки виртуальной машины или управления ею. Хотя WSL 2 использует виртуальную машину, она будет управляемой и будет работать в фоновом режиме, предоставляя тот же пользовательский интерфейс, что и WSL 1.

Полнофункциональное ядро Linux

Ядро Linux в WSL 2 собрано собственными силами корпорации Майкрософт на основе последней стабильной ветви исходного кода, доступного по адресу kernel.org. Этот ядро специально настроено для WSL 2 путем оптимизации размера и производительности, чтобы обеспечить невероятное взаимодействие с Linux в Windows. Ядро будет обслуживаться обновлениями Windows. Это означает, что вы получите новейшие исправления безопасности и улучшения ядра без необходимости заниматься этим самостоятельно.

Ядро Linux WSL 2 — это проект с открытым исходным кодом. Если вы хотите узнать больше, ознакомьтесь с записью блога Реализация ядра Linux в Windows, созданной группой, которая занималась сборкой ядра.

Повышенная производительность операций ввода-вывода файлов

Команды для операций с большими объемами файлов, такие как git clone, npm install, apt update, apt upgrade и другие, с WSL 2 выполняются заметно быстрее.

Фактическое увеличение скорости будет зависеть от того, какое приложение вы используете и как оно взаимодействует с файловой системой. Первоначальные версии WSL 2 запускаются в 20 раз быстрее по сравнению с WSL 1 при распаковке сжатого архива tarball и в 2–5 раз быстрее при использовании команд git clone, npm install и cmake в различных проектах.

Полная совместимость системных вызовов

Двоичные файлы Linux используют системные вызовы для выполнения функций, таких как доступ к файлам, запрос памяти, создание процессов и многое другое. В то время как WSL 1 использует уровень перевода, созданный командой WSL, WSL 2 имеет собственное ядро Linux с полной совместимостью системных вызовов. Доступные преимущества:

  • целый ряд новых приложений, которые можно запускать внутри WSL, например Docker и другие;

  • все обновления ядра Linux немедленно готовы к использованию. (Вам не нужно ждать, пока специалисты WSL реализуют обновления и добавят изменения).

Исключения для использования WSL 1 вместо WSL 2

Рекомендуется использовать WSL 2, так как он обеспечивает более высокую производительность и полную совместимость системных вызовов. Однако существует несколько отдельных сценариев, в которых использовать WSL 1 может оказаться более предпочтительным. Рекомендуем использовать WSL 1, если:

  • Файлы проекта должны храниться в файловой системе Windows. WSL 1 обеспечивает более быстрый доступ к файлам, подключенным из Windows.
    • Если вы будете использовать дистрибутив Linux WSL для доступа к файлам проекта в файловой системе Windows, и эти файлы не могут храниться в файловой системе Linux, вы получите более высокую производительность в файловых системах ОС, используя WSL 1.
  • Проект, для которого требуется перекрестная компиляция с использованием средств Windows и Linux на одних и тех же файлах.
    • Операции с файлами в операционных системах Windows и Linux выполняются быстрее в WSL 1, чем на WSL 2. Поэтому если вы используете приложения Windows для доступа к файлам Linux, в настоящее время вы получите более высокую производительность при использовании WSL 1.
  • Вашему проекту требуется доступ к последовательному порту или USB-устройству.
  • У вас есть строгие требования к памяти
    • Использование памяти WSL 2 масштабируется по мере использования. Когда процесс освобождает память, она автоматически становится доступной в Windows. Но сейчас WSL 2 не освобождает кэшированные страницы в памяти, делая их доступными в Windows, пока не завершится работа экземпляра WSL. При наличии длительных сеансов WSL или при обращении к очень большому объему файлов этот кэш может занимать память в Windows. Мы отслеживаем процесс изменений по мере оптимизации в репозитории WSL (проблема 4166) в Github.

Примечание

Попробуйте использовать удаленное расширение WSL VS Code, чтобы хранить файлы проекта в файловой системе Linux, используя средства командной строки Linux. Также с помощью VS Code в Windows можно создавать, редактировать, отлаживать или запускать проекты в браузере без снижения производительности, связанной с работой в файловых системах Linux и Windows. Подробнее.

Доступ к сетевым приложениям

Доступ к сетевым приложениям Linux из Windows (localhost)

Если вы создаете сетевое приложение (например, приложение, работающее на NodeJS или SQL Server) в дистрибутиве Linux, вы можете получить к нему доступ из приложения Windows (например, используя Microsoft Edge или Chrome) с помощью localhost (как обычно это и происходит).

Тем не менее, если вы используете более раннюю версию Windows (сборка 18945 или меньше), вам потребуется получить IP-адрес виртуальной машины узла Linux (или обновить ее до последней версии Windows).

Чтобы найти IP-адрес виртуальной машины, содержащей дистрибутив Linux, выполните следующие действия.

  • В дистрибутиве WSL (напр., Ubuntu) выполните команду: ip addr
  • Найдите и скопируйте адрес в значение inet интерфейса eth0.
  • Если у вас установлено средство grep, найдите его с помощью команды: ip addr | grep eth0
  • Подключитесь к серверу Linux, используя этот IP-адрес.

На изображении ниже показан пример подключения к серверу Node.js с помощью браузера Edge.

Подключение к серверу NodeJS с помощью Edge

Доступ к сетевым приложениям Windows из Linux (IP-адрес основной системы)

Если вы хотите получить доступ к сетевому приложению, работающему в Windows (например, к приложению, работающему на NodeJS или SQL Server) из дистрибутива Linux (напр., Ubuntu), необходимо использовать IP-адрес основной системы. Хотя это происходит и нечасто, для этого можно выполнить следующие действия.

  1. Получите IP-адрес основной системы, выполнив следующую команду из дистрибутива Linux: cat /etc/resolv.conf
  2. Скопируйте IP-адрес в строке, начинающейся с nameserver.
  3. Подключитесь к любому серверу Windows, используя скопированный IP-адрес.

На изображении ниже показан пример подключения к серверу Node.js под управлением Windows через cURL.

Подключение к серверу NodeJS в Windows с помощью cURL

Дополнительные рекомендации по работе с сетью

Подключение через удаленные IP-адреса

При использовании удаленных IP-адресов для подключения к приложениям они будут рассматриваться как подключения из локальной сети (LAN). Это означает, что необходимо убедиться, что приложение может принимать подключения по локальной сети.

Например, может потребоваться привязать приложение к 0.0.0.0 вместо 127.0.0.1. В примере приложения Python, использующего Flask, это можно сделать с помощью команды app.run(host='0.0.0.0'). При внесении этих изменений не забывайте о безопасности, так как это позволит устанавливать подключения из вашей локальной сети.

Доступ к дистрибутиву WSL 2 из локальной сети (LAN)

При использовании дистрибутива WSL 1, если к компьютеру можно получить доступ из локальной сети, то приложения, работающие в WSL, могут быть также доступны в локальной сети.

Это нетипичная ситуация в WSL 2. В WSL 2 имеется виртуализированный адаптер Ethernet с собственным уникальным IP-адресом. В настоящее время для включения этого рабочего процесса необходимо выполнить те же действия, что и для обычной виртуальной машины. (Мы ищем способы улучшить это взаимодействие.)

Ниже приводится пример команды PowerShell, которая добавляет прокси-сервер портов, ожидающий передачи данных на порту узла 4000 и перенаправляющий все подключения на порт 4000 виртуальной машины WSL 2 с IP-адресом 192.168.101.100.

netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100

Доступ по протоколу IPv6

В настоящее время дистрибутивы WSL 2 не могут обращаться к IPv6-адресам. Мы работаем над добавлением этой возможности.

Увеличение размера виртуального жесткого диска WSL 2

Для хранения файлов Linux в WSL 2 используется виртуальный жесткий диск (VHD). В WSL 2 виртуальный жесткий диск существует в виде VHDX-файла на жестком диске Windows.

Виртуальный жесткий диск WSL 2 использует файловую систему ext4. Этот виртуальный жесткий диск имеет начальный максимальный размер 256 ГБ, и он автоматически изменяется по мере необходимости. Если объем хранилища, необходимый для файлов Linux, превышает этот размер, вам следует увеличить его. Если размер дистрибутива превысил 256 ГБ, вы увидите сообщение о том, что закончилось место на диске. Эту ошибку можно устранить, увеличив размер виртуального жесткого диска.

Чтобы увеличить максимальный размер виртуального жесткого диска свыше 256 ГБ:

  1. Завершите работы всех экземпляров WSL с помощью команды wsl --shutdown.

  2. Вот как можно найти имя пакета установки дистрибутива (PackageFamilyName):

    • С помощью PowerShell (где "distro" — имя дистрибутива) введите команду:
    • Get-AppxPackage -Name "*<distro>*" | Select PackageFamilyName
    • Например: Get-AppxPackage -Name "*Ubuntu*" | Select PackageFamilyName

    Снимок экрана: Get-AppxPackage в командной строке

  3. Используя итоговое значение PackageFamilyName, выберите VHD-файл fullpath, используемый в WSL 2. Это будет pathToVHD. Вот как можно найти полный путь:

    • В меню "Пуск" введите %LOCALAPPDATA% и откройте папку %LOCALAPPDATA%.
    • Затем откройте папку Packages и выполните поиск по значению PackageFamilyName своего дистрибутива. Откройте эту папку (например, CanonicalGroupLimited.Ubuntu20.04onWindows_79xxxxx).
    • В папке PackageFamilyName откройте папку LocalState и найдите файл <disk>.vhdx.
    • Скопируйте путь к этому файлу. Он должен выглядеть примерно так: %LOCALAPPDATA%\Packages\<PackageFamilyName>\LocalState\<disk>.vhdx.
    • Например, значение <pathToVHD> для Ubuntu 20.04 должно выглядеть примерно так: %LOCALAPPDATA%\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79xxxx\LocalState\ext4.vhdx.
  4. Измените размер VHD WSL 2, выполнив следующие команды.

    • Откройте командную строку Windows с правами администратора и введите:

      diskpart
      
      DISKPART> Select vdisk file="<pathToVHD>"
      
      DISKPART> detail vdisk
      
    • Изучите выходные данные команды detail. Эти выходные данные будут содержать значение Virtual size (Объем виртуальной памяти). Это текущее максимальное значение. Переведите это значение в мегабайты. Например, если в выходных данных detail показано Virtual size: 256 GB (Объем виртуальной памяти: 256 ГБ), измените это значение на 256000.

    • Новое вводимое значение должно быть больше этого исходного значения. Например, чтобы удвоить указанный выше виртуальный размер, можно ввести это значение: 512000. Определив число, которое вы хотите задать в качестве нового размера (в мегабайтах), введите следующую команду в командной строке Windows (diskpart):

      DISKPART> expand vdisk maximum=<sizeInMegaBytes>
      
    • Выход из diskpart

      DISKPART> exit
      
  5. Запустите дистрибутив WSL (например, Ubuntu).

  6. Сообщите WSL, что можно увеличить размер файловой системы, выполнив следующие команды в командной строке дистрибутива WSL:

       sudo mount -t devtmpfs none /dev
       mount | grep ext4
    
    • В ответ на первую команду mount может появиться такое сообщение: /dev: none already mounted on /dev. Это сообщение можно спокойно игнорировать.
    • Скопируйте имя этой записи, которая будет выглядеть следующим образом: /dev/sdX (где X обозначает любой символ). В следующем примере значение X равно b:
       sudo resize2fs /dev/sdb <sizeInMegabytes>M
    
    • Используя приведенный выше пример, мы изменили размер виртуального жесткого диска, указав 512000, поэтому команда будет выглядеть так: sudo resize2fs /dev/sbd 512000M.

    Примечание

    Возможно, придется установить приложение resize2fs. Для этого можно использовать такую команду: sudo apt install resize2fs.

    Вывод имеет следующий вид:

       resize2fs 1.44.1 (24-Mar-2021)
       Filesystem at /dev/sdb is mounted on /; on-line resizing required
       old_desc_blocks = 32, new_desc_blocks = 38
       The filesystem on /dev/sdb is now 78643200 (4k) blocks long.
    

Важно!

Мы рекомендуем не изменять и не перемещать связанные с WSL файлы, расположенные в папке AppData, а также не обращаться к ним, используя средства или редакторы Windows. Это может привести к повреждению дистрибутива Linux. Если вы хотите обращаться к файлам Linux из Windows, это можно сделать, используя путь \\wsl$\<distroName>\. Откройте дистрибутив WSL и введите explorer.exe ., чтобы просмотреть эту папку. Дополнительные сведения см. в записи блога, посвященной получению доступа к файлам Linux из Windows.