Насколько я люблю систему портов FreeBSD, настолько же мне не нравравится поддерживать дерево портов...
Автор:
Разместил: slayer   Дата: 2006-07-03 13:16
Комментарии: (0)   Рейтинг:
Насколько я люблю систему портов FreeBSD, настолько же мне не нравравится поддерживать дерево портов в актуальном состоянии используя CVSup. Мне не удалось еще попробовать утилиту portsnap Colin'а Percival'а, которая использует HTTP протокол для распространения сжатых и криптографически подписанных снимков дерева портов. Это хорошая альтернатива, но я стараюсь по возможности избегать процесса компиляции из исходных текстов, т.к. использую не совсем современные и очень медленные системы. В этом случае наиболее подходящим способом является установка и обновление программного обеспечения (ПО) используя заранее скомпилированные пакеты.

Portupgrade - наиболее подходящая утилита для обновления ПО под FreeBSD. Она обладает мощным потенциалом, т.к. способна разрешать зависимости во время массового обновления ПО. Не имеет значения каким образом были установлены приложения: используя порты или заранее скомпилированные пакеты, т.к. с сомента установки FreeBSD расценивает их как пакеты используя в работе с ними такие утилиты как например pkg_info. Использование в качестве аргумента для portupgrade ключа -PP позволит провести обновление ПО используя исключительно заранее скомпилированные пакеты. Это позволит избежать процесса компиляции перед непосредственно установкой.



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

Я часто думал над альтернативными методами обновления дерева портов целиком. По этому поводу в рассылке freebsd-ports проходит множество дискуссий. Они обьявляют удаление файлов INDEX и INDEX-5 из CVS хранилища. Эти файлы (INDEX для ветви 4.х и INDEX-5 для ветви 5.х) содержат информацию о ПО, например для nmap:

nmap-3.75|/usr/ports/security/nmap|/usr/local|Port scanning utility for large
networks|/usr/ports/security/nmap/pkg-descr|eik@FreeBSD.org|security ipv6|openssl-
0.9.7e_1 pcre-5.0|openssl-0.9.7e_1 pcre-5.0|http://www.insecure.org/nmap/|||

Эта запись описывает порт nmap, его майнтайнера, зависимости, и прочее: НО вы не найдете ни одного INDEX файла в CVS, например на cvsweb.freebsd.org (см. запись в CHANGES, в которой говорится об удалении INDEX). Майнтайнеры считают что INDEX файлы в CVS сильно устарели и необходимость в их хранении отпала. Но все же INDEX файлы все еще доступны, их можно сформировать запустив 'make index' находясь в /usr/ports или скачать их. Последний способ
наиболее подходит, т.к. формирование с использование традиционных методов занимает большое количество времени.
Это позволит полностью исключить CVSup и обновление дерева портов если вы желаете работать только с заранее скомпилированными пакетами. Дальнейшее повествование описывает как это сделать на FreeBSD 5.3 RELEASE с несколькими приложениями установленными с помощью заранее скомпилированных пакетов.

Вначале у меня под рукой был только файл INDEX-5, который идет стандартной поставке коллекции портов устанавливаемой с FreeBSD 5.3 RELEASE:

janney:/root# ls -al /usr/ports/IND*
-rw-r--r-- 1 root wheel 5798559 Nov 4 18:27 /usr/ports/INDEX-5


Сперва я установил portupgrade:

janney:/root# pkg_add -vr portupgrade
looking up ftp.freebsd.org
connecting to ftp.freebsd.org:21
setting passive mode
opening data connection
initiating transfer
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5.3-release/Lates
t/portupgrade.tbz...x +CONTENTS
x +COMMENT
x +DESC
x +MTREE_DIRS
x man/man1/pkg_deinstall.1.gz
...truncated...

После того как portupgrade был установлен я запустил portversion чтобы понаблюдать обнаружит ли portupgrade уже установленные пакеты. Во время запуска portversion происходит создание базы данных пакетов, расположенной в /var/db/pkg/pkgdb.db.

janney:/root# portversion -v
[Updating the pkgdb in /var/db/pkg ... - 48 packages found (
-0 +1) . done]
[Updating the portsdb in /usr/ports ... - 11735 port entries
found .........1000.........2000.........3000.........4000.........5000........
.6000.........7000.........8000.........9000.........10000.........11000.......
..... done]
bash-3.0_5 = up-to-date with port
bitstream-vera-1.10 = up-to-date with port
boxtools-0.65.0 = up-to-date with port
cdrtools-2.0.3_4 = up-to-date with port
cmdwatch-0.2.0 = up-to-date with port
...truncated...

После окончания процесса в /usr/ports создается новый файл INDEX.db наравне с оригинальным INDEX-5:

janney:/root# ls -al /usr/ports/IND*
-rw-r--r-- 1 root wheel 5798559 Nov 4 18:27 /usr/ports/INDEX-5
-rw-r--r-- 1 root wheel 11915264 Nov 19 23:16 /usr/ports/INDEX.db


Теперь мне потребуется обновить оригинальный фал INDEX-5. Судя выводу portupgrade, все мои пакеты находятся в актуальном состоянии. На самом деле это не так. Например,взглянув на ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/ можно увидеть что доступен пакет /shells/bash-3.0.15.tbz. Я же использую bash-3.0_5, таким образом для обновления доступен более свежий прекомпилированный пакет.

Данный процесс проходит в два шага. Во-первых, требуется получить новый INDEX-5, например скачав его следующим способом:

janney:/usr/ports# make fetchindex
INDEX-5 0% of 5877 kB 0 Bps

После завершения работы 'make fetchindex' получаем обновленный файл INDEX-5:

janney:/usr/ports# ls -al IND*
-rw-r--r-- 1 root wheel 6018417 Nov 19 23:05 INDEX-5
-rw-r--r-- 1 root wheel 11915264 Nov 19 23:16 INDEX.db

Во-вторых, потребуется обновить файл INDEX.db:

janney:/usr/ports# portsdb -uf
[Updating the portsdb in /usr/ports ... - 11972 port entries
found .........1000.........2000.........3000.........4000.........5000........
.6000.........7000.........8000.........9000.........10000.........11000........
. ..... done]

Теперь посмотрим на файл INDEX.db:

janney:/usr/ports# ls -al IND*
-rw-r--r-- 1 root wheel 6018417 Nov 19 23:05 INDEX-5
-rw-r--r-- 1 root wheel 12334080 Nov 19 23:54 INDEX.db


Повторный запуск portversion показал что некоторые порты требуют обновления. Например bash:

janney:/usr/ports# portversion -v
bash-3.0_5 < needs updating (port has 3.0.16_1)
bitstream-vera-1.10 = up-to-date with port
boxtools-0.65.0 = up-to-date with port
cdrtools-2.0.3_4 = up-to-date with port
...truncated...


Теперь файл INDEX-5 содержит информацию о том, что доступная версия bash в дереве портов 3.0.16_1, но ведь прекомпилированый пакет имеет версию 3.0.15. На самом деле это допустимо (если не учитывать аспект безопасности), и позволит произвести обновление bash с 3.0_5 до 3.0.15. Следующим шагом нужно сообщить portupgrade где искать заранее скомпилированные пакеты:

janney:/usr/ports# setenv PACKAGESITE ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/

Теперь мы готовы к обновлению пакетов с помощью portupgrade:

janney:/usr/ports# portupgrade -varRPP
---> Session started at: Fri, 19 Nov 2004 23:55:03 -0500
** No need to upgrade 'python-2.3.4_2' (>= python-2.3.4_2). (specify -f to force)
...edited...
---> Checking for the latest package of 'shells/bash'
---> Fetching the package(s) for 'bash-3.0.16' (shells/bash)
---> Fetching bash-3.0.16
++ Will try the following sites in the order named:
ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/
---> Invoking a command: /usr/bin/fetch -o '/var/tmp/bash-3.0.16.tbz' 'ftp://ft
p2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/bash-3.0.16.tbz'
fetch: ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/bash-3.0.16.tbz: File unavailable (e.g., file not found, no access)
** The command returned a non-zero exit status: 1
** Failed to fetch ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/bash-3.0.16.tbz
---> Invoking a command: /usr/bin/fetch -o '/var/tmp/bash-3.0.16.tgz' 'ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/bash-3.0.16.tgz'
fetch: ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/bash-3.0.16.tgz: File unavailable (e.g., file not found, no access)
** The command returned a non-zero exit status: 1
** Failed to fetch ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stab
le/All/bash-3.0.16.tgz
** Failed to fetch bash-3.0.16
---> Listing the results (+:done / -:ignored / *:skipped / !:failed)
! bash-3.0.16 (fetch error)
---> Packages processed: 0 done, 0 ignored, 0 skipped and 1 failed
---> Fetching the latest package(s) for 'bash' (shells/bash)
---> Fetching bash
++ Will try the following sites in the order named:
ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/
---> Invoking a command: /usr/bin/fetch -o '/var/tmp/bash.tbz' 'ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/Latest/bash.tbz'
/var/tmp/bash.tbz 0% of 532 kB
---> Downloaded as bash.tbz
---> Identifying the package /var/tmp/bash.tbz
---> Saved as /usr/ports/packages/All/bash-3.0.15.tbz
---> Skipping libiconv-1.9.2_1 (already installed)
---> Skipping gettext-0.13.1_1 (already installed)
---> Listing the results (+:done / -:ignored / *:skipped / !:failed)
+ bash@
- libiconv-1.9.2_1
- gettext-0.13.1_1
---> Packages processed: 1 done, 2 ignored, 0 skipped and 0 failed
---> Found a package of 'shells/bash': bash-3.0.15.tbz (bash-3.0.15)
---> Located a package version 3.0.15 (bash-3.0.15.tbz)
---> Using it anyway although it is not the latest version (3.0.16), since -PP/
--use-packages-only is specified
---> Upgrade of shells/bash started at: Sat, 20 Nov 2004 00:00:52 -0500
---> Upgrading 'bash-3.0_5' to 'bash-3.0.15' (shells/bash) using a package
---> Updating dependency info
---> Uninstallation of bash-3.0_5 started at: Sat, 20 Nov 2004 00:00:53 -0500
---> Fixing up dependencies before creating a package
---> Backing up the old version
---> Uninstalling the old version
---> Deinstalling 'bash-3.0_5'
[Updating the pkgdb in /var/db/pkg ... - 47 packages found (
-1 +0) (...) done]
---> Uninstallation of bash-3.0_5 ended at: Sat, 20 Nov 2004 00:01:01 -0500 (consumed 00:00:07)
pkg_info: can't find package 'bash-3.0.15.tbz' installed or in a file!
---> Installation of bash-3.0.15 started at: Sat, 20 Nov 2004 00:01:01
-0500
---> Installing the new version via the package
---> Removing temporary backup files
---> Installation of bash-3.0.15 ended at: Sat, 20 Nov 2004 00:01:06 -0500 (consumed 00:00:04)
---> Cleaning out obsolete shared libraries
[Updating the pkgdb in /var/db/pkg ... - 48 packages found (-0 +1) . done]
---> Upgrade of shells/bash ended at: Sat, 20 Nov 2004 00:01:08 -0500 (consumed 00:00:15)
** No need to upgrade 'xorg-fonts-miscbitmaps-6.7.0' (>=xorg-fonts-miscbitmaps-6.7.0). (specify -f to force)
...truncated...

Приведенный выше листинг показывает что происходит когда portupgrade не может обнаружить требуемую версию пакета bash-3.0.16 на ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All.
Происходит поиск bash.tbz на ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/Latest. На самом деле это символическая ссылка на доступный пакет:

lrwxr-xr-x 1 110 0 22 Nov 15 08:09 bash.tbz -> ../All/bash-3.0.15.tbz

На будущее, я определю переменную PACKAGESITE таким образом:

janney:/usr/ports# setenv PACKAGESITE ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/

В итоге все порты, которые могли быть обновлены с помощью прекомпилированых пакетов, были действительно обновлены. Например, bash:

janney:/root# portversion -v bash
bash-3.0.15 < needs updating (port has 3.0.16_1)

Прекомпилированные пакеты закачиваются на FTP сервера еженедельно, я буду проводить этот процесс каждый раз после появление более новых версий.

Я также намереваюсь проследить за новой утилитой Мэтью Симана portindex.Portindex Matthew позволяет намного быстрее сгенерировать INDEX и INDEX-5, а также заменяет медленные процессы 'make index' и 'portsb -uU'. Использование системы портов в комбинации с portindex и portsnap позволит раскрыть облее мощный потенциал данного способа установки ПО. Описаный же выше способ должен понравиться людям, использующим медленные системы или обновляющих ПО с помощью пакетов.

Источник http://taosecurity.blogspot.com/2004_11_01_taosecurity_archive.html#110093091499914264

Перевод s1lv3r