mysurik.ru

WSL2 на Windows 11: мой Linux-инструментарий без второй машины

Зачем мне вообще Linux внутри Windows

Рабочий ноутбук мне достался с Windows 11. Не спорю, машина хорошая, но я годы прожил в Linux, и мои руки отказывались понимать PowerShell. Каждый раз, когда надо было быстро поднять nginx, глянуть логи или запустить скрипт на bash, я разворачивал виртуалку. Пятнадцать минут на запуск, три гигабайта памяти съедено, а задача-то занимала две минуты. Знакомо? Тогда история ниже для вас.

Я уже писал, как перешёл на NixOS и перестал бояться конфигов, так вот Linux мне нужен не как религия, а как инструмент. Терминал, пакетный менеджер, привычные утилиты. И в какой-то момент коллега сказал мне: «Ты чего мучаешься, поставь WSL2». Я отмахнулся, мол, очередная эмуляция, будет тормозить. Зря отмахнулся, кстати.

WSL2 — это Windows Subsystem for Linux второй версии. Если коротко, Microsoft запихнула внутрь Windows настоящее ядро Linux. Не эмуляцию, не переводчик команд, а лёгкую виртуальную машину с реальным Ubuntu внутри. Об этой штуке я и хочу рассказать: как я её ставил, что настроил, куда тыкнул носом систему, когда она тупила, и почему теперь открываю виртуалки раз в месяц, а не пять раз в день.

Чем WSL2 отличается от первой версии, и почему это важно

Первая версия WSL работала как переводчик. Ты пишешь bash-команду, Windows её перехватывает и пытается выполнить через слой совместимости. Где-то работало, где-то падало, systemd не было вообще, а некоторые пакеты просто отказывались ставиться. Я её попробовал ещё в 2019 году и вернулся к виртуалкам.

Во второй версии подход сменили кардинально. Внутри запускается настоящая виртуалка на Hyper-V, в ней — настоящее ядро Linux. Microsoft его сама собирает и обновляет. Для тебя это выглядит как обычный терминал, но внутри — полноценный Ubuntu с apt, systemd и всеми привычными пакетами. Фух, вот теперь по-взрослому.

Разница на практике огромная. Docker внутри WSL2 работает нормально, потому что ядро настоящее. Сеть ведёт себя предсказуемо. Файловая система ext4 честная. Я сначала не поверил и специально погонял свои старые скрипты, которые первая версия давилась. Всё прошло с первого раза.

Как я ставил WSL2: десять минут и один перезапуск

Ставится всё одной командой. Открываешь PowerShell от администратора и пишешь:

wsl --install

Команда сама включит нужные компоненты Windows, скачает ядро и поставит Ubuntu по умолчанию. После этого система попросит перезагрузиться. Перезагружаешься, Ubuntu доустанавливается и просит придумать логин с паролем. Всё. Больше никаких танцев с включением компонентов вручную, как это было раньше.

Единственный момент, где я споткнулся: у меня была старая сборка Windows 11, и команда предложила обновиться. Я сначала полез в настройки компонентов, что-то там включал руками, потом плюнулся, просто обновил Windows через Windows Update, и после этого установка прошла с первого тыка. Так что если у вас что-то не заводится — сначала обновите систему, потом уже гуглите.

Проверить, что всё живое, можно так:

wsl -l -v

У меня вывелся список с Ubuntu и версией 2. Если у кого-то стоит единица, переводится командой wsl --set-version Ubuntu 2. Займёт минут двадцать, зато потом не будете страдать.

Какой дистрибутив я выбрал и почему

По умолчанию ставится Ubuntu, и я не стал изобретать велосипед. Мой основной сервер живёт на Debian, Ubuntu — его родня, так что привычные команды работают один в один. Но список доступных дистрибутивов приличный:

wsl --list --online

Там есть Debian, openSUSE, Kali, Oracle Linux. Я ради интереса поставил Debian второй машиной и переключаться можно командой wsl -d Debian. Забавно, но Ubuntu мне зашла больше — пакеты свежее, а сообщество больше: любая проблема уже кем-то решена.

Настройка, которую я делаю сразу после установки

Чистый Ubuntu хорош, но я сразу накатываю свой минимальный набор. Сначала обновления, куда без них:

sudo apt update && sudo apt upgrade -y

Потом git, curl, htop и пара утилит, без которых мне некомфортно. Дальше — SSH-ключи. Вот тут я поймал первый «Момент Икс», о котором стоит рассказать подробнее.

Я скопировал свои ключи в WSL, выставил права, всё как обычно. Пытаюсь подключиться к своему серверу — и получаю отказ. Думаешь, ключ не тот? Нет. Оказалось, Windows тянула свой встроенный ssh-агент, и ключи из WSL просто не подхватывались. Я часа два бился, пока не понял: для git и ssh внутри WSL надо использовать именно линуксовый агент, а не виндовый. Прописал в ~/.bashrc добавление ключа в ssh-agent — и о чудо, всё заработало.

Ещё я сразу ограничил аппетиты WSL2 по памяти. По умолчанию виртуалка может отъесть до половины оперативки, и однажды я заметил, что браузер начал задыхаться. Лечится файлом .wslconfig в домашней папке Windows:

[wsl2]
memory=6GB
processors=4
swap=2GB

После правки файла делаем wsl --shutdown и заходим заново. Память теперь живёт в рамках, и ноутбук перестал потеть.

Файловая система: где что лежит и почему это важно

Тут у новичков чаще всего боль. Внутри WSL2 твой линуксовый диск лежит в \\wsl$\Ubuntu, а диски Windows примонтированы в /mnt/c и дальше. Казалось бы, работай где хочешь. Но скорость на этих файловых системах разная в разы.

Я как-то положил проект на диск C и стал собирать его из WSL. Сборка шла мучительно долго, я уже думал, что WSL2 — это всё враньё и тормоза. Потом перенёс проект внутрь линуксовой файловой системы, в домашнюю папку. Та же сборка стала быстрее в четыре-пять раз. Не в процентах, а в разы, Карл!

С тех пор правило простое: код живёт в файловой системе Linux, а виндовые документы — на диске C. Доступ из Проводника к линуксовым файлам работает через \\wsl$, и для править конфиг блокнотом его хватает. Но компиляторы, git и прочие инструменты пусть работают со своими родными дисками.

VS Code подружился с WSL2 лучше всех

Отдельной строкой хочу отметить интеграцию с Visual Studio Code. Ставишь расширение WSL, открываешь папку проекта командой code . из терминала — и редактор запускается на Windows, а весь его терминал, отладчик и расширения живут внутри Linux. Выглядит как магия, работает без пинка.

Я сначала ворчал, что это проприетарщина, а потом сдался за неделю. Отладка Python внутри WSL работает как родная, подсказки по линуксовым путям не врут, терминал не путается в буквах дисков. Для меня это оказалось тем самым случаем, когда удобство перевесило принципы.

Docker внутри WSL2: работает лучше, чем я ожидал

Я долго держал Docker на отдельном сервере, о чём писал в статье про свой опыт с Docker на домашнем сервере. Но для локальных экспериментов контейнеры внутри WSL2 оказались очень удобными. Ставишь Docker Engine прямо в Ubuntu, без Docker Desktop, и всё крутится как на обычном линуксе.

Почему без Docker Desktop? Он платный для коммерческого использования в крупных компаниях, да и жрёт лишнюю память на свой интерфейс. Мне хватило чистого движка:

sudo apt install docker.io
sudo usermod -aG docker $USER

После этого контейнеры запускаются одной командой, порты пробрасываются на localhost, и я могу поднять базу для теста за минуту. Локальная разработка стала заметно живее.

Сеть: localhost и доступ к сервисам

С сетью у WSL2 вышло приятное удивление. Сервис, поднятый внутри Linux, доступен с Windows по обычному localhost. Поднял nginx на 8080 порту — открываешь в браузере Windows localhost:8080, и он там. Проброс работает автоматически, ничего настраивать не надо.

Обратное направление тоже работает, но с нюансами: из Linux до виндовых сервисов добираешься через IP шлюза, который виден в ip route. Я как-то долго тупил, почему мой линуксовый скрипт не видит базу на Windows, а надо было просто использовать не localhost, а адрес шлюза. Мелочь, а неприятно.

Кстати, про сеть и безопасность: для доступа к своим серверам я использую WireGuard, и рассказывал, как поднял личный VPN-туннель за 10 минут. Внутри WSL2 клиент WireGuard завёлся без сюрпризов, хотя я готовился к войне.

Бэкап и перенос: одна команда вместо ночи страданий

Когда я сменил ноутбук, то боялся переезда с WSL2 как огня. А оказалось, вся моя линуксовая среда выгружается в один файл:

wsl --export Ubuntu ubuntu-backup.tar

На новой машине — wsl --import Ubuntu ./Ubuntu ubuntu-backup.tar, и ты снова дома. Все пакеты, конфиги, ключи, история — внутри. Я переехал за вечер, причём большую часть вечера пил чай. Для сравнения: переезд с физического линукса я однажды делал двое суток.

Что меня до сих пор раздражает в WSL2

Не буду рисовать райскую жизнь, есть и минусы. Первый — доступ к USB-железу. Подключить программатор или специфичный адаптер внутрь WSL2 можно, но через костыль usbipd, и работает это через раз. Мне хватило один раз помучиться, чтобы запомнить: железо — только в Windows.

Второй — память. Даже с лимитом в .wslconfig виртуалка иногда жадничает, и кэш внутри Linux не спешит отдаваться назад. Лечится всё тем же wsl --shutdown, но осадочек остаётся. Третий — звук и графика: если тебе нужен линукс с десктопом, WSL2 не про это. Он про терминал и разработку.

И четвёртый, самый смешной: иногда я забываю, где нахожусь. Откроешь терминал, поработаешь час, а потом пытаешься открыть виндовый проводник линуксовой командой. Мозг уже перепутал миры. Согласитесь, забавная плата за комфорт?

Мой вердикт после полугода с WSL2

Полгода спустя WSL2 живёт у меня как постоянный инструмент. Виртуалки я запускаю только когда нужен именно десктопный Linux для тестов. Терминальные задачи — сразу в WSL2: быстро, привычно, без компромиссов по скорости. Время на запуск среды упало с пятнадцати минут до двух секунд, и это не шутка, а моя личная арифметика.

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

Если вкратце

  • WSL2 — настоящее ядро Linux внутри Windows, ставится командой wsl --install.
  • После установки обновите систему, иначе компоненты могут не включиться.
  • Лимит памяти задавайте в файле .wslconfig, иначе виртуалка сожрёт пол ноутбука.
  • Проекты держите внутри линуксовой файловой системы: на диске C сборка медленнее в разы.
  • Docker ставьте прямо в Ubuntu без Docker Desktop — быстрее и без лишних расходов.
  • Бэкап всей среды — одна команда wsl --export, переезд занимает вечер.
  • USB-железо и десктопные приложения — не для WSL2, для этого есть виртуалки.

Ваш комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *