Содержание


Функциональный менеджер пакетов Nix

Часть 1.Базовое использование

Comments

Серия контента:

Этот контент является частью # из серии # статей: Функциональный менеджер пакетов Nix

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Функциональный менеджер пакетов Nix

Следите за выходом новых статей этой серии.

1. Введение

Функциональный подход заключается в том, что пакет собирается функцией, не имеющей побочных эффектов, т. е. операции в Nix не являются деструктивными. Таким образом, операции установки и обновления как пакетов, так и целиком системы безопасны и позволяют осуществлять откат не только к предыдущему, но и к более ранним состояниям.

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

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

2. Установка Nix в основную систему

Nix портирован на различные платформы: Linux (архитектуры x86, x86_64, PowerPC), Mac OS X (Intel и PowerPC), FreeBSD (тестирование проводилось только для архитектуры Intel), Windows (Cygwin).

2.1. Сборка из исходных текстов

Для компиляции NIX в системе должны быть установлены GCC/G++, Curl и Perl.

Сборка и установка осуществляется стандартным набором команд:

$ ./configure
$ make
$ make install

По умолчанию утилиты и конфигурационные файлы Nix устанавливаются в /usr/local, изменить этот путь можно, указав конфигурационному скрипту --prefix=path. Изменять путь размещения хранилища (/nix) не рекомендуется.

2.2. Установка из RPM

Есть уже собранные пакеты для дистрибутивов, основанных на пакетном менеджере RPM. Скачать их можно отсюда. Бинарный пакет устанавливается командой

$ rpm -U nix-0.12-1.i386.rpm

2.3. Активизация Nix в системе

Если системой пользуется всего один человек, то назначаем его пользовательский аккаунт владельцем директорий /nix/var/nix и /nix/store:

$ sudo chown -R <username> /nix/store /nix/var/nix

Теперь он может выполнять операции с Nix без привилегий суперпользователя. Такой режим доступа к хранилищу Nix называется однопользовательским. Nix также поддерживает многопользовательский режим, при котором операции доступа к хранилищу от пользователей перенаправляются демону Nix, работающему с правами суперпользователя. Это позволяет непривилегированным пользователям в системе работать с менеджером Nix. Настройка многопользовательского режима в этой статье не рассматривается, информация о ней есть в руководстве пользователя.

Включаем в пользовательский ~/.bashrc загрузку файла /usr/local/etc/profile.d/nix.sh:

source /usr/local/etc/profile.d/nix.sh

Скрипт создает в директории пользователя символическую ссылку ~/.nix-profile, которая указывает на пользовательское окружение Nix с набором установленных программ. В переменную окружения PATH добавляется путь ~/.nix-profile/bin, и таким образом становятся доступны программы, установленные через Nix.

2.4. Обновление Nix через Nix

Если Nix уже установлен, то для его обновления нет необходимости трогать основную систему, с самим менеджером можно работать через Nix как с обычным пакетом:

$ nix-env -i nix

3. Репозитории и ресурсы

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

стабильные версии пакетов – http://nixos.org/releases/nixpkgs/channels/nixpkgs-stable

или

последние версии пакетов – http://nixos.org/releases/nixpkgs/channels/nixpkgs-unstable

Сделать это можно при помощи утилиты nix-channel:

$ nix-channel --add http://nixos.org/releases/nixpkgs/channels/nixpkgs-stable

Подписка означает, что указанный URL канала добавляется в файл ~/.nix-channels.

Команда

$ nix-channel --update

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

Операция

$ nix-channel --list
http://nixos.org/releases/nixpkgs/channels/nixpkgs-stable

выводит список используемых каналов.

Чтобы убрать подписку на определенный канал, выполняем команду:

$ nix-channel --remove <URL>

Преимущественно Nix собирает пакеты из исходных текстов, скачивая их с ресурсов разработчиков либо с таких хранилищ, как SourceForge. Таже на nixos.org есть набор прекомпилированных версий некоторых пакетов. При установке можно указать, чтобы менеджер Nix выбирал бинарные пакеты, если это возможно.

4. Работа с пакетами

Операции работы с пакетами осуществляются через утилиту nix-env.

4.1. Доступные пакеты

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

$ nix-env -qa '*'
a52dec-0.7.4
aalib-1.4rc4
abc-1.2.0
abcde-2.3.99.6
...

Опция -q (--query) указывает на операцию запроса, а опция -a (--available) уточняет, что запрос выполняется по доступным на канале пакетам.

Опция --description укажет, что необходимо дополнительно вывести краткую информацию о пакете, если она есть.

С опцией -s (--status) выводится статус для каждого пакета:

$ nix-env -qas '*'
-P-  a52dec-0.7.4
--S  aalib-1.4rc4
---  abc-1.2.0
IPS  abcde-2.3.99.6
...

Здесь первая буква (I) означает, что пакет установлен в текущем пользовательском окружении. Вторая буква (P) говорит о том, что пакет уже есть в хранилище Nix и в случае установки в пользовательское окружение скачивание и сборка пакета не потребуются. Последняя буква (S) – знак того, что на сетевом ресурсе доступна прекомпилированная сборка.

Также можно выполнить запрос выборочно по одному или нескольким пакетам, указав их названия в качестве параметров:

$ nix-env -qa xterm aterm gnome-terminal
aterm-2.5
aterm-2.8
gnome-terminal-2.26.0
xterm-231

Nix не осуществляет поиск по подстроке, так что используйте для этого утилиту grep.

Может оказаться удобным вывод списка пакетов с дополнительной информацией в XML-формате:

$ nix-env -qa--xml --meta '*'

4.2. Установка

Чтобы установить программу, используем ту же команду nix-env c опцией -i (--install), указывая в качестве параметра имена инсталлируемых пакетов. Дополнительно к имени можно указать версию пакета (если она не указана, автоматически выбирается наиболее поздняя):

$ nix-env -i aterm-2.5 gnome-terminal

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

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

$ nix-env -qas gnome-terminal
--S  gnome-terminal-2.26.0

S говорит о том, что прекомпилированная сборка доступна на сервере.

Используем опцию -b (--prebuilt-only) для установки:

$ nix-env -ib gnome-terminal

Иногда возникает необходимость установить пакет, который не представлен в канале, на который вы подписаны, или вообще ни в одном из каналов, например, более раннюю версию. Тогда переходим на страницу со списком пакетов, например http://nixos.org/releases/nixpkgs/nixpkgs-unstable либо ранних релизов коллекции пакетов. Находим нужную программу и нажимаем ссылку, соответствующую вашей платформе, при этом браузер спросит, что делать с типом файла application/nix-package. Необходимо выбрать запуск через программу nix-install-package. Появится окно консоли, в котором нужно будет ответить Y.

Программа (nix-pull) импортирует в локальную базу список прекомпилированных сборок коллекции пакетов, в которой находится выбранная программа. После этого производит загрузку и установку прекомпилированной сборки пакета, при необходимости загружая зависимости.

Скачав локально файл по ссылке и передав путь к нему утилите nix-install-package, вы получите тот же эффект:

$ nix-install-package zile-2.3.7-x86_64-linux.nixpkg

Возможность установки пакета по указанию файла с описанием пакета на специализированном языке Nix будет рассмотрена в следующих статьях серии.

Дополнительная опция --dry-run позволяет посмотреть, какие сборки будут произведены и какие компоненты загружены при установке, но сама установка производиться не будет:

$ nix-env -i gnome-panel --dry-run

4.3. Обновление

Для обновления пакета используется операция -u (--upgrade):

$ nix-env -u zile

При установке (ключ -i ), в отличие от обновления, инсталлируется доступный пакет, без проверки версии.

Просмотреть список имеющихся новых версий пакетов можно таким образом:

$ nix-env -u '*' --dry-run

Чтобы произвести все эти обновления:

$ nix-env -u '*'

4.4. Удаление

Удаление пакета из пользовательского окружения производится операцией -e (--uninstall):

$ nix-env -e zile

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

5. Пользовательское окружение

На рисунке показано, как реализовано пользовательское окружение Nix.

Пользовательское окружение
Пользовательское окружение
Пользовательское окружение

Пользовательское окружение Nix есть набор символических ссылок на программы из хранилища Nix. Каталог самого пользовательского окружения также расположен в хранилище, а ссылка на него помещается в каталог профилей /nix/var/nix/profiles. При установке/удалении/обновлении пакета пользовательское окружение пересобирается заново с новым набором ссылок и также помещается в хранилище, только с другим идентификатором. При этом не удаляются ни предыдущее окружение из хранилища, ни ссылка на него из каталога профилей, лишь создается новая ссылка на новое окружение в каталоге профилей (/nix/var/nix/profiles). Дополнительная символическая ссылка default указывает на активное пользовательское окружение. В домашнем каталоге пользователя создается ссылка ~/.nix-profile, указывающая на соответствующий ему профиль, а путь к ней добавляется в переменную окружения PATH. Таким образом, пользователю становятся доступны программы, установленные через Nix.

5.1. Цепочка состояний

При работе с пакетами предыдущие сборки пользовательского окружения остаются, поэтому легко вернуть предыдущее состояние окружения, лишь заменив ссылку default:

$ nix-env --rollback

либо вернуть более раннее состояние:

$ nix-env --switch-generation 27

Просмотреть список состояний для текущего профиля можно, выполнив команду:

$ nix-env --list-generations

5.2. Профили

Профиль представляет собой цепочку состояний пользовательского окружения, каждое из которых отражает набор доступных программ. Одно из состояний может быть активно в конкретный момент. Профилей может быть несколько, создаются они операцией --switch-profile:

$ nix-env --switch-profile /nix/var/nix/profiles/test

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

Переключение между существующими профилями выполняется той же операцией --switch-profile, при этом команда лишь меняет ссылку ~/.nix-profile. Выполнить операцию над другим профилем, не переключаясь на него, можно, указав опцию -p (--profile):

$ nix-env -p /nix/var/nix/profiles/other-profile -i aterm

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

5.3. Сборщик мусора

Операции удаления (-e) и обновления (-u) пакетов не удаляют их из хранилища, они лишь создают новое окружение, которое не содержит ссылок на эти пакеты. Чтобы удалить ненужные более пакеты для освобождения места на диске, используется сборщик мусора. Он удаляет из хранилища те пакеты, ссылок на которые не содержит ни одно из состояний окружения какого-либо профиля. Прошлые состояния сохраняются для возможности отката, пока непосредственно не указать удаление тех состояний, которые уже наверняка не понадобятся:

$ nix-env --delete-generations 10 11 14

Команда удаляет указанные состояния текущего профиля.

Удаление всех предыдущих состояний:

$ nix-env --delete-generations old

После этого запускается сборщик мусора:

$ nix-store --gc

Предварительно можно просмотреть список объектов хранилища, которые будут удалены:

$ nix-store --gc --print-dead

Наоборот, опция --print-live выведет список объектов, которые не подлежат удалению.

Быстрая очистка системы:

$ nix-collect-garbage -d

Команда удалит все прошлые состояния всех профилей из /nix/var/nix/profiles и запустит сборщик мусора.

6. Заключение

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

Набор пакетов, доступных через Nix, включает средства для разработки (GCC, Haskell, Perl, Python, Ruby, Subversion, Git, Darcs, Bazaar, Mercurial,...), сетевые утилиты, средства работы с текстом (Vim, Emacs, Eclipse,...), средства виртуализации (VirtualBox, Qemu,...), офисные пакеты (Abiword, OpenOffice,...), мультимедиа приложения (Audacious, Audacity, MPlayer, Xine, Vlc,...), интернет-приложения (Firefox, Opera, BitTorrent, Skype, Pidgin,...) и др.

В следующей статье будет дано описание специализированного языка – связующей силы Nix.


Ресурсы для скачивания


Похожие темы


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=479620
ArticleTitle=Функциональный менеджер пакетов Nix: Часть 1.Базовое использование
publish-date=04012010