<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>WSL2 on kenji.blog</title><link>http://kenji.blog/ru/tags/wsl2/</link><description>Recent content in WSL2 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ru</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 07:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ru/tags/wsl2/index.xml" rel="self" type="application/rss+xml"/><item><title>Hyper-V против WSL2: сравнение технологий виртуализации на Windows</title><link>http://kenji.blog/ru/p/hyper-v-vs-wsl2-windows-virtualization/</link><pubDate>Sun, 13 Sep 2026 07:00:00 +0900</pubDate><guid>http://kenji.blog/ru/p/hyper-v-vs-wsl2-windows-virtualization/</guid><description>&lt;img src="http://kenji.blog/p/hyper-v-vs-wsl2-windows-virtualization/img/eyecatch.jpg" alt="Featured image of post Hyper-V против WSL2: сравнение технологий виртуализации на Windows" />&lt;h2 id="1-введение-эволюция-виртуализации-в-windows">1. Введение: Эволюция виртуализации в Windows
&lt;/h2>&lt;p>Технологии виртуализации на платформе Windows претерпели кардинальные изменения за последние несколько десятилетий. Ранее доминировали гипервизоры 2-го типа от сторонних разработчиков (такие как VMware Workstation и VirtualBox), но с момента внедрения Microsoft «Hyper-V» в Windows Server 2008 гипервизоры 1-го типа стали встраиваться и в настольные ОС Windows 10/11.&lt;/p>
&lt;p>В последние годы наибольшее внимание разработчиков привлекает «WSL2 (Windows Subsystem for Linux 2)». В то время как WSL1 полагалась на трансляцию системных вызовов, WSL2 использует технологию Hyper-V для создания «легковесной служебной ВМ» (Lightweight Utility VM), обеспечивая полную совместимость с Linux и значительный прирост производительности.&lt;/p>
&lt;p>В этой статье мы подробно сравним и объясним с глубокими техническими деталями две мощные технологии виртуализации: полнофункциональную «Hyper-V» и ориентированную на разработчиков «WSL2», рассматривая их архитектуру, производительность (CPU, память, дисковый ввод-вывод), сетевую конфигурацию и оптимальные сценарии использования.&lt;/p>
&lt;hr>
&lt;h2 id="2-базовая-теория-гипервизоров-и-сравнение-архитектур">2. Базовая теория гипервизоров и сравнение архитектур
&lt;/h2>&lt;p>Для понимания технологий виртуализации необходимо разобраться в классификации типов гипервизоров (мониторов виртуальных машин, VMM).&lt;/p>
&lt;h3 id="21-различия-между-гипервизорами-1-го-и-2-го-типа">2.1. Различия между гипервизорами 1-го и 2-го типа
&lt;/h3>&lt;p>Гипервизор — это программный слой, который абстрагирует доступ к оборудованию и позволяет нескольким операционным системам (гостевым ОС) выполняться одновременно на одной физической машине.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Тип 1 (Bare-metal, автономный)&lt;/strong>: Выполняется непосредственно на оборудовании. Концепции хост-ОС не существует (строго говоря, может существовать управляющая ОС с привилегиями), имеет крайне низкие накладные расходы и обеспечивает высокую производительность и безопасность. Примеры: Hyper-V, VMware ESXi, Xen.&lt;/li>
&lt;li>&lt;strong>Тип 2 (Хостовый)&lt;/strong>: Выполняется как приложение в хост-ОС (например, Windows или macOS). Все обращения к оборудованию проходят через хост-ОС, что увеличивает накладные расходы. Примеры: VMware Workstation, Oracle VirtualBox.&lt;/li>
&lt;/ul>
&lt;p>Hyper-V в Windows является чистым &lt;strong>гипервизором 1-го типа&lt;/strong>. При включении Hyper-V фактически сама операционная система Windows, с которой взаимодействует пользователь, начинает работать внутри специальной виртуальной машины, называемой «корневым разделом» (Root Partition).&lt;/p>
&lt;h3 id="22-детали-архитектуры-hyper-v">2.2. Детали архитектуры Hyper-V
&lt;/h3>&lt;p>Архитектура Hyper-V использует дизайн микроядра и основана на логических единицах изоляции, называемых разделами (Partitions).&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;Оборудование (CPU, RAM, Диск, NIC)&amp;#34;] --&amp;gt; B[&amp;#34;Windows Hypervisor (Кольцо -1)&amp;#34;]
B --&amp;gt; C[&amp;#34;Корневой раздел (Windows OS)&amp;#34;]
B --&amp;gt; D[&amp;#34;Дочерний раздел 1 (Windows VM)&amp;#34;]
B --&amp;gt; E[&amp;#34;Дочерний раздел 2 (Linux VM)&amp;#34;]
C --&amp;gt; F[&amp;#34;VMBus (Шина виртуальных машин)&amp;#34;]
D --&amp;gt; F
E --&amp;gt; F
C --&amp;gt; G[&amp;#34;VID (Драйвер инфраструктуры виртуализации)&amp;#34;]
C --&amp;gt; H[&amp;#34;VMWP.exe (Рабочий процесс)&amp;#34;]
&lt;/pre>
&lt;ul>
&lt;li>&lt;strong>Windows Hypervisor&lt;/strong>: Работает в состоянии процессора с наивысшим уровнем привилегий (Кольцо -1 или VMX Root Mode) и отвечает только за выделение памяти и планирование CPU. Он не содержит драйверов устройств.&lt;/li>
&lt;li>&lt;strong>Корневой раздел (Root Partition)&lt;/strong>: Раздел, в котором работает хост-ОС Windows. Содержит все драйверы устройств и напрямую управляет оборудованием. Также предоставляет функции управления дочерними разделами (WMI-провайдеры, VMWP.exe и др.).&lt;/li>
&lt;li>&lt;strong>Дочерний раздел (Child Partition)&lt;/strong>: Раздел, в котором работает гостевая ОС. Прямой доступ к оборудованию не разрешен, запросы на ввод-вывод (Synthetic I/O) отправляются в корневой раздел через логическую шину совместного использования памяти, называемую «VMBus».&lt;/li>
&lt;/ul>
&lt;h3 id="23-wsl2-и-устройство-lightweight-utility-vm">2.3. WSL2 и устройство Lightweight Utility VM
&lt;/h3>&lt;p>WSL2 использует ту же базовую технологию гипервизора 1-го типа, что и Hyper-V, но задействует подмножество функций, называемое «Платформа виртуальных машин» (Virtual Machine Platform, VMP), которое отличается от полнофункциональных виртуальных машин Hyper-V.&lt;/p>
&lt;p>«Легковесная служебная ВМ» (Lightweight Utility VM), применяемая в WSL2, полностью исключает эмуляцию устаревшего оборудования (такого как виртуальный BIOS или виртуальная материнская плата), присутствующую в традиционных ВМ.&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;Хост-ОС Windows (Пользовательское пространство)&amp;#34;]
B[&amp;#34;Файловая система NTFS&amp;#34;]
C[&amp;#34;Сервер протокола 9P (Plan 9)&amp;#34;]
D[&amp;#34;Легковесная служебная ВМ (Ядро Linux)&amp;#34;]
E[&amp;#34;ext4.vhdx (Виртуальный диск)&amp;#34;]
F[&amp;#34;Пользовательское пространство Linux (Дистрибутивы WSL2)&amp;#34;]
A --&amp;gt; C
C --&amp;gt;| Кросс-ОС обмен файлами | D
D --&amp;gt; E
D --&amp;gt; F
&lt;/pre>
&lt;p>Главная особенность WSL2 — это &lt;strong>скорость запуска&lt;/strong> и &lt;strong>бесшовная интеграция с хост-ОС&lt;/strong>. Ядро Linux загружается менее чем за секунду, а доступ к файловой системе Windows (NTFS) осуществляется через протокол сетевой файловой системы &lt;code>9P&lt;/code> из Plan 9.&lt;/p>
&lt;hr>
&lt;h2 id="3-подробный-анализ-производительности-вычислительные-ресурсы-и-ввод-вывод">3. Подробный анализ производительности: Вычислительные ресурсы и ввод-вывод
&lt;/h2>&lt;p>Производительность виртуальной машины выражается как сумма накладных расходов в компонентах CPU, памяти и дискового ввода-вывода.&lt;/p>
&lt;h3 id="31-cpu-и-накладные-расходы-на-переключение-контекста">3.1. CPU и накладные расходы на переключение контекста
&lt;/h3>&lt;p>Hyper-V и WSL2 используют аппаратную виртуализацию (Intel VT-x / AMD-V). Инструкции процессора в основном выполняются с нативной скоростью, но при выполнении привилегированных инструкций или обработке ввода-вывода возникает прерывание «VM Exit», приводящее к переключению контекста на гипервизор.&lt;/p>
&lt;p>Накладные расходы CPU $T_{overhead}$ в этот момент можно описать следующей математической моделью:&lt;/p>
$$ T_{overhead} = \sum_{i=1}^{N} (t_{vm\_exit} + t_{hypercall\_process} + t_{vm\_entry}) $$&lt;p>Где:&lt;/p>
&lt;ul>
&lt;li>$N$: Количество возникновений VM Exit за единицу времени&lt;/li>
&lt;li>$t_{vm\_exit}$: Время перехода от гостя к гипервизору&lt;/li>
&lt;li>$t_{hypercall\_process}$: Время обработки ввода-вывода или прерываний через VMBus&lt;/li>
&lt;li>$t_{vm\_entry}$: Время возврата от гипервизора к гостю&lt;/li>
&lt;/ul>
&lt;p>Поскольку в WSL2 отсутствует эмуляция устаревшего оборудования, параметр $t_{hypercall\_process}$ крайне мал и оптимизирован. Поэтому при чистых вычислениях на CPU (например, компиляция ядра или вывод моделей машинного обучения) снижение производительности по сравнению с bare-metal средой составляет в пределах нескольких процентов.&lt;/p>
&lt;h3 id="32-механизм-выделения-памяти">3.2. Механизм выделения памяти
&lt;/h3>&lt;p>В методах управления памятью у двух систем есть четкие различия в философии проектирования.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Hyper-V (Динамическая память)&lt;/strong>: В зависимости от потребностей гостевой ВМ в памяти корневой раздел динамически выделяет и возвращает память. Однако память, зарезервированная как страничный кэш (page cache) внутри гостевой ОС, обычно не освобождается, пока система не столкнется с нехваткой ресурсов.&lt;/li>
&lt;li>&lt;strong>WSL2 (Динамическое освобождение памяти)&lt;/strong>: WSL2 имеет собственный механизм, который регулярно возвращает (Reclaim) ненужную память (включая кэш) из ВМ Linux хосту Windows. В ранних версиях WSL2 существовала проблема, когда страничный кэш Linux съедал память Windows (разрастание процесса Vmmem), но сейчас это исправлено патчами ядра.&lt;/li>
&lt;/ul>
&lt;h3 id="33-характеристики-дискового-ввода-вывода-vhdx-против-ext4vhdx">3.3. Характеристики дискового ввода-вывода (VHDX против ext4.vhdx)
&lt;/h3>&lt;p>Дисковый ввод-вывод чаще всего становится узким местом в производительности виртуальных машин.&lt;/p>
&lt;p>Задержка ввода-вывода (Latency) $L_{total}$ рассчитывается следующим образом:&lt;/p>
$$ L_{total} = L_{guest\_fs} + L_{vmbus} + L_{host\_fs} + L_{physical\_disk} $$&lt;p>&lt;strong>В случае Hyper-V&lt;/strong>:
Типичный гость Hyper-V использует виртуальный диск в формате &lt;code>VHDX&lt;/code>. Запросы на ввод-вывод от файловой системы внутри гостевой ОС (ext4 или NTFS) проходят через драйвер блочного устройства хранилища VMBus (storvsc) и обрабатываются как доступ к файлу VHDX на NTFS на стороне Windows.&lt;/p>
&lt;p>&lt;strong>В случае WSL2&lt;/strong>:
Дистрибутивы Linux в WSL2 работают на нативной файловой системе ext4, созданной внутри выделенного файла &lt;code>ext4.vhdx&lt;/code>. Файловые операции внутри Linux (например, в директории &lt;code>~&lt;/code>) демонстрируют нативную производительность, эквивалентную Hyper-V, описанному выше.
Однако &lt;strong>когда осуществляется доступ из Linux в WSL2 к файлам на стороне Windows (например, &lt;code>/mnt/c/&lt;/code>)&lt;/strong>, или наоборот, процесс значительно отличается. Для этого кросс-ОС доступа используется &lt;code>9P (Plan 9 File System Protocol)&lt;/code>.&lt;/p>
$$ L_{cross\_os} = L_{9p\_client} + L_{socket\_transfer} + L_{9p\_server} + L_{ntfs} $$&lt;p>Доступ через этот протокол 9P имеет высокие накладные расходы на сериализацию, поэтому производительность значительно падает (иногда в 10 и более раз) в сценариях, требующих массового чтения и записи небольших файлов (например, &lt;code>npm install&lt;/code> или операции Git в проекте Node.js, расположенном в каталоге Windows).
Поэтому &lt;strong>при использовании WSL2 железное правило — всегда размещать файлы проекта в нативной файловой системе Linux (внутри &lt;code>~/&lt;/code>)&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="4-сетевая-структура-nat-default-switch-bridged">4. Сетевая структура: NAT, Default Switch, Bridged
&lt;/h2>&lt;p>Гибкость сетевых функций — одно из главных отличий между Hyper-V и WSL2.&lt;/p>
&lt;h3 id="41-сеть-wsl2-на-базе-nat">4.1. Сеть WSL2 (На базе NAT)
&lt;/h3>&lt;p>Сеть WSL2 по умолчанию настроена как «NAT (Network Address Translation)», используя технологию виртуальных коммутаторов Hyper-V.
ВМ Linux автоматически получает приватный IP-адрес (например, &lt;code>172.20.x.x&lt;/code>), отличный от адреса хоста Windows. Предусмотрен встроенный механизм переадресации, благодаря которому сервисы (порты), запущенные в WSL2, доступны с хоста Windows через &lt;code>localhost&lt;/code>, что позволяет разработчикам тестировать веб-серверы, не задумываясь о сети.&lt;/p>
&lt;p>Недавно в предварительных версиях WSL2 был представлен новый сетевой режим «Mirrored» (Зеркальный). Он улучшает поддержку IPv6 и совместимость с VPN-соединениями (настраивается в &lt;code>.wslconfig&lt;/code>).&lt;/p>
&lt;h3 id="42-виртуальный-коммутатор-hyper-v-virtual-switch">4.2. Виртуальный коммутатор Hyper-V (Virtual Switch)
&lt;/h3>&lt;p>Hyper-V позволяет создавать сложные сети корпоративного уровня. Через «Диспетчер виртуальных коммутаторов» доступны три основных режима:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Внешняя (External)&lt;/strong>: Привязывает физическую сетевую карту (NIC) хост-машины к виртуальному коммутатору, подключая гостевую ВМ напрямую к физической сети (мостовое соединение). ВМ получает IP-адрес от DHCP-сервера в той же подсети, что и физическая сеть.&lt;/li>
&lt;li>&lt;strong>Внутренняя (Internal)&lt;/strong>: Разрешает связь только между хост-ОС и ВМ, а также между самими ВМ. Прямой выход во внешнюю сеть невозможен.&lt;/li>
&lt;li>&lt;strong>Частная (Private)&lt;/strong>: Разрешает связь только между ВМ и блокирует связь с хост-ОС. Используется для создания изолированных тестовых сред.&lt;/li>
&lt;/ol>
&lt;h3 id="43-продвинутая-настройка-сети-hyper-v-с-помощью-powershell">4.3. Продвинутая настройка сети Hyper-V с помощью PowerShell
&lt;/h3>&lt;p>Если вам нужно создать кастомизированную NAT-сеть для ВМ в среде разработки или тестирования, PowerShell предоставляет детальный контроль. Ниже приведен пример скрипта для создания внутреннего виртуального коммутатора, настройки на нем NAT и предоставления ВМ доступа в Интернет.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. Создание внутреннего виртуального коммутатора&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SwitchName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HyperV-NatSwitch&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-VMSwitch&lt;/span> &lt;span class="n">-SwitchName&lt;/span> &lt;span class="nv">$SwitchName&lt;/span> &lt;span class="n">-SwitchType&lt;/span> &lt;span class="n">Internal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 2. Настройка IP-адреса для виртуальной NIC хоста (IP, который станет шлюзом)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$GatewayIP&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;192.168.100.1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$NetPrefix&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="mf">24&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$InterfaceAlias&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;vEthernet (&lt;/span>&lt;span class="nv">$SwitchName&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-NetIPAddress&lt;/span> &lt;span class="n">-IPAddress&lt;/span> &lt;span class="nv">$GatewayIP&lt;/span> &lt;span class="n">-PrefixLength&lt;/span> &lt;span class="nv">$NetPrefix&lt;/span> &lt;span class="n">-InterfaceAlias&lt;/span> &lt;span class="nv">$InterfaceAlias&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 3. Настройка сети NAT&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$NatName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HyperV-NatNetwork&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$NatSubnet&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;192.168.100.0/24&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-NetNat&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="nv">$NatName&lt;/span> &lt;span class="n">-InternalIPInterfaceAddressPrefix&lt;/span> &lt;span class="nv">$NatSubnet&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Команда для проверки&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Get-NetNat&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>С помощью этой конфигурации вы можете создать собственный сегмент NAT, который может взаимодействовать с внешним миром через хост, вручную назначив указанному гостю Hyper-V IP-адрес &lt;code>192.168.100.x&lt;/code> и шлюз &lt;code>192.168.100.1&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="5-варианты-использования-и-практическое-руководство-по-выбору">5. Варианты использования и практическое руководство по выбору
&lt;/h2>&lt;p>Учитывая различия в архитектуре и производительности, описанные выше, определим, в каких ситуациях следует применять каждую из технологий.&lt;/p>
&lt;h3 id="51-сценарии-когда-следует-выбрать-wsl2">5.1. Сценарии, когда следует выбрать WSL2
&lt;/h3>&lt;p>WSL2 специально разработан для «повышения продуктивности разработчиков». Он идеально подходит для следующих целей:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Веб-разработка и облачная (cloud-native) разработка&lt;/strong>: Разработка контейнеров с использованием Docker Desktop (бэкенд WSL2) или Podman.&lt;/li>
&lt;li>&lt;strong>Использование инструментов только для Linux&lt;/strong>: Если вы повседневно используете bash, grep, awk, sed или компиляторы GCC / Clang для Linux.&lt;/li>
&lt;li>&lt;strong>GUI-приложения (WSLg)&lt;/strong>: Если вы хотите бесшовно запускать приложения X11/Wayland для Linux на рабочем столе Windows.&lt;/li>
&lt;li>&lt;strong>Машинное обучение и разработка ИИ&lt;/strong>: Быстрое обучение в TensorFlow или PyTorch с использованием функции проброса GPU (NVIDIA CUDA на WSL).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Примечание&lt;/strong>: Вы можете столкнуться с ограничениями, если вам нужно глубоко настроить ядро или если вы развертываете сложные сервисы, сильно зависящие от systemd (в настоящее время systemd поддерживается, но по умолчанию может быть отключен или иметь ограничения).&lt;/p>
&lt;h3 id="52-сценарии-когда-следует-выбрать-hyper-v">5.2. Сценарии, когда следует выбрать Hyper-V
&lt;/h3>&lt;p>Hyper-V предназначен для «виртуализации инфраструктуры и полной изоляции». Он обязателен для следующих задач:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Запуск ВМ Windows&lt;/strong>: При запуске различных версий Windows (например, Windows Server или старой Windows 10) в качестве среды тестирования.&lt;/li>
&lt;li>&lt;strong>Вложенная виртуализация (Nested Virtualization)&lt;/strong>: Если вам нужно запустить виртуальную машину (Hyper-V или KVM) внутри другой виртуальной машины. Это незаменимо для сред тестирования инженеров инфраструктуры.&lt;/li>
&lt;li>&lt;strong>Сложные сетевые требования&lt;/strong>: Если вам нужен строгий контроль над конфигурацией сети, например, подключение внешнего моста (подключение к той же локальной сети), тегирование VLAN или назначение нескольких NIC.&lt;/li>
&lt;li>&lt;strong>Снапшоты (Контрольные точки)&lt;/strong>: Функция сохранения состояния ВМ в определенный момент времени и возможности мгновенного отката в любой момент. Чрезвычайно полезно для разрушительного тестирования программного обеспечения или анализа вредоносных программ.&lt;/li>
&lt;li>&lt;strong>Фиксированное распределение ресурсов&lt;/strong>: Если вам нужно строго зафиксировать количество ядер CPU и объем памяти для минимизации влияния на хост-ОС.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="6-рассмотрение-пропускной-способности-ввода-вывода-с-использованием-математических-моделей-приложение">6. Рассмотрение пропускной способности ввода-вывода с использованием математических моделей (Приложение)
&lt;/h2>&lt;p>Для системного инженера при оценке пределов производительности ввода-вывода обеих систем важно теоретически понимать взаимосвязь между пропускной способностью $S$ и размером блока $B$.&lt;/p>
&lt;p>Пропускная способность передачи данных $S$ — это объем данных, переданных за единицу времени, которая моделируется следующим образом:&lt;/p>
$$ S(B) = \frac{B}{L_{setup} + \frac{B}{R_{max}}} $$&lt;ul>
&lt;li>$B$: Размер блока (Байты)&lt;/li>
&lt;li>$L_{setup}$: Фиксированная задержка, связанная с настройкой запроса ввода-вывода и переключением контекста&lt;/li>
&lt;li>$R_{max}$: Максимальная пропускная способность оборудования при копировании или передаче на устройство&lt;/li>
&lt;/ul>
&lt;p>При доступе к файлам через протокол 9P в WSL2 этот параметр $L_{setup}$ становится очень большим (из-за сокет-коммуникаций и сериализации/десериализации протокола). Таким образом, когда размер блока $B$ мал (массовое чтение/запись мелких файлов размером в несколько килобайт), влияние $L_{setup}$ в знаменателе становится доминирующим, и пропускная способность $S$ резко падает.
И наоборот, при доступе к VHDX через VMBus в Hyper-V, параметр $L_{setup}$ оптимизирован почти до уровня аппаратных прерываний, что позволяет поддерживать высокие значения IOPS даже для небольших блоков.&lt;/p>
&lt;p>Эта математическая реальность является логическим обоснованием лучшей практики, которая гласит: «В WSL2 нельзя размещать файлы проекта на стороне Windows».&lt;/p>
&lt;hr>
&lt;h2 id="7-заключение-две-сосуществующие-технологии-виртуализации">7. Заключение: Две сосуществующие технологии виртуализации
&lt;/h2>&lt;p>Hyper-V и WSL2 — это не ситуация, когда одна технология превосходит другую; это &lt;strong>«два решения с разными целями»&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>WSL2&lt;/strong> — это «лучший инструмент интеграции», позволяющий пробить оболочку ОС Windows и бесшовно и быстро предоставить экосистему Linux пользователям Windows. Не будет преувеличением сказать, что это идеальная CLI-среда для разработчиков.&lt;/li>
&lt;li>&lt;strong>Hyper-V&lt;/strong> — это «полноценный гипервизор», который привносит на рабочий стол надежную изоляцию и возможности управления, отточенные в корпоративных центрах обработки данных. Ему нет равных в построении сетей, тестировании ОС Windows и симуляции инфраструктурных сред.&lt;/li>
&lt;/ul>
&lt;p>В современных средах Windows эти две технологии не конкурируют друг с другом, а прекрасно сосуществуют на одной платформе ВМ. Используя их по назначению в зависимости от задачи, вы сделаете Windows самой мощной и гибкой инженерной рабочей станцией в мире.&lt;/p></description></item><item><title>Идеальное руководство по настройке среды разработки WSL2 (Windows Subsystem for Linux)</title><link>http://kenji.blog/ru/p/wsl2-ultimate-development-setup-guide/</link><pubDate>Sat, 12 Sep 2026 23:00:00 +0900</pubDate><guid>http://kenji.blog/ru/p/wsl2-ultimate-development-setup-guide/</guid><description>&lt;img src="http://kenji.blog/p/wsl2-ultimate-development-setup-guide/img/eyecatch.jpg" alt="Featured image of post Идеальное руководство по настройке среды разработки WSL2 (Windows Subsystem for Linux)" />&lt;p>WSL2 (Windows Subsystem for Linux 2), предоставляющая нативную среду разработки Linux в Windows, стала незаменимым инструментом в современной разработке программного обеспечения. Однако существует огромная разница в производительности и удобстве разработки между использованием её по умолчанию и правильной настройкой с пониманием архитектуры.&lt;/p>
&lt;p>В этой статье мы подробно, в объёме более 10 000 символов, рассмотрим все этапы создания &amp;ldquo;идеальной среды разработки&amp;rdquo;, востребованной профессиональными инженерами: начиная с объяснения архитектуры, лежащей в основе WSL2, и заканчивая настройками для максимальной производительности, созданием комфортной терминальной среды, бесшовной интеграцией с Docker и VS Code, а также расширенными сетевыми настройками.&lt;/p>
&lt;hr>
&lt;h2 id="1-архитектура-wsl2-и-эволюция-от-wsl1">1. Архитектура WSL2 и эволюция от WSL1
&lt;/h2>&lt;p>Чтобы полностью раскрыть потенциал WSL2, важно сначала понять её внутреннюю структуру. В оригинальной WSL (WSL1) и WSL2 подходы к запуску бинарных файлов Linux на Windows принципиально отличаются.&lt;/p>
&lt;h3 id="wsl1-слой-трансляции-системных-вызовов">WSL1: Слой трансляции системных вызовов
&lt;/h3>&lt;p>WSL1 использовала механизм трансляции (перевода) системных вызовов Linux в API Windows NT в реальном времени. Поскольку виртуальная машина (ВМ) не использовалась, преимуществом были очень низкие накладные расходы на ресурсы. Однако было сложно полностью эмулировать сложные системные вызовы, такие как операции ввода-вывода файловой системы, что приводило к катастрофическому падению производительности при обработке большого количества мелких файлов, особенно в таких задачах, как &lt;code>npm install&lt;/code> в Node.js или операции с репозиториями Git.&lt;/p>
&lt;h3 id="wsl2-легковесная-служебная-вм-и-полноценное-ядро-linux">WSL2: Легковесная служебная ВМ и полноценное ядро Linux
&lt;/h3>&lt;p>В WSL2 архитектура была полностью переработана: теперь настоящее ядро Linux, собранное Microsoft, работает напрямую на &lt;strong>&amp;ldquo;легковесной служебной ВМ&amp;rdquo; (Lightweight Utility VM), использующей подмножество архитектуры Hyper-V&lt;/strong>. Это гарантирует 100% совместимость системных вызовов, а использование виртуального диска (VHDX) с нативной файловой системой Linux ext4 кардинально повысило производительность файлового ввода-вывода по сравнению с WSL1.&lt;/p>
&lt;p>Следующая диаграмма Mermaid показывает структурные различия между WSL1 и WSL2.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
subgraph &amp;#34;Среда ОС Windows&amp;#34;
A[&amp;#34;Ядро Windows NT&amp;#34;]
A --&amp;gt; F[&amp;#34;Файловая система NTFS (Диск C:)&amp;#34;]
end
subgraph &amp;#34;Архитектура WSL2&amp;#34;
B[&amp;#34;Гипервизор Hyper-V&amp;#34;]
B --&amp;gt; C[&amp;#34;Легковесная служебная ВМ&amp;#34;]
C --&amp;gt; D[&amp;#34;Ядро Linux (Microsoft)&amp;#34;]
D --&amp;gt; E[&amp;#34;Пространство пользователя Ubuntu (glibc, bash и т.д.)&amp;#34;]
D --&amp;gt; G[&amp;#34;Виртуальный диск ext4 (.vhdx)&amp;#34;]
end
A -.-&amp;gt;|&amp;#34;Сетевой общий ресурс по протоколу Plan 9 (9P)&amp;#34;| D
style B fill:#f9f,stroke:#333,stroke-width:2px
style D fill:#bbf,stroke:#333,stroke-width:2px
&lt;/pre>
&lt;p>Важный урок из этой структуры: &lt;strong>&amp;ldquo;Доступ к файлам на стороне Linux (внутри VHDX) работает чрезвычайно быстро, но доступ к файлам на стороне Windows (&lt;code>/mnt/c/&lt;/code>) очень медленный, так как осуществляется через протокол 9P&amp;rdquo;&lt;/strong>. Исходный код проекта обязательно должен располагаться в домашнем каталоге на стороне WSL (&lt;code>~&lt;/code>).&lt;/p>
&lt;hr>
&lt;h2 id="2-математический-анализ-производительности-почему-wsl2-такая-быстрая">2. Математический анализ производительности: Почему WSL2 такая быстрая?
&lt;/h2>&lt;p>Давайте количественно оценим прирост производительности WSL2 с использованием математической модели. Одной из самых ресурсоемких операций в разработке программного обеспечения является обработка большого количества файлового ввода-вывода (например, установка библиотек или сборка).&lt;/p>
&lt;p>Общее время выполнения некоторого процесса $T_{total}$ выражается как сумма времени вычислений процессора $T_{compute}$ и времени дискового ввода-вывода $T_{io}$.&lt;/p>
$$ T_{total} = T_{compute} + T_{io} $$&lt;p>В случае WSL1 возникают накладные расходы на преобразование операций Linux в операции NTFS, поэтому время ввода-вывода моделируется следующим образом. Где $n$ — количество файловых операций, $t_{ntfs\_syscall_i}$ — время выполнения системного вызова на стороне Windows, а $t_{trans_i}$ — накладные расходы слоя трансляции.&lt;/p>
$$ T_{wsl1\_io} = \sum_{i=1}^{n} (t_{ntfs\_syscall_i} + t_{trans_i}) $$&lt;p>С другой стороны, в случае WSL2 ядро напрямую обращается к файловой системе ext4, поэтому накладные расходы составляют лишь незначительную задержку от виртуализации $t_{virt_i}$.&lt;/p>
$$ T_{wsl2\_io} = \sum_{i=1}^{n} (t_{ext4_i} + t_{virt_i}) $$&lt;p>В обычных файловых системах $t_{ext4} \ll t_{ntfs\_syscall} + t_{trans}$, поэтому когда $n$ очень велико (сотни тысяч файловых операций), разница во времени ввода-вывода между WSL1 и WSL2 растет экспоненциально.&lt;/p>
&lt;p>Кроме того, если обозначить долю накладных расходов на вычисления CPU в виртуализированной среде как $\rho$, то благодаря современной аппаратной поддержке виртуализации (Intel VT-x / AMD-V) значение $\rho \approx 0.01 \sim 0.03$ (около 1–3%). Следовательно, даже в чисто вычислительных задачах производительность составляет от $97\% \sim 99\%$ и не уступает нативной среде Linux.&lt;/p>
&lt;hr>
&lt;h2 id="3-установка-и-базовая-настройка">3. Установка и базовая настройка
&lt;/h2>&lt;p>В Windows 10/11 установка WSL2 стала очень простой. Достаточно открыть PowerShell от имени администратора и выполнить следующую команду.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># По умолчанию установит WSL2 и Ubuntu&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-install&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Для указания конкретного дистрибутива&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Можно проверить с помощью wsl --list --online&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-install&lt;/span> &lt;span class="n">-d&lt;/span> &lt;span class="n">Ubuntu&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="mf">24.04&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>После установки и перезагрузки при первом запуске вам будет предложено создать имя пользователя UNIX и пароль. Этот пользователь не зависит от пользователя Windows и действителен только внутри WSL.&lt;/p>
&lt;p>Если вы уже используете WSL1, вы можете конвертировать её в WSL2 с помощью следующей команды:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Конвертировать существующий дистрибутив в WSL2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-set-version&lt;/span> &lt;span class="n">Ubuntu&lt;/span> &lt;span class="mf">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Установить WSL2 по умолчанию для новых дистрибутивов&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-set-default-version&lt;/span> &lt;span class="mf">2&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="4-секреты-управления-ресурсами-wslconfig-и-wslconf">4. Секреты управления ресурсами: .wslconfig и wsl.conf
&lt;/h2>&lt;p>Одной из главных ловушек WSL2 является &amp;ldquo;безграничное потребление памяти (разрастание процесса Vmmem)&amp;rdquo;. Поскольку WSL2 использует страничный кэш ядра Linux, каждая операция ввода-вывода безостановочно поглощает память хоста (Windows). Чтобы предотвратить это, обязательно нужно ограничить ресурсы через файлы конфигурации.&lt;/p>
&lt;p>Конфигурационные файлы WSL2 разделены на два типа: &lt;strong>&lt;code>.wslconfig&lt;/code> (влияет на всю Windows)&lt;/strong> и &lt;strong>&lt;code>wsl.conf&lt;/code> (влияет на внутреннюю часть каждого дистрибутива)&lt;/strong>.&lt;/p>
&lt;h3 id="41-wslconfig-на-стороне-windows">4.1. .wslconfig (на стороне Windows)
&lt;/h3>&lt;p>Создайте файл в каталоге профиля пользователя Windows (&lt;code>C:\Users\&amp;lt;Имя_пользователя&amp;gt;\.wslconfig&lt;/code>), чтобы управлять выделением ресурсов для ВМ.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># C:\Users\&amp;lt;Имя_пользователя&amp;gt;\.wslconfig&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[wsl2]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Максимальный объем памяти, выделяемый ВМ. Рекомендуется около 50%–75% от общей памяти хоста.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">memory&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">16GB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Количество используемых ядер процессора (если не указано, используются все ядра).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">processors&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Размер файла подкачки (swap).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">swap&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">8GB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Расположение файла подкачки (если хотите сэкономить место на диске C).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># swapfile=D:\\wsl\\swap.vhdx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Включить переадресацию localhost (для доступа к WSL из Windows через localhost).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">localhostForwarding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Автоматически освобождать память (только для Windows 11).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Динамически освобождает страничный кэш, предотвращая разрастание Vmmem.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">autoMemoryReclaim&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">dropcache&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[experimental]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Расширенные сетевые функции, доступные в Windows 11 22H2 и новее.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Включает поддержку IPv6 и использование одного и того же IP-адреса между WSL и Windows.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">networkingMode&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">mirrored&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">dnsTunneling&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">firewall&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">autoProxy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="42-wslconf-на-стороне-linux">4.2. wsl.conf (на стороне Linux)
&lt;/h3>&lt;p>Отредактируйте &lt;code>/etc/wsl.conf&lt;/code> внутри WSL, чтобы управлять поведением конкретного дистрибутива.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># /etc/wsl.conf (Редактируется внутри WSL)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[network]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Отключить автоматическую генерацию /etc/resolv.conf при запуске WSL.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Полезно, если вы хотите установить собственный DNS (например, 8.8.8.8).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">generateResolvConf&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Установить собственное имя хоста.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">hostname&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">WSL-DevNode&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[automount]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Настройки монтирования дисков Windows.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">enabled&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">options&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;metadata,uid=1000,gid=1000,umask=022&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Изменить точку монтирования диска C с /mnt/c на /c (сокращает пути).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">root&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[boot]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Включить systemd (WSL 0.67.6 и новее).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Позволяет нативно запускать snap и различные демоны (например, Docker).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">systemd&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[user]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Пользователь для входа по умолчанию.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">default&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">kenji&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Чтобы применить эти настройки, необходимо выполнить команду &lt;code>wsl --shutdown&lt;/code> в PowerShell, полностью остановить ВМ WSL, а затем перезапустить её.&lt;/p>
&lt;hr>
&lt;h2 id="5-идеальная-терминальная-среда-zsh--powerlevel10k">5. Идеальная терминальная среда: Zsh + Powerlevel10k
&lt;/h2>&lt;p>bash по умолчанию не способствует высокой продуктивности. Мы создадим мощную строку приглашения, объединив Zsh, который может похвастаться мощным автодополнением и отличной читаемостью, со сверхбыстрой темой &amp;ldquo;Powerlevel10k&amp;rdquo;.&lt;/p>
&lt;h3 id="51-установка-и-настройка-windows-terminal">5.1. Установка и настройка Windows Terminal
&lt;/h3>&lt;p>Установите &amp;ldquo;Windows Terminal&amp;rdquo; из Microsoft Store. Откройте настройки JSON (&lt;code>settings.json&lt;/code>), установите WSL (Ubuntu) в качестве профиля по умолчанию и измените шрифт на Nerd Font, подходящий для разработки (например, &lt;code>HackGen Console NF&lt;/code> или &lt;code>MesloLGS NF&lt;/code>).&lt;/p>
&lt;h3 id="52-установка-zsh-и-oh-my-zsh">5.2. Установка Zsh и Oh My Zsh
&lt;/h3>&lt;p>Выполните следующие команды в терминале WSL:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Обновление пакетов и установка Zsh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt update &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo apt upgrade -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install -y zsh git curl
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Запуск скрипта установки Oh My Zsh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sh -c &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="53-установка-powerlevel10k-и-плагинов">5.3. Установка Powerlevel10k и плагинов
&lt;/h3>&lt;p>Мы установим плагины для дальнейшего расширения Zsh (подсветка синтаксиса и автодополнение ввода) и тему Powerlevel10k.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Powerlevel10k&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone --depth&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> https://github.com/romkatv/powerlevel10k.git &lt;span class="si">${&lt;/span>&lt;span class="nv">ZSH_CUSTOM&lt;/span>&lt;span class="k">:-&lt;/span>&lt;span class="nv">$HOME&lt;/span>&lt;span class="p">/.oh-my-zsh/custom&lt;/span>&lt;span class="si">}&lt;/span>/themes/powerlevel10k
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># zsh-autosuggestions&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/zsh-users/zsh-autosuggestions &lt;span class="si">${&lt;/span>&lt;span class="nv">ZSH_CUSTOM&lt;/span>&lt;span class="k">:-&lt;/span>&lt;span class="p">~/.oh-my-zsh/custom&lt;/span>&lt;span class="si">}&lt;/span>/plugins/zsh-autosuggestions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># zsh-syntax-highlighting&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/zsh-users/zsh-syntax-highlighting.git &lt;span class="si">${&lt;/span>&lt;span class="nv">ZSH_CUSTOM&lt;/span>&lt;span class="k">:-&lt;/span>&lt;span class="p">~/.oh-my-zsh/custom&lt;/span>&lt;span class="si">}&lt;/span>/plugins/zsh-syntax-highlighting
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Отредактируйте &lt;code>~/.zshrc&lt;/code>, чтобы включить тему и плагины:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Изменения в ~/.zshrc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ZSH_THEME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;powerlevel10k/powerlevel10k&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Добавьте в массив плагинов&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">plugins&lt;/span>&lt;span class="o">=(&lt;/span>git zsh-autosuggestions zsh-syntax-highlighting&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Сохраните изменения и выполните &lt;code>source ~/.zshrc&lt;/code>, запустится мастер настройки Powerlevel10k (&lt;code>p10k configure&lt;/code>). Следуйте инструкциям на экране, чтобы настроить строку приглашения на свой вкус (стиль приглашения, наличие иконок, отображаемая информация и т.д.). Имя ветки Git и статус, версия Node.js, время выполнения команд будут отображаться в реальном времени, что значительно повысит эффективность разработки.&lt;/p>
&lt;hr>
&lt;h2 id="6-vs-code-remote---бесшовная-интеграция-с-wsl">6. VS Code Remote - Бесшовная интеграция с WSL
&lt;/h2>&lt;p>В разработке на WSL2 механизм бесшовного доступа к файлам внутри WSL из IDE (Visual Studio Code), установленной на Windows, обеспечивается расширением &amp;ldquo;Remote - WSL&amp;rdquo;.&lt;/p>
&lt;h3 id="объяснение-архитектуры">Объяснение архитектуры
&lt;/h3>&lt;p>Следующая диаграмма последовательности показывает, как VS Code взаимодействует с WSL2.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
autonumber
participant U as &amp;#34;Разработчик&amp;#34;
participant V as &amp;#34;VS Code UI (Windows)&amp;#34;
participant S as &amp;#34;VS Code Server (WSL2)&amp;#34;
participant F as &amp;#34;Файловая система ext4 (WSL2)&amp;#34;
U-&amp;gt;&amp;gt;V: &amp;#34;Ввести `code .` в терминале WSL&amp;#34;
V-&amp;gt;&amp;gt;S: &amp;#34;Установить RPC-соединение через Vsock&amp;#34;
Note over V,S: Общение через сокеты Hyper-V вместо TCP/IP
S-&amp;gt;&amp;gt;F: &amp;#34;Чтение исходных файлов / Запуск линтера&amp;#34;
F--&amp;gt;&amp;gt;S: &amp;#34;Возврат данных и результатов анализа&amp;#34;
S--&amp;gt;&amp;gt;V: &amp;#34;Потоковая передача результатов Language Server в интерфейс&amp;#34;
V--&amp;gt;&amp;gt;U: &amp;#34;Отображение подсветки синтаксиса и ошибок&amp;#34;
&lt;/pre>
&lt;p>VS Code на стороне Windows работает как простой &amp;ldquo;тонкий клиент (UI)&amp;rdquo;, в то время как все тяжелые процессы, такие как Language Server, отладчик и выполнение терминала, обрабатываются &amp;ldquo;сервером VS Code&amp;rdquo; на стороне WSL. Благодаря этому вы можете поддерживать чистоту среды на стороне WSL без необходимости устанавливать Node.js или Python на Windows.&lt;/p>
&lt;h3 id="обязательные-настройки-vs-code">Обязательные настройки VS Code
&lt;/h3>&lt;p>Из раздела &amp;ldquo;Расширения&amp;rdquo; в VS Code установите &lt;strong>&amp;ldquo;WSL&amp;rdquo; (ms-vscode-remote.remote-wsl)&lt;/strong>. После этого просто перейдите в директорию вашего проекта в терминале WSL и выполните &lt;code>code .&lt;/code>, и VS Code на стороне Windows запустится с открытой директорией.&lt;/p>
&lt;p>&lt;strong>Важное замечание (проблема символов переноса строки):&lt;/strong>
Символы переноса строки в Windows и Linux отличаются (в Windows — &lt;code>CRLF&lt;/code>, в Linux — &lt;code>LF&lt;/code>). При разработке в WSL обязательно унифицируйте настройки &lt;code>core.autocrlf&lt;/code> в Git и настройки файлов по умолчанию в VS Code на &lt;code>LF&lt;/code>. Игнорирование этого приведет к загадочным ошибкам при выполнении скриптов оболочки или запуске контейнеров Docker.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Настройка символов переноса строки Git на стороне WSL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global core.autocrlf input
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Также добавьте следующее в &lt;code>settings.json&lt;/code> (Удаленные настройки) VS Code:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;files.eol&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;terminal.integrated.defaultProfile.linux&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;zsh&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="7-docker-desktop-и-оптимизация-интеграции-с-wsl2">7. Docker Desktop и оптимизация интеграции с WSL2
&lt;/h2>&lt;p>В среде WSL2 существует два основных подхода к использованию Docker:&lt;/p>
&lt;ol>
&lt;li>Установить &lt;strong>Docker Desktop for Windows&lt;/strong> и включить функцию интеграции WSL2.&lt;/li>
&lt;li>Установить &lt;strong>нативный Docker Engine&lt;/strong> напрямую внутри WSL2 (например, Ubuntu).&lt;/li>
&lt;/ol>
&lt;h3 id="подход-1-docker-desktop-рекомендуется">Подход 1: Docker Desktop (рекомендуется)
&lt;/h3>&lt;p>Этот вариант рекомендуется в большинстве случаев из-за простоты управления через GUI и прозрачного доступа к контейнерам между Windows и WSL. Проверьте следующие настройки (Settings) в Docker Desktop:&lt;/p>
&lt;ul>
&lt;li>Установите галочку &lt;code>General&lt;/code> -&amp;gt; &lt;code>Use the WSL 2 based engine&lt;/code>.&lt;/li>
&lt;li>Перейдите в &lt;code>Resources&lt;/code> -&amp;gt; &lt;code>WSL Integration&lt;/code> -&amp;gt; установите галочку на &lt;code>Enable integration with my default WSL distro&lt;/code> и включите переключатель для используемого дистрибутива (Ubuntu).&lt;/li>
&lt;/ul>
&lt;p>Теперь команду &lt;code>docker&lt;/code> можно будет вызывать прямо из терминала WSL2, а связь с демоном Docker будет осуществляться через специальную легковесную ВМ (&lt;code>docker-desktop&lt;/code> и &lt;code>docker-desktop-data&lt;/code>), управляемую Docker Desktop.&lt;/p>
&lt;h3 id="подход-2-прямая-установка-нативного-docker-engine">Подход 2: Прямая установка нативного Docker Engine
&lt;/h3>&lt;p>Если у вас есть корпоративные сетевые ограничения (например, чтобы избежать платы за Docker Desktop) или вы хотите минимизировать накладные расходы до предела, включите &lt;code>systemd&lt;/code> в &lt;code>/etc/wsl.conf&lt;/code> и установите Docker напрямую, как на обычном сервере Ubuntu.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Фрагмент официальной инструкции по установке Docker для WSL2 Ubuntu с включенным systemd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get install ca-certificates curl gnupg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo install -m &lt;span class="m">0755&lt;/span> -d /etc/apt/keyrings
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -fsSL https://download.docker.com/linux/ubuntu/gpg &lt;span class="p">|&lt;/span> sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chmod a+r /etc/apt/keyrings/docker.gpg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Добавление репозитория&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="s2">&amp;#34;deb [arch=&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>dpkg --print-architecture&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34; signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>. /etc/os-release &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$VERSION_CODENAME&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34; stable&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Добавьте текущего пользователя в группу docker (чтобы запускать команды без sudo)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo usermod -aG docker &lt;span class="nv">$USER&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>После перезагрузки &lt;code>systemctl start docker&lt;/code> будет работать точно так же, как в нативной среде Linux, обеспечивая высокую производительность.&lt;/p>
&lt;hr>
&lt;h2 id="8-интеграция-ssh-ключей-бесшовная-аутентификация-в-windows-и-wsl">8. Интеграция SSH ключей: Бесшовная аутентификация в Windows и WSL
&lt;/h2>&lt;p>При клонировании через SSH в Git или подключении к удаленным серверам управлять отдельными SSH-ключами для Windows и WSL очень неудобно. Чтобы совместить безопасность и удобство, мы настроим мост (переадресацию) от SSH-агента, работающего на стороне Windows (или менеджера паролей, такого как 1Password), в сторону WSL.&lt;/p>
&lt;p>Здесь мы рассмотрим самый современный и безопасный подход: использование &lt;strong>функции SSH-агента 1Password&lt;/strong> или &lt;strong>OpenSSH Authentication Agent для Windows&lt;/strong> и переадресацию их в UNIX-сокет домена в WSL2 с помощью &lt;code>npiperelay&lt;/code> и &lt;code>socat&lt;/code>.&lt;/p>
&lt;h3 id="переадресация-сокета-ssh-agent">Переадресация сокета ssh-agent
&lt;/h3>&lt;p>Обычно SSH-агент в Windows предоставляется как Named Pipe (именованный канал), и его нужно преобразовать в файл сокета для WSL. Это легко сделать с помощью &lt;code>wsl-ssh-agent&lt;/code> или функций, предлагаемых 1Password.&lt;/p>
&lt;p>В настройках 1Password перейдите в &amp;ldquo;Developer&amp;rdquo; и включите &amp;ldquo;Использовать SSH-агент&amp;rdquo;.
Затем добавьте следующие настройки в &lt;code>~/.zshrc&lt;/code> или &lt;code>~/.bashrc&lt;/code> на стороне WSL, чтобы автоматически привязывать сокет при входе в систему.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Добавление в ~/.zshrc (Пример при использовании SSH-агента 1Password)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">SSH_AUTH_SOCK&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$HOME&lt;/span>/.ssh/agent.sock
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Если сокет не существует при запуске WSL или процесс не привязан, используйте socat и npiperelay для переадресации&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ALREADY_RUNNING&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>ps -aux &lt;span class="p">|&lt;/span> grep &lt;span class="s2">&amp;#34;[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> wc -l&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> &lt;span class="nv">$ALREADY_RUNNING&lt;/span> -eq &lt;span class="m">0&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> -S &lt;span class="nv">$SSH_AUTH_SOCK&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rm &lt;span class="nv">$SSH_AUTH_SOCK&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Запустите socat в фоновом режиме, чтобы соединить Named Pipe Windows с UNIX-сокетом WSL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">(&lt;/span>setsid socat UNIX-LISTEN:&lt;span class="nv">$SSH_AUTH_SOCK&lt;/span>,fork EXEC:&lt;span class="s2">&amp;#34;npiperelay.exe -ei -s //./pipe/openssh-ssh-agent&amp;#34;&lt;/span>,nofork &lt;span class="p">&amp;amp;&lt;/span>&lt;span class="o">)&lt;/span> &amp;gt;/dev/null 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>*Вам потребуется предварительно установить &lt;code>npiperelay.exe&lt;/code> в Windows и добавить его в переменную среды PATH.&lt;/p>
&lt;p>После завершения настройки при выполнении команды &lt;code>ssh-add -l&lt;/code> в терминале WSL вы увидите список публичных ключей SSH, зарегистрированных в 1Password или на стороне Windows. Это позволяет безопасно проходить аутентификацию без необходимости копировать файлы секретных ключей внутрь WSL.&lt;/p>
&lt;hr>
&lt;h2 id="9-обслуживание-оптимизация-сжатие-раздутого-vhdx">9. Обслуживание: Оптимизация (сжатие) раздутого VHDX
&lt;/h2>&lt;p>Один из самых больших недостатков WSL2 заключается в том, что &amp;ldquo;размер файла виртуального диска (.vhdx) в Windows не уменьшается автоматически даже после удаления образов Docker или удаления файлов&amp;rdquo;. В течение длительной разработки размер файла ext4.vhdx может вырасти до десятков или сотен гигабайт.&lt;/p>
&lt;p>Чтобы освободить дисковое пространство, необходимо регулярно оптимизировать (Compact) VHDX со стороны Windows.&lt;/p>
&lt;ol>
&lt;li>Сначала полностью завершите работу WSL:
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-shutdown&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>Откройте PowerShell с правами администратора и выполните следующую команду &lt;code>diskpart&lt;/code> или команду &lt;code>Optimize-VHD&lt;/code> из модуля Hyper-V (последняя доступна, только если включен Hyper-V).&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Если доступен модуль Hyper-V&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Optimize-VHD&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$env:LOCALAPPDATA&lt;/span>&lt;span class="s2">\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx&amp;#34;&lt;/span> &lt;span class="n">-Mode&lt;/span> &lt;span class="n">Full&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># При использовании diskpart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">diskpart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Введите команды интерактивно в открывшемся окне&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="nb">select &lt;/span>&lt;span class="n">vdisk&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="s2">&amp;#34;C:\Users\&amp;lt;Имя_пользователя&amp;gt;\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">attach&lt;/span> &lt;span class="n">vdisk&lt;/span> &lt;span class="n">readonly&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">compact&lt;/span> &lt;span class="n">vdisk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">detach&lt;/span> &lt;span class="n">vdisk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">exit&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Регулярно выполняя эту операцию, вы сможете вернуть впустую израсходованное пространство на диске C.&lt;/p>
&lt;hr>
&lt;h2 id="10-заключение">10. Заключение
&lt;/h2>&lt;p>WSL2 полностью переросла рамки &amp;ldquo;просто бонуса Linux для Windows&amp;rdquo; и превратилась в мощную платформу разработки, не уступающую, а порой и превосходящую MacOS или нативные компьютеры на Linux.&lt;/p>
&lt;p>Применив все описанные здесь настройки (оптимизацию ресурсов через &lt;code>.wslconfig&lt;/code>, улучшение терминала с помощью Zsh + Powerlevel10k, прозрачный доступ с помощью VS Code Remote, а также настройку интеграции SSH и обслуживание VHDX), вы получите &amp;ldquo;идеальную среду разработки&amp;rdquo; — быструю, безопасную и не вызывающую стресса.&lt;/p>
&lt;p>Настройка среды требует некоторых усилий, но как только всё будет настроено, ваша продуктивность как инженера обязательно возрастет. Не стесняйтесь использовать это руководство в качестве основы и исследовать дальнейшие настройки в соответствии с требованиями ваших проектов и вашими предпочтениями.&lt;/p></description></item></channel></rss>