mysurik.ru

Как я перешёл на NixOS и перестал бояться конфигов

Обложка статьи про NixOS

Полгода назад я снёс со второго диска Ubuntu, которая жила у меня лет пять, и поставил туда NixOS. Скажу честно: первые два вечера я жалел об этом решении. Однако через неделю поймал себя на странном: открываю терминал на рабочей системе просто так. Все привычные ритуалы починки испарились. Так что рассказываю по порядку, что это за зверь и почему я не вернулся назад.

Что меня доконало в обычных Linux

Пять лет на Ubuntu — это примерно шестьдесят обновлений. Большинство проходили тихо, но пару раз в год случалось то самое. После какого-нибудь апгрейда отваливается Wi-Fi драйвер, и ты полдня ищешь виноватый пакет. Бывает, при переезде на новый ноутбук выясняется: половина софта стояла из PPA, и их надо вспоминать по одному. То ты меняешь что-то в системе руками. Потом через полгода забываешь, что менял, и ловишь странный баг, который никто кроме тебя воспроизвести не может.

Отдельная боль — эксперименты. Хочешь попробовать новую версию драйвера или какой-нибудь пакетный менеджер? Делаешь снапшот, пробуешь, откатываешься. Только снапшоты эти мало кто делает, потому что лень. Я тоже не делал. И однажды заплатил вечер за собственную самодеятельность с драйвером видеокарты.

Про NixOS я читал давно, но всё откладывал: вокруг неё слишком много разговоров про функциональное программирование и сложность. Вроде как это дистрибутив для математиков. На деле всё оказалось проще.

Главная идея: система — это один текстовый файл

В NixOS нет понятия «установить пакет» в привычном смысле. Есть файл /etc/nixos/configuration.nix, в котором описана вся система. Какие пакеты стоят, какие сервисы включены, имя машины, пользователи, сеть, звук, драйверы. Хочешь что-то поменять — правишь файл и выполняешь одну команду:

sudo nixos-rebuild switch

Затем система читает конфиг, вычисляет разницу между тем, что есть, и тем, что описано, и приводит реальность к файлу. Добавил строку firefox в список пакетов — появился Firefox. Потом убрал — исчез при следующей пересборке. Не «установлен где-то в недрах», а именно описан в одном месте.

Вот кусок моего реального конфига, чтобы было понятнее:

environment.systemPackages = with pkgs; [
  git
  vim
  htop
  firefox
];

services.openssh.enable = true;
virtualisation.docker.enable = true;

networking.hostName = "workstation";
time.timeZone = "Asia/Novosibirsk";

То есть это весь код, который нужен, чтобы получить систему с браузером, git, docker и ssh. Никаких «скачал deb из непонятного сайта», никаких PPA, никаких записей в блокноте «а что я там ставил».

Честно говоря, поначалу это раздражает. Стоишь с чистой системой, хочется привычное apt install, а тебя как будто отталкивают рукой: нет, сначала опиши желание в файле. Правда, дня через три рука привыкает. Зато ещё через неделю наступает момент, ради которого всё затевалось.

Тот самый момент

Мне понадобилось проверить поведение программы на старой версии библиотеки. Раньше это означало пляску с виртуальными окружениями или сборку из исходников. Здесь я просто дописал в конфиг строку с нужной версией, выполнил rebuild — получил систему, где всё работает по-старому. Посмотрел, что хотел, потом поменял одну цифру обратно. Ещё rebuild. Пять минут, ни одного артефакта в системе.

Потом понял, что каждый switch создаёт поколение — полный снимок состояния системы. Все поколения лежат рядом, и в меню загрузки GRUB они видны списком. Загрузился в предыдущее — и ты буквально в прошлой версии своей операционки, со всеми её пакетами и настройками.

История одного отката

Через месяц после перехода я решил настроить себе другой видеовыход под второй монитор. Покрутил конфиг, применил — экран погас и больше не проснулся. Картинка есть только на встроенной мелочи, интерфейс тормозит, работать нельзя.

Раньше такой вечер превращался в экскурсию по форумам. В итоге я перезагрузился и выбрал в GRUB предыдущее поколение. Через двадцать секунд передо мной была рабочая система ровно в доэкспериментальном виде. Потом спокойно открыл конфиг, убрал кривую строку, выполнил rebuild ещё раз. Весь инцидент занял меньше пяти минут и выпил ровно ноль нервов.

Кстати о месте на диске: поколения копятся, и через пару месяцев активных экспериментов они могут съесть десятки гигабайт. Лечится одной командой:

sudo nix-collect-garbage -d

Она удаляет всё, кроме пары последних поколений. Поэтому я повесил себе напоминалку запускать её раз в месяц.

Установка — проще, чем говорят

В общем, ставится NixOS стандартно: скачал ISO, записал на флешку, загрузился, кликнул по графическому установщику, разметил диск, подождал. Минут двадцать, не больше. Единственное отличие от Ubuntu — после установки ты получаешь почти голую систему: рабочий стол и терминал. Браузер придётся прописать в конфиг самому. Новичку в Linux это покажется странным. Поэтому первая задача после установки — открыть /etc/nixos/configuration.nix и вписать туда всё нужное.

Искать пакеты удобнее всего на сайте nixos.org — там поиск по всему репозиторию с готовыми строчками для копирования. Потом нашёл пакет, скопировал имя, вставил в список, rebuild. Всё.

Пользователей, раскладки клавиатуры, часовой пояс и имя машины я тоже перенёс в конфиг. Вот, например, как описывается пользователь:

users.users.mysurik = {
  isNormalUser = true;
  extraGroups = [ "wheel" "networkmanager" "docker" ];
};

Сначала кажется странным описывать такими вещами то, что в других системах делается одной командой useradd. Зато вопрос «а в какой группе состоит пользователь?» через полгода решается за десять секунд — в том же файле. Без археологии по /etc/passwd и истории команд.

Что ещё оказалось приятно неожиданным

Кстати, конфиг можно скопировать на другую машину — и получить ту же самую систему. Не «примерно похожую», а идентичную: те же версии программ, те же настройки сервисов. Когда у меня сдох системный диск, я развернул новую систему за время, которое ушло на установку самой NixOS плюс одну команду. Словом, все мои инструменты, все настройки ssh, все привычки — на месте.

Кроме того, есть бонус для любопытных: репозиторий Nixpkgs — крупнейший среди всех дистрибутивов. Свежие версии появляются быстро, а старые пакеты живут рядом с новыми без конфликтов: каждый замкнут на свои библиотеки.

Домашний сервер по расписанию

Второй конфиг у меня описывает домашний мини-сервер: веб-панель, пара контейнеров docker, резервное копирование. Например, в мае он попросил замены железа. Я поставил NixOS на новый диск, скопировал один файл конфигурации, выполнил rebuild. Через полчаса сервер работал как ни в чём не бывало. Ни переустановки пакетов по списку из блокнота, ни «ой, а это я откуда ставил?».

При этом тот же конфиг служит и документацией. Жена спросила, что за зелёные буквы бегут у меня на экране, когда я что-то правлю на сервере. Показал файл. Она ничего не поняла, но суть уловила верно: «то есть у тебя вся система в этом блокноте?» Именно так. И этот блокнот можно положить в git, откатывать как код и показывать другим людям — они воспроизведут твою систему один в один.

Как это живёт дальше

Обновления системы здесь тоже через rebuild: сначала обновляешь описание канала пакетов (nixos-rebuild switch --upgrade), и только потом система пересобирается. Я обновляюсь раз в две-три недели, без графика и обязательств. Если что-то пошло не так — откат из меню загрузки, о котором я уже писал. За полгода мне ни разу не понадобилось чинить систему руками после обновления, и это, честно говоря, непривычно.

Когда освоишься, загляни во flakes — способ описывать конфигурации с точными версиями всех пакетов. Ещё интересен home-manager: он берёт на себя пользовательские настройки — раскладки, конфиги, оболочку. Это следующий уровень той же идеи. Впрочем, спешить туда в первый месяц не советую: базового configuration.nix хватает с головой, а флейки только добавят вопросов.

Теперь про минусы, честно

Первое — порог входа. Если Linux для вас исчерпывается «нажал установить галочку next-next», NixOS будет мучением. Причём тут даже простые вещи требуют чтения. Вторая неделя была самой раздражающей: постоянно хотелось сделать по-старому.

Второе — документация размазана. Официальная wiki сухая, ответы раскиданы по форумам, GitHub-обсуждениям и чужим конфигам на GitLab. Русскоязычных материалов мало, поэтому картинку приходится собирать по кусочкам.

Третье — чужие инструкции часто не подходят напрямую. В интернете полно советов вида «выполните такую-то команду». В NixOS половина таких команд либо не нужна, либо делается иначе, через декларацию. Приходится каждый раз переводить с общелинуксового на нихский.

Четвёртое — экосистема развивается быстро, местами как движущаяся мишень. Учебники по flakes и home-manager устаревают прямо на глазах. Новичку это добавляет путаницы.

Ничего из этого не стало сюрпризом после первой недели — скорее наоборот, все минусы я прочувствовал сразу же. В общем, плюсы перевесили быстрее, чем я ожидал.

Кому подойдёт, а кому нет

Подойдёт тем, кто хоть раз терял вечер на починку системы после обновления. Тем, кто держит дома сервер или несколько машин и хочет одинакового окружения везде. И тем, кто любит экспериментировать без последствий. Особенно стоит присмотреться тем, кто пишет код: изолированные окружения под проект здесь получаются почти бесплатно.

Не подойдёт, если компьютер вам нужен как калькулятор: браузер, документы, печать. Вы не получите от NixOS ничего, кроме лишнего обучения. И не подойдёт, если нет желания читать: этот дистрибутив требует, чтобы вы понимали, что делаете. Зато взамен перестаёт требовать ремонта.

Три месяца спустя

Итак, я остался на NixOS. Рабочая машина, домашний мини-сервер — всё переведено, оба конфига лежат в git. Обновляюсь спокойнее, чем когда-либо: любое обновление — это новое поколение, а не лотерея. Экспериментировать стало можно без страха, а именно за это я и любил Linux изначально, пока реальность не исправила эту любовь на осторожность.

Напоследок мой совет один: не пытайтесь перенести привычки со старого дистрибутива. Первые дни делайте всё через конфиг, даже если руки тянутся к старым командам. Именно в момент, когда система впервые спасает вас откатом, становится ясно, зачем всё это было придумано.

Ваш комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *