Главная | Контакты | Настройки СМЕНИТЬ ПАЛИТРУ:

Главная > Программы > PortUpgrade

Portupgrade - обновление установленных портов во FreeBSD

К вопросу об обновлении портов. Вопрос возник от народа - как обновляться. Странный вопрос - то, что касается портов, неплохо рассмотрено в хандбуке.
Порыскав по сайту понял, тема пока не окучена, просто забыл, хотя сам давно и активно пользуюсь. Для обновления установленных портов есть утилита - portupgrade.

# 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:
# 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 и той же самбы. По окончании обновления имеем следующее:

# pkg_version -v | grep "need"
libtool-1.5.18                      <   needs updating (port has 1.5.22_2)
# 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

Ага. libtool в двух экземплярах... Либо чё-то глюкануло, либо так и задумано, ввиду того что не все приложения переваривают новые версии зависмостей, а хотят чё-то старое. Попробуем пофиксить БД:

# 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

Прервал - куча ошибок из-за одного отсутствующего порта. Значит пойдём правильным путём, - доставим зависисмось, которую он хочет:

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

Использован материал: http://www.lissyara.su/archive/portupgrade/

Dru Lavigne
перевод Евгения Чайкина aka StraNNick

Оригинал статьи находится по адресу:
http://www.onlamp.com/lpt/a/4111.

Unix.ginras.ru

7 июня 2005 г

Установка portupgrade

Порт portupgrade устанавливается, как и любой другой порт, путём перехода в соответствующий каталог и выполнения команды make:

# cd /usr/ports/sysutils/portupgrade
# make install clean

Установка даст нам несколько весьма полезных утилит. Используем трюк из последней статьи, и посмотрим какие man'ы установил порт:

# 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

Мы не зря потратили время, решив взглянуть на man'ы. Теперь вы имеете представление о мощи и гибкости коллекции портов, а также сможете узнать о трюках, которые вы и представить не могли. Хотя, конечно, такое количество информации вполне может привести в смятение. В последующих статьях мы рассмотрим несколько конкретных примеров, для того, чтобы вы могли эффективно использовать эти утилиты.

Для начала, взглянем на структуру портов, установленных на вашей системе, и разберёмся, как своевременно их обновлять.

Когда вы установили FreeBSD и выбрали установку коллекции портов, вы получили /usr/ports, а также его файлы и подкаталоги. Если вы сделаете ls /usr/ports, вы увидите подкаталоги, на которые логически разбита коллекция портов. Например, на каталоги mail, www, и databases. Каждая директория разбита на подкаталоги с приложениями, так www содержит mozilla и lynx. Каждый из этих подкаталогов содержит информацию, необходимую для установки данного приложения. Например:

# ls -F /usr/ports/www/mozilla
./	Makefile	distinfo	pkg-descr	pkg-message
../	README.html	files/		pkg-descr.gtk2

Таким образом, мы видим Makefile, pkg-descr, и pkg-message файлы, которые, вместе с некоторыми утилитами и ключами, мы рассмотрели в прошлой статье.

Коллекция портов постоянно обновляется. Регулярно добавляются новые порты, обычно раз в день. Если вы любопытны, и любите подробности FreshPorts, станет для вас неоценимым ресурсом.

То, что коллекция портов постоянно меняется, здорово, но это означает, что структура вашей /usr/ports может быстро устареть. Чтобы быть уверенным, что ваша коллекция портов актуальна и пригодна для построения новейших приложений, используйте cvsup.

Синхронизация вашего дерева портов

Я часто упоминаю cvsup. Если вы еще не используете cvsup, вам стоит прочесть Using CVSup (или его русский перевод - ред.), прежде чем браться за дело. Справочник является лучшим источником знаний об утилите cvsup и о том, для чего она нужна. Когда вы будете готовы:

# cd /usr/ports/net/cvsup-without-gui
# make install clean

cvsup можно использовать для поддержания в актуальном состоянии как исходных текстов операционной системы, так и коллекции портов. Если вам нужно обновлять только коллекцию портов, вам поможет такой файл:

more /root/cvs-supfile
*default host=cvsup.ca.freebsd.org
*default base=/usr/local/etc/cvsup
*default prefix=/usr
*default release=cvs delete use-rel-suffix compress
ports-all tag=.

Для использования этого файла, запустите с правами superuser'а команду:

# cvsup -g -L 2 ~/cvs-supfile

Если смысл файла или команды вам непонятен, прочитайте раздел справочника, на который я ссылалась ранее. Также заметьте, что строка =. в файле ports-all очень важна, так что дважды проверьте её наличие.

Команда cvsup загрузит последние дополнения коллекции портов и добавит их к высшему дереву. Этот тип команды подразумевает ежедневное применение, и просто просится в cron.

Процесс cvsup также обновляет /usr/ports/INDEX. Этот файл содержит список всех приложений в вашем дереве портов. Чтобы посмотреть, насколько свежие у вы порты, наберите:

# ls -l /usr/ports/INDEX
-rw-r--r--  1 root  wheel  3678738 May 17 17:04 INDEX

Установка операционной системы на этой машине была произведена 17 мая и с тех пор я не обновляла дерево портов. Сравним её с моей основной машиной, на которой я выполняю cvsup ежедневно:

# ls -l /usr/ports/INDEX
-rw-r--r--  1 root  wheel  3912366 Aug 17 08:50 INDEX

Что ж, за три месяца размер файла, а значит и количество приложений в коллекции портов, значительно увеличился.

Обновление базы данных портов

Ну что ж, теперь мы готовы к portupgrade и прочим утилитам из её набора. После каждого cvsup, запустите команду:

# portsdb -Uu

После первого запуска этой команды, будет создан файл базы данных INDEX.db в /usr/ports. Он будет обновляться каждый раз, когда вы используете команду portsdb после обновления cvsup. Если вы используете утилиту file, вы обнаружите, что не можете увидеть содержимое INDEX.db, поскольку это не текстовый ASCII файл:

# file /usr/ports/INDEX.db
/usr/ports/INDEX.db: \
Berkeley DB 1.85/1.86 (Btree, version 3, native byte-order)

Тем не менее, некоторые утилиты portupgrade используют эту базу данных. Btree - алгоритм базы данных, специально предназначенный для просмотра большого количества данных. Он идеален для коллекции портов - как мы увидим, многие утилиты portupgrade быстрее и эффективнее нативных, которые мы рассматривали в прошлой статье, и это благодаря Btree.

Когда утилита portsdb начнёт свою работу, наберитесь терпения. Когда она закончит, вы готовы к использованию portversion, чтобы взглянуть, какие порты требуют обновления. Помните эту команду?

# portversion -l "<"

Если вы получили какой-либо вывод, значит вашим следующим шагом должно стать обновление устаревших портов. Что неудивительно, мы используем portupgrade, также именуемый portinstall.

Апгрейд портов

В своей простейшей форме, portupgrade -a проапгрейдит все (-a) ваши устаревшие порты. Тем не менее, время от времени могут встречаться порты, которые отказываются обновляться. Эта кажущаяся аномалия, не недостаток portupgrade, а умолчание, связанное с проблемой зависимостей.

Порт имеет два типа зависимостей. Первый тип называется build dependency и относится к другим портам, которые должны быть собраны и установлены перед установкой порта. Второй тип зависимости связан с портами, которым для нормальной работы требуется данный порт. Как вы помните из предыдущей статьи, pkg_delete отказывается удалять приложение, если имеются другие приложения, которые зависят от него.

Если вы просто апгрейдите порты, то рано или поздно сталкиваетесь с портами, которые отказываются апгрейдиться. Для предотвращения такой ситуации, используйте portupgrade с двумя ключами, вот так:

# portupgrade -arR

Ключ -R проверит зависимости для установки, а ключ -r проверит приложения, которые зависят от порта. Это предотвратит появление в вашей системе устаревших зависимостей и несовместимости программ.

Периодически, когда вы используете portupgrade или его утилиты, вам будет выдаваться сообщение с предложением запустить pkgdb -F. Как вы можете догадаться по её названию, эта утилита обновляет базу данных пакетов. Эта база данных находится в /var/db/pkg/pkgdb.db. Кроме того, эта база данных использует Btree для оптимизации времени поиска.

Если вы просят запустить pkgdb -F, сделайте это. И ещё, если вы запустили эту команду, не прерывайте её работу, иначе вы рискуете остаться с противоречивой базой данных. Если же неприятность случилась, эта команда устранит несовместимость:

# pkgdb -fu

Эта комбинация ключей легко запоминается, оставляя возможность мыслям свободно течь через ваш мозг.

Запуск pkgdb с ключом -F интерактивно исправит вашу базу данных. Имеется в виду, что pkgdb будет останавливаться и спрашивать вас о вашем выборе, перед тем, как что-либо сделать. Michael Lucas написал статью о том, как реагировать на это. Тем не менее, если вас смущает необходимость искать правильные ответы, используйте pkgdb с ключом -fu и она молча сделает то, что считает наилучшим. Если вы настоящий параноик, используйте ключи -Fa, которые говорят pkgdb исправлять только те несоответствия, которые могут быть безопасно исправлены.

Вообще, всё не так страшно, как кажется. Вероятность того, что система попросит запустить pkgdb -F, очень мала. pkgdb обычно используется для других целей, например which, также называемый pkg_which.

Использование pkg_which

pkg_which (или pkgdb) используется для определения, какому приложению принадлежит файл. Вот простой пример, иллюстрирующий различие между встроенной командой which и pkg_which:

# which pkgdb
/usr/local/sbin/pkgdb

which используется для того, чтобы показать путь к приложению. pkg_which скажет мне, какому приложению принадлежит файл:

# pkg_which pkgdb
portupgrade-20030723

Эта команда эквивалентна предыдущей команде pkg_which:

# pkgdb pkgdb
portupgrade-20030723

Ещё пример. Скажем, каталоги из /usr/local содержат файлы, установленные приложениями. вы нашли целую кучу файлов, и хотели бы узнать, что откуда взялось. Вот и работа для pkg_which. Взгляните для примера на эту выдержку из вывода моей системы:

# ls /usr/local/bin | grep yaf
tryaffix*
yaf-cdda*
yaf-mpgplay*
yaf-splay*
yaf-tplay*
yaf-vorbis*
yaf-yuv*

Если вы похожи на меня, то эти имена файлов ничего вам не говорят. Давайте посмотрим, какому приложению они принадлежат:

# pkg_which *yaf*
ispell-3.2.06_3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
kdemultimedia-3.1.3

pkg_which содержит несколько полезных ключей. Один из них - ключ -o, или "начало". Скажем, вы не помните, откуда из дерева портов происходит kdemultimedia-3.1.3. Попробуйте это:

# pkg_which -o kdemultimedia-3.1.3
multimedia/kdemultimedia3

Вывод показывает, что каталог, из которого было построено приложение - /usr/ports/multimedia/kdemultimedia3.

Ключ -v также может оказаться полезным. Если я хочу узнать какие приложения kde у меня установлены:

# pkg_which -v kde*
kde-config: kdelibs-3.1.3
kdebugdialog: kdebase-3.1.3
kded: kdelibs-3.1.3
kdeeject: kdebase-3.1.3
kdeinit: kdelibs-3.1.3
kdeinit_shutdown: kdelibs-3.1.3
kdeinit_wrapper: kdelibs-3.1.3
kdepasswd: kdeutils-3.1.3
kdeprintfax: kdebase-3.1.3
kdesktop: kdebase-3.1.3
kdesktop_lock: kdebase-3.1.3
kdessh: kdeutils-3.1.3
kdesu: kdebase-3.1.3
kdesu_stub: kdelibs-3.1.3
kdesud: kdebase-3.1.3
kdevdlg2ui: kdevelop-2.1.5
kdevelop: kdevelop-2.1.5

Красивый, информативный вывод. Каждая строка показывает имя приложения и следующее за ней через : имя порта, который установил это приложение. Кстати, похоже на этой машине установлен KDE версии 3.1.3.

Прежде чем двигаться дальше, подведём итоги. Итак, шаги, нужные для поддержания ваших программ в актуальном состоянии, будут следующими:

  1. Запустите cvsup для синхронизации дерева портов.
  2. Запустите portsdb для обновления INDEX.db.
  3. Используйте portversion для определения приложений, требующих обновления.
  4. Используйте portupgrade для апгрейда этих приложений.

Дополнительные ключи portupgrade

Мы уже убедились, что portupgrade -arR корректно обновляет все устаревшие приложения. Тем не менее, у portupgrade есть еще несколько ключей, позволяющих вам выбирать какие приложения апгрейдить, и как это делать.

Опция, которая полезна, если у вас нет постоянного соединения с интернетом -F. Обычно, когда вы производите апгрейд, portupgrade идёт в интернет, когда ей требуется файл, а затем тратит время на его сборку. Если вы производите большой апгрейд, например KDE, она может много раз выходить в интернет с перерывами в несколько часов.

Эта команда выходит в Интернет, вытягивает все нужные файлы, но ничего не устанавливает:

# portupgrade -aFrR

Когда вы загрузили необходимые файлы, можно отключаться от интернета и запускать portupgrade -arR как обычно.

Другой ключ -n. Этот ключ просто сообщает вам, что собирается делать portupgrade. Этот ключ очень полезен, если вы относитесь к нервному, параноидальному типу и хотите заранее знать, что случится с вашим софтом.

Вот пример вывода:

# portupgrade -anrR
--->  Session started at: Sun, 17 Aug 2003 22:06:00 -0400
<a page of output snipped>
--->  Reporting the results (+:done / -:ignored / *:skipped / !:failed)
- lang/ruby16 (ruby-1.6.8.2003.04.19)
- net/cvsup-without-gui (cvsup-without-gui-16.1h)
+ lang/ruby16-shim-ruby18 (ruby-shim-ruby18-1.8.0.p2.2003.04.19)
+ databases/ruby-bdb1 (ruby-bdb1-0.1.9)
- sysutils/portupgrade (portupgrade-20030723)
- www/lynx (lynx-2.8.4.1d)
--->  Session ended at: Sun, 17 Aug 2003 22:06:02 -0400 (consumed 00:00:02)

Давайте посмотрим на этот вывод. portupgrade систематически проходит через каждый установленный в системе порт, а затем помещает результат в отчет. Каждая строка отчета показывает заголовок порта, установленную версию, и символ, показывающий, требуется ли апгрейд. В этом частичном отчёте показано два порта, требующих модернизации. Они находятся в строках, начинающихся со знака +. Если я сравню отчёт с показаниями portversion, я увижу один результат, записанный по разному:

# portversion -l "<"
ruby-bdb1
ruby-shim-ruby18

Если вы очень осторожны, можете использовать ключ -i, что означает интерактивность. Добавьте его к вашим ключам portupgrade и portupgrade будет делать паузу перед апгрейдом приложения или зависимости. Пауза выглядит так:

--->  Upgrading 'ruby-bdb1-0.1.9' to 'ruby-bdb1-0.2.1'
	(databases/ruby/bdb1)
	OK? [yes]

Обратите внимание на ответ "да" в квадратных скобках, этот ответ будет использован по умолчанию. Это значит, что нажимая Enter, вы говорите "Да". Если вы полагаете, что вы не хотите обновлять этот порт, наберите no.

Последний ключ, который я хотела бы упомянуть, это ключ l, или лог. Этот ключ неоценим, когда порт отказывается устанавливаться, и вы собираетесь послать кому-либо лог неудачной установки. Для примера, я проапгрейжу один порт и направлю вывод в файл, названный logfile:

# portupgrade -rR ruby-shim-ruby18 -l logfile

Скорее всего, вы не захотите использовать этот ключ, особенно если у вы много файлов, требующих модернизации. Кому же хочется продираться через огромный лог-файл!

В следующей статье я хочу осветить деинсталляцию портов и чистку файлов, которые уже не используются портами. А еще мы рассмотрим настройку pkgtools.conf.

Комментарий читателя: в статье неоднократно упоминается файл /usr/ports/INDEX, содержащий список программ в дереве портов. Он по умолчанию используется утилитами семейства portupgrade. Однако этот же файл используется и системами обновления портов штатными базовыми средствами - через CVS, CVSup или CTM. Это может привести к конфликтам, поэтому разработчики portupgrade рекомендуют использовать файл с каким-либо другим именем (см. man portsdb).

Dru Lavigne is an instructor at Marketbridge Technologies in Ottawa and the maintainer of the Open Protocol Resource.

Материал взят: http://citforum.ru/~alv/lavign/portupgrades.html

Главная > Программы > PortUpgrade