Назад | Перейти на главную страницу

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

Я пытаюсь использовать FreeBSD pkg_add команда для установки и обновления двоичных пакетов в сценарии типа "сборка один раз установка на нескольких машинах". Он хорошо работает при установке нового пакета, но обновления сбивают меня с толку. Например, если я хочу обновить пакет, зависел от другим пакетом не могу просто установить:

# 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

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

Спасибо!

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

После установки порта вы можете просто запустить 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) и смонтируйте его на всех остальных серверах.

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

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

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

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

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