Как устанавливать программы на NixOS

NixOS - это дистрибутив Linux, основанный на пакетном менеджере nix, и он хорошо известен своей сложностью и слишком запутанными функциями. Я недавно перешла на NixOS из-за его обширных репозиториев пакетов, чистого конфигурирования из одного набора конфигурационных файлов и возможности отката обновлений.

Но я, как и многие другие люди, заметила, что одна из вещей, которую NixOS мог бы сделать лучше - это документация. Она не очень хорошо объясняет, почему вы должны делать что-то, например, устанавливать программы, тем или иным способом, и даже не перечисляет поддерживаемые способы в одном месте.

Видео Ссылка на заголовок

Прежде чем начать это видео, я должна сделать небольшое замечание. В этом видео рассказывается о довольно сложной и не очень понятной теме, которая не становится лучше от того, что брендинг Nix и NixOS порой очень запутан.

Когда я говорю “пакет”, что обычно означает “программное обеспечение, упакованное в файл, который будет распакован системой для установки”, я имею в виду деривацию Nix. По сути, это то же самое, но есть некоторые технические различия, например, хранение в nix store вместо распаковки и автоматическая сборка из исходников вместо упаковки и загрузки.

Nix делает много работы за вас, чтобы вы ее не замечали, например, проверяет внешний сайт на наличие готовых пакетов, чтобы вам не нужно было тратить свои вычислительные ресурсы на сборку всего из исходников, и управляет приложениями, чтобы вы могли запускать их нормально из командной строки или графического интерфейса, не задумываясь о том, как они хранятся на самом деле.

Заметка

Я также упомяну о Flakes. Это Nix Flakes, новый экспериментальный формат для конфигурационных файлов и пакетов, который лучше текущего, с более новыми, быстрыми и удобными версиями инструментов командной строки, сделанными для него, но он немного сложнее и пока не используется по умолчанию. Включить поддержку flake довольно просто с помощью этой опции в конфигурации NixOS.

nix.settings.experimental-features = [ "nix-command" "flakes" ];

Императивная установка программ Ссылка на заголовок

С помощью этой команды можно императивно устанавливать пакеты на уровне пользователя, что не рекомендуется, но все же работает, особенно за пределами NixOS.

nix-env Ссылка на заголовок

Пример
nix-env -iA nixos.minetest # в nixos
nix-env -iA nixpkgs.minetest # вне nixos
Информация

nix profiles Ссылка на заголовок

Nix profile, который представляет собой способ для flake установки пакетов, немного отличается, поскольку он будет устанавливать пакет внутри так называемого профиля, с возможностью делать откат и иметь несколько независимых профилей, и будет устанавливать пакет из последнего, нестабильного репозитория по умолчанию.

Пример
nix profile install nixpkgs#minetest # нестабильный репозиторй
nix profile install nixpkgs/nixos-23-05#minetest # 23.05 стабильная версия
Предупреждение
Профиль имеет более высокий приоритет, чем nix-env, поэтому пакеты, установленные через него, будут недоступны до тех пор, пока вы не удалите профиль и не перестанете использовать команду nix profile.
Информация

Попробовать без установки (Императивно) Ссылка на заголовок

Это способ загрузки или сборки пакетов и запуска программ из них из отдельной сессии командной строки без постоянной установки чего-либо в систему. Это позволяет пользователю опробовать новое программное обеспечение или использовать некоторые обычно не нужные пакеты, не раздувая систему.

nix-shell Ссылка на заголовок

Пример
nix-shell -p minetest
# здесь ваше использование ПО
exit # выйти из шелла
Информация

nix shell and nix run Ссылка на заголовок

Пример
nix shell nixpkgs#minetest
# здесь ваше использование ПО
exit

# or

nix run nixpkgs#minetest # сразу запустить главный исполняемый файл
nix run nixpkgs#minetest -- --help # передать флаги в программу

Все три варианта также подходят для запуска программ вне NixOS или без root-доступа.

Предупреждение

Скачанные пакеты все еще хранятся на устройстве, они удаляются командой nix-collect garbage.

https://nixos.org/manual/nix/stable/command-ref/nix-collect-garbage

Конфигурационные файлы Ссылка на заголовок

Основным способом постоянной установки пакета на NixOS является модификация конфигурационного файла NixOS или модуля, импортируемого в такой файл. Проще всего это сделать с помощью enviroment.systemPackages, где вы определяете пакеты, доступные любому пользователю в системе, как список имен пакетов, снабженных префиксом pkgs. и разделенных пробелами.

Пример
{ pkgs, config, lib, ... }:
{
    ...

    enviroment.systemPackages = with pkgs; [
        minetest
        taisei
    ];

    ...
}

Другой способ - использовать список пакетов для конкретного пользователя в users.users.username.packages, который работает почти так же, или использовать опции nixos для установки и, возможно, даже настройки программного обеспечения, которое поддерживает его, на системном уровне. Некоторые программы работают хуже, если устанавливаются только как пакет, особенно если они требуют каких-то общесистемных изменений или запуска демона, а некоторые не доступны как опция конфигурации, но работают как просто пакет.

Пример
{ pkgs, config, lib, ... }:
{
    ...

    users.users.laika.packages = with pkgs; [
        minetest
        taisei
    ];
    programs.kdeconnect.enable = true;

    ...
}
Предупреждение
Чтобы изменения были применены, используйте команду `sudo nixos-rebuild switch. Перезагрузка также может потребоваться для больших обновлений и изменений, связанных с драйверами.

Обычно именно таким образом устанавливают программное обеспечение на nixos, поскольку это позволяет восстановить ту же систему на другом устройстве с тем же программным обеспечением и даже большинством общесистемных настроек.

Информация
Неплохой гайд для новичков - https://itsfoss.com/nixos-package-management/

Home Manager Ссылка на заголовок

Если вы не работаете под NixOS или являетесь пользователем без root-доступа и хотите иметь список программ, основанный на репозиториях, или хотите устанавливать настройки пользовательских приложений из основных конфигурационных файлов, во всех этих случаях вам понадобится Home Manager. Это внешнее программное обеспечение, которое позволяет вам управлять пользовательским программным обеспечением и его конфигурацией,

По сути, это программное обеспечение и набор конфигурационных файлов, созданных пользователем либо в домашнем каталоге, либо импортированных в системный конфиг. Вы можете просто добавить home.packages, аналогичные пользовательским пакетам в конфигурации nixos, или использовать опции менеджера home, аналогичные общесистемным опциям nixos.

Программа также может возвращать ошибки, когда встречает предсуществующие конфигурационные файлы, в этом случае вам нужно переместить их с пути или удалить, если вы уверены, что они вам не нужны.

Информация
Полный мануал home manager - https://nix-community.github.io/home-manager/

Файлы шеллов и девшеллы Flake Ссылка на заголовок

Если вам нужна какая-то рабочая среда, набор пакетов и переменных окружения за пределами вашей системной конфигурации, которыми вы можете просто поделиться с любым человеком, у которого тоже есть nix, ваш выход - shell.nix, или, скорее, файл конфигурации nix, который можно использовать для вызова команды nix-shell, чтобы получить конфигурацию из нее вместо того, чтобы каждый раз вручную указывать имена пакетов. Используйте nix-shell shell.nix, или просто nix-shell в том же каталоге, чтобы использовать этот файл оболочки.

Пример
{ pkgs ? import <nixpkgs> {} }:
  pkgs.mkShell {
    nativeBuildInputs = with pkgs; [
        minetest
        blockbench
        blender
    ];
}

В случае с хлопьями, однако, он создается с помощью специальной опции внутри файла flake, с другим синтаксисом, и вызывается с помощью команды nix develop.

Исполняемые файлы не для NixOS Ссылка на заголовок

Но что делать, если вам нужно запустить что-то, чего нет в репозиториях NixOS? Конечно, в Nixpkgs есть множество пакетов, портированных из других дистрибутивов, и самостоятельных исполняемых файлов, но вам все равно понадобится запустить некоторые специфические программы, не входящие в пакет. В NixOS это сделать сложнее, так как она не придерживается некоторых стандартов, что делает невозможным запуск исполняемого файла напрямую, но на самом деле это все еще возможно с помощью встроенных функций nix через некоторые внешние инструменты.

Steam-run Ссылка на заголовок

Если программа представляет собой отдельный бинарник или бинарник в папке со всем, что находится рядом с ним, как большинство игр, проще всего запустить ее через steam-run - инструмент, эмулирующий стандартный дистрибутив linux с наиболее распространенными зависимостями. Он называется так, потому что использует те же настройки, что и пакет, используемый для установки Steam, магазина видеоигр и платформы.

Пример
steam-run ./a.out
steam-run ./GodotGame.x86_64
Информация
Страница про Steam в NixOS Вики - https://nixos.wiki/wiki/Steam

Appimage-run Ссылка на заголовок

Если программа упакована как appimage, что легко узнать, посмотрев на расширение файла, ее нужно запустить с помощью инструмента appImage-run, который работает аналогично, но заточен под appimages.

Пример
appimage-run ./appimage.AppImage
Информация
Страница AppImage на NixOS Вики - https://nixos.wiki/wiki/Appimage

Итог Ссылка на заголовок

Есть и другие методы, как специфические для NixOS, например nix-alien и nix-LD, так и просто доступные для любого дистрибутива linux, например Wine для Windows-приложений, Flatpak и Docker для Linux-программ, упакованных для них, Waydroid для android-приложений и многие другие, но это может быть темой для другого дня.

Надеюсь, эта статья была вам полезна.