Обработка обновлений пакетов FreeBSD с помощью pkg_add

Обработка обновлений пакетов FreeBSD с помощью pkg_add

Я пытаюсь использовать pkg_addкоманду FreeBSD для установки и обновления бинарных пакетов в сценарии build-once-install-on-multiple-machines. Это работает хорошо при установке нового пакета, но обновления сбивают меня с толку. Например, если я хочу обновить пакет, которыйзависел отдругим пакетом, я не могу просто установить его:

# pkg_add /path/to/somepackage-2.0.tbz
pkg_add: package 'somepackage' or its older version already installed

На этом этапе я могу удалить старую версию пакета, если передам -fкоманду pkg_delete:

# pkg_delete -f somepackage-1.0
pkg_delete: package 'somepackage-1.0' is required by these other packages
and may not be deinstalled (but I'll delete it anyway):
anotherpackage-1.0

Но... и это убийственно... теперь информация о зависимостях исчезла! Я могу установить обновление:

# pkg_add /path/to/somepackage-2.0.tbz

И теперь попытки удалить его будут проходить без ошибок:

# pkg_delete somepackage-2.0

Как мне решить эту проблему изящно (где «изящно» означает «таким образом, чтобы сохранить информацию о зависимостях, не требуя от меня пересборки/переустановки и всей цепочки зависимостей»).

Спасибо!

решение1

Как вы обнаружили, pkg_addне удается обновить порты изящно. portupgradeОднако пакет делает это довольно хорошо, и это метод, который я использую и рекомендую (есть и другие, если вам не нравится этот метод).

После установки порта вы можете просто запустить его portupgrade -aPP, и он обновит все порты, установленные в системе, используя пакеты. Если вы не хотите обновлять ни один порт, вы можете запустить его portupgrade -RPP [category/port]для обновления определенного порта и портов, от которых он зависит. Запуск программы без аргументов обновит порт, принадлежащий текущему каталогу (т. е. cd /usr/ports/security/openssl ; portupgradeобновит openssl, без -PPпараметра он построит порт из исходного кода); и если вы не находитесь в каталоге портов, он отобразит справку (такую ​​же, как и параметр -h).

Редактировать:
По умолчанию portupgrade установит пакеты, если они существуют в каталоге, определенном PKG_PATHпеременной среды (по умолчанию $PACKAGES/All, $PACKAGESпо умолчанию $PORTSDIR/packages; поэтому путь по умолчанию — /usr/ports/packages/All).

Если их там нет, он загрузит пакеты (по выбору) из$PKG_SITES (принимает URI с подпапками Latestи All; значение по умолчанию отсутствует) или $PACKAGEROOT(принимает URI с обычным путем к зеркалу под ним; по умолчанию "ftp://ftp.freebsd.org").

Один из простых способов сделать это — использовать одну машину для сборки/кэширования пакетов, которые будут установлены на другой машине.

  • Вы можете собирать пакеты из дерева портов make packageв каталоге порта (что также установит порт).
  • Вы можете использовать его portupgradeдля обновления одной машины и кэширования файлов пакета для использования на других машинах; вышеупомянутые команды кэшируют файлы пакета в каталоге по умолчанию (см. выше).
  • Вы можете использовать portupgrade только для загрузки пакетов, но не для их установки, с помощью portupgrade -aPPFилиportupgrade -RPPF [category/port] .

После того, как у вас есть кэшированные файлы пакетов, вы можете предоставить общий доступ к каталогу через NFS, FTP, HTTP и т. д.; при условии, что файлы доступны с других машин. Установите PACKAGESилиPKG_SITE с соответствующими значениями, чтобы указать на сервер кэширования. Выполните типичную portupgradeкоманду, она должна извлечь пакеты с сервера кэширования и установить их.

Примечание: Дерево портов должно быть обновлено на всех серверах для portupgradeкорректной работы (оно попытается обновиться до любой версии в локальном дереве портов). Если вы собираетесь установить одни и те же порты/пакеты на всех компьютерах, может быть проще всего сделать общим один /usr/portsкаталог сервера (например, через NFS) и смонтировать его на всех других серверах.

решение2

Может бытьpkg_replace это то, что вы ищете.

Я использую его уже некоторое время. Одна из моих машин FreeBSD работает как сервер сборки и собирает (используя portmaster) все пакеты для других машин. Я использую его pkg_replaceдля установки этих пакетов предварительной сборки на все другие машины.

http://www.FreeBSD.org/cgi/url.cgi?ports/ports-mgmt/pkg_replace/pkg-descr

решение3

Или вы можете положиться на Portsnap или CVSup, описанные здесь:

http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html

Связанный контент