Next: Тулчейн GCC, Previous: Запуск guix environment, Up: Разработка [Contents][Index]
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 eachdpkg
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; при передаче дважды16, 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. Обратите внимание,
что вы можете указать либо файл манифеста либо список пакетов,
но не то и другое вместе.
--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 Параметры преобразования пакета).
Вот трюк, чтобы запомнить его: -RR
, который
добавляет поддержку PRoot, можно рассматривать как сокращение от “Really
Relocatable”. Удобно, не правда ли?
Next: Тулчейн GCC, Previous: Запуск guix environment, Up: Разработка [Contents][Index]