Рубрика:
Администрирование /
Продукты и решения
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
ВЛАДИМИР ОСИНЦЕВ
Эффективная работа с портами в FreeBSD
Статья полностью посвящена портам в FreeBSD, хотя большинство примеров актуальны и для других *BSD-систем.
В рамках данной статьи «порт» происходит от слова «портировать» и обозначает скрипт, с помощью которого можно просто установить программу в систему из исходников или удалить ее из системы. Давным-давно в FreeBSD образовалась так называемая «коллекция портов», которая на данный момент насчитывает более 9000 программ.
Система портов конкурирует с прекомпилированными rpm- и deb-пакетами, являясь более удобным средством для установки и удаления программ, обновления как отдельных, так и всех компонентов системы (стоит отметить, что порты не предоставляют альтернативу и являются ОС-зависимыми). Все основные системы BSD-семейства (NetBSD, OpenBSD, ну и, конечно, FreeBSD) оснащены своими коллекциями портов. Аналогом портов обладают все «source-based» дистрибутивы GNU/Linux, самый известный из которых – Gentoo (http://gentoo.org), со своей системой портежей («portage»).
С помощью портов программы устанавливаются из исходных текстов, т.е. закачиваются исходники, распаковываются, настраиваются, компилируются и устанавливаются в систему, всю работу на себя берет порт. Но также система портов умеет работать и с прекомпилированными пакетами с расширением tbz, что представляет собой tar.bz2 архив с дополнительной информацией в конце файла.
В рамках статьи и порт, и пакадж, и пакет обозначают одно и то же. Сегодня мы не будем рассматривать обновление дерева портов с помощью утилиты CVSup, читайте соответствующую главу «FreeBSD Handbook».
Поиск по коллекции портов
В коллекции портов находится свыше 9000 программ, поэтому эффективный поиск очень важен. Система портов предоставляет достаточно обширные средства поиска, самое простое и популярное из них:
# cd /usr/ports
# make search name=opera
Port: opera-7.21.20031013 Path: /usr/ports/www/opera Info: A blazingly fast, full-featured, standards-compliant browser Maint: avleeuwen@piwebs.com Index: www B-deps: ... R-deps: ... ... |
Здесь был использован поиск по названию порта (был выведен список портов, в названии которых встречается слово «opera»), как альтернативу, можно использовать поиск по ключевому слову:
# make search key=dvd
Port: dvdrip-0.48.8 Path: /usr/ports/multimedia/dvdrip Info: This is dvd::rip, a Perl Gtk+ based dvd-ripper Maint: michaelnottebrock@gmx.net Index: multimedia B-deps: ... R-deps: ... ... |
Главное отличие «portsearch» от «make search» – это поддержка логических выражений, как в Perl, к тому же возможность поиска не только «в названии» или «по ключевому слову».
Как пример рассмотрим:
# ./portsearch -n "^xmms" -p "(audio|multimedia)" -i "plugin"
Эта команда выведет список портов, название которых начинается с xmms (выражение ^xmms), из каталогов /usr/ports/audio или /usr/ports/multimedia (выражение (audio|multimedia)), в описании которых есть слово «pligin». Описание других ключей смотрите в файле README.portsearch из каталога программы.
Как вариант, утилита «portsearch» может производить поиск по дереву портов, которое находится на удаленной машине, например, поиск по самой последней версии портов может выглядеть так:
# ./portsearch -n "^xmms" -f ftp://ftp.freebsd.org/pub/FreeBSD/branches/-current/ports/INDEX
Информация о коллекции портов индексируется в файле /usr/ports/INDEX, чтобы поиск был максимально быстрым, но при изменении в дереве портов файл INDEX, который используют, и «make search», и «port-search» остается прежним. Для повторного индексирования портов:
# cd /usr/ports && make index
Просмотр зависимостей
Один из способов просмотра зависимостей того или иного порта является:
# cd /usr/ports/www/opera
# make pretty-print-build-depends-list
This port requires package(s) "XFree86-libraries-4.3.0_5 compat4x-i386-5.0.20030328 expat-1.95.6_1 fontconfig-2.2.0 freetype2-2.1.4_1 imake-4.3.0 perl-5.6.1_13 pkgconfig-0.15.0 png-1.2.5_2" to build. |
Мы получили список необходимых пакетов для сборки порта веб-браузера «Opera». Как вариант можно использовать «make pretty-print-run-depends-list» для просмотра Run-зависимостей (пакеты, необходимые для запуска порта).
Проверка зависимостей до удаления
До того как удалить пакет из системы, неплохо посмотреть список пакетов, которые зависят от него, чтобы ничего не сломать. Например, по команде «pkg_info | less» вы увидите, что в системе установлен пакет ORBit2-2.6.2. Название пакета ничего не говорит, по-моему, вы его ни разу не использовали, и хорошо было бы удалить его, но сначала посмотрим, какие пакеты зависят от него.
# pkg_info -R ORBit2-2.6.2
Information for ORBit2-2.6.2: Required by: libgnome-2.2.0.1 nautilus2-2.2.4 gnome2-2.2.1_1 ... |
Как видим, удалять этот пакет было плохой идеей, т.к. от него зависят необходимые нам программы и библиотеки. Нарушение зависимостей в лучшем случае приведет к неработоспособности программы. Конечно, при попытке удаления командой «pkg_delete ORBit2-2.6.2» мы увидим то же самое сообщение о зависимых от него пакетах и ORBit2 не будет удален, но лучше все равно делать это с помощью «pkg_info».
Просмотр установленных пакетов
«pkg_info» – утилита для просмотра установленных пакетов. Настоятельно рекомендую прочитать man-страницу, т.к. сегодня мы рассмотрим лишь пару возможностей.
При использовании ключа «-a» будет отображена информация о всех установленных пакетах, как альтернативу вы можете использовать название пакета. Например, команда «pkg_info -ac» выдаст короткие комментарии (ключ «-c») ко всем установленным пакетам, в свою очередь «pkg_info -c sudo-1.6.7.4» выдаст комментарий к пакету «sudo». Если вы хотите прочитать полное описание вместо коротких комментариев, используйте ключ «-d» вместо «-c».
Если вам, как и мне, не очень нравится помнить версию пакета, то с помощью ключа «-x» можно избавиться от этой необходимости.
# pkg_info -xc sudo
Information for sudo-1.6.7.4:
Comment: Allow others to run commands as root |
Эта команда равнозначна предыдущей, но она выведет информацию о всех установленных пакетах, чье название начинается с sudo (в нашем случае это единственный пакет).
Просмотр подробной информации о пакетах
После инсталляции порта (особенно в автономном режиме) неплохо посмотреть, были или нет post-install-сообщения, для этого используется ключ «-D». Например, я поcтавил на ночь обновляться систему, среди всех портов был www/opera (одноименный веб-браузер), а уже утром я смог посмотреть какие были сообщения от всех портов и от www/opera в частности, для этого «pkg_info -xD opera», теперь я знаю, что при апгрейде веб-браузера от 6.x до 7.x нужно сделать backup каталога ~/.opera, иначе вся информация (история, закладки, почта и прочее) могла быть утеряна.
Еще один полезный ключ «-L», позволяет просмотреть список установленных файлов из данного порта.
Например:
# pkg_info -xL opera
Information for opera-7.21.20031013: Files: /usr/X11R6/bin/opera /usr/X11R6/share/doc/opera/LICENSE /usr/X11R6/share/doc/opera/help /usr/X11R6/share/opera/bin/m2.so ... |
Хороший способ узнать, что и куда устанавливалось.
Навигация по коллекции портов
При обновлении дерева портов файлы README.html, которые генерируются при помощи информации из самого порта, остаются старыми и могут отражать устаревшую информацию: сайт программы, описание, Run и Build зависимости. Для обновления README-файлов сделайте:
# сd /usr/ports
# make readmes
Далее вы можете просматривать актуальную информацию при помощи вашего любимого браузера. Ту же информацию вы можете найти на http://freebsd.org/ports.
Статус установленных пакетов
Один из способов посмотреть список установленных пакетов – это утилита «pkg_version».
# pkg_version | less
gnome2 = nvidia-driver < opera = vim < ... |
Мы получили список всех установленных пакетов, который состоит из названия и одного символа, из них основные:
- «=» – установлена последняя версия пакета;
- «<« – доступна для установки новая версия пакета, рекомендую обновиться;
- «>» – когда установленная версия старше, чем в коллекции портов. Иногда бывает, когда, например, устанавливаются самодельные порты.
Теперь попробуем просмотреть список пакетов, которые нужно обновить:
# pkg_version -l "<"
nvidia-driver < vim < ... |
Обычно, «pkg_version» используют после обновления локальной коллекции портов, например, с помощью CVSup (об этом читайте в FreeBSD Handbook). Но можно проверить статус установленных пакетов относительно «свежей» коллекции портов:
# pkg_version -v ftp://ftp.freebsd.org/pub/FreeBSD/branches/-current/ports/INDEX | less
При необходимости можно использовать ключ -l (см. выше) для просмотра только тех пакетов, которые уже устарели.
Проверка целостности установленных пакетов
Еще одна интересная утилита «consistency-check» позволяет проверить целостность установленных в систему пакетов. При запуске:
# ./consistency-check
Утилита покажет вам, из каких пакетов какие файлы были удалены, изменены и файлы, которые не принадлежат не одному из портов. Данную утилиту полезно использовать не только для общего мониторинга системы, но и как security-сканер, т.к. вы всегда можете посмотреть, у каких файлов md5checksum отличается от оригинальных.
Освобождение свободного места на диске
Когда порт устанавливается в систему на локальный компьютер, в директорию /usr/ports/distfiles закачиваются необходимые исходные тексты, после чего порт компилируется и инсталлируется.
При обновлении порта уже закачиваются новые версии исходников (старые остаются). При удалении порта исходные тексты также остаются в distfiles/. Через какое-то время мы получаем, что distfiles/ содержит очень мало «нужного».
Конечно, вместо «make install clean» можно использовать «make install clean distclean», т.е. после загрузки, сборки и установки исходники будут удалены, но необходимо, чтобы в distfiles/ сохранялись только свежие исходники – это позволяет сэкономить трафик и время при медленном канале, а значит, и ваши деньги.
Для очистки диска нам понадобится набор утилит «portupgrade», который нужно обязательно иметь, если вы так или иначе собираетесь использовать порты. Если порт не установлен, тогда:
# cd /usr/ports/sysutils/portupgrade
# make install clean
Теперь можно начать с удаления каталогов work/, в которых находятся уже распакованные исходные тексты, которые мы забыли удалить при помощи цели «clean», которую мы добавляем к «make».
# portsclean –C
Cleaning out /usr/ports/*/*/work... Delete /usr/ports/news/gnus-emacs20/work ... |
Утилита имеет еще одну возможность, которая нас интересует больше всего: удаление неактуальных файлов из distfiles/
# portsclean –DD
Detecting unreferenced distfiles... Delete /usr/ports/distfiles/KDE/qt-x11-free-3.1.2.tar.bz2 ... |
Эту же операцию можно проделать и с помощью встроенной утилиты «distclean»:
# ./distclean
Она проделает то же самое: сверит md5checksum исходных текстов из установленных портов и удалит те, которые не соответствуют. Заметьте, что будут удалены, например, еще недокачанные файлы, потому что md5checksum отличается от полного файла.
Настройка параметров коллекции портов
Когда вы установили пакет «portupgarde» в системе, кроме всего, в каталоге /usr/local/etc были созданы файлы pkgtools.conf и pkgtools.conf.sample. Sample-файл оставьте как есть, он имеет хорошие комментарии и послужит хорошим примером.
Файл pkgtools.conf содержит параметры переменных окружения для утилит из пакета «portupgrade». Например, по умолчанию директория для хранения временных файлов является /var/tmp. На некоторых системах, где под раздел /var отведено недостаточно места, могут возникнуть проблемы. Для их решения достаточно сделать так, чтобы временные файлы хранились не в /var/tmp, а к примеру на /usr/tmp. Для этого в pkgtools.conf достаточно изменить строку:
# ENV["PKG_TMPDIR"] ||= "/var/tmp"
на
ENV["PKG_TMPDIR"] ||= "/usr/tmp"
Обратите внимание на символ «#»: вы должны раскомментировать строку, иначе значение переменной окружения не вступит в силу.
Другая интересная часть файла pkgtools.conf – это «IGNORE_CATEGORIES». В этом массиве, который по умолчанию пуст, содержатся названия игнорируемых категорий (директории в /usr/ports), обычно игнорируются языковые категории. Лично у меня игнорируются следующие категории: chinese, french, german, hebrew, japanese, korean, ukrainian, vietnamese, astro, biology, palm, portuguese, hungarian, games.
Заполните массив «IGNORE_CATEGORIES», как это сделано в комментариях файла pkgtools.conf, после чего обязательно выполните команду:
# portsdb -Ufu
Которая обновит информацию о коллекции портов. В итоге поиск в игнорируемых каталогах производиться не будет и порты из этих категорий будут удалены из Run и Build зависимостей других портов.
Настройка параметров сборки порта
В файле pkgtools.conf (см. выше) есть возможность задать массив «MAKE_ARGS», в котором хранятся параметры сборки портов. Чтобы понять, о чем идет речь, нужно вспомнить, что некоторые порты мы собираем с указанием параметров, например, «ITH_GUI=yes» при сборке порта multimedia/mplayer, т.е.:
# cd /usr/ports/multimedia/mplayer
# make WITH_GUI=yes WITH_LANG=ru install clean
Этот массив служит для того, чтобы не задавать параметры каждый раз при сборке порта, т.е. при команде «portupgrade» пакеты будут обновлены с заданными параметрами.
По умолчанию в файле pkgtools.conf массив «MAKE_ARGS» пуст, исправьте его, чтобы он выглядел, например, так:
MAKE_ARGS = {
"multimedia/mplayer-*" => "WITH_GUI=yes WITH_LANG=ru",
"multimedia/xmms-*" => "WITHOUT_MIKMOD=yes",
}
Запись имеет следующий синтаксис: название порта пишется вместе с названием категории, заключается в одиночные кавычки и должно оканчиваться на символы «-*». Затем идет «=>», после чего список параметров, который также заключается в одиночные кавычки. Как видите, элементы массива записываются через запятую.
Заключение
Вот, наверное, и все. Как видите, порты – это очень мощная и удобная система, которой нужно просто уметь пользоваться, а уметь ею пользоваться просто, как вы сегодня узнали.
Ссылки:
- http://freebsd.org
- http://freebsd.org/ports
- http://freshports.org
- http://freshmeat.net
- http://sourceforge.net
- http://freebsd.org.ru
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|