ZOURCE

WSL2: Свой дистрибутив

January 08, 2021

Настройка systemd упрощена до одной команды. Но будьте бдительны, не запускайте сторонние скрипты не проверив их.

wget -O - https://dl.zource.dev/wsl-setup.sh | bash

Сначала, перегенерируем ключи хоста, так как скорее всего они отсутствуют, перезапустим sshd и добавим настройки ssh-agent в наше окружение.

sudo ssh-keygen -A -f /
sudo service ssh --full-restart
eval $(ssh-agent -s)

Проверим, что ssh сервер запустился и исправен

service ssh status

Сгенерируем несколько пар ключей алгоритмом RSA длинной 4096 бит указав секретную фразу, EMAIL и путь. Я рекомендую фразу для начала оставить пустой, что бы не вводить ее каждый раз при использовании ключа.

mkdir -p ~/.ssh
ssh-keygen -t rsa -b 4096 -N "" -C [email protected] -f ~/.ssh/id_rsa

После того как сгенерируете все ключи загрузите их в SSH агент и добавьте id_rsa.pub в список авторизованных ключей для локального использования

ssh-add ~/.ssh/*_rsa
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys

Теперь, что бы использовать созданный ключ, нужно запускать SSH с параметром -i указав путь к ключу.

ssh [email protected] -i ~/.ssh/id_rsa

Вы увидите сообщение о том что система находится в состоянии загрузки. Это происходит изза файла /run/nologin.

ls -l /run/nologin
cat /run/nologin

Для того что бы это исправить, просто переименуйте этот файл.

mv /run/nologin /run/nologin.bak

Давайте подскажем SSH клиенту, какой ключ для какого сервиса мы хотим использовать. Для этого в папке ~/.ssh/ создадим файл config и пропишем какой хост, должен использовать какой ключ

nano ~/.ssh/config
Host localhost
  IdentityFile ~/.ssh/id_rsa

Host github.com
  IdentityFile ~/.ssh/github_rsa

Host heroku.com
  IdentityFile ~/.ssh/heroku_rsa

Обязательно после этого задайте права доступа 700 на директорию .ssh/ и 600 на все что внути нее.

chmod 700 ~/.ssh
chmod 600 ~/.ssh/*

Экспорт

Сейчас мы можем экспортировать дистрибутив в файл, для этого в Powershell запустим wsl c опцией export указав название дистрибутива и место его сохранения

wsl --export ubuntu-20.04 $env:USERPROFILE/ubuntu.tar.gz

Импорт

После того как мы экспортировали дистрибутив, мы можем импортировать его опцией import

wsl --import ubuntu $env:USERPROFILE/ubuntu $env:USERPROFILE/ubuntu.tar.gz

Но сразу после импорта можно заметить одно неудобство, ведь пользователь по умолчанию для данного дистрибутива будет root, а не тот которого вы задали ранее.

wsl -d ubuntu -e whoami

Это можно легко исправить добавив запись в реестр с UID пользователя. Для этого откроем редактор реестра regedit по пути HKEYCURRENTUSER\Software\Microsoft\Windows\CurrentVersion\Lxss и найдем ключ где DistributionName содержит имя нашего дистрибутива.

wsl -d ubuntu -u zource -e id -u

Вернемся в powershell и получим uid нашего пользователя. После чего установим его в значение для ключа реестра DefaultUid в моем случае это 1000

Либо с помощью powershell.

$distro = "ubuntu"
$user = wsl -d $distro -e ls /home
$uid = wsl -d $distro -u $user -e id -u
Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\*\ DistributionName | Where-Object -Property DistributionName -eq $distro | Set-ItemProperty -Name DefaultUid -Value $uid