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 admin@zource.dev -f ~/.ssh/id_rsa
После того как сгенерируете все ключи загрузите их в SSH агент и добавьте id_rsa.pub
в список авторизованных ключей для локального использования
ssh-add ~/.ssh/*_rsa
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
Теперь, что бы использовать созданный ключ, нужно запускать SSH с параметром -i
указав путь к ключу.
ssh zource@localhost -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 по пути HKEY_CURRENT_USER\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