Хулио Мерино. Поддержание свежести NetBSD при помощи pkg_comp 2.0, 2017

Это руководство по использованию pkg_comp 2.0 в NetBSD.

Цели: использовать pkg_comp 2.0 для сборки двоичного репозитория всех нужных пакетов; ежедневно обновлять этот репозиторий; и использовать этот репозиторий вместе с pkgin для поддержания свежести и безопасности системы NetBSD.

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

Приступим

Сначала установим пакет sysutils/sysbuild-user и запустим полную компиляцию NetBSD, чтобы у pkg_comp были архивы для установки системы. Обратитесь к sysbuild(1) и pkg_info sysbuild-user за подробностями о том, как это сделать. Или можно скачать установочные архивы с сервера FTP и затем указать их расположение pkg_comp.

Теперь установим пакет pkgtools/pkg_comp-cron. Ниже в руководстве предполагается, что всё это было проделано.

Настройка конфигурации

Для периодической сборки с помощью pkg_comp нужно сделать несколько небольших правок в файлах конфигурации по умолчанию. Эти файлы находятся в каталоге /var/pkg_comp/, который является домашним каталогом для pkg_comp-cron:

И наконец, проверьте crontab пользователя root, чтобы убедиться в разумности настроек задачи, запускающей pkg_comp. Если компьютер медленный или если нужно собирать много пакетов, то возможно стоит понизить частоту сборки с ежедневной до еженедельной.

Простая конфигурация

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

# pkg_comp -c /var/pkg_comp/pkg_comp.conf config
AUTO_PACKAGES = autoconf automake bash colordiff dash emacs-nox11 git-base git-docs gmake gnuls lua52 mozilla-rootcerts pdksh pkg_comp-cron pkg_developer pkgin sqlite3 sudo sysbuild sysbuild-user sysupgrade tmux vim zsh
CVS_ROOT = :ext:anoncvs@anoncvs.NetBSD.org:/cvsroot
CVS_TAG is undefined
DISTDIR = /var/pkg_comp/distfiles
EXTRA_MKCONF = /var/pkg_comp/extra.mk.conf
FETCH_VCS = cvs
GIT_BRANCH = trunk
GIT_URL = https://github.com/jsonn/pkgsrc.git
LOCALBASE = /usr/pkg
NJOBS = 2
PACKAGES = /var/pkg_comp/packages
PBULK_PACKAGES = /var/pkg_comp/pbulk-packages
PKG_DBDIR = /usr/pkg/libdata/pkgdb
PKGSRCDIR = /var/pkg_comp/pkgsrc
SANDBOX_CONFFILE = /var/pkg_comp/sandbox.conf
SYSCONFDIR = /etc
UPDATE_SOURCES = true
VARBASE = /var

NETBSD_NATIVE_RELEASEDIR = /home/sysbuild/release/amd64
NETBSD_RELEASE_RELEASEDIR = /home/sysbuild/release/amd64
NETBSD_RELEASE_SETS is undefined
SANDBOX_ROOT = /var/pkg_comp/sandbox
SANDBOX_TYPE = netbsd-release

Ручная сборка пакетов

Теперь, когда всё полностью установлено и настроено, можно попробовать собрать что-нибудь вручную, чтобы убедиться, что всё работает, прежде чем запустится задача из cron.

Простейший способ с использованием полной автоматизации выглядит следующим образом:

# pkg_comp -c /var/pkg_comp/pkg_comp.conf auto

Эта простейшая с виду команда сделает следующее:

  1. проверит и обновит вашу копию pkgsrc;
  2. создаст песочницу;
  3. развернёт в ней pkgsrc и pbulk;
  4. воспользуется pbulk для сборки указанных пакетов; и
  5. уничтожит песочницу.

После успешного вызова в каталоге, который вы настроили в PACKAGES и которым при установке pkg_comp-cron по умолчанию является /var/pkg_comp/packages/, останется коллекция пакетов.

Если нужно ограничить набор пакетов при ручной сборке, укажите нужные пакеты после аргумента auto. Они заменят содержимое AUTO_PACKAGES, взятое из файла list.txt.

А как вместо auto запускать этапы раздельно? Указанная выше команда будет равнозначной следующим:

# pkg_comp -c /var/pkg_comp/pkg_comp.conf fetch
# pkg_comp -c /var/pkg_comp/pkg_comp.conf sandbox-create
# pkg_comp -c /var/pkg_comp/pkg_comp.conf bootstrap
# pkg_comp -c /var/pkg_comp/pkg_comp.conf build <имена пакетов>
# pkg_comp -c /var/pkg_comp/pkg_comp.conf sandbox-destroy

Попробуйте. Чтобы попасть в песочницу в диалоговом режиме, можно воспользоваться командой sandbox-shell. За подробностями обратитесь к pkg_comp(8).

Напоследок замечу, что пользователь root будет получать письма при ошибках выполнения периодической задачи pkg_comp из cron, но только при ошибках. Полные журналы всех сборок, успешных или неудачных, можно найти в каталоге /var/pkg_comp/log/.

Установка полученных пакетов

Теперь, когда собран первый набор пакетов, можно попробовать установить их. В NetBSD, в конфигурации pkg_comp-cron по умолчанию, собранные пакеты предназначены для установки в каталог /usr/pkg, поэтому придётся сначала удалить уже установленные пакеты, чтобы избежать несоответствий в настройках с собранными пакетами.

ПРЕДУПРЕЖДЕНИЕ: Да, вам действительно придётся удалить ваши пакеты. В настоящее время pkg_comp не распознаёт утилиты управления пакетами из базовой системы NetBSD (то есть развёртывание pkgsrc происходит безусловно, включая bmake). Это означает, что вновь собранные пакеты не будут совместимыми с уже имеющимися. Во избежание каких-либо проблем нужно начинать с нуля.

Очистить систему можно следующим образом:

# ... убедитесь, что ваша входная оболочка находится в /bin! ...
# pkg_delete -r -R "*"
# mv /usr/pkg/etc /root/etc.old # Резервное копирование изменённых файлов.
# rm -rf /usr/pkg /var/db/pkg*

Теперь повторно развенём pkgsrc и переустановим удалённые пакеты:

# cd /
# tar xzvpf /var/pkg_comp/packages/bootstrap.tgz
# echo "pkg_admin=/usr/pkg/sbin/pkg_admin" >>/etc/pkgpath.conf
# echo "pkg_info=/usr/pkg/sbin/pkg_info" >>/etc/pkgpath.conf
# export PATH=/usr/pkg/bin:/usr/pkg/sbin:${PATH}
# export PKG_PATH=file:///var/pkg_comp/packages/All
# pkg_add pkgin pkg_comp-cron <другие пакеты>

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

ВАЖНО: Обратите внимание, что в последней команде из примера указаны pkgin и pkg_comp-cron. Нужно установить их первыми, чтобы можно было выполнить следующие шаги этого руководства.

Поддержание свежести системы

Как уже было сказано, при установке пакета pkg_comp-cron в cron помещается задача для ежедневного запуска pkg_comp. Это означает, что репозиторий пакетов в /var/pkg_comp/packages/ будет постоянно обновляться и можно использовать его для быстрого обновления системы с минимальным перерывом в работе.

Предполагаю, что вы воспользуетесь pkgtools/pkgin (а почему нет?) и настроите локальный репозиторий:

# echo 'file:///var/pkg_comp/packages/All' >>/etc/pkgin/repositories.conf

Теперь для обновления системы нужно выполнить всего лишь две команды:

# pkgin update
# pkgin upgrade

Приятного пользования!

Автор перевода на русский язык: Владимир Ступин