Автозапуск Windows Subsystem for Linux при ввімкненні комп'ютера 💻

Друзі, оприлюднюю одну зі статей, що вже довгий час (десь з початку пандемії 2020 року) лежить у теці з чорновими варіантами майбутніх статей. У ній йде мова про те, як "навчити" новомодну підсистему Windows Subsystem for Linux першої (і найпопулярнішої на даний момент) версії запускатися з деяким набором сервісів, також відомих як "демонів" при ввімкненні вашого комп'ютера, а не лиш тоді, коли ви після входу в систему запускаєте термінал WSL, після чого виконуєте за допомогою нього першу команду. Звичайно, Docker чи LXD сюди не поставиш, проте й у WSL2 працюють вони не так швидко, як би нам всім хотілося. Краще вже у віртуальній машині запустити, або на якомусь дешевому тонкому клієнті (колись і така стаття буде, сподіваюсь). Але зараз мова йде про WSL, тож почнемо:

Встановлення WSL і Ubuntu 20.04

Встановлення відбуватиметься на прикладі ОС Windows версії 1909, що має підтримку WSL1. Новішу версію Linux-підсистеми ми використовувати не будемо, бо WSL2 ще й досі проходить тестування у складі інсайдерської збірки Windows, і, ще не відомо, коли вона стане доступною для усіх користувачів Windows.
Усе, про що я розповідаю у цій статті, працює на моєму продакшені на базі Windows Server 1909, де процес встановлення і налаштування WSL значно відрізняється від версій цієї операційної системи для "звичайних" користувачів. Думаю, більшості така інформація не буде цікавою. Якщо ж я помиляюся, Ubuntu WSL останньої версії ви можете завантажити з Microsoft Store for Business, скориставшись перед тим цією інструкцією.

Крок 1. Встановлення компоненту системи

Спершу, нам необхідно увімкнути підтримку Windows Subsystem for Linux у системних компонентах, які можна знайти за таким шляхом: Control Panel -> Programs -> Programs and Features -> Turn Windows features on or off.

Діалогове вікно управління компонентами Windows

У цьому вікні нам необхідно обрати виділений пункт (на зображенні вище), й розпочати встановлення. Після завершення процесу, комп'ютер необхідно перезавантажити, після чого можемо перейти до наступного кроку.

Крок 2. Встановлення дистрибутиву

Після перезавантаження комп'ютера ми переходимо до встановлення Linux дистрибутиву, а саме Ubuntu 20.04. Для цього використовуємо Microsoft Store:

Результати пошуку фрази "Ubuntu 20.04"

Відкриваємо сторінку Ubuntu 20.04 LTS і натискаємо кнопку "Install". Якщо ви використовуєте Microsoft Store вперше, необхідно буде увійти у ваш Microsoft Account. Після завершення процесу інсталяції ми можемо відкрити застосунок за допомогою кнопки "Launch", що і необхідно зробити.

Сторінка дистрибутиву Ubuntu 20.04 у Microsoft Store

Після першого запуску дистрибутиву, необхідно буде зачекати, поки система інсталюється, після чого надати наступну інформацію.

  1. Ім'я основного користувача системи. За замовчуванням, ви будете працювати з Ubuntu WSL від імені цього користувача. Також, він є членом групи sudoers. Я обрав своє улюблене - sirkadirov.
  2. Пароль і підтвердження паролю основного користувача.

Після виконання цих налаштувань, вас привітає ново встановлена операційна система. Першим ділом, рекомендую одразу ж виконати наступні команди, що актуалізують усі пакети, встановлені у системі, а також кеш доступних пакетів.

sudo apt update
sudo apt upgrade

Якщо під час оновлення виникають якісь помилки, спробуйте скористатися командою sudo apt install --fix-broken. На цьому встановлення завершено.

Крок 3. Налаштування Task Scheduler

А тепер - найцікавіше! Підтримки автозапуску WSL1 "з пакунку" не має. До того ж, усі операції над демонами ми можемо проводити лише через SysVinit, що значно обмежує нас у виборі програмного забезпечення, яке ми можемо використовувати у WSL. З новою версією GNU/Linux підсистеми нам обіцяють підтримку SystemD, а, поки, будемо працювати з тим, що є під руками.

Спосіб, що я використовую у своїй практиці, базується на використанні Windows Task Scheduler і WSL Interop. Якщо ж ви знайдете кращий метод, поділіться ним у коментарях, і я його додам до статті.

Для початку, відкриваємо Task Scheduler, і у меню "Actions" обираємо "Create Task...", після чого відкриється наступне вікно створення завдання:

Нам необхідно вказати назву задачі, а також поставити відмітки на "Run whether user is logged on or off" і "Run with highest privileges". Далі, натискаємо на кнопку "Change User or Group...", де вводимо логін і пароль вашого облікового запису (тобто того, у якому ви нещодавно встановили середовище WSL). Таким чином, Ubuntu і обрані нами сервіси (демони) будуть запускатися автоматично, одразу ж після запуску операційної системи.

Далі, переходимо на наступну вкладку, "Triggers". Тут ми створюємо новий триггер, натиснувши кнопку "New...", і заповнивши відкрите діалогове вікно так, як це показано на зображенні вище. Цим ми вказуємо, що Ubuntu повинна запускатися після ввімкнення комп'ютеру, але з затримкою 30 секунд - це пришвидшить запуск основної операційної системи, і, цілком можливо, вбереже вас від незрозумілих помилок при використанні WSL.

Алгоритм дій на вкладці "Actions" збігається з попередньою вкладкою; тут нам необхідно створити дію, яка буде виконуватись при виконанні системного завдання. У полі "Program/script" ми вказуємо шлях до bash.exe, що лежить у системній директорії операційної системи (C:\Windows\System32\bash.exe), а, в аргументах - рядок -c "sudo /etc/start_services.sh".

Таким чином, при запуску завдання Task Scheduler-ом, відбудеться виконання bash скрипта (від імені нашого користувача, з підвищеними правами доступу), який ми створимо пізніше. У ньому будуть інструкції щодо запуску демонів, які ми плануємо використовувати без запуску командного рядка Ubuntu WSL.

І, нарешті, на вкладці "Settings", ми можемо налаштувати параметри виконання цього завдання. Взагалі, вони є дуже специфічними, тому я раджу або залишити все як є, або підлаштувати "під себе" (за умови, якщо вони взагалі вам потрібні). Наприклад, мені необхідно увімкнути опцію "Allow task to be run on demand", щоб без перезавантаження комп'ютера швидко перезапускати сервіси WSL власноруч.

Тепер нам залишилося натиснути на кнопку "ОК", після чого ввести свій пароль.

Крок 5. Створюємо файл автозапуску

Після створення завдання у планувальнику завдань, переходимо до створення файлу автозапуску сервісів (демонів), про який ми говорили у попередньому пункті розділу.

Для цього відкриваємо термінал WSL. Я, наприклад, для цього й для інших маніпуляцій використовую новий Windows Terminal - цікавого проєкту, який у майбутньому стане заміною для звичного й не дуже зручного cmd.exe.

Windows Terminal з відкритою вкладкою для Ubuntu 20.04. На Windows Server його можна встановити з Microsoft Store for Business.

Тепер ми створимо пустий файл start_services.sh, який потім будемо використовувати для того, щоб запускати демонів при старті системи, а також дозволимо власнику файлу (нам) його виконання.

sudo touch /etc/start_services.sh
sudo chmod 700 /etc/start_services.sh

Файл створено, тепер перевіримо правильність наших дій за допомогою команди sudo /etc/start_services.sh - вона повинна повернути пустий рядок.

Крок 6. Дозволяємо виконання скрипту автозапуску від імені адміністратора без запиту пароля

Так, вам не почулося. Зараз ми дещо змінимо файл sudoers, який містить налаштування того, які користувачі і у якому порядку можуть запитувати тимчасове підвищення привілеїв до рівня адміністратора системи. Це робиться викликом наступної команди:

sudo visudo

Команда visudo відкриє стандартний консольний редактор коду (у нашому випадку - nano), у якому буде редагуватися тимчасовий файл, який є копією основного конфігураційного файлу sudoers. Після збереження змін у ньому, команда visudo перевіряє відредагований нами файл на відповідність вимогам до його структури і вмісту, і, у разі успіху, перезаписує оригінальний файл його новою версією. Таке "зайве", на перший погляд, ускладнення насамперед пов'язане з великою імовірністю допущення користувачем помилок, які у прямому сенсі "зламають" систему, після чого використання команди sudo стане неможливим.

Додаємо в кінець цього файлу наступний рядок:

%sudo ALL=(ALL) NOPASSWD: /etc/start_services.sh

Це дозволить запускати скрипт /etc/start_services.sh від імені root без паролю, що, з одного боку, погіршить захищеність системи, але надасть нам змогу реалізувати підтримку автозапуску сервісів (демонів) в Ubuntu WSL.

Доступ по SSH і початкові налаштування

Тепер переходимо до встановлення і базового налаштування OpenSSH сервера, щоб до нашого встановлення Ubuntu можна було віддалено підключитися за допомогою вільної реалізації протоколу SSH.

Крок 1. Встановлення OpenSSH Server

За замовчуванням, пакет openssh-server вже встановлено у системі, але, у деяких випадках, його немає. Тому, встановимо його, після чого додаємо виняток для мережевого екрану ufw (останнє не є обов'язковим, бо вбудований в Ubuntu WSL ufw майже не працює, як мінімум на моєму тестовому "залізі"):

sudo apt install openssh-server
sudo dpkg-reconfigure openssh-server
sudo ufw allow ssh

Другу команду виконувати обов'язково, бо існує якась дивна проблема зі сумісністю OpenSSH з WSL, через яку публічні/приватні ключі безпеки не генеруються автоматично, що унеможливлює використання SSH сервера.

Крок 2. Виконуємо початкові налаштування

Далі, відредагуємо файл конфігурації SSH сервера. Перед цим рекомендую створити його резервну копію, яку можна буде використати у разі пошкодження конфігурації:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
sudo nano /etc/ssh/sshd_config

Далі, файл конфігурації відкриється у nano, де ми змінимо деякі параметри:

Port 202# Довільний порт для вхідних з'єднань, за замовчуванням - 22
PasswordAuthentication yes# дозволяємо вхід за паролем, не для production
AllowUsers <ім'я вашого користувача>

Як ви вже, мабуть, зрозуміли, цими директивами ми змінили порт для вхідних підключень протоколом SSH з 22 на 202, дозволили вхід за логіном і паролем (замість використання ключів доступу), а також обмежили використання SSH усім користувачам крім вказаного вами у конфігураційному файлі. Детальніше про налаштування SSH сервера ви можете дізнатися з документації: man sshd_config.

Тепер, перезапустимо openssh-server. Для цього скористаємося одною з доступних утиліт програмного забезпечення SysVinit:

sudo service ssh restart

Ця команда при вдалій спробі перезапуску повинна повернути або пустий рядок, або ж деталі перезапуску чи, небажано, але можливо - дуже велику помилку 😀.

Крок 3. Перевіряємо працездатність

Тепер, саме час перевірити працездатність встановленого нами SSH сервера. Це можна зробити за допомогою будь-якого SSH клієнта, наприклад PuTTY (безкоштовний) чи Termius (платний, але надто зручний, щоб його ігнорувати):

ssh <ім'я користувача>@127.0.0.1:202
Перевіряємо працездатність встановленого нами SSH сервера за допомогою Termius

Крок 4. Автозапуск OpenSSH Server

У попередньому розділі ми створили файл автозапуску /etc/start_services.sh, до якого зараз ми додаємо рядок, що відповідатиме за перезапуск (початковий запуск) служби SSHD. Для цього використаємо консольний редактор nano:

sudo nano /etc/start_services.sh

Додаємо у згаданий файл наступний рядок, після чого збережемо зміни:

service ssh restart

Післямова

Тепер я можу привітати вас з успішним встановленням SSH сервера! При наступному перезавантаженні комп'ютера, навіть не входячи в систему, ви з легкістю зможете віддалено увійти в Ubuntu 20.04, яку ми з вами встановили, за допомогою будь-якого SSH клієнта - і на цьому стаття добігає свого кінця. Буду вдячний за ваші думки і зауваження щодо викладеного у ній матеріалу 😃!