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 и не усложнять.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте