Трюки с портами во FreeBSD


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

Одна из многих причин, для того чтобы любить FreeBSD - коллекция портов. Почти 10,000 приложений и для установки любого - просто make install clean. В сегодняшней статье я хотела бы рассказать вам о некоторых хитростях при работе с коллекцией портов.
README

Даже если вы уже некоторое время используете коллекцию портов, чтение man ports может выявить некоторые хитрости, о которых вы даже не подозревали. Если у вас есть масса дискового пространства, но медленная или нерегулярная связь с Internet, эта выдержка из manpage - просто бриллиант:
% cd /usr/ports
% make readmes

Пока команда будет выполняться, возможно стоит пойти перекусить. Когда она завершится, у вас появится новый файл /usr/ports/README.html. Откройте этот файл в вашем любимом браузере и вы увидите чрезвычайно удобную страничку со ссылками. Первой даётся ссылка на справочник FreeBSD, который находится либо на вашем жестком диске, либо на сайте FreeBSD. Второй идёт ссылка на Porter's Handbook. Если вы когда-либо хотели узнать, что скрывается за магией Makefile в портах или хотели собрать свой собственный порт, тогда это - первый кандидат на чтение.

Далее идёт список ссылок в каждый из подкаталогов в /usr/ports. Не позволяйте видимой простоте одурачить вас. Выберите подкаталог и одно из приложений. Я кликну на Editors->AbiWord2. Результирующая страница содержит ссылки на описание порта, сайт программы, и электронный адрес мантэйнера, а также электронный адрес списка рассылки этого порта. А еще здесь есть полный список зависимостей порта. И вся эта информация уже лежит на вашем винчестере, и доступна в любой момент, особенно, если поставить закладку.
Создание Package Repository

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

Выберите машину в вашей сети, чтобы создать хранилище пакетов. Коллекция портов нужна только на этой машине; для остальных машин она не потребуется. Создайте директорию для пакетов:
% mkdir /usr/ports/packages

Затем соберите нужные вам пакеты. Для примера, я соберу два пакета:
% cd /usr/ports/www/lynx
% make package
% cd /usr/ports/mail/getmail
% make package

Когда вы делаете make package, происходят две вещи. Во-первых, создается пакет и помещается в /usr/ports/packages. Во-вторых, на локальной машине устанавливается этот порт, если он еще не был установлен. Если вам не нужно это приложение, после создания пакета просто наберите make deinstall.

Заполнив /usr/ports/packages нужными вам пакетами, создайте NFS mount для обеспечения общего доступа к хранилищу пакетов. Самое простое - сделать это с помощью stand/sysinstall. На машине, содержащей пакеты, наберите:
% /stand/sysinstall

Выберите Configure, Networking, а затем NFS server. вы увидите следующее сообщение:
Для работы NFS сервера вы должны сначала
сконфигурировать /etc/exports, чтобы указать,
какие хосты могут иметь доступ к
вашей файловой системе.
Нажмите [ENTER], чтобы немедленно
начать редактировать /etc/exports

Если вы не меняли редактор по умолчанию, /etc/exports откроется в vi. Первоначальный файл содержит примеры конфигурации. Я добавила в файл эту строку, чтобы добавить мою сеть:
/usr/ports/packages -network 192.168.2.0 -mask 255.255.255.0

После сохранения изменений, вам потребуется перезагрузка для инициализации NFS сервера. Если перезагрузка нежелательна, читайте инструкции в справочнике (или в русском переводе - прим. ред.). Теперь убедимся, что сервер NFS готов к работе:
% sockstat | grep nfs
root nfsd 3973 tcp4*:2049 *:*

Теперь вам нужно создать NFS клиентов на каждой из машин, которые будут использовать хранилище пакетов. На этот раз с помощью /stand/sysinstall выберем NFS client, а затем NFS server. вас ни о чем не спросят; просто снимите отметку. Когда закончите, наберите:
% nfsiod -n 4

Теперь проверьте, доступно ли хранилище пакетов. В моём примере 192.168.2.12 - машина, на которой хранятся пакеты:
% mount 192.168.2.12:/usr/ports/packages /mnt
% ls /mnt
All Latest ipv6 mail python www

Обратите внимание, что были созданы подкаталоги для mail/getmail и www/lynx. Подкаталоги ipv6 и python - зависимоcти этих пакетов. Подкаталог All самый удобный:
% ls /mnt/All
getmail-3.1.7.tbz lynx-2.8.4.1d.tbz

А теперь я попробую добавить пакет:
% pkg_add /mnt/www/lynx-2.8.4.1d.tbz

После возвращения в командную строку я проверю, установился ли пакет:
% pkg_info | grep lynx
lynx-2.8.4.1d A non-graphical, text-based World-Wide Web client

При установке вы обнаружите, что пакеты не устанавливают свои зависимости. При их отсутствии они выводят ошибку. Например:
% pkg_add /mnt/mail/getmail-3.1.7.tbz
pkg_add: could not find package python-2.2.3_2 !

Обучите своих пользователей сначала устанавливать зависимости (в этом примере - python-2.2.3_2), а затем сам пакет. Также напомните им, что после окончания установки, необходимо выйти из каталога NFS и отмонтировать последний:
% cd /
% umount /mnt
Показ зависимостей

Хорошо, что еще можно делать с портами? Я уже показывала, как просматривать зависимости, используя make readmes.

Другой путь - сделать так:
% cd /usr/ports/graphics/gimp
% make pretty-print-build-depends-list
This port requires package(s) "XFree86-libraries-4.3.0_5
aalib-1.4.r5_1 cups-base-1.1.19.0 cups-pstoraster-7.07 expat-1.95.6_1
fontconfig-2.2.90_3 freetype2-2.1.4_1 gettext-0.11.5_1
ghostscript-gnu-7.07_3 gimp-print-4.2.5 glib-1.2.10_9 gmake-3.80
gtk-1.2.10_9 imake-4.3.0_1 jpeg-6b_1 libiconv-1.9.1_1 libijs-0.34
libtool-1.3.5_1 perl-5.6.1_13 pkgconfig-0.15.0 png-1.2.5_2
tiff-3.5.7_1" to build.
Поиск портов

Коллекция портов включает возможность поиска. Это чрезвычайно полезно. Особенно если вы знаете, что должно делать приложение и хотите узнать, какие именно порты вам подходят. К примеру:
% cd /usr/ports
% make search key=dvd | more

В результате мы получим список портов, так или иначе связанных с DVD. Чтобы вы получили представление, о чем идет речь, вот первый результат этого поиска:
Port:dvdauthor-0.5.3
Path:/usr/ports/multimedia/dvdauthor
Info:Makes a DVD file structure from one or more MPEG2 streams
Maint:/teeBSD.org
Index:multimedia
B-deps:expat-1.95.6_1 gettext-0.11.5_1 gmake-3.80 libdvdcss-1.2.5
libdvdread-0.9.4 libgnugetopt-1.2 libiconv-1.8_2
png-1.2.5_2
R-deps:libdvdcss-1.2.5 libdvdread-0.9.4 libgnugetopt-1.2 png-1.2.5_2

"B-deps" - это зависимости для построения, тогда как "R-deps" - зависимости для запуска приложения.

Если вы хотите просто найти порт по имени, используйте make search name=[имя_программы]. К примеру, если я знаю, что хочу собрать Netscape, и хочу посмотреть доступные версии, я просто наберу:
% make search name=netscape | more

Если вы находите поиск полезным, используйте make index для того, чтобы быть уверенным, что ваш поиск выдает свежие результаты. Но выполнение этой команды занимает довольно много времени, так что не используйте её, если вы торопитесь.
Показ уже установленных пакетов и портов

Перейдём к man pkg_info. Эта утилита показывает установленные в системе порты и пакеты. Если вы не прочтёте manpage этой утилиты перед использованием, вы рискуете не узнать довольно много полезных ключей.

Когда вы используете pkg_info, с ключом -a в комбинации с другими ключами, вы получите информацию обо всех установленных в системе программах. Если же вы укажете имя конкретной программы, вы получите информацию только о ней. Например:
% pkg_info -ac

покажет комментарий в одну строку для каждого приложения, тогда как:
% pkg_info -c lynx-2.8.4.1d

покажет однострочный комментарий для lynx-2.8.4.1d. Если вы хотите длинного описания, используйте -d вместо -c.

Если вы похожи на меня и ненавидите набирать, или, что более вероятно, не помните версию приложения, используйте -x:
% pkg_info -xc lynx

Вышеприведённая команда выведет однострочный комментарий для всех приложений, начинающихся с lynx. Кроме экономии ваших ячеек памяти, это прекрасный способ обнаружить, что на вашей системе установлено несколько версий lynx.
Чтение пост-установочных сообщений

После установки порта полезно взглянуть на вывод установки, так как там часто бывают советы и инструкции по настройке. К примеру, в моей предыдущей статье, я показывала, как посмотреть вывод установки /usr/ports/mail/messagewall. Вот ещё один метод:
% pkg_info -xD messagewall

Очень полезный ключ -L, выводит полный путь для каждого файла, который был установлен для приложения:
% pkg_info -xL lynx | more
Information for lynx-2.8.4.1d:

Files:
/usr/local/man/man1/lynx.1.gz
/usr/local/bin/lynx
/usr/local/etc/lynx.cfg.default
/usr/local/share/doc/lynx/CHANGES

Из вывода мне стало известно, что lynx установился с manpage, что сам он установился в /usr/local/bin/lynx, что у него есть пример файла конфигурации, и что существует директория, содержащая документацию, касающуюся lynx. Обычно меня не интересует, куда был установлен каждый файл. Поскольку в большинстве случаев меня интересует начало вывода, я перенаправляю вывод в head вместо more:
% pkg_info -xL lynx | head
Проверка зависимостей перед деинсталляцией

Перед деинсталляцией приложения, хорошей идеей будет проверить, не является ли оно зависимостью для других приложений. К примеру, вы набрали
% pkg_info | more

и видите это приложение:
ORBit-0.5.17

вы думаете, "Что-то я не припоминаю, чтобы я устанавливал или пользовался этой программой. Может быть просто удалить её?" Эта команда покажет вам, для чего требуется приложение, если оно было установлено другой программой:
% pkg_info -R ORBit-0.5.17
Information for ORBit-0.5.17:

Required by:
AbiWord-gnome-1.0.5
flashplugin-mozilla-0.4.10_2

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

Как быть, если вы решили немного безумно-поинсталлировать и обнаружили, что приложений больше, чем места на диске? Используйте ключ для определения размера, потребного для приложения. Перенаправьте вывод команды на more:
% pkg_info -as | more

или в файл, чтобы прочитать его потом в своё удовольствие:
% pkg_info -as > sizes

У вас появится информация о том, какие приложения съедают больше всего места, что даст повод для решения о деинсталляции чего-либо. Не забывайте использовать ключи комментария и зависимостей, чтобы определиться с решением.
Проверка статуса установленных портов

Еще один путь отслеживания установленного в системе программного обеспечения - использование pkg_version:
% pkg_version | more

покажет алфавитный список приложений, установленных в системе. При этом каждое приложение следует за одним из трёх символов:
=: свежее приложение;
<: уже есть более новая версия приложения;
>: вам надо обновить индекс.

Так, чтобы определить какие приложения требуют модернизации:
% pkg_version -l "<"

Заметьте, вам надо поставить кавычки вокруг знака <, иначе оболочка пожалуется на отсутствие имени файла для перенаправления. Если команда ничего не вывела, поздравляю! Все ваши приложения вполне свежие. Если вы получили какой-либо вывод, вы знаете, какие приложения нужно обновить.

Эта команда выведет поочерёдно все устаревшие приложения:
% pkg_version -L "="

Подробнее смотрите man pkg_version, если вы не видите разницы между -l и -L.

Если вы хотите более подробного отчёта, чем =, <, или >, попробуйте эту команду:
% pkg_version -v | more

В большинстве случаев, стоит запускать pkg_version после использования /usr/ports/net/cvsup-without-gui и получения свежей коллекции портов. (Смотри раздел The FreeBSD Handbook's cvsup, или его русский перевод). Если по каким-либо причинам вы не используете cvsup, вы можете сравнить ваши приложения с последним деревом портов:
% pkg_version -v ftp://ftp.freebsd.org/pub/FreeBSD/branches/-current/ports/INDEX
| more

Заметьте, эта команда пишется в одну строку. Используйте поочерёдно ключи -l или -L с этим URL, чтобы найти устаревшие приложения.

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

http://www.onlamp.com/lpt/a/4057

Обновлено: 12.03.2015