LinuxRuLinux без лишней теории
Пакеты и окружения

Пакетный менеджер Nix без NixOS: воспроизводимые пакеты и окружения

Редакция LinuxRu7 мин чтенияСоветы

Nix без NixOS работает как второй пакетный менеджер в любом дистрибутиве: всё ставится в /nix/store, разные версии живут рядом, а окружение проекта описывается одним файлом flake.nix. Ниже установка, команды нового CLI, пример окружения для разработки, очистка места и удаление.

Пакетный менеджер Nix без NixOS: воспроизводимые пакеты и окружения
Фото: NixOS contributors (NixOS Foundation), GPL, Wikimedia Commons
Содержание
  1. Что такое Nix
  2. Установка
  3. Включить flakes
  4. Первые команды
  5. Окружения проектов
  6. Графические программы
  7. Обновление и место
  8. Удаление
  9. Частые вопросы

Зачем ставить Nix в обычный дистрибутив

Nix - это пакетный менеджер, а NixOS - дистрибутив, построенный вокруг него. Пакетный менеджер отлично работает и сам по себе: в Ubuntu, Debian, Fedora, Arch и даже в WSL2. Он не трогает apt или dnf и не лезет в /usr. Всё, что он ставит, лежит в каталоге /nix/store, причём каждая сборка в своей папке с хешем в имени, например /nix/store/abc123...-ripgrep-14.1.1.

Из этого вытекают его сильные стороны:

  • Несколько версий рядом. Python 3.11 для одного проекта и 3.13 для другого без конфликтов и без pyenv.
  • Воспроизводимость. Файл flake.nix с файлом блокировки даёт коллеге ровно тот же набор инструментов той же версии.
  • Откат. Каждое изменение профиля создаёт новое поколение, к предыдущему можно вернуться одной командой.
  • Попробовать без установки. Программа запускается во временной оболочке и исчезает из PATH, когда вы из неё выходите.

Цена - порог входа: свой язык описания пакетов, необычная структура каталогов и заметный расход места на диске. Для одной-двух программ проще взять Flatpak, для полноценной чужой системы внутри своей подойдёт Distrobox, о нём статья Distrobox: несколько Linux-сред в одной системе.

Установка Nix: многопользовательский режим

Официальный способ - скрипт с nixos.org. Многопользовательский режим с демоном nix-daemon рекомендуется для систем с systemd и sudo: сборки идут от отдельных служебных пользователей, а не от вас.

# многопользовательская установка, рекомендуется
curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install | sh -s -- --daemon

# однопользовательская: без демона и без root после установки
curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install | sh -s -- --no-daemon

Скрипт создаёт каталог /nix, группу nixbld со служебными пользователями, службу nix-daemon и прописывает переменные окружения в файлы оболочки. После установки откройте новый терминал и проверьте: nix --version. Если не любите выполнять скрипты из сети вслепую, сначала скачайте его командой curl -L https://nixos.org/nix/install -o nix-install.sh и прочитайте.

Особенности дистрибутивов

  • Arch Linux. Nix есть в официальном репозитории: sudo pacman -S nix, затем sudo systemctl enable --now nix-daemon.service и добавление себя в группу: sudo usermod -aG nix-users $USER.
  • Debian и Ubuntu. В репозиториях есть пакеты Nix, но версия часто отстаёт от актуальной. Для работы с flakes и новым CLI лучше официальный скрипт.
  • Fedora. Официальная страница загрузки рекомендует многопользовательский режим на системах с выключенным SELinux. На Fedora с включённым SELinux проверяйте актуальные инструкции и сторонние установщики, которые заявляют его поддержку.
  • Неизменяемые системы. На Silverblue и Kinoite корень доступен только для чтения, и каталог /nix создаётся обходными путями. Подробнее о таких системах в обзоре Atomic Linux: Silverblue, Kinoite и неизменяемый рабочий стол.

Новый интерфейс nix и flakes

У Nix два набора команд. Классический: nix-env, nix-shell, nix-channel. Новый: единая команда nix с подкомандами и flakes для описания проектов. Новый интерфейс и flakes всё ещё помечены как экспериментальные, но ими пользуется большая часть сообщества, и почти вся свежая документация написана под них. Включите их в конфиге:

mkdir -p ~/.config/nix
echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf

Для всех пользователей ту же строку добавляют в /etc/nix/nix.conf и перезапускают демон: sudo systemctl restart nix-daemon.

ЗадачаКлассические командыНовый CLI
Найти пакетnix-env -qaP ripgrepnix search nixpkgs ripgrep
Установить в профильnix-env -iA nixpkgs.ripgrepnix profile add nixpkgs#ripgrep
Список установленногоnix-env -qnix profile list
Удалитьnix-env -e ripgrepnix profile remove ripgrep
Обновить всёnix-channel --update, затем nix-env -unix profile upgrade --all
Откатить профильnix-env --rollbacknix profile rollback
Временная оболочкаnix-shell -p ripgrepnix shell nixpkgs#ripgrep

В Nix 2.30 команду nix profile install переименовали в nix profile add, старое имя осталось как псевдоним. Не смешивайте в одном профиле nix-env и nix profile: после перехода на новый формат профиля старые команды перестают с ним работать.

Попробовать программу, не устанавливая её

Самая приятная возможность Nix для повседневной работы - временные оболочки. Нужен jq на пять минут, чтобы разобрать JSON? Не надо ставить его в систему:

# оболочка, в которой есть jq и httpie
nix shell nixpkgs#jq nixpkgs#httpie

# запустить программу один раз
nix run nixpkgs#cowsay -- "Привет из Nix"

# выйти из временной оболочки
exit

Пакеты при этом скачиваются в /nix/store и остаются там до сборки мусора, поэтому повторный запуск мгновенный. Если инструмент нужен постоянно, добавьте его в профиль через nix profile add, он появится в ~/.nix-profile/bin.

Окружение проекта в flake.nix

Главная причина, по которой разработчики ставят Nix: описать инструменты проекта в одном файле в корне репозитория. Простой flake.nix для проекта на Node.js и Python:

{
  description = "Окружение проекта";

  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";

  outputs = { self, nixpkgs }:
    let
      pkgs = nixpkgs.legacyPackages.x86_64-linux;
    in {
      devShells.x86_64-linux.default = pkgs.mkShell {
        packages = [ pkgs.nodejs_22 pkgs.python3 pkgs.git ];
      };
    };
}
# войти в окружение проекта
nix develop

# обновить версии пакетов в flake.lock
nix flake update

При первом запуске nix develop создаст flake.lock с точной ревизией nixpkgs. Закоммитьте его вместе с flake.nix, и у всей команды будут одинаковые версии. Учтите, что flakes видят только файлы, добавленные в git: новый flake.nix нужно хотя бы проиндексировать командой git add.

Поставьте direnv и nix-direnv и положите в корень проекта файл .envrc с одной строкой use flake. Тогда окружение будет включаться само при переходе в каталог проекта и выключаться при выходе из него, а nix-direnv закэширует его, чтобы не пересчитывать при каждом заходе.

Графические программы из Nix на чужом дистрибутиве

Консольные утилиты из Nix работают везде одинаково. С графическими сложнее. Программы, которым нужны OpenGL или Vulkan, ищут драйверы внутри /nix/store, а драйверы вашей системы лежат в /usr/lib. В итоге игра или 3D-редактор падают с ошибкой контекста или работают на программном рендеринге. Для таких случаев сообщество сделало обёртку nixGL, но надёжнее брать GPU-программы из репозитория дистрибутива или Flathub.

Ярлыки программ из профиля лежат в ~/.nix-profile/share/applications. Если меню их не видит, проверьте, что этот путь попал в переменную XDG_DATA_DIRS: обычно её дополняет скрипт профиля Nix при входе в систему, поэтому после установки нужно выйти из сеанса и войти снова. Сравнение способов установки программ есть в статье Как установить программу в Linux.

Обновление, сборка мусора и место на диске

Старые поколения профиля держат в хранилище все прежние версии пакетов, поэтому /nix/store растёт. Раз в месяц полезно чистить:

# сколько занимает хранилище
du -sh /nix/store

# удалить старые поколения и всё, на что больше никто не ссылается
nix-collect-garbage -d
sudo nix-collect-garbage -d   # то же для системных профилей и root

# объединить одинаковые файлы жёсткими ссылками
nix store optimise

После -d откатиться на удалённые поколения уже нельзя. Если хотите оставить запас, используйте nix-collect-garbage --delete-older-than 30d. Другие способы освободить место описаны в статье Как освободить место на диске в Linux.

Следующий шаг для тех, кому понравилось, - Home Manager. Он описывает в Nix не только пакеты, но и конфиги пользователя: настройки оболочки, git, редактора. Это уже почти NixOS, но только для домашнего каталога.

Как полностью удалить Nix

Многопользовательская установка удаляется вручную, по шагам из руководства:

sudo systemctl stop nix-daemon.service
sudo systemctl disable nix-daemon.socket nix-daemon.service
sudo systemctl daemon-reload

sudo rm -rf /etc/nix /etc/profile.d/nix.sh /etc/tmpfiles.d/nix-daemon.conf /nix ~root/.nix-channels ~root/.nix-defexpr ~root/.nix-profile ~root/.cache/nix ~/.nix-channels ~/.nix-defexpr ~/.nix-profile ~/.cache/nix

for i in $(seq 1 32); do sudo userdel nixbld$i; done
sudo groupdel nixbld

Затем проверьте файлы /etc/bash.bashrc, /etc/bashrc, /etc/profile, /etc/zsh/zshrc и /etc/zshrc: установщик мог оставить там строки с подключением Nix, их нужно удалить. Если установщик делал резервные копии с суффиксом .backup-before-nix, верните их на место. Полная инструкция есть в официальном руководстве Nix.

Частые вопросы

Можно ли использовать Nix без NixOS?

Да. Nix ставится в Ubuntu, Debian, Fedora, Arch и WSL2 рядом с родным пакетным менеджером, хранит всё в /nix/store и не трогает системные пакеты.

Чем nix profile add отличается от nix profile install?

Это одна и та же команда. В Nix 2.30 её переименовали в nix profile add, а старое имя install оставили как псевдоним.

Нужно ли включать flakes?

Для современного CLI и описания окружений проектов да. Добавьте строку experimental-features = nix-command flakes в ~/.config/nix/nix.conf.

Почему /nix/store занимает так много места?

В хранилище остаются все версии пакетов из старых поколений профиля. Очистите их командой nix-collect-garbage --delete-older-than 30d или nix-collect-garbage -d и выполните nix store optimise.

Работают ли графические программы из Nix в Ubuntu?

Большинство обычных программ работает, но приложения с OpenGL и Vulkan могут не найти системные драйверы. Для них используют обёртку nixGL или ставят программу из репозитория дистрибутива.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.