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
where file is the image returned by guix pack
, and
guile-guile-readline
is its “image tag”. See the
Docker
documentation for more information.
Ещё одна опция производит образ 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. You can nonetheless pack as many Guix packages as you want in one such archive.
Внимание:
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.
rpm
¶This produces an RPM archive (a package with the ‘.rpm’ file extension)
containing all the specified binaries and symbolic links, that can be
installed on top of any RPM-based GNU/Linux distribution. The RPM format
embeds checksums for every file it contains, which the rpm
command
uses to validate the integrity of the archive.
Advanced RPM-related options are revealed via the --help-rpm-format option. These options allow embedding maintainer scripts that can run before or after the installation of the RPM archive, for example.
The RPM format supports relocatable packages via the --prefix
option of the rpm
command, which can be handy to install an RPM
package to a specific prefix.
guix pack -f rpm -R -C xz -S /usr/bin/hello=bin/hello hello
sudo rpm --install --prefix=/opt /gnu/store/...-hello.rpm
Примечание: Contrary to Debian packages, conflicting but identical files in RPM packages can be installed simultaneously, which means multiple
guix pack
-produced RPM packages can usually be installed side by side without any problem.
Внимание:
rpm
assumes ownership of any files contained in the pack, which means it will remove /gnu/store upon uninstalling a Guix-generated RPM package, unless the RPM package was installed with the --prefix option of therpm
command. It is unwise to install Guix-produced ‘.rpm’ packages on a system where /gnu/store is shared by other software, such as a Guix installation or other, non-rpm 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 Параметры преобразования пакета).
Вот трюк, чтобы запомнить его: -RR
, который
добавляет поддержку PRoot, можно рассматривать как сокращение от “Really
Relocatable”. Удобно, не правда ли?
Next: Тулчейн GCC, Previous: Вызов guix environment
, Up: Разработка [Contents][Index]