NixOS описывает всю систему файлом конфигурации: пакеты, сервисы, пользователи, ядро и параметры загрузчика. Сборка попадает в /nix/store, переключение на неё атомарно, а предыдущее состояние остаётся в меню загрузки. За воспроизводимость и откат платят языком Nix, расходом диска и временем на сборку. В 2026 году flakes стали де-факто стандартом, вокруг проекта появилось несколько реализаций, но модель осталась прежней. Разберём её на практике и честно посчитаем цену.
Модель: конфигурация как единственный источник правды
В NixOS нет смысла настраивать систему руками: пакеты, сервисы, пользователи, ядро и параметры загрузчика описываются в configuration.nix и модулях. При сборке получается замыкание зависимостей в /nix/store с хешем в пути. Переключение на новую сборку — атомарная операция, а старая остаётся доступной как поколение. Отсюда два свойства, ради которых люди терпят неудобства: воспроизводимость и предсказуемый откат.
Первый конфиг
{ config, pkgs, ... }:
{
imports = [ ./hardware-configuration.nix ];
boot.loader.systemd-boot.enable = true;
networking.hostName = "nixos";
services.openssh.enable = true;
users.users.admin = {
isNormalUser = true;
extraGroups = [ "wheel" ];
};
environment.systemPackages = with pkgs; [ git vim htop ];
system.stateVersion = "26.05";
}
Параметр system.stateVersion фиксируется при установке и не меняется при обновлениях: он управляет миграциями состояния, а не версией системы. Если поднять его наугад, можно получить несовместимые форматы данных.
Flakes
{
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs }: {
nixosConfigurations.server = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [ ./configuration.nix ];
};
};
}
Flake фиксирует входы в flake.lock, поэтому сборка на другой машине даёт тот же результат. Включаются flakes параметром nix.settings.experimental-features: в списке должны быть nix-command и flakes. Дальше сборка идёт командой nixos-rebuild switch —flake .#server, а обновление зависимостей — nix flake update. Каналы без flakes всё ещё работают, но новые руководства в основном написаны под flakes.
Три режима пересборки и откат
sudo nixos-rebuild test
sudo nixos-rebuild boot
sudo nixos-rebuild switch
sudo nixos-rebuild switch --rollback
test активирует конфигурацию до перезагрузки, boot делает её следующей при загрузке, switch делает и то и другое. Если после switch что-то сломалось, rollback возвращает предыдущее поколение; то же самое можно выбрать в меню systemd-boot. Список поколений смотрится через nix-env —list-generations —profile /nix/var/nix/profiles/system. Это и есть главная страховка: эксперимент с конфигом не требует переустановки.
Пакеты и окружения
nix shell nixpkgs#jq
nix run nixpkgs#ripgrep -- --version
nix develop
nix profile install nixpkgs#neovim
nix shell даёт временное окружение с нужной утилитой, nix run запускает приложение без установки, nix develop поднимает окружение из devShell в flake, nix profile ставит пакет в профиль пользователя. Для проектов это означает, что версии компиляторов и библиотек фиксируются в репозитории, а не в README с инструкцией поставить нужное вручную.
Home-manager и модульность
Системная конфигурация описывает машину, home-manager — пользовательское окружение: dotfiles, пакеты, сервисы пользователя. Он подключается как отдельный input и позволяет держать одни и те же настройки на ноутбуке и сервере. Модули с options дают типизированные параметры вместо копипасты, но требуют понимать, как устроено слияние атрибутов.
Цена: язык и время
Nix — ленивый функциональный язык с непривычным синтаксисом. Ошибки часто выглядят как infinite recursion encountered без указания на реальное место. Отладка требует терпения: nix repl, nix eval и трассировка помогают, но порог входа заметно выше, чем у apt или pacman. Вторая статья расходов — время: первая сборка с нуля может занять десятки минут, а вычисление больших конфигураций ощутимо нагружает процессор.
nix repl
nix eval .#nixosConfigurations.server.config.networking.hostName
nix log /nix/store/...-package.drv
nix why-depends /run/current-system /nix/store/...
Цена: диск и мусор
Каждое поколение хранит свои зависимости, поэтому /nix/store быстро растёт. Автоматическая сборка мусора настраивается в конфиге:
nix.gc = {
automatic = true;
dates = "weekly";
options = "--delete-older-than 30d";
};
nix.settings.auto-optimise-store = true;
Ручная чистка — sudo nix-collect-garbage -d, проверка размера — nix path-info -Sh. Оптимизация стора заменяет одинаковые файлы жёсткими ссылками и экономит место, но требует времени на дедупликацию.
Цена: нестандартная среда
NixOS не следует FHS: бинарники лежат в /nix/store, динамический компоновщик указывает на конкретные библиотеки. Проприетарные программы, AppImage и установщики, которые ищут /lib64/ld-linux, из коробки не работают. Решения есть: nix-ld для обычных ELF-бинарников, buildFHSEnv для сложных приложений, steam-run для игр. Но каждый такой случай — отдельная задача, а не просто запустилось.
programs.nix-ld.enable = true;
programs.nix-ld.libraries = with pkgs; [ stdenv.cc.cc.lib zlib ];
Цена: экосистема и документация
Вокруг Nix несколько реализаций: официальный Nix, форк Lix и коммерческий Determinate Nix. Это создаёт путаницу в руководствах, часть которых написана под разные версии и разные наборы экспериментальных функций. Официальная документация улучшилась, но статьи в интернете часто устарели. Помогает привычка сверяться с поиском по options и исходниками модулей, а не с блогом трёхлетней давности.
Кому подходит
- Нужна воспроизводимая конфигурация для нескольких машин.
- Важны атомарные обновления и откат без резервных копий.
- Есть время на изучение языка и отладку.
- Не подходит, если нужен софт, которого нет в nixpkgs, и нет желания его пакетировать.
- Не подходит для машины, которая должна работать сразу, без периода освоения.
Чек-лист перед переходом
- Конфигурация хранится в git с первого дня.
- Есть отдельный тестовый хост или виртуалка для экспериментов.
- Настроены сборка мусора и оптимизация стора.
- Понятно, как откатиться через меню загрузки.
- Проверено, что критичный софт запускается: nix-ld или FHS-окружение.
Итог
NixOS даёт то, чего нет у большинства дистрибутивов: систему, которую можно описать текстом, собрать заново и откатить к предыдущему состоянию одной командой. За это платят языком с высоким порогом входа, расходом диска, временем сборки и необходимостью разбираться с нестандартными путями. Если инфраструктура однотипная, а ценность воспроизводимости высока, цена окупается. Если нужен сервер, который настраивается один раз и больше не трогается, проще взять Debian или AlmaLinux и не усложнять.