‹ Окружение разработчика

Создание WSL инстанса с кастомным дистрибутивом

Jan 05, 2023

С момента своего появления WSL набрал большую популярность, среди разработчиков и администраторов, которым нужно пользоваться Linux’ом, на машине с Windows. Для своей работы мне часто приходится создавать новые инстансы под каждый проект. В данной заметке хочу показать как можно легко и просто создавать контейнеры с нужными дистрибутивом, не ограничиваясь дистрибутивами из microsoft store

Проблема

Стандартный путь установки wsl дистрибутива - скачать его из microsoft store. У этого подхода есть некоторые недостатки:

  1. Нельзя просто запустить несколько инстансов одного дистрибутива
  2. В магазине распростроняются далеко не все дистрибутивы. У тех что есть, не очень понятно происхождение, это, в основном, неофициальные сборки

Решение

Решение достаточно простое: нам нужно достать проверенный rootfs и импортировать его в WSL. Если с импортом всё понятно, то главный вопрос в том где взять rootfs, который не будет вызывать подозрений в безопасности? На самом деле тут тоже нет проблем: rootfs нужен не только для WSL, все технологии контейнеризации работают точно так же, поэтому нам нужно разобраться как из контейнеров linux извлечь rootfs.

Экспорт rootfs из контейнера

Экспорт rootfs Docker

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

docker export $(docker create <image id>) --output="rootfs.tar"

,где <image id> - имя образа, например ubuntu:22.04

Скачивание rootfs LXD

С LXD дела обстоят проще: rootfs можно скачать из хранилища lxd образов

wget https://us.lxd.images.canonical.com/images/ubuntu/jammy/amd64/default/20230105_07:43/rootfs.tar.xz

WSL не поддерживает импорт архивов сжатых алгоритом xz, поэтому необходимо распаковать архив

xz -d rootfs.tar.xz

Образ LXD существенно тяжелее чем докер, но я предпочитаю использовать именно его, т.к. в поставку входит systemd, таким образом получаем контейнер уровня ОС, если же нужен контейнер уровня приложения, стоит выбрать образ полученный из докера или сам докер

Импорт образа WSL

Теперь, когда у нас есть rootfs.tar осталось проимпортировать его в WSL.

wsl --import <distro name> <install location> <rootfs file>

Например

wsl --import lxc-images-ubuntu-22.04 'D:\wsl\lxc-images-ubuntu-22.04' '.\Downloads\rootfs.tar'

Настройка пользователя

По умолчанию, после импорта wsl будет стартовать под рутом. Чтобы изменить это поведение, заходим в наш дистрибутив

wsl -d lxc-images-ubuntu-22.04

Прописываем пользователя по-умолчанию в /etc/wsl.conf

[user]
default=ubuntu

Для LXD пользователь ubuntu идёт из коробки, для Docker или другого дистрибутива понадобится создать пользователя

adduser ubuntu
adduser -G sudo ubuntu

перезапускаем инстанс

wsl -t lxc-images-ubuntu-22.04
wsl -d lxc-images-ubuntu-22.04

Готово, теперь вы можете пользовать любыми дистрибутивами доступными в репозитариях Docker или LXD

Материалы

  1. https://learn.microsoft.com/en-us/windows/wsl/use-custom-distro