
NixOS: уникальная Linux-система с управлением конфигурациями и изоляцией пакетов
NixOS — это операционная система Linux, построенная на фундаментально иной философии управления пакетами и конфигурациями. В отличие от традиционных дистрибутивов, NixOS предлагает декларативный подход к настройке системы, атомарные обновления и полную воспроизводимость окружения. В этой статье разберём ключевые особенности системы и её отличия от привычных дистрибутивов.
Философия Nix: декларативность и чистота
В основе NixOS лежит пакетный менеджер Nix, который радикально отличается от APT, YUM или Pacman. Главная идея — каждый пакет устанавливается в изолированное окружение с уникальным хешем, который зависит от всех зависимостей и параметров сборки.
Структура файловой системы
В традиционных Linux-системах исполняемые файлы располагаются в /usr/bin
, библиотеки в /usr/lib
, а конфигурации в /etc
. NixOS организует пакеты иначе:
/nix/store/hash-название-версия/
├── bin/
├── lib/
└── share/
Каждый пакет получает уникальный путь вида /nix/store/a5b2c3d4...-firefox-120.0
, где хеш рассчитывается из всех зависимостей, исходного кода и параметров сборки. Это обеспечивает:
- Изоляцию версий — несколько версий одной программы сосуществуют без конфликтов
- Атомарность — установка пакета либо полностью успешна, либо не меняет систему
- Воспроизводимость — один и тот же конфигурационный файл создаст идентичную систему
Декларативная конфигурация
Вся система описывается в файле /etc/nixos/configuration.nix
на языке Nix Expression Language:
{ config, pkgs, ... }:
{
# Параметры загрузчика
boot.loader.systemd-boot.enable = true;
# Сетевые настройки
networking = {
hostName = "nixos-workstation";
networkmanager.enable = true;
firewall = {
enable = true;
allowedTCPPorts = [ 22 80 443 ];
};
};
# Пользователи
users.users.developer = {
isNormalUser = true;
extraGroups = [ "wheel" "docker" "networkmanager" ];
shell = pkgs.zsh;
};
# Установленные пакеты
environment.systemPackages = with pkgs; [
vim
git
htop
docker
postgresql_15
];
# Сервисы
services = {
openssh.enable = true;
postgresql = {
enable = true;
package = pkgs.postgresql_15;
};
};
}
После изменения конфигурации достаточно выполнить sudo nixos-rebuild switch
, и система перестроится в соответствии с описанием.
Управление пакетами и окружениями
Множественные окружения пользователей
В NixOS каждый пользователь может иметь собственный набор пакетов, не влияя на систему:
# Установка пакета для текущего пользователя
nix-env -iA nixpkgs.nodejs
# Временный shell с нужными инструментами
nix-shell -p python311 python311Packages.numpy
# Создание изолированного окружения для разработки
nix-shell --pure -p gcc gnumake
Это особенно полезно для разработки: можно создать файл shell.nix
в проекте:
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = with pkgs; [
nodejs_20
yarn
postgresql_15
];
shellHook = ''
export DATABASE_URL="postgresql://localhost/myapp"
echo "Development environment ready"
'';
}
Теперь команда nix-shell
автоматически активирует нужное окружение с точными версиями зависимостей.
Поколения системы
NixOS сохраняет все предыдущие конфигурации как "поколения". При каждом nixos-rebuild
создаётся новая запись в загрузчике:
# Просмотр поколений
sudo nix-env --list-generations --profile /nix/var/nix/profiles/system
# Откат на предыдущее поколение
sudo nixos-rebuild switch --rollback
# Удаление старых поколений
sudo nix-collect-garbage --delete-older-than 30d
Это делает систему практически неубиваемой — неудачное обновление можно откатить простым выбором предыдущей записи в меню загрузки.
Воспроизводимость и безопасность
Воспроизводимые сборки
Благодаря чистоте функций в Nix, сборка пакета всегда даёт одинаковый результат. Файл flake.nix
позволяет зафиксировать точные версии всех зависимостей:
{
description = "Production server configuration";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11";
};
outputs = { self, nixpkgs }: {
nixosConfigurations.webserver = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [ ./configuration.nix ];
};
};
}
Теперь любой может воспроизвести точную копию вашей системы, а flake.lock
гарантирует, что даже через годы сборка будет идентичной.
Изоляция и безопасность
NixOS предоставляет мощные механизмы изоляции:
# Контейнеры на уровне системы
containers.webserver = {
autoStart = true;
privateNetwork = true;
hostAddress = "192.168.100.1";
localAddress = "192.168.100.2";
config = { config, pkgs, ... }: {
services.nginx = {
enable = true;
virtualHosts."example.com" = {
root = "/var/www";
};
};
};
};
# Принудительные правила доступа
security.apparmor.enable = true;
services.openssh.settings = {
PermitRootLogin = "no";
PasswordAuthentication = false;
};
Каждый пакет не может случайно затронуть файлы других пакетов или системные библиотеки, что снижает риск supply chain атак.
Практические сценарии использования
Разработка с точными зависимостями
Для проекта на Python создаём shell.nix
:
{ pkgs ? import <nixpkgs> {} }:
let
pythonEnv = pkgs.python311.withPackages (ps: with ps; [
django
psycopg2
celery
pytest
]);
in
pkgs.mkShell {
buildInputs = [
pythonEnv
pkgs.postgresql_15
pkgs.redis
];
}
Все члены команды получат идентичное окружение, независимо от их основной системы.
Облачная инфраструктура
NixOS отлично подходит для инфраструктуры как кода:
# Описание сервера
{ config, pkgs, ... }:
{
services.kubernetes = {
roles = ["master" "node"];
masterAddress = "k8s-master.local";
};
services.prometheus.exporters.node = {
enable = true;
enabledCollectors = [ "systemd" ];
};
# Автоматическое обновление с откатом при сбое
system.autoUpgrade = {
enable = true;
allowReboot = true;
flake = "github:company/nixos-infra";
};
}
Desktop-конфигурация
Полное описание рабочего окружения:
{
services.xserver = {
enable = true;
displayManager.gdm.enable = true;
desktopManager.gnome.enable = true;
};
# Пакеты для работы
environment.systemPackages = with pkgs; [
vscode
google-chrome
slack
spotify
docker-compose
];
# Настройки по умолчанию для новых пользователей
programs.git = {
enable = true;
config = {
init.defaultBranch = "main";
pull.rebase = true;
};
};
}
Недостатки и ограничения
Несмотря на преимущества, NixOS имеет особенности, которые нужно учитывать:
Кривая обучения: Язык Nix и декларативный подход требуют времени на освоение. Привычные команды вроде apt install
здесь не работают.
Бинарные программы: Сторонние бинарники могут не запуститься из-за нестандартной структуры системы. Решается через steam-run
или buildFHSUserEnv
.
Размер хранилища: /nix/store
быстро растёт, так как хранит множество версий пакетов. Требуется регулярная очистка через nix-collect-garbage
.
Документация: Официальная документация иногда отстаёт от возможностей системы, приходится изучать исходники.
Время сборки: При установке нестандартных пакетов может потребоваться компиляция, что занимает время.
Заключение
NixOS представляет альтернативный взгляд на управление Linux-системами. Декларативная конфигурация, атомарные обновления, воспроизводимость и изоляция делают её мощным инструментом для разработки, DevOps и построения надёжной инфраструктуры.
Система идеальна для тех, кто:
- Ценит воспроизводимость окружения
- Работает над несколькими проектами с конфликтующими зависимостями
- Хочет версионировать конфигурацию системы в Git
- Нуждается в быстром откате изменений
- Строит облачную инфраструктуру как код
NixOS требует инвестиции времени в обучение, но взамен даёт уровень контроля и надёжности, недостижимый в традиционных дистрибутивах. Для тех, кто готов изучить новый подход, это открывает возможности качественно иного уровня управления системами.