Установка в вашей системе
Добро пожаловать на вторую пилюлю Nix. В первой пилюле мы кратко рассказали про Nix.
Теперь установим Nix в нашу систему и разберёмся, что изменилось после установки.
Если вы используте NixOS, Nix у вас уже установлен, так что вы сразу можете переходить к следующей пилюле.
За инструкциями по установке, пожалуйста, обратитесь к разделу Установка Nix Справочного руководства Nix.
Установка
Эти статьи — не руководство по использованию Nix. Здесь мы будем знакомиться с Nix, не погружаясь в формальности, просто чтобы разобраться, как он устроен.
Первая важная вещь: деривации в хранилище Nix ссылаются на другие деривации, которые также находятся в хранилище Nix.
Они не используют libc
из основной операционной системы или откуда-то ещё.
В хранилище лежат все библиотеки, которые могут потребоваться, чтобы запустить любой пакет.
ℹ️ При многопользовательской установке (такая как раз применяется в NixOS), хранилищем владеет root, а многочисленные пользователи могут устанавливать или собирать софт при помощи демона Nix. Больше о многопользовательской установке вы можете прочитать здесь: https://nixos.org/manual/nix/stable/installation/installing-binary.html#multi-user-installation.
С чего начинается хранилище в Nix
Вот что печатает команда установки Nix во время установки:
copying Nix to /nix/store..........................
Речь идёт о каталоге /nix/store
, который мы обсуждали в первой статье.
Туда копируется всё, что необходимо для запуска системы Nix.
Вы можете заметить bash
, утилиты ядра, компилятор C, библиотеки, Perl
, sqlite
и сам Nix с его утилитами и libnix
.
Обратите внимание, что в /nix/store
лежат не только каталоги, но и файлы. У них такой же формат имени /hash-name
.
База данных Nix
Сразу после наполнения хранилища, процесс установки инициализирует базу данных:
initialising Nix database...
Да, в Nix есть база данных.
Она находится в каталоге /nix/var/nix/db
.
Это база данных sqlite
, которая хранит зависимости между деривациями.
Схема очень простая: есть таблица корректных путей, где каждому пути сопоставлен целый ключ. Он автоматически увеличивается при вставке новых дериваций.
Далее, есть таблица зависимостей, которая обеспечивает связь один-ко-многим, так что, зная деривацию, вы можете выяснить, от каких дериваций она зависит.
Можно исследовать эту базу, установив sqlite
(nix-env -iA sqlite -f '<nixpkgs>'
) и выполнив команду sqlite3 /nix/var/nix/db/db.sqlite
.
ℹ️ Сразу после установки Nix не забудьте закрыть и заново открыть терминалы, чтобы обновить настройки командной строки.
📢 Изменяйте
/nix/store
вручную, только если вы на самом деле знаете, что делаете, или хранилище больше не будет синхронизировано в базой данныхsqlite
.
Первый профиль
Завершив установку, познакомимся с профилем:
creating /home/nix/.nix-profile
installing 'nix-2.1.3'
building path(s) `/nix/store/a7p1w3z2h8pl00ywvw6icr3g5l9vm5r7-user-environment'
created 7 symlinks in user environment
Профиль в Nix — это удобная концепция, чтобы откатывать изменения. Профили используются для объединения компонентов, разбросанных по разным путям, в одно целое. Более того, у профилей есть версии или «поколения». Когда вы изменяете профиль, рядом со старой версией появляется новая.
Поколения можно переключать и откатывать атомарно, что делает управление изменениями особенно удобным.
Итак, внимательно посмотрим на наш профиль:
$ ls -l ~/.nix-profile/
bin -> /nix/store/ig31y9gfpp8pf3szdd7d4sf29zr7igbr-nix-2.1.3/bin
[...]
manifest.nix -> /nix/store/q8b5238akq07lj9gfb3qb5ycq4dxxiwm-env-manifest.nix
[...]
share -> /nix/store/ig31y9gfpp8pf3szdd7d4sf29zr7igbr-nix-2.1.3/share
Деривация nix-2.1.3
в хранилище Nix — это сам Nix вместе с исполняемыми файлами и библиотеками.
Процесс «установки» деривации в профиль, в сущности, воспроизводит дерево nix-2.1.3
из хранилища с помощью символических ссылок.
В настоящий момент в профиль установлена только одна программа (сам Nix), поэтому каталог bin
ссылается на каталог bin
из nix-2.1.3
.
Но ~/.nix-profile
— это не реальный каталог, а символическая ссылка на последнее поколение нашего профиля, /nix/var/nix/profiles/default
.
Которая, в свою очередь, тоже является ссылкой на соседний каталог default-1-link
.
Так что текущим профилем может быть люоое из поколений, но сейчас он указывает на первое.
В конечном итоге, default-1-link
— символическая ссылка на деривацию user-environment
, которая печаталась на экране в процесс установки.
О файле manifest.nix
мы подробнее поговорим в следующей статье.
Выражения Nixpkgs
Ещё немного вывода от программы установки:
downloading Nix expressions from `http://releases.nixos.org/nixpkgs/nixpkgs-14.10pre46060.a1a2851/nixexprs.tar.xz'...
unpacking channels...
created 2 symlinks in user environment
modifying /home/nix/.profile...
Выражения Nix написаны на языке Nix, они описывают пакеты и процесс их сборки. Nixpkgs — это репозиторий, содержащий все выражения: https://github.com/NixOS/nixpkgs.
Установщик скачал описания пакетов, начиная с коммита a1a2851
.
Второй профиль, который есть в системе — это профиль каналов.
~/.nix-defexpr/channels
ссылается на /nix/var/nix/profiles/per-user/nix/channels
, который в свою очередь ссылается на channels-1-link
, который ссылается на каталог в хранилище со скачанными выражениями Nix.
Каналы — это набор пакетов и выражений, доступных для скачивания. Подобно стабильным и нестабильным репозиториям в Debian, в Nix есть есть стабильные и нестабильные каналы.
Позже мы вернёмся к выражениям Nix, а пока закончим с профилями.
В конечном итоге установщик изменил ~/.profile
так, чтобы вы попадали в окружение Nix автоматически.
Что делает скрипт ~/.nix-profile/etc/profile.d/nix.sh
на самом деле, так это добавляет ~/.nix-profile/bin
в PATH
и ~/.nix-defexpr/channels/nixpkgs
в NIX_PATH
.
Переменную NIX_PATH
мы обсудим позже.
Попробуйте в разобраться в скрипте nix.sh
, он не очень большой.
Вопросы и ответы: можно ли заменить /nix на что-то другое?
Да, можно, но есть веская причина использовать именно каталог /nix
вместо любого другого.
Все деривации зависят от других дериваций, используя при этом абсолютные пути.
В первой статье мы видели, что bash
ссылается на glibc
по конкретному абсолютному пути внутри /nix/store
.
Убедитесь сами, и не волнуйтесь, если увидите множество дериваций bash
:
$ ldd /nix/store/*bash*/bin/bash
[...]
Размещая хранилище в /nix
, мы можем напрямую использовать бинарные образы с nixos.org
(точно также, как и пакеты с зеркал Debian).
Если же разместить хранилище в каталоге, скажем, /foo/store
, то:
glibc
будет установлен в/foo/store
- После этого bash будет указывать на
glibc
в/foo/store
вместо/nix/store
- В результате мы не сможем использовать бинарный образ, так как нам нужен другой bash, и мы вынуждены перекомпилировать вообще всё.
Помимо прочего, /nix
— это осмысленное место для хранилища.
Заключение
Мы установили Nix в нашу систему. Он полностью изолирован и принадлежит пользователю nix
, а мы продолжим изучать особенности новой системы.
В этой статье мы познакомились с новыми концепциями, такими как профили и каналы.
В частности, с помощью профилей мы научились управлять поколениями, а с помощью каналов — загружать бинарные образы с nixos.org
.
Программа установки помещает всё в каталог /nix
, создавая несколько символических ссылок в домашнем каталоге пользователя Nix.
Я надеюсь, что объяснил все детали, и вы теперь не думаете, что вся система построена на волшебстве. В конечном итоге всё сводится к тому, что компоненты лежат в хранилище и ссылаются друг на друга через символические ссылки.
В следующей пилюле
…мы погрузимся в окружение Nix и научимся взаимодействовать с хранилищем.