Глава 6. Настройка WSL2

WSL2 привносит некоторые новые настройки в WSL по причине своей архитектуры. Будучи ВМ с малым весом, некоторые из этих настроек могут быть знакомы пользователям прочего виртуального программного обеспечения, такого как Hyper-V или VirtualBox, где вы можете определять объём памяти или процессоров для конкретной ВМ. В WSL2 вы можете определять эти параметры для своей среды WSL2. Следующие настройки требуют WSL2 и доступны в Windows 10 сборки 18980 или выше.

.wslconfig

Относящиеся к WSL2 настройки хранятся в отдельном файле. Он располагается в домашней папке вашего пользователя Windows в файле с названием .wslconfig. Эти настройки глобальны для всех дистро WSL2, в отличии от /etc/wsl.conf, которые отличаются для каждого дистро WSL. Если этот файл не существует, тогда применяются значения по умолчанию для WSL2. Поэтому в целом вам требуется лишь этот файл если вы решили перекрыть установленные по умолчанию настройки WSL2.

Ядро

WSL2 поставляется с ядром, которое хранится в Windows 10 по адресу %SystemRoot%\system32\lxss\tools\kernel и обновляется через Обновление Windwos автоматически, либо вручную через


PS C:\> wsl.exe --update
		

Это официально поддерживаемое ядро для WSL2 от Microsoft, которое содержит удобные оптимизации специально под WSL2, такое как уплотнение памяти, обсуждаемое в разделе Составление отчётов страниц.

Тем не менее, имеется возможность замены этого ядра вашим собственным ядром при помощи kernel= в .wslconfig. Я рекомендую собрать такое и заменить официальное ядро WSL2, которое продолжает оптимизироваться Microsoft. Однако имеется возможность брать наиболее распространённые ядра Linux и применять их здесь. Обратите внимание, что если вы не пользуетесь официальным ядром WSL2, вы можете утратить некоторые из имеющихся оптимизаций, специфичных для WSL. Самая хорошая новость состоит в том, что ядро WSL2 обладает открытым исходным кодом, который доступен в https://github.com/microsoft/WSL2-Linux-Kernel и может быть запросто подогнано под ваши потребности, если, к примеру, по умолчанию не содержит поддержку конкретной файловой системы или иных функциональных возможностей. Обратите внимание, что добавление драйверов ядра для вашего ядра WSL2 не обязательно разрешит поддержку для этого оборудования в WSL2, которая всё ещё содержится в виртуальном контейнере с малым весом. Иными словами, даже с конкретными драйверами оборудования такое ядро не способно “видеть” такие устройства.

WSL2 по умолчанию настроена на встроенное ядро. Если вы желаете перекрыть эту настройку по умолчанию, вам всего лишь требуется определить здесь ядро:


[wsl2]
kernel=C:\\Users\\Hayden\\bzImage
		

Обратите внимание, что значение пути здесь должно быть абсолютным, поэтому вам следует избегать применение здесь переменных среды. Вам также надлежит применять экранированные обратные слеши \\ в вашем пути для соответствующего скомпилированного ядра.

[Совет]Совет

bzImage это распространённо применяемое название для сжатого ядра Linux. Вы также можете наблюдать файлы ядра с их обычно применяемом для несжатого вида названием файла vmlinux. WSL2 способна загружаться с любого. {Прим. пер.: подробнее о компоновке ядра Linux в нашем переводе Практика загрузки. Изучение процесса загрузки Linux, Windows и Unix Йогеша Бабара и в Программирования ядра Linux Кайвань Н Биллимории}.

Командная строка ядра

Командная строка ядра это способ настройки расширенных элементов ядра Linux, например, разрешения особых функциональных возможностей, таких как AppArmor, функций отладки или параметров тонкой настройки драйвера. Поскольку WSL2 работает в ВМ, некоторые из таких параметров драйвера ограничены относительно оборудования (которое WSL2 не может достигать напрямую изнутри своего контейнера Hyper-V с малым весом), однако доступны оптимизации, относящиеся к работе с потоками, обработкой системных вызовов, сетевой средой и использования диска RAM. Эти доступные варианты будут зависеть от тех, которые допускаются в вашем ядре, причём как встроенные, так и добавляемые в качестве модуля.

По умолчанию, встроенные параметры командной строки будут загружать только установленные по умолчанию ядро и init. Для настройки дополнительных параметров ядра вам просто потребуется определить kernelCommandLine=, например, vsyscall=emulate для поддержки более старых дистрибутивов Linux:


[wsl2]
kernel=C:\\Users\\Hayden\\bzImage
kernelCommandLine= vsyscall=emulate
		

Кавычки вокруг вашей командной строки ядра Linux не обязательны; просто наберите необходимую командную строку для передачи по своему желанию после =.

[Совет]Совет

{Прим. пер.: подробнее о командной строке ядра Linux в нашем переводе Практика загрузки. Изучение процесса загрузки Linux, Windows и Unix Йогеша Бабара и в Программирования ядра Linux Кайвань Н Биллимории}.

Процессоры

WSL2 получает преимущество от всех доступных в вашем компьютере ядер процессора. Большинство потребительских и офисных компьютеров обладают одним процессором с числом ядер от 4 до 8. Этого достаточно для большинства вариантов применения, даже для программного обеспечения компиляции и отладки. Тем не менее, некоторые высокопроизводительные рабочие станции, предназначенные для Искусственного интеллекта/ Машинного обучения, САПР или построения видео обладают от 16 до 32 ядер на процессор и способны поддерживать множество процессоров, например, Lenovo ThinkStation серии P900. Последние высококлассные процессоры AMD с торговой маркой Ryzen Threadripper обладают до 64 ядер. Вне зависимости от того будете ли вы обладать 4 ил 32 ядрами, вы способны настраивать WSL2 для балансировки ядер под свои задачиЮ которые вы можете запускать.

Вы можете определить число ядер своего устройства в закладке Производительность (Performance) своего Диспетчера задач (Task Manager) Windows (Рисунок 6-1).

 

Рисунок 6-1


Просмотр числа ЦПУ и ядер в Диспетчере задач Windows

По умолчанию WSL2 использует все эти ядра, доступные из вашего устройства Windows.

Вы имеете возможность ограничить значение числа ядер, которым пользуется WSL2 при помощи processors=, например, если вы желаете назначить определённое число ядер WSL и оставить прочие свободными для задач на основе Windows.


[wsl2]
kernel=C:\\Users\\Hayden\\bzImage
kernelCommandLine= vsyscall=emulate
processors=4
		

Здесь, на (Рисунке 6-2), в той же системе, которая применяется на (Рисунке 6-1), с 8 ядрами, мы должны ограничить общее число ядер в WSL до 4 при помощи processors= и подтверждения (после wsl.exe --shutdown и повторного открытия Ubuntu) через grep /proc/cpuinfo.

 

Рисунок 6-2


Ограничение числа доступных ядер до 4 при помощи .wslconfig и подтверждение через grep processor /proc/cpuinfo

Память

WSL2 автоматически выделяет дистро WSL память по мере необходимости и возвращает её по мере высвобождения из задач. Начиная со сборки 20175 Windows, WSL2 по умолчанию выделяет до 50% из доступной вам памяти или 8ГБ, в зависимости от того что меньше. Это означает, что если вы обладаете рабочей станцией с 32ГБ ОЗУ и желаете сделать доступными для WSL2 16ГБ, вам потребуется в .wslconfig установить параметр memory=. Осуществление этого максимизирует объём производительности, который вы можете получать от своих рабочей станции и WSL.

И наоборот, когда у вас машина с малыми ресурсами, вы можете пожелать ограничить объём используемой памяти ещё больше. Небольшая оболочка и некоторые терминальные задачи весьма удобны при использовании всего 1 ГБ ОЗУ при маломощной машине. Обратите внимание, однако, что такие приложения, как обладающие графическим интерфейсом, разрабатываемые с применением инфраструктур большего размера, такие как NodeJS или крупные задачи компиляции, могут значительно замедляться или даже падать при ткаом малом объёме памяти. Если вы намерены компилировать Chromium из его исходного кода, вам потребуется по крайней мере 4ГБ оперативной памяти.


[wsl2]
kernel=C:\\Users\\Hayden\\bzImage
kernelCommandLine= vsyscall=emulate
processors=4
memory=12GB
		

Память устанавливается в гигабайтах или мегабайтах как целое число, за которым следует GB или MB, соответственно.

Подкачка

Хранилище подкачки (swap) это основанная на диске память с произвольной выборкой (RAM, random access memory), которой пользуется дистро WSL когда запрашиваемая память превосходит доступную аппаратную ОЗУ, либо по причине того, что настройка параметра memory= слишком низка или по причине аппаратных ограничений вашего устройства Windows.

WSL2 по умолчанию устанавливает файл подкачки размером 25% от доступной оперативной памяти вашего устройства Windows, округляя значение до бижайшего целого ГБ. Для регулировки размера подкачки, или пространства подкачки, в своём .wslconfig настройте swap=:


[wsl2]
kernel=C:\\Users\\Hayden\\bzImage
kernelCommandLine= vsyscall=emulate
memory=12GB
processors=6
swap=6GB
		

Подкачка настраивается в гигабайтах или мегабайтах как целое число, за которым следует GB или MB, соответственно.

Когда вы выполняете задачи с интенсивным применением памяти, например компиляция Chromium из исходного кода, вам может потребоваться дополнительное пространство подкачки если ваша доступная оперативная память потреблена. Это также может быть необходимо для устройств и низким объёмом памяти, например, ниже 8ГБ. Обратите внимание на то, что пространство подкачки, по причине его записи на диск, внутренне медленнее чем аппаратная оперативная память. Однако оно способно решать проблемы когда вы вылетаете за доступную аппаратную память. Вы также можете отключать в WSL2 подкачку, настраивая его размер в ноль; тем не менее, обычно это не приветствуется и делая так вы можете вызывать проблемы выхода за пределы памяти некоторых приложений. С другой стороны, когда вы выполняете связанную с Kubernetes разработку, в которой подкачка пока не поддерживается, вы можете пожелать отключить подкачку для лучшей эмуляции вашей среды разработки. Это осуществляется настройкой swap=0:


[wsl2]
kernel=C:\\Users\\Hayden\\bzImage
kernelCommandLine= vsyscall=emulate
memory=12GB
processors=6
swap=0
		

Файл подкачки

По умолчанию WSL2 будет хранить ваш файл подкачки в %USERPROFILE%\AppData\Local\Temp\swap.vhdx.

WSL2 создаёт этот файл автоматически; нет никакой нужды создавать его вручную. Тем не менее, вы можете определять гда бы вы желали сохранять подкачку, если это требуется, при помощи задания местоположения через swapfile=.

Как и в ситуации с путём ядра. здесь также требуется абсолютное значение с экранируемыми обратными слешами:


[wsl2]
kernel=C:\\Users\\Hayden\\bzImage
kernelCommandLine= vsyscall=emulate
memory=12GB
processors=6
swap=4GB
swapfile=C:\\wslswap.vhdx
		

Составление отчётов страниц

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

Ядро Linux выделяет доступную память страницами, которые затем ставятся в соответствие исполняемым процессам. API в установленном ядре Linux способен, при работе в качестве гостя, такого как WSL2, сообщать гипервизору ядра когда страницы памяти больше не используются. Это позволяет WSL возвращать эту память обратно и перемещать её в пул доступной в Windows памяти, где она повторно может применяться приложениями Windows, либо снова забираться другим процессом WSL.

Это происходит только кода ЦПУ почти простаивает. Вы можете наблюдать это в действии когда вы разрешаете консоль отладки (Рисунок 6-3). Подробнее о консоли отладки ниже.

 

Рисунок 6-3


Просмотр консоли отладки WSL2

Вы можете вручную включать уплотнение в WSL при помощи следующего от имени root:


> echo 1 | sudo tee /proc/sys/vm/compact_memory
		

Вы можете отключать функциональность отчётов о страницах с тем, чтобы WSL высвобождала всю ту память, которую она запросила в Windows без возврата её обратно при её высвобождении в WSL:


[wsl2]
kernel=C:\\Users\\Hayden\\bzImage
kernelCommandLine= vsyscall=emulate
memory=12GB
processors=6
swap=4GB
swapfile=C:\\wslswap.vhdx
localhostforwarding=true
pageReporting=false
		

Проброс локального хоста

WSL2 по умолчанию для осуществления подключений ограничен в своей среде WSL2 локальным хостом, доступным в Windows, также именуемым как localhost. Это аналогично сетевой обработке в WSL1. Основная разница здесь состоит в том, что в отличие от WSL1 здесь нет отдельного сетевого стека; здесь есть только localhost. В WSL2 ваш дистро WSL создаёт сетевую среду в виртуальной подсети с NAT и настраивается при помощи DHCP. Это может несколько усложнять сетевую настройку. Однако, при пробросе localhost вы можете имитировать бо́льшую часть работы сетевой среды WSL1 в WSL2.


[wsl2]
kernel=C:\\Users\\Hayden\\bzImage
kernelCommandLine= vsyscall=emulate
memory=12GB
processors=6
swap=4GB
swapfile=C:\\wslswap.vhdx
localhostforwarding=true
		

Встраиваемая виртуализация

Встраиваемая виртуализация позволяет вам запускать виртуальные машины (ВМ) внутри WSL2, скорее всего при помощи KVM, естественного инструментария виртуализации в ядре Linux. Это в частности позволяет необходимым расширениям витуализации процессора пробрасываться в виртуальные контейнеры с малым весом, которые исполняет WSL2 и делает их доступными своему ядру там и затем запускать прочие виртуальные машины, отсюда и происходит “встраиваемость”. Именно относительно этого состоял мой запрос к команде WSL, когда я приступил к изучению WSL2, поскольку это позволяло создавать ВМ Linux из различных дистро и даже из других операционных систем, таких как Windows, Haiku, BSD и наследуемые операционные системы. Поскольку это одна из моих наиболее любимых функциональных возможностей, я окунусь в неё поглубже в Главе 8, Следуем далее с WSL2.


[wsl2]
kernel=C:\\Users\\Hayden\\bzImage
kernelCommandLine= vsyscall=emulate
memory=12GB
processors=6
swap=4GB
swapfile=C:\\wslswap.vhdx
localhostforwarding=true
nestedVirtualization=true
		

Встраиваемая виртуализация требует по крайней мере сборки 19645 Windows 10 и по умолчанию включается со сборки 20175.

Консоль отладки

Когда WSL2 запускает своё ядро, где пребывают её регистрационный сообщения? Как вы можете отлаживать своё ядро и при проблемах с командной строкой ядра? При помощи консоли отладки. Консоль отладки предоставляет некое окно, в котором выводятся на печать сообщения ядра. Оно порождается всякий раз когда загружается ядро WSL2. Обладая им во включённом состоянии также сообщает вам насколько часто перезагружается ядро и когда, причём при некоторых удивительных обстоятельствах, это происходит, например, при открытии Проводника (File Explorer), когда у вас имеются смонтированными папки WSL.

Это в особенности полезно при сборке и тестировании вашего собственного ядра. Вы можете отслеживать его и отслеживать уплотнение памяти в работе (Рисунок 6-4). Когда зависает большая задача WSL2, вы можете проверить отладку чтобы посмотреть что, возможно, вы исчерпали оперативную память и вам требуется выделять больше или добавить пространство подкачки.


[wsl2]
kernel=C:\\Users\\Hayden\\bzImage
kernelCommandLine= vsyscall=emulate
memory=12GB
processors=6
swap=4GB
swapfile=C:\\wslswap.vhdx
localhostforwarding=true
nestedVirtualization=true
debugConsole=true
		
 

Рисунок 6-4


Наблюдение за уплотнением памяти в консоли отладки WSL2

Советы

При внесении изменений в .wslconfig вам надлежит останавливать WSL2 чтобы вступали в силу настройки.

Вы можете выполнять это при помощи wsl.exe --shutdown.

 

Рисунок 6-5


Останов WSL из PowerShell при помощи wsl.exe --shutdown

Хотя и имеется возможность вносить изменения в настройки WSL из WSL, вам следует преобразовывать окончания строк в CRLF стиль строк Windows.

Когда вы создаёте этот файл при помощи notepad/exe, тогда nano и прочие редакторы обязаны сохранять стиль Windows CRLF окончания строк.

 

Рисунок 6-6


Редактирование .wslconfig nano. Обратите внимание на “Converted from DOS format”

Вы также можете переключаться взад и вперёд между стилями окончания строк в VS Code кликая по CRLF или LF в планке состояния VS Code Microsoft.

 

Рисунок 6-7


Переключение между окончаниями строк Linux LF и Windows CRLF в VS Code

Настройки реестра WSL

Имеется возможность настройки некоторых установок WSL из Реестра Windows. Я бы рекомендовал применять настройки доступные из wsl.exe, .wslconfig и wsl.conf , прежде чем применять Реестр. Тем не менее, в крайнем случае этого может не хватать. Здесь также приводятся все необходимые предупреждения относительно изменения самого реестра.

Относящиеся к WSL настройки пребывают в


\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss
 	   
 

Рисунок 6-8


Просмотр дистрибутивов WSL в реестре Windows

DefaultDistribution содержит значение GUID для вашего дистро по умолчанию.

DefaultVersion хранит значение версии по умолчанию WSL, 1 или 2.

Всякий установленный WSL дистро затем перечисляет по GUID, который походит на {66dfcb00-cc73-4054-a9cd-70f4149c8209}.

 

Рисунок 6-9


Просмотр индивидуального дистрибутива WSL в реестре Windows

Каждый дистро будет обладать BasePath, содержащим местоположение вашего установленного дистро WSL, DistributionName, а также Version, либо WSL1, либо WSL2.

Устанавливаемые из Microsoft Store дистро будут обладать большей информацией, хранимой в Реестре.

Устанавливаемые вручную дистро, при помощи wsl.exe --import, будут обладать меньшими подробностями (Рисунок 6-10)

 

Рисунок 6-10


Просмотр настроек индивидуального дистрибутива WSL установленного вручную дистро из реестра Windows

И снова, в целом не рекомендуется чтобы вы изменяли эти значения вручную. Выполняя это при работающем дистро WSL может оставлять такой дистро в неком не используемом состоянии, а это может приводить к утрате данных.

Однако, поскольку вы читаете эту книгу и читаете про настройки Реестра Windows, вы, скорее всего, осознаёте имеющийся здесь риск и просматривая некоторые из этих значений вы можете подумать, что кое- что вы могли бы пожелать подстроить. Попробуйте это. Просто удостоверьтесь что вы сохранили резервную копию.