Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> главная —> Архив —> portupgrade

portupgrade - `обновлялка` установленных портов.

Автор: lissyara.


    К вопросу об обновлении портов. Вопрос возник от народа - как обновляться. Странный вопрос - то, что касается портов, неплохо рассмотрено в хандбуке. Порыскав по сайту понял, тема пока не окучена, просто забыл, хотя сам давно и активно пользуюсь. Для обновления установленных портов есть утилита - 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 - слетело всё - вместо русских символов везде вопросы были... Два раза пересобирал, пока вспомнил с чем у меня что было собрано. Причём и клиент тоже с нужной кодировкой пришлось пересобирать.



размещено: 2006-03-23,
последнее обновление: 2010-05-20,
автор: lissyara


Abigor, 2006-03-27 в 13:42:19

хорошо обновлять порты такой командой portupgrade -Rcvf name_port польностью пересобрет все зависимости, но долго =) в большей части удобно portupgrade -rcvf name_port

UFOS, 2006-08-11 в 15:38:47

Последний portupgrade чем то поменялся и теперь данный скрипт обносления выводит полную инфу обносления и обновляет только 1 порт, а не все.

Eric, 2006-09-01 в 16:45:11

Параметр -a   ставить надо

blackp, 2006-09-18 в 15:33:16

есть еще прекрасные вещи, такие как portmaster и portmanager
http://mikestammer.com/dokuwiki/doku.php?id=bsd:maintainports

Erley, 2006-09-29 в 1:14:07

Можно ещё делать
 pkg_version -L=
чтобы увидеть устаревшие порты
и
 portupgrade -kva
чтоб обновиться. В общем, думаю, можно обойтись без скриптов.

Александр, 2006-10-19 в 15:07:49

не совсем по теме, но может быть полезно
в старых портах, где нет опции make config
все ключи сборки можно записать в файл sys.mk
в дальнейшем не придется мучиться вспоминать
что с чем было собрано

guest, 2006-10-26 в 22:01:34

Вместо скриптика лучше писать так:
portupgrade -r -R -a

А еще лучше, добавлять ключик -i и глазами смотреть что можно сейчас обновить (всмысле что сервис может быть остановлен или новая версия сглючить...), а что нет)

warwar, 2007-02-09 в 12:44:14

после cvsup порт portupgrade "корова языком слизала" (удалили).
FreeBSD 6.1

lissyara, 2007-02-09 в 12:48:22

Недавно добавился новый раздел в портах:
/usr/ports/ports-mgmt
Туда собрали всё что касается портов.

warwar, 2007-02-09 в 18:53:54

cd /usr/ports
make fetchindex

cvsup...

portupgrade....

Snaut, 2007-04-10 в 20:09:48

а чем cvsup не устраивает?

staskur, 2007-04-27 в 14:02:10

courier-authlib   при обновлении пишет свои конфиги, а текущие рабочие переименовывает, добавляя .BAK

nk, 2007-07-04 в 17:42:02

courier вообще криволапый софт:)

Quake, 2007-09-13 в 11:01:13

%cd /usr/ports/sysutils/portupgrade
/usr/ports/sysutils/portupgrade: No such file or directory.

Он из портов везде пропал...

lissyara, 2007-09-13 в 11:21:45

Просто, изменилась категория.
Используйте поиск.

kmb, 2007-10-23 в 15:10:09

А скрипт проверяли? у меня есть чувство, что он не правильно работает =)

lissyara, 2007-10-23 в 15:13:58

Работает.
тока лучше юзать portupgrade -R \*

kmb, 2007-10-23 в 15:37:37

странно, у меня этот скрипт обновляет только(первый в списке) один порт...

kmb, 2007-10-23 в 18:15:00

Упс... дико извиняюсь за флуд, не внимательно прочел комменты, в частности второй :(

San, 2007-11-14 в 23:28:05

Народ, всю жизнь обновлялся portupgrade -arR, но тут в наследство достался тазик, где один порт собран как-то по хитрому, соответственно когда его обновляешь, половина фичъ в нём перестаёт работать... Так вот вопрос, как сделать (не скриптом и не руками) чтобы portupgrade не обновлял один порт? Ман курил, но что-то не воткнул... :(

lisergey, 2007-11-14 в 23:49:11

чтобы portupgrade не обновлял конкретный порт
portupgrade -x имя_порта_не_обновлять все остальное

по личным наблюдениям, портапгрейд не сразу принимал имя_порта к исключению, поэтому я тренировался "на кошках" в имени порта так
portupgrade -n -x имя_хитрого_порта -a
ключик -n говорит портапгрейду все делать как обычно, кроме реального обновления.

lisergey, 2007-11-15 в 0:02:30

а нафига такие извороты
pkg_version -v | grep "need"
??
есть стандартный ключ pkg_version -l "<"
который покажет все что надо обновлять
у меня он сразу "все в одном флаконе"
cvsup -g -L 2 /root/cvsup-ports && pkg_version -l "<"

а вот делать портапгрейд сразу всему, что покажет pkg_version, я бы не стал:
1) надо бы проверить /usr/ports/UPDATING на предмет нетривиальных путей обновления какого-либо порта.
редко, но бывают "засады", которые требуют вручную что-то сделать еще.
перед такими обновлениями рекомендуется сделаь бэкап
/var/db/pkg

2) есть порты, например postgresql, которому при увеличении версии релиза (например 8.2.5->8.3.2 ) необходимо САМОСТОЯТЕЛЬНО (ни сам постгрес, ни портапгрейд) делать полноценный бэкап и восстановление всей базы из бэкапа, так как существенно меняется "движок" и появляются принципиально новые возможности, которые требуют соотвественного отражения в формате хранилища

artem, 2008-02-27 в 12:37:00

делаю так
update.sh

#!/bin/sh
csup -g -L 2 /usr/ports/sup1 && make fetchindex
rm /usr/ports/*.bz*
echo "Ports updated" | mail -s "Ports updated" root@localhost
./portupgrade.sh


portupgrade.sh

#!/bin/sh
pkgdb -F
pkg_version -v | grep "need"
pkg_version -v | grep "need" >> portupgrade.lst
date >> portupgrade.lst
mail -s "portupgrade need" root@localhost < portupgrade.lst
portupgrade -rRai

az, 2008-08-13 в 18:08:06

зачем изобретать велосипед, очень старенькая статья
http://www.opennet.ru/base/sys/freebsd_ports_tips.txt.html

+ man portupgrade на предмет portupgrade.conf

90h, 2008-12-05 в 20:36:46

## Делаю так
#!/bin/sh

portupgrade="/usr/local/sbin/portupgrade"
pkg_ver="/usr/sbin/pkg_version"
echo Starting update.

if test -e ports.txt
then
   rm -f ports.txt
fi

/usr/local/bin/cvsup -g -L 2 /usr/local/etc/cvsup/cvs-supfile

echo Making ports.txt
${pkg_ver} -v | grep "need" | awk '{print $1}' > ports.txt
ii=`wc -l ports.txt |awk '{print $1}'`
i=`expr $ii`
j=$i
a=1
echo $i packages update needed.

while [ $a -le $i ]
do
    echo $a package now updating.
    echo $j estimated package to update.
    pkg_name=`head -n 1 ports.txt`
    echo Package $pkg_name updating!
    ${portupgrade} ${pkg_name}
    echo Package $pkg_name done!
    ( echo '1,1 d' ; echo 'wq' ) | ed - ports.txt
    a=`expr $a + 1`
    j=`expr $j - 1`
done

pkgdb -aFO

KrivoSoft, 2009-04-25 в 15:13:44

Недавно потребовалось откатить обновленную програмулину назад. Бекап перед обновлением ессно не делался.
Для обратной процедуры (т.е. donwgrade) нашлась в портах тулза portdowngrade: /usr/ports/ports-mgmt/portdowngrade .
portdowngrade используя анонимный cvs умеет откатить любой указанный порт до любой предыдущей версии.
После обновляемся "вниз" используя portupgrade -f <programka>

dl, 2009-05-03 в 14:20:23

portupgrade переехал в ports-mgmt :)

kirgudu, 2010-04-21 в 13:58:55

Кстати, не обязательно юзать
$ pkg_info | grep libtool

Можно просто
$ pkg_info -Ix libtool

:D

Alpha, 2010-07-16 в 11:24:49

РџРѕ РїРѕРІРѕРґСѓ:
"2. MySQL Сѓ меня собрана СЃ дефаулт чарсет Рё коллатион cp1251 - слетело РІСЃС‘ - вместо СЂСѓСЃСЃРєРёС… символов везде РІРѕРїСЂРѕСЃС‹ были... Р
ва раза пересобирал, пока вспомнил с чем у меня что было собрано. Причём и клиент тоже с нужной кодировкой пришлось пересобирать."

Р?спользуйте pkgtools.conf (/usr/local/etc/pkgtools.conf)
Выставляете MAKE_ARGS к примеру
'database/mysql50-server-* => 'WITH_CHARSET=utf8',
и в дальнейшем при обновлении, portupgrade будет применять описанные аргументы к данному порту...

Alpha, 2010-07-16 в 11:27:16

"2. MySQL у меня собрана с дефаулт чарсет и коллатион cp1251 - слетело всё - вместо русских символов везде вопросы были... Два раза пересобирал, пока вспомнил с чем у меня что было собрано. Причём и клиент тоже с нужной кодировкой пришлось пересобирать."



Используйте pkgtools.conf (/usr/local/etc/pkgtools.conf)

Выставляете MAKE_ARGS к примеру

'database/mysql50-server-* => 'WITH_CHARSET=utf8',

и в дальнейшем при обновлении, portupgrade будет применять описанные аргументы к данному порту...

redhat, 2010-09-07 в 15:57:14

При make выдавало эррор
Could not find /usr/ports/misc/ldconfig_compat/bsd.ldconfig.mk

Лечил комментированием
#.include «${PORTSDIR}/misc/ldconfig_compat/bsd.ldconfig.mk»

в Makefile

п.с.
Спасибо Лису - отличный ресурс.

kirgudu, 2010-09-07 в 16:05:17

@redhat нужно было сделать portsnap fetch extract и ничего не комментировать.

Dimitryus, 2011-03-15 в 2:45:02

#!/usr/local/bin/bash

# echo "Введите название для обновления : "
# read program

# Скриптик для обнввления всех портов,
# что нуждаются в обновлении

portupgrade="/usr/local/sbin/portupgrade"
pkg_ver="/usr/sbin/pkg_version"

# Получаем список портов, нуждающихся в обновлении
LIST=`${pkg_ver} -v | grep 'gstreamer' | awk '{print $1}'`

for pkg_name in ${LIST}
do
${portupgrade} ${pkg_name}
done

Klop, 2011-09-07 в 16:08:49

А зачем в цикле вызывать каждый раз portupgrade (в статье, и в каментах тоже)?
Не правильней ли будет конструкцию:


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
}


и им подобные, заменить на такую:


portupgrade="/usr/local/sbin/portupgrade"
pkg_ver="/usr/sbin/pkg_version"
xargs="/usr/bin/xargs"

# Получаем список портов, нуждающихся в обновлении
# и в цикле обновляем их
${pkg_ver} -v | grep "need" | awk '{print $1}' | $xargs $portupgrade


И не только в этом примере. Ресурсы экономить надо. =)



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0499 секунд
Из них PHP: 38%; SQL: 62%; Число SQL-запросов: 54 шт.
Исходный размер: 55514; Сжатая: 12587