Исправление ошибки в работе portupgrade
На сервере под управлением FreeBSD 8.2-RELEASE архитектуры amd64, при выполнении обновления с помощью portupgrade, на некотором этапе стала выскакивать ошибка, которая не давала обновить всю систему полностью. portupgrade – это инструмент, служащий для изменения и обновления установленных пакетов и портов. По-умолчанию в системе не установлен. Сделать это можно вручную из /usr/ports/ports-mgmt/portupgrade. С его помощью очень удобно поддерживать всю систему в актуальном состоянии. |
Обновление системы я делаю так: сперва обновляю дерево портов, затем базу известных уязвимостей, после – собственно полное обновление системы.
# portsnap fetch update # portaudit -Fda # portupgrade -v -a
Так вот, при выполнении последней команды, после обновления нескольких портов, выскочила следующая ошибка:
---> ** Upgrade tasks 3: 1 done, 0 ignored, 0 skipped and 0 failed ---> Skipping 'bsdpan-Mail-SpamAssassin-CompiledRegexps-body_0-1.0' because it is held by user (specify -f to force) ---> Session ended at: Mon, 05 Dec 2011 09:08:24 +0400 (consumed 00:01:23) /usr/local/lib/ruby/site_ruby/1.8/pkgtools.rb:934:in `initialize': ArgumentError (ArgumentError) from /usr/local/sbin/portupgrade:1004:in `new' from /usr/local/sbin/portupgrade:1004:in `do_upgrade' from /usr/local/sbin/portupgrade:814:in `main' from /usr/local/sbin/portupgrade:810:in `each' from /usr/local/sbin/portupgrade:810:in `main' from /usr/local/lib/ruby/1.8/optparse.rb:791:in `initialize' from /usr/local/sbin/portupgrade:231:in `new' from /usr/local/sbin/portupgrade:231:in `main' from /usr/local/sbin/portupgrade:2219
Дальнейшее обновление системы не происходило. Дело в том, что некоторые порты начинают ставить зависимости не из дерева портов, а из CPAN – всеобъемлющей сети архивов Perl. Такие порты имеют префикс bsdpan. Посмотреть их список вы можете командой # pkg_info | grep bsdpan
. Установленные из CPAN порты не могут автоматически обновиться через portupgrade. Чтобы исправить это недоразумение, необходимо заменить порт из CPAN на аналогичный из дерева портов. Для этого запустим команду pkgdb в интерактивном режиме (ключ -F
), которая обновляет и проверяет базу установленных портов (ключ -f
) и поможет устранить дубликаты, удалить старые порты и т.д.
В моем случае проблему вызвал bsdpan-Mail-SpamAssassin-CompiledRegexps-body_0-1.0, который необходимо заменить на p5-Mail-SpamAssassin-3.3.2_3.
# pkgdb -fF ---> Checking the package registry database Missing origin: bsdpan-Mail-SpamAssassin-CompiledRegexps-body_0-1.0 Skip this for now? [yes]no
Guessing... no idea. Not in due form <category/portname>: New origin? (? to help):mail/p5-Mail-SpamAssassin
mail/p5-Mail-SpamAssassin (p5-Mail-SpamAssassin-3.3.2_3): Change the origin to this? [yes]yes
(? bsdpan-Mail-SpamAssassin-CompiledRegexps-body_0-1.0)Fixed. (-> mail/p5-Mail-SpamAssassin) Duplicated origin: mail/p5-Mail-SpamAssassin - bsdpan-Mail-SpamAssassin-CompiledRegexps-body_0-1.0 p5-Mail-SpamAssassin-3.3.2_3 Unregister any of them? [no]yes
Unregister bsdpan-Mail-SpamAssassin-CompiledRegexps-body_0-1.0 keeping the installed files intact? [no]yes
-> p5-Mail-SpamAssassin-3.3.2_3 is kept. --> Saving the bsdpan-Mail-SpamAssassin-CompiledRegexps-body_0-1.0's +CONTENTS file as /var/db/pkg/p5-Mail-SpamAssassin-3.3.2_3/+CONTENTS.bsdpan-Mail-SpamAssassin-CompiledRegexps-body_0-1.0 --> Unregistering bsdpan-Mail-SpamAssassin-CompiledRegexps-body_0-1.0 --> Done. [Updating the pkgdb <format:bdb_btree> in /var/db/pkg ... - 240 packages found (-1 +0) (...) done]
Обратите внимание на ответы на интерактивные вопросы в процессе проверки базы портов подсвеченные желтым
.
Вот в принципе и все. После указанных действий проблем с обновлением системы через portupgrade не возникло.