Об обновлении портов во FreeBSD


Вопрос возник от народа - как обновляться. Странный вопрос - то, что касается портов, неплохо рассмотрено в хандбуке. Порыскав по сайту понял, тема пока не окучена, просто забыл, хотя сам давно и активно пользуюсь. Для обновления установленных портов есть утилита - portupgrade.
/usr/home/lissyara/>cd /usr/ports/
/usr/ports/>make search name='portupgrade'
Port: portupgrade-2.0.1_1,1
Path: /usr/ports/sysutils/portupgrade
Info: FreeBSD ports/packages administration and management tool suite
Maint: koma2@lovepeers.org
B-deps: ruby-1.8.4_4,1
R-deps: perl-5.8.8 ruby-1.8.4_4,1 ruby18-bdb1-0.2.2
WWW:
/usr/ports/>
/usr/ports/>cd /usr/ports/sysutils/portupgrade
/usr/ports/sysutils/portupgrade/>make && make install && make clean
Тутже вылезет синенькое окошко с выбором - какую БД использовать. Я выбрал BDB4 - с первой были проблемы на 4.11. (правда всё это делается под шохой, но тем не менее.)
[X] BDB4 Use Berkeley DB >=2 as backend. (Use BDB 1.85 if off)
После установки (кстати, тянет он за собой немало - мегов на 10 выльется.) смотрим, что нам надо обновить:
/usr/ports/sysutils/portupgrade/>pkg_version -v | grep "need"
fontconfig-2.3.2,1 < needs updating (port has 2.3.2_3,1)
freetype2-2.1.10_2 < needs updating (port has 2.1.10_3)
gettext-0.14.5 < needs updating (port has 0.14.5_2)
glib-2.8.6 < needs updating (port has 2.8.6_1)
john-1.6.40 < needs updating (port has 1.7_1)
jpeg-6b_3 < needs updating (port has 6b_4)
libdrm-2.0 < needs updating (port has 2.0_1)
libiconv-1.9.2_1 < needs updating (port has 1.9.2_2)
libmcrypt-2.5.7_1 < needs updating (port has 2.5.7_2)
libtool-1.5.18 < needs updating (port has 1.5.22_2)
mysql-server-5.0.18 < needs updating (port has 5.0.18_2)
perl-5.8.7_2 < needs updating (port has 5.8.8)
phpMyAdmin-2.7.0.2 < needs updating (port has 2.8.0.1)
png-1.2.8_2 < needs updating (port has 1.2.8_3)
popt-1.7 < needs updating (port has 1.7_1)
samba-3.0.21a,1 < needs updating (port has 3.0.21b,1)
t1lib-5.1.0,1 < needs updating (port has 5.1.0_1,1)
/usr/ports/sysutils/portupgrade/>
Немало. Руками вводить столько команд:portupgrade имя_порта ломало. Решил написать скриптик такого вида:
#!/bin/sh
# Скриптик для обнввления всех портов,
# что нуждаются в обновлении
portupgrade="/usr/local/sbin/portupgrade"
pkg_ver="/usr/sbin/pkg_version"
# Получаем список портов, нуждающихся в обновлении
# и в цикле обновляем их
${pkg_ver} -v | grep "need" | awk '{print $1}' |
{
while read pkg_name
do
# обновляем порт, имя которого в переменной pkg_name
${portupgrade} ${pkg_name}
done
}
# примечание: при сборке и обновлении портов выводимтся намного
# технической инфы, куда меньше чем при запуске той же команды
# руками. Это к тому, чтоб не подумали, что "зависло" :)
Советую не увлекаться подобными скриптами, а думать прежде чем обновлять - т.к. при обновлении приложение, обычно останавливается, то подумайте, чем грозит остановка, например, MySQL? Или samba, если эта машина файл-сервер конторы? В данном случае это был сервер для архивации, и днём он не использовался - значит можно творить что душе угодно. Потому запускаем и ждём - времени уйдёт прилично, т.к. там пара тяжёлых приложений типа MySQL, perl`a и той же самбы. По окончании обновления имеем следующее:
/usr/home/lissyara/>pkg_version -v | grep "need"
libtool-1.5.18 < needs updating (port has 1.5.22_2)
/usr/home/lissyara>pkg_info | grep libtool-
libtool-1.5.18 Generic shared library support script (1.5)
libtool-1.5.22_2 Generic shared library support script
/usr/home/lissyara/>
Ага. libtool в двух экземплярах... Либо чё-то глюкануло, либо так и задумано, ввиду того что не все приложения переваривают новые версии зависмостей, а хотят чё-то старое. Попробуем пофиксить БД:
/usr/home/lissyara/>pkgdb -F
---> Checking the package registry database
Duplicated origin: devel/libtool15 - libtool-1.5.18 libtool-1.5.22_2
Unregister any of them? [no] yes
Unregister libtool-1.5.18 keeping the installed files intact? [no] yes
-> libtool-1.5.22_2 is kept.
--> Saving the libtool-1.5.18's +CONTENTS file as /var/db/pkg/libtool-1.5.22_2/
+CONTENTS.libtool-1.5.18
--> Unregistering libtool-1.5.18
--> Done.
[Updating the pkgdb <format:dbm_hash> in /var/db/pkg ... - 71 packages found
(-1 +0) (...) done]
Stale dependency: mysql-server-5.0.18_2 -> ldconfig_compat-1.0_6
(misc/ldconfig_compat):
New dependency? (? to help):
^C
Прервал - куча ошибок из-за одного отсутствующего порта. Значит пойдём правильным путём, - доставим зависисмось, которую он хочет:
/usr/home/lissyara/>cd /usr/ports/misc/ldconfig_compat
/usr/ports/misc/ldconfig_compat/>make && make install && make clean
===> Vulnerability check disabled, database not found
===> Extracting for ldconfig_compat-1.0_6
===> Patching for ldconfig_compat-1.0_6
===> Configuring for ldconfig_compat-1.0_6
===> Installing for ldconfig_compat-1.0_6
===> Generating temporary packing list
===> Checking if misc/ldconfig_compat already installed
===> Registering installation for ldconfig_compat-1.0_6
===> Cleaning for ldconfig_compat-1.0_6
/usr/ports/misc/ldconfig_compat/>pkgdb -F
---> Checking the package registry database
[Updating the pkgdb <format:dbm_hash> in /var/db/pkg ... - 72 packages
found (-0 +1) . done]
/usr/ports/misc/ldconfig_compat/>
Всё. Никакой ругани, в системе стоят последние версии портов.
P.S. Насчёт того, какие опции выбирались при установке приложения, и какие ключи make использовались - можно не беспокоится, portupgrade пересоберёт с такими же опциями и ключами. Проблемы могут возникнуть только в случае если Вы руками правили Makefile - ибо это за Вас он сделать не сможет. В таком случае - тока руками - pkg_delete и в портах make && make install && make clean :)
P.S.2 надо заметить, что с portupgrade устанавливается далеко не два приложения:
/usr/home/lissyara/>pkg_info -xL portupgrade | grep man
/usr/local/man/man1/pkg_deinstall.1.gz
/usr/local/man/man1/pkg_fetch.1.gz
/usr/local/man/man1/pkg_glob.1.gz
/usr/local/man/man1/pkg_sort.1.gz
/usr/local/man/man1/pkgdb.1.gz
/usr/local/man/man1/portcvsweb.1.gz
/usr/local/man/man1/portsclean.1.gz
/usr/local/man/man1/portsdb.1.gz
/usr/local/man/man1/portupgrade.1.gz
/usr/local/man/man1/portversion.1.gz
/usr/local/man/man5/pkgtools.conf.5.gz
/usr/local/man/man1/pkg_which.1.gz
/usr/local/man/man1/portinstall.1.gz
/usr/local/man/man1/ports_glob.1.gz
/usr/home/lissyara/>
И функциональность у проги весьма богатая.
P.S. По следам наделанного :) Совет - перед использованием portupgrade делайте пакеты, и обязательно сохраняйте конфиги! На выходных напоролся на два косяка:
1. courier-imap при обновлении затёр нахер мои конфиги. Хорошо они были почти один-в-один со статьёй на сайте.
2. MySQL у меня собрана с дефаулт чарсет и коллатион cp1251 - слетело всё - вместо русских символов везде вопросы были... Два раза пересобирал, пока вспомнил с чем у меня что было собрано. Причём и клиент тоже с нужной кодировкой пришлось пересобирать.

Обновлено: 12.03.2015