Skip to content

Что такое Nix и почему я обратил на него внимание

Это первая статья из серии про мой переход в 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.