Это первая статья из серии про мой переход в NixOS. Расскажу, что подтолкнуло меня искать альтернативу привычным дистрибутивам и почему именно Nix привлёк моё внимание.
Проблемы с Ubuntu
Я долго сидел на Ubuntu и в целом был доволен, но со временем накопились раздражающие моменты:
Конфигурация разбросана повсюду. Настройки системы лежат в
/etc,~/.config,~/.local,/var, в dconf, в snap-пакетах, в Docker-контейнерах — единого источника правды нет. После переустановки приходится вспоминать, что и где настраивал.Воспроизводимость на нуле. Поставил пакет полгода назад, подкрутил конфиг — а потом не можешь повторить это на другой машине. Скрипты для «автоматизации» быстро устаревают и ломаются.
Конфликты пакетов. Разные проекты требуют разные версии одних и тех же библиотек. PPA и snap частично решают проблему, но добавляют свои сложности.
Обновления ломают систему. Обновление с одной LTS-версии на другую — всегда лотерея. Что-то обязательно перестаёт работать, и ты тратишь время на починку вместо работы. Моя личная боль — Wi-Fi драйвер 😅 Каждый раз после обновления приходилось доставать трёхметровый LAN-кабель, подключаться напрямую к роутеру, вспоминать, находить и скачивать актуальный.
Страх трогать низкоуровневые вещи. Я не мастер Gentoo — ядра не собирал и не патчил 😄 Правка kernel modules или конфигурации GRUB вызывала холодный пот — одна ошибка, и система не загрузится.
Что такое Nix
Nix — это в первую очередь пакетный менеджер с принципиально другим подходом.
Функциональный подход. Каждый пакет — это результат чистой функции от своих зависимостей. Нет глобального состояния, нет побочных эффектов при установке. Два пакета с разными версиями одной библиотеки спокойно сосуществуют.
Декларативность. Nix позволяет описывать окружения декларативно — через конфигурационные файлы вместо последовательности команд. На уровне пакетного менеджера это
shell.nix,default.nixиflake.nix(формально экспериментальный, но де-факто стандарт в сообществе), а в NixOS этот принцип распространяется на всю систему целиком.Воспроизводимость. Одна и та же конфигурация даёт одинаковый результат на любой машине. Можно хранить конфиг в git и откатываться к любому состоянию — чем я и занимаюсь 😄
Язык Nix. Для описания пакетов и конфигурации используется собственный функциональный язык. Если ты знаком с FP, он покажется простым — в нём не так много конструкций, но их достаточно для гибкого конфигурирования всей системы. Мне он настолько понравился, что я написал библиотеку для сборки Neovim bundle, где вся конфигурация собирается внутри пакета и не зависит от пользовательских настроек — по аналогии с подходом NixOS. А для конвертации Nix в Lua даже сделал отдельную библиотеку nix2lua 😊
Первое знакомство
Узнал я про NixOS неожиданно — как активный участник open source сообщества стал всё чаще встречать людей, у которых что-то не работает именно под NixOS 😄 Начал изучать, что это за зверь, смотреть их конфигурации. А потом в open-source проектах стали появляться flake.nix и моё любопытство взяло верх!
Переходить на NixOS сразу я не решился — слишком радикально. Вместо этого поставил Nix как пакетный менеджер поверх Ubuntu.
Первое, что попробовал — nix-shell. Возможность войти во временное окружение с нужными пакетами без установки в систему — это то, чего мне всегда не хватало. Нужен nodejs, rust или ghc конкретной версии для проекта? Одна команда — и ты в окружении с ним, а после выхода из шелла всё чисто. С Rust это особенно актуально — разные проекты поддерживают свою минимальную версию, и держать их все в системе одновременно было той ещё головной болью.
nix-env для постоянной установки пакетов тоже работал, но тут впечатления были смешанные — императивный подход nix-env не раскрывает главных преимуществ Nix.
Что по-настоящему зацепило — это ощущение контроля. Система перестала быть чёрным ящиком из накопленных изменений. Появилась возможность точно знать, что установлено и почему. И захотелось пойти дальше.
Что дальше
В следующей статье расскажу про home-manager — инструмент, который позволяет декларативно управлять конфигурацией пользовательского окружения. Это был мой следующий шаг перед полным переходом на NixOS.