Как устанавливать программы на 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-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;
...
}
Обычно именно таким образом устанавливают программное обеспечение на nixos, поскольку это позволяет восстановить ту же систему на другом устройстве с тем же программным обеспечением и даже большинством общесистемных настроек.
Home Manager Ссылка на заголовок
Если вы не работаете под NixOS или являетесь пользователем без root-доступа и хотите иметь список программ, основанный на репозиториях, или хотите устанавливать настройки пользовательских приложений из основных конфигурационных файлов, во всех этих случаях вам понадобится Home Manager. Это внешнее программное обеспечение, которое позволяет вам управлять пользовательским программным обеспечением и его конфигурацией,
По сути, это программное обеспечение и набор конфигурационных файлов, созданных пользователем либо в домашнем каталоге, либо импортированных в системный конфиг. Вы можете просто добавить home.packages
, аналогичные пользовательским пакетам в конфигурации nixos, или использовать опции менеджера home, аналогичные общесистемным опциям nixos.
Программа также может возвращать ошибки, когда встречает предсуществующие конфигурационные файлы, в этом случае вам нужно переместить их с пути или удалить, если вы уверены, что они вам не нужны.
Файлы шеллов и девшеллы 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
Appimage-run Ссылка на заголовок
Если программа упакована как appimage, что легко узнать, посмотрев на расширение файла, ее нужно запустить с помощью инструмента appImage-run, который работает аналогично, но заточен под appimages.
appimage-run ./appimage.AppImage
Итог Ссылка на заголовок
Есть и другие методы, как специфические для NixOS, например nix-alien и nix-LD, так и просто доступные для любого дистрибутива linux, например Wine для Windows-приложений, Flatpak и Docker для Linux-программ, упакованных для них, Waydroid для android-приложений и многие другие, но это может быть темой для другого дня.
Надеюсь, эта статья была вам полезна.