Next: , Previous: , Up: Разработка   [Contents][Index]


8.3 Вызов guix pack

Иногда бывает необходимо передать программу людям, которые (ещё!) не являются счастливыми обладателями Guix. Вы могли бы им рекомендовать заустить guix package -i something, но в данном случае это не подхлдит. Тогда guix pack решает вопрос.

Примечание: Если вы ищете способ обмена бинарниками между машинами, работающими с Guix, see Запуск guix copy, Запуск guix publish и Вызов guix archive.

Команда guix pack создаёт обёрнутый набор или программный набор: она создаёт архив tarball или другой архив, содержащий исполняемые файлы программного обеспечения, которое вас интересует, а также все его зависимости. Результирующий архив может использоваться на любой машине, которая не имеет Guix, а люди могут запустить совершенно такие же бинарники, как у вас в Guix. Набор создаётся со свойством воспроизводимости до бита, так что любой может проверить, что он действительно содержит результаты сборок, которые вы поставляете.

Например, чтобы создать набор, содержащий Guile, Emacs, Geiser и все их зависимости, можно запустить:

$ guix pack guile emacs geiser
…
/gnu/store/…-pack.tar.gz

Результатом будет архив tarball, содержащий директорию /gnu/store со всеми соответствующими пакетами. Результирующий архив содержат профиль с тремя запрошенными пакетами; профиль представляет то же самое, что можно создать командой guix package -i. Это механизм, который используется, собственно, для создания автономного (standalone) бинарного архива Guix (see Бинарная установка).

Пользователи этого пакета должны запускать /gnu/store/…-profile/bin/guile для запуска Guile, что может быть не удобно. Чтобы исправить это, можно создать, например, символическую ссылку /opt/gnu/bin на профиль:

guix pack -S /opt/gnu/bin=bin guile emacs geiser

Так пользователи смогут благополучно напечатать /opt/gnu/bin/guile, и всё хорошо.

Что если получатель вашего пакета не имеет привилегий root на своей машине, и поэтому не может распаковать его в корне файловой системы? В таком случае вам стоит использовать опцию --relocatable (смотрите ниже). Эта опция производит перемещаемые бинарники, в том плане, что они могут размещаться где угодно в иерархии файловой системы: в примере выше пользователи могут распаковать ваш архив в свои домашние директории и напрямую запустить ./opt/gnu/bin/guile.

В качестве альтернативы можно производить пакет в формате образа Docker, используя следующую команду:

guix pack -f docker guile emacs geiser

Результатом будет архив, который можно передать команде docker load, followed by docker run:

docker load < file
docker run -ti guile-guile-readline /bin/guile

Результатом будет архив, который можно передать команде docker load. Смотрите документацию Docker для подробной информации.

Ещё одна опция производит образ SquashFS следующей командой:

guix pack -f squashfs guile emacs geiser

Результатом будет образ файловой системы SquashFS, который может непосредственно монтироваться как образ, содержащий контейнер файловой системы, с помощью контейнерного окружения Singularity, используя команды типа singularity shell или singularity exec.

Несколько опций командной строки позволяют вам переделывать ваш пакет:

--format=format
-f format

Произвести пакет в указанном формате format.

Возможные форматы:

tarball

Это формат по умолчанию. Он производит архив tarball, содержащий все заданные бинарники и символические ссылки.

docker

Это производит архив, соответствующий спецификации образа Docker.

squashfs

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

Примечание: Singularity требует, чтобы вы указали /bin /sh в образе. По этой причине guix pack -f squashfs всегда подразумевает -S /bin=bin. Таким образом, вызов guix pack всегда должен начинаться с чего-то вроде:

guix pack -f squashfs guile emacs geiser

Если вы забудете пакет bash (или аналогичный), singularity run и singularity exec выдаст бесполезное сообщение “нет такого файла или каталога”.

deb

This produces a Debian archive (a package with the ‘.deb’ file extension) containing all the specified binaries and symbolic links, that can be installed on top of any dpkg-based GNU(/Linux) distribution. Advanced options can be revealed via the --help-deb-format option. They allow embedding control files for more fine-grained control, such as activating specific triggers or providing a maintainer configure script to run arbitrary setup code upon installation.

guix pack -f deb -C xz -S /usr/bin/hello=bin/hello hello

Примечание: Because archives produced with guix pack contain a collection of store items and because each dpkg package must not have conflicting files, in practice that means you likely won’t be able to install more than one such archive on a given system.

Внимание: dpkg will assume ownership of any files contained in the pack that it does not know about. It is unwise to install Guix-produced ‘.deb’ files on a system where /gnu/store is shared by other software, such as a Guix installation or other, non-deb packs.

--relocatable
-R

Создавать relocatable binaries — то есть двоичные файлы, которые можно разместить в любом месте иерархии файловой системы и запускать оттуда.

Когда эта опция передается один раз, конечные двоичные файлы требуют поддержки user namespaces в ядре Linux; при передаче дважды18, Relocatable двоичные файлы возвращаются к другим методам, если пользовательские пространства имен недоступны, и по существу работают где угодно - см. ниже что под этим подразумевается.

Например, если вы создаете пакет, содержащий Bash, с помощью:

guix pack -RR -S /mybin=bin bash

... вы можете скопировать этот пакет на машину, на которой отсутствует Guix, и из своего домашнего каталога как обычный пользователь запустите:

tar xf pack.tar.gz
./mybin/sh

В этой оболочке, если вы наберете ls /gnu/store, вы заметите, что отобразятся /gnu/store и содержатся все зависимости bash, даже если на машине нет /gnu/store! Это, вероятно, самый простой способ установить программное обеспечение, созданное с помощью Guix, на машине, отличной от Guix.

Примечание: По умолчанию relocatable двоичные файлы полагаются на функцию user namespace ядра Linux, которая позволяет непривилегированным пользователям монтировать или изменять root. Старые версии Linux не поддерживали его, а некоторые дистрибутивы GNU/Linux его отключили.

Чтобы создать relocatable двоичные файлы, которые работают даже при отсутствии пользовательских пространств имен, передайте --relocatable или -R дважды. В этом случае двоичные файлы будут пытаться использовать пространство имен пользователей и возвращаться к другому механизму выполнения, если пространства имен пользователей не поддерживаются. Поддерживаются следующие механизмы выполнения:

по умолчанию

Попробовать использовать пространства имен пользователей и вернуться к PRoot, если пространства имен пользователей не поддерживаются (см. ниже).

форматирование кода

Попробовать использовать пространства имен пользователей и вернуться к Fakechroot, если пространства имен пользователей не поддерживаются (см. ниже).

user

Запустить программу через пользовательские пространства имен и прервать, если они не поддерживаются.

chroot

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

chroot

Запустить Fakechroot. Fakechroot виртуализирует доступ к файловой системе путем перехвата вызовов функций библиотеки C, таких как open, stat, exec и т.п. В отличие от PRoot, накладных расходов очень мало. Однако это не всегда работает: например, некоторые обращения к файловой системе, сделанные из библиотеки C, не перехватываются, а обращения к файловой системе, сделанные через прямые системные вызовы, также не перехватываются, что приводит к нестабильному поведению.

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

--commit=commit

Используйте command в качестве точки входа конечного пакета, если формат пакета поддерживает это — в настоящее время docker и squashfs (Singularity) поддерживают это. command должна относиться к профилю, содержащемуся в пакете.

Точка входа указывает команду, которую по умолчанию автоматически запускают такие инструменты, как docker run или singularity run. Например, вы можете сделать:

guix pack -f docker guile emacs geiser

Полученный пакет может быть легко импортирован, и запущен через docker run без дополнительных аргументов, пораждая bin/guile:

docker load -i pack.tar.gz
docker run image-id
--expression=expr
-e expr

Процедура, при выполнении которой возвращается пакет.

Это то же, что опция с таким же именем в guix package (see --manifest) и использует такие же файлы манифестов.

--manifest=file
-m file

Использовать пакеты, содержащиеся в объекте манифеста, возвращенном кодом Scheme в file. Эта опция может быть указана несколько раз, и в этом случае манифесты объединяются.

Она служит для того же, что и одноименная опция в guix package (see --manifest) и использует те же файлы манифеста. Она позволяет вам один раз определить набор пакетов и использовать его как для создания профилей, так и для создания архивов для использования на машинах, на которых не установлен Guix. Обратите внимание, что вы можете указать либо файл манифеста либо список пакетов, но не то и другое вместе.

See Writing Manifests, for information on how to write a manifest. See guix shell --export-manifest, for information on how to “convert” command-line options into a manifest.

--system=system
-s system

Предпринять попытку собрать систему system, т.е. i686-linux, вместо типа системы хоста сборки.

--target=triplet

Cross-сборка для triplet, который должен быть допустимым GNU triplet, например \ "aarch64-linux-gnu\" (see GNU configuration triplets in Autoconf).

--compression=tool
-C tool

Архивировать логи сборки методом type. Это один из: gzip, bzip2 или none.

--symlink=spec
-S spec

Добавить в пакет символические ссылки, указанные в spec. Эта опция может быть указана несколько раз.

spec имеет вид source=target, где source - это символическая ссылка, которая будет создана, а target - это цель символьной ссылки.

Например, -S /opt/gnu/bin=bin создает символическую ссылку /opt/gnu/bin, указывающую на подкаталог bin профиля.

--save-provenance

Сохранить информацию о происхождении пакетов, переданных в командной строке. Информация о происхождении включает в себя URL и фиксацию используемых каналов (see Каналы).

Информация о происхождении сохраняется в файле /gnu/store/…-profile/manifest в пакете вместе с обычными метаданными пакета - названием и версией каждого пакета, их propagated inputs и т.п. Это полезная информация для получателя pack, который исходя из нее знает, как (предположительно) был собран pack.

Этот параметр не включен по умолчанию, поскольку, как и временные метки, информация о происхождении не влияет на процесс сборки. Другими словами, существует бесконечное количество URL-адресов каналов и ID коммитов, которые могут привести к одному и тому же pack. Таким образом, запись таких “тихих” метаданных в output потенциально нарушает свойство побитовой воспроизводимости.

--root=file
-r file

Создать символическую ссылку file на профиль этого окружения и зарегистрировать её как корень сборщика мусора.

--localstatedir
--profile-name=name

Включите в конечный пакет “локальный каталог состояния”, /var/guix и, в частности, профиль /var/guix/profiles/per-user/root/name — по умолчанию name - это guix-profile, что соответствует ~root/.guix-profile.

/var/guix содержит базу данных store (see Хранилище), а также корни сборщика мусора (see Вызов guix gc). Предоставление ее в pack означает, что store является “полным” и управляемым Guix; отсутствие в pack означает, что store “мертв”: пакеты нельзя добавить в него или удалить из него после извлечения pack.

Одним из вариантов использования является включающий себя двоичный архив Guix (see Бинарная установка).

--derivation
-d

Выведите имя derivation, которая создает pack.

--bootstrap

Использовать bootstrap бинарники для сборки пакета. Эта опция полезна только разработчикам Guix.

Кроме того, guix pack поддерживает все стандартные параметры сборки (see Стандартные параметры сборки) и все параметры преобразования пакетов (see Параметры преобразования пакета).


Footnotes

(18)

Вот трюк, чтобы запомнить его: -RR, который добавляет поддержку PRoot, можно рассматривать как сокращение от “Really Relocatable”. Удобно, не правда ли?


Next: , Previous: , Up: Разработка   [Contents][Index]