NixOS - це дистрибутив Linux з декларативною конфігурацією. Ви можете описати один раз всі налаштування системи в конфігураційному файлі, а потім розгорнути аналогічну конфігурацію на іншому комп'ютері в декілька команд. Налаштовується майже все: встановлені програми, параметри цих програм, Firewall, та навіть графічне середовище. Тому це непоганий вибір для домашнього сервера та Raspberry Pi.
В цій статті ми розглянемо як встановити NixOS на Raspberry Pi 4 без підключення монітора. Я покажу як записати ОС на SD карту так, щоб вставивши її в Raspberry Pi можна було завантажитись і одразу підключитись до міні-комп'ютера по SSH.
Зміст
Як це працюватиме?
Найпростіший спосіб встановити NixOS на Raspberry Pi - це скористатись образом SD Image, який можна завантажити з сервісу збирання NixOS під назвою Hydra. Цей образ має все необхідне, а також має увімкнений за замовчуванням SSH сервер. Для того щоб до нього можна було під'єднатись потрібно тільки додати свій SSH ключ.
Після встановлення розглянемо мінімальне налаштування для використання Raspberry Pi в якості сервера. Розглянемо як створити користувача, встановити Docker та деякі додаткові корисні програми.
Встановлення NixOS на Raspberry Pi 4
Крок 1. Завантаження образа SD Image
Відкрийте сайт Hydra та перейдіть на сторінку найсвіжішого релізу:
Далі перейдіть на вкладку Jobs та наберіть у пошуку sd_image:
Для Raspberry Pi потрібна архітектура aarch64. Перейдіть на сторінку образа та виберіть найсвіжішу успішну збірку:
Залишається завантажити zst архів за посиланням:
Тепер можна переходити до запису. Або те ж саме можна зробити за допомогою команди wget. Завантаження може тривати довго, а використавши команду ви зможете перезапустити завантаження якщо з'єднання розірветься:
wget https://hydra.nixos.org/build/342779548/download/1/nixos-image-sd-card-26.05.8111.5880666fd9eb-aarch64-linux.img.zst
Та для продовження:
wget -c https://hydra.nixos.org/build/342779548/download/1/nixos-image-sd-card-26.05.8111.5880666fd9eb-aarch64-linux.img.zst
Крок 2. Розпаковування архіву
Тепер потрібно розпакувати zstd архів для того, щоб отримати образ. Для цього виконайте команду:
zstd --decompress ~/Downloads/nixos-image-sd-card-26.05.8111.5880666fd9eb-aarch64-linux.img.zst
Крок 3. Запис образу на SD карту
Вставте SD карту в кард-рідер та підключіть його до комп'ютера. Для запису можна використовувати будь-яку програму, що може записувати образи на флешку. Це може бути: BalenaEtcher, UNetbootin, Raspberry Pi Imager, Fedora Media Writer чи Rufus в Windows.
В цій інструкції буде використовуватись BalenaEtcher. Її можна встановити завантаживши пакет для вашого дистрибутиву або архів з виконуваними файлами зі сторінки релізів на GitHub. Після запуску на першому кроці виберіть img файл образа NixOS:
Далі виберіть пристрій SD карти, на який цей образ буде записано. Для цього скористайтесь кнопкою Set Target:
Тут зорієнтуватись простіше за все по назві файлу пристрою та розміру:
Натисніть кнопку Flash, підтвердіть дію, введіть пароль користувача та дочекайтесь завершення запису:
Утиліта також проведе верифікацію, що всі дані записані вірно. Тому якщо щось піде не так ви отримаєте помилку. Утиліта записує блок з метаданими лише після успішної верифікації, тому при помилці, флешка буде порожня. Іноді таке може статись при записі на нову SD карту якщо на ній є биті сектори. Тоді можна виконати запис ще раз, пропустити верифікацію і після цього перезаписати заново.
В якості альтернативи, можна записати образ за допомогою утиліти dd. Образ містить дамп SD карти з розділами, тому записувати його треба не на файл розділу, а на файл SD карти. Наприклад, якщо SD карта називається /dev/sde, то команда буде виглядати так:
sudo dd if=~/Downloads/nixos-image-sd-card-26.05.8111.5880666fd9eb-aarch64-linux.img of=/dev/sde bs=1M conv=fsync status=progress
Ось так виглядають записані розділи:
fdisk -l /dev/sde
Програма запише лише об'єм, який займає образ, але при першому запуску система сама розширить кореневий розділ, тому нічого додатково робити не потрібно.
Крок 4. Створення SSH ключа
Починаючи з версії 20.04 випущеної в 2020-тому році в NixOS OpenSSH сервер увімкнений за замовчуванням. Але з міркувань безпеки образ не має пароля за замовчуванням. Але для того щоб авторизуватись в новій системі по SSH не підключаючи Raspberry Pi до монітора та клавіатури можна додати свій SSH ключ. Спочатку згенеруйте ключ в основній системі:
ssh-keygen
Під час генерації ключа треба ввести його назву, в даному випадку буде ~/.ssh/id_raspberry та два рази натиснути Enter, щоб пропустити створення пароля.
Крок 5. Копіювання SSH ключа
Тепер потрібно змонтувати кореневий розділ карти пам'яті в якийсь каталог, наприклад, /mnt, та скопіювати туди публічний ключ з раніше створеної пари для авторизації по SSH. Для цього виконайте таку команду:
sudo mount /dev/sde2 /mnt
Ключ потрібно додати для користувача nixos, оскільки це користувач, який є в системі за замовчуванням. Перша команда створить папку користувача, а друга скопіює ключ:
sudo mkdir -p /mnt/home/nixos/.ssh
cat ~/.ssh/id_raspberry.pub | sudo tee -a /mnt/home/nixos/.ssh/authorized_keys
Після цього можна розмонтувати карту пам'яті, вимкнути для неї живлення та вийняти з комп'ютера:
sudo umount /dev/sde2
udisksctl power-off -b /dev/sde
Крок 6. Завантаження Raspberry Pi
Вставте карту пам'яті в Raspberry Pi, підключіть кабель інтернету та шнур живлення. Та дочекайтесь поки пристрій завантажиться. Якщо індикатор живлення світиться, а індикатори активності та інтернету мигають, скоріше за все все працює і можна пробувати підключатись по SSH. Але для цього треба знайти пристрій. Найпростіший спосіб це зробити, переглянути список підключених пристроїв вашого роутера:
Або можна просканувати локальну мережу за допомогою Nmap:
nmap -sT 192.168.1.1/24
В моєму випадку Raspberry Pi отримав IP адресу 192.168.1.104.
Крок 7. Підключення по SSH
Для підключення необхідно виконати наступну команду. Причому файл ключа шифрування варто вказати явно, тому що якщо у вас декілька ключів SSH клієнт може вибрати не той:
ssh -i ~/.ssh/id_raspberry nixos@192.168.1.104
Якщо все було зроблено правильно, то ви успішно авторизуєтесь і побачите запрошення вводу користувача nixos:
Крок 8. Створення конфігураційного файлу
На даному етапі, якщо у вас є свій конфігураційний файл NixOS, то ви вже можете завантажити його та розгорнути. Або можете продовжити читати статтю, виконати мінімально необхідні налаштування і створити такий файл.
За замовчуванням після розгортання системи з SD образа, конфігураційного файлу в каталозі /etc/nixos/ не буде. Для того щоб його згенерувати треба виконати таку команду:
sudo nixos-generate-config
Команда створить два конфігураційні файли /etc/nixos/configuration.nix з загальною конфігурацією, та /etc/nixos/hardware-configuration.nix з специфічними для конкретного пристрою налаштуваннями. Всі зміни потрібно вносити в configuration.nix, вміст файла hardware-configuration.nix, генерується автоматично і міняти його вручну не рекомендується.
Тепер можна відкрити файл та почати налаштовувати систему:
sudo vi /etc/nixos/configuration.nix
Розглянемо коротко що міститься в цьому файлі та як цим користуватись. Сам файл написаний на мові програмування Nix. Це функціональна мова програмування, яку розробили спеціально для опису пакетів. Кожен файл конфігурації може містити лише один вираз. Вираз може містити звичайні змінні, або секції (set), які поміщаються в фігурні дужки. Ось приблизний синтаксис таких файлів:
{ argument1, argument2, argument3, ... }:
{
parameter1 = value1;
parameter2 = value2;
parameter3 = value3;
}
На початку в файлі описано параметри які він має отримати від системи, а перелічені параметри які файл повертає. Наприклад, файл за замовчуванням буде виглядати ось так:
{ config, lib, pkgs, ... }:
{
imports =
[
./hardware-configuration.nix
];
boot.loader.grub.enable = false;
boot.loader.generic-extlinux-compatible.enable = true;
Ось основні секції які можна налаштовувати:
- boot.loader - налаштування загрузчика
- networking - налаштування компонентів пов'язаних з мережею
- virtualisation - налаштування програм для віртуалізації та керування контейнерами
- users - керування користувачами
- services - керування сервісами які будуть працювати в фоні
- programs - керування програмами
- environment - загальна конфігурація середовища, змінних, встановлених пакетів.
Переглянути доступні параметри налаштувань для певного шляху можна за допомогою команди nix-option. Наприклад, так можна подивитись що доступно в virtualisation:
nix-option virtualisation
Попередження: Не перезбирайте систему поки не завершимо налаштування. Зараз система працює на конфігураційному файлі, на основі якого було зібрано образ для SD. Саме там був описаний користувач nixos від імені якого ви зараз авторизовані, та все інше. Якщо перезібрати систему зараз, всі сервіси та користувачі, які були налаштовані на SD image зникнуть, а ви, як мінімум, не можете отримати до неї доступ по SSH.
Крок 9. Створення користувача
Знайдіть секцію users, вона може бути закоментована, та за прикладом користувача alice додайте свого користувача. В моєму випадку serhii:
users.users.serhii = {
isNormalUser = true;
extraGroups = [ "wheel" "docker" ];
packages = with pkgs; [];
initialPassword = "password";
};
В даному випадку додається звичайний користувач, який має групу wheel, для того щоб мати доступ до команди sudo, а також групу docker для керування контейнерами. Крім того, для користувача задано початковий пароль password. Цей пароль буде застосовано лише перший раз при створенні користувача, на подальші перезбирання системи це не вплине.
Крок 10. Встановлення необхідних програм
Програми в NixOS додаються або за допомогою секції environment.systemPackages, або вмикаючи окремі секції сервісів в конфігураційному файлі. Для того щоб зрозуміти який спосіб використовувати для кожної конкретної програми, варто подивитись документацію для потрібної програми на https://search.nixos.org/. Наприклад, наберіть в пошуку htop:
А потім перейдіть на вкладку Nix Configuration:
Утиліта htop встановлюється через systemPackages, тому що це програма, яку виконує користувач. Сервіси, які мають бути запущені в фоні, зазвичай налаштовуються за допомогою секції services, або інших окремих секцій. Наприклад, ось так виглядає документація docker:
Також деталі про налаштування, доступні для того чи іншого сервісу можна знайти в офіційній Wiki по NixOS.
Для того щоб встановити htop, vim, wget та docker-compose та декілька інших корисних утиліт:
environment.systemPackages = with pkgs; [
vim
wget
git
docker-compose
libraspberrypi
usbutils
htop
ncdu
];
Але сам Docker необхідно активувати за допомогою окремої опції конфігурації. Для цього додайте такий рядок в секцію virtualisation:
virtualisation.docker.enable = true;
Крок 11. Налаштування SSH
Далі, для того щоб ви знову могли підключитись до системи по SSH після перезбирання, необхідно в конфігураційному файлі увімкнути SSH:
services.openssh.enable = true;
А також скопіювати SSH ключ для користувача якого ви створили раніше:
sudo mkdir -p /home/serhii/.ssh
sudo cp /home/nixos/.ssh/authorized_keys /home/serhii/.ssh/authorized_keys
Крок 12. Розгортання конфігураційного файлу
Збережіть зміни і можна розгортати новий конфігураційний файл. Для цього виконайте таку команду:
sudo nixos-rebuild switch
Система буде перезібрана і одразу ж перемкнеться на нову версію. Але оскільки ім'я користувача тепер відрізняється вам доведеться вийти з системи та підключитись знову:
exit
ssh -i ~/.ssh/id_raspberry serhii@192.168.1.104
Після авторизації потрібно також поміняти пароль користувача:
passwd serhii
Тут необхідно ввести початковий пароль, який раніше ви вказали в конфігові, та ввести два рази новий пароль:
При наступній перезбірці системи, паролі нових користувачів будуть задаватись з конфігураційного файлу, але вже задані паролі не зміняться. Тепер у вас є повністю налаштована система, яку ви можете використовувати в якості сервера або продовжити налаштовувати під свої задачі.
Висновки
В цій статті ми розглянули як встановити NixOS на Raspberry Pi 4, а також як виконати базове налаштування системи. Тепер у вас є конфігураційний файл, на основі якого ви можете продовжити налаштовувати свою систему. А також це все можна зробити не підключаючи монітор та клавіатуру до Raspberry Pi, що досить зручно.























