Absolute OpenBSD 2ed - Глава 13 (3)

Aug 13, 2014 10:17

Минуточку! Я установил tcsh поскольку мой мозг не осиливает изучение новой оболочки. Я установил OpenLDAP и решил добавить Cyrus-SASL в качестве зависимости. Разве pkg_add действительно установит все эти пакеты в качестве зависимостей? Или один из моих младших администраторов установит дополнительный хлам? Мне действительно нужны все эти пакеты или просто следует выпороть подчинённого? OpenBSD записывает информацию о всех программных пакетах которые вы установили относительно пакетов которые были установлены в качестве зависимостей. Используйте флаг -m чтобы увидеть только пакеты установленные вручную.

# pkg_info -m
openldap-server-2.4.31p0 Open source LDAP software (server)
quirks-1.73 exceptions to pkg_add rules
tcsh-6.18.01 extended C-shell with many useful features

Так выглядит более знакомо. Видимо остальные пакеты являются зависимости.

Теперь давайте рассмотрим некоторые варианты. Для более детального описания каждого пакета добавьте флаг -d или используйте флаг -a для отображения информации всех пакетов. Если вы хотите выполнить pkg_info только для одного пакета, используйте имя пакета в качестве аргумента. Например флаг -L позволяет отобразить список файлов устанавливаемых пакетом. С флагом -a будут показаны все файлы включённые в устанавливаемые пакеты, но это приведёт к большим проблемам чем вам хотелось бы. Чтобы показать все файлы  установленные пакетом используйте флаг -L и имя пакета.

$ pkg_info -L tcsh
Information for inst:tcsh-6.18.01
Files:
/usr/local/bin/tcsh
/usr/local/man/man1/tcsh.1
/usr/local/share/nls/C/tcsh.cat
/usr/local/share/nls/de_AT.ISO_8859-1/tcsh.cat
/usr/local/share/nls/de_CH.ISO_8859-1/tcsh.cat
/usr/local/share/nls/de_DE.ISO_8859-1/tcsh.cat
...

Как вы можете видеть, пакет tcsh(1) фактически включает в себя бинарный tcsh, страницу руководства и целую кучу файлов поддержки языков (NLS). Указывая имя пакета вы можете определить какие файлы являются частью пакета. С другой стороны, иногда, вам требуется знать откуда возникает конкретный файл. Например, время от времени я просматриваю файлы сервера и вижу странные вещи. Я определяю "странные вещи" как "вещи которые я не понимаю". Если я вижу знакомый файл или программу, я проверяю какие файлы установил его пакет.

$ pkg_info -E /usr/local/sbin/pluginviewer
/usr/local/sbin/pluginviewer: cyrus-sasl-2.1.25p3-ldap
cyrus-sasl-2.1.25p3-ldap RFC 2222 SASL (Simple Authentication and Security
Layer)

Однажды я столкнулся с plugviewer, разработанный для того, чтобы помочь web-браузерам Unix запускать ПО сторонних разработчиков когда сайт требовал плагин. Я не знаю, что делает этот pluginwiewer, но, по видимому, это законная часть Cyrus-SASL. Чтобы обнаружить то о чём мне следует волноваться я должен быть внимателен [3 Если вы ничего не увидели на любом сервере, что бы вас взволновало, значит вы искали не достаточно тщательно.]. Если вам требуется производить множественные поиски файлов, как в моём случае, вы можете добиться более быстрых результатов используя pkglocatedb (/usr/ports/databases/pkglocatedb).

После инсталляции, многие пакеты показывают сообщение, которое я часто забываю читать. Чтобы отразить его ещё раз используйте pkg_info с флагом -M.

$ pkg_info -M apache-httpd
Information for inst:apache-httpd-2.2.22
Install notice:
This is the official httpd distributed by the Apache Server Project,
...

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

$ pkg_info -t
apache-httpd-2.2.22 apache HTTP server
icu4c-49.1.2p1 International Components for Unicode
quirks-1.73 exceptions to pkg_add rules
tcsh-6.18.01 extended C-shell with many useful features

Я знаю, что я не выбирал инсталляцию icu4c. У меня нет моральных возражений относительно ПО, но следует заметить, что я его не просил. Каким же образом, часть программного обеспечения, которое я не выбирал для установки не требует чего либо ещё в системе? Это по тому, что я удалил то что ему требовалось.

Деинсталляция пакетов
Для удаления ранее установленных пакетов используйте pkg_delete(1).

# pkg_delete openldap-server
openldap-server-2.4.31p0: ok
Read shared items: ok
--- -openldap-server-2.4.31p0 -------------------
You should also run /usr/sbin/userdel _openldap
You should also run /usr/sbin/groupdel _openldap

pkg_delete не запрашивает подтверждения. Она не спрашивает, уверены ли вы. Она просто стирает программное обеспечение с диска. Она так же не удаляет непривилегированных пользователей и группы созданные для поддержки программы, а так же и другие файлы принадлежащие программам. Помните, что многие пакеты требуют другие пакеты. По умолчанию, pkg_delete не удаляет зависимости пакетов. Например, мы видели, что icu4c автоматически установился как зависимость от уже удалённого пакета сервера OpenLDAP. Для автоматического удаления ненужных зависимостей используйте флаг -a. Например, чтобы полностью искоренить пакет сервера OpenLDAP и его инфраструктуру, выполните pkg_delete дважды.

# pkg_delete openldap-server
# pkg_delete -a

Это должно очистить вашу систему от всех установленных зависимостей пакетов.

Ограничения пакетов
Система пакетов является быстрой, эффективной и надёжной, и проект OpenBSD указывает её как предпочтительный способ инсталляции программного пакета. Однако, система имеет некоторые ограничения, о которых вы должны знать, в том числе проблем процесса портирования программного обеспечения и поддержка новых пакетов на старых версиях OpenBSD. Каждый релиз OpenBSD поддерживает только пакеты собранные для этого релиза, а новые пакеты строятся не для старых релизов. Вы получите все пакеты выпущенные с релизом. (Есть небольшие исключения, если вы работаете с -stable; в главе 20). Если вы работаете с OpenBSD 5.3 и пробуете установить пакеты из OpenBSD 5.4, они не будут работать.

Большинство пакетов включают ПО разработанное сторонними лицами. OpenBSD обеспечивает упаковку, но само программное обеспечение выпускается по расписанию не зависящему от OpenBSD. После того как разработчик ПО выпустит обновление ПО, пакет OpenBSD обновляется, но существует разрыв между датой релиза ПО и релизом пакета OpenBSD. Популярный пакет может обновляться в течение нескольких часов, в то время как менее популярные или редко используемые пакеты могут оставаться в старой версии несколько дней или недель. Эти пакеты не являются официально доступными до следующего релиза OpenBSD, так что вы можете запускать ПО устаревшее на несколько месяцев. Как правило, это не является проблемой (Если это исследование ветви -stable OpenBSD, обсуждаемое в главе 20).

ПРИМЕЧАНИЕ: Если пакеты у вас не работают, исследуйте сборку стороннего ПО посредством портов. Вы не получите новые версии ПО, но вы можете получить несколько различных версий.

Использование портов
Коллекция портов является набором инструментов для сборки пакетов OpenBSD. Инсталляция ПО из портов занимает больше времени чем инсталляция из пакетов, процесс более склонен к ошибкам и требует более глубокого понимания системы и настройки ПО чем при использовании системы пакетов. Однако, вы не можете получить пакеты для всевозможных ситуаций (особенно раздражает один пример, когда лицензия для некоторой части ПО не позволяет проекту OpenBSD создавать и распространять пакеты), а иногда порты являются единственным способом получения стороннего ПО на вашей OpenBSD.

Что делает порты интересными - их уровень автоматизации. С помощью одной команды порт может найти исходный код программы, скачать его, проверить его целостность, применить все необходимые патчи, необходимые для использования пользовательских функций системы, построить код для бинарных файлов, создать пакет и инсталлировать его. Если вы компилировали ПО на других платформах, вы быстро поймёте, как порты упрощяют сборку пакетов. Как и пакеты, порты работают только на версии OpenBSD для которой они выпускались. Это означает, что вы должны использовать порты коллекции OpenBSD 5.4 на OpenBSD 5.4; порты коллекции 5.5 работать не будут. Иногда может показаться, что это работает, но ПО может оказаться непредсказуемым. При обновлении OpenBSD, ожидается, что вы будете модернизировать коллекцию портов и все инсталлированные пакеты до точного соответствия версии. Вы могли бы использовать старые пакеты на новой OpenBSD до тех пор, пока вы не удалите старые разделяемые библиотеки требуемые программам.

Дерево портов
Дерево портов обычно устанавливается в /usr/ports. Если вам требуется дерево портов, вы должны вручную получить файл ports.tar.gz для вашего релиза OpenBSD и извлечь его в /usr.

ПРИМЕЧАНИЕ: Я предложил этот путь в главе 4, но вы можете получить дерево портов и сохранять файлы обновлёнными с использованием cvs(1), как рассматривается в главе 20. Посмотрите этот директорий и вы обнаружите целую кучу директорий и файлов.

Файл INDEX содержит список всех портов системы в алфавитном порядке но в машино-читаемом формате. Вы можете искать порты в этом файле, но я рекомендую использовать для этого один из обсуждаемых далее инструментов.

Makefile содержит основные инструкции для работы системы портов. Хотя он предназначен для использования make(1), вы можете много узнать прочитав сборочный файл для любого порта. Большинство действительно сложных портов находятся в директории ports/infrastructure, и все makеfiles в системе портов опираются на эту инфраструктуру.

Остальные директории содержат категории программного обеспечения. Каждая категория содержит дополнительный уровень директорий, а каждый директорий подкатегории является портом определённой части ПО.

OpenBSD, на момент написания книги, включает более 7600 портов, следовательно, эта иерархическая организация имеет жизненно важное значение для поддержания управляемого порядка. Например, следующий список содержит перечисление директория news, который содержит программы для использования и управления новостями Usenet. Это одна из самых маленьких категорий. Некоторые категории включают сотни записей, но в целом выглядят аналогичным образом.

CVS
Makefile
aub
hellanzb
yencode
leafnode
newsfetch
nn
p5-Gateway
p5-News-Article
p5-News-Newsrc
pan
plor
py-yenc
sabnzbd
sickbeard
slrn
tin
trn
ubh

Подобно директорию CVS в главном дереве портов, директорий категории CVS содержит информацию контроля версий CVS. Makefile содержит список валидных портов в категории. Используя этот Makefile, вы можете построить все порты в этой категории, хотя такое действие полезно только тогда, когда сборка пакетов производится массово. (Когда команда проекта OpenBSD строит всё дерево портов, она использует /usr/ports/infrastructure/bin/dpb.)

Спустимся ещё на один уровень. Вот порт для tcsh, один из тех которые я рекомендую для системного администратора:

$ ls /usr/ports/shells/tcsh

CVS Makefile distinfo patches pkg

Директорий CVS содержит информацию управления версиями, как и каждый директорий CVS. Makefile предоставляет конкретные инструкции по сборке tcsh на OpenBSD, в том числе о том, где получить ПО и любые патчи, как его извлечь, как могут распространяться пакеты, а так же любые настройки. Файл distinfo содержит несколько различных криптографических хэшей для загружаемого исходного кода, позволяющих избежать сборки ПО из ненадёжного исходника, а так же размер исходного файла. Новые порты содержат только хэши SHA-256.

ПРИМЕЧАНИЕ: Хотя возможно (сложно, но возможно) попасть под угрозу файла соответствующего конкретному хэшу, крайне мало вероятно, что изменённый файл исходного кода может соответствовать хэшам рассчитанным несколькими различными алгоритмами и иметь тот же размер, что и оригинальный файл. Даже если выяснить как взломать регулярный хэш, использование нескольких хэшей и размер файла делают практически невозможным компрометацию исходного файла.

Директорий patches содержит код изменений, необходимых чтобы собрать это ПО для выполнения на OpenBSD. Некоторые порты не имеют патчей; другие имеют десятки патчей.

Наконец директорий pkg описывает пакет и перечисляет файлы которые должен включать полный пакет.

Вторичные порты
Некоторые порты включают в себя другие порты. Вот содержимое порта emulators/fedora.

CVS Makefile Makefile.inc base cups motif sdl

Новые - Makefile.inc, а так же поддиректории base, cups, motif и sdl. Поддиректории это независимые порты. Эти четыре порта часто устанавливаются вместе, и в целом, реализуют поддержку эмуляции Linux в OpenBSD (описано в compat_linux(8)). Все четыре порта вызываются в общей инструкции Makefile.inc. (Дерево портов не включает многие из них, но не удивляйтесь когда найдёте их).

Дерево портов только-для-чтения
Процесс сборки портов создаёт инсталлируемый пакет и использует целую кучу временных файлов, исходные файлы и статусные файлы. По умолчанию, все эти файлы должны размещаться внутри самого дерева портов. В течение этого процесса, я призываю вас относиться к /usr/ports к дереву директорий только-для-чтения, подобно /usr/bin, /usr/lib  и прочим. Это упрощает модернизацию и выявление локальных изменений, а так же, помогает определить, что вы собрали из портов, и экономит место на разделе /usr.

ПРИМЕЧАНИЕ: Сборочные файлы портов могут варьироваться от нескольких килобайт до нескольких гигабайт, следовательно, лучше собирать порты на большом разделе. Если у вас есть не размеченное пространство диска, создайте раздел исключительно для сборки портов. Или используйте любой раздел с доступным пространством, или даже раздел NFS.

Настройте коллекцию портов, установив переменные в /etc/mk.conf. Чтобы использовать дерево портов в режиме только-чтение, установите переменные в этих директориях:
  • WRKOBJDIR Директорий, где ПО извлекается из исходника и компилируется. Эти директории могут быть удалены и повторно созданы по мере необходимости.
  • PACKAGE_REPOSITORY Директорий где размещаются завершённые пакеты. Коллекция портов собирает пакеты которые вы затем можете установить.
  • PLIST_DB Директорий в котором размещается упаковочный список пакета.
  • BULK_COOKIES_DIR Директорий для хранения статуса подготовки в течение массовой сборки пакетов.
  • UPDATE_COOKIES_DIR Директорий для хранения статуса подготовки в течение массовой сборки пакетов.
  • DISTDIR Директорий в котором хранится исходный код разработчика. Исходный код, обычно, сохраняется для повторного использования.
Если эти директории принадлежат регулярной учётной записи пользователя, вы можете собрать большую часть пакетов без привилегий суперпользователя. На одной, конкретной тестовой системе, у меня есть сотни гигабайт свободного места в /home, так что я решил разместить здесь свои директории пакетов. Вот мой /etc/mk.conf:

WRKOBJDIR=/home/ports/wrkobjdir
DISTDIR=/home/ports/distdir
PLIST_DB=/home/ports/plist
BULK_COOKIES_DIR=/home/ports/bulk_cookies
UPDATE_COOKIES_DIR=/home/ports/update_cookies
PACKAGE_REPOSITORY=/home/ports/pkgrepo

Система портов будет строить всё в /home/ports/wrkobjdir. Оригинальные файлы исходного кода разместятся в /home/ports/distdir. Система портов поддерживает различные записи в /home/ports/update_cookies и /home/ports/bulk_cookies. Завершённые пакеты размещаются в /home/ports/pkgrepo.

ПРИМЕЧАНИЕ: Если у вас есть специально выделенная машина для сборки портов, рассмотрите порелизные репозитории пакетов. Например, я могу иметь три версии OpenBSD запущенные в данное время. Сборочная машина всегда выполняет последнюю версию, но я не хочу выбрасывать свои старые пакеты, поэтом я использую директорий репозитория пакетов на подобии /home/ports/pkgrepo/5.4 для пакетов собранных на системе 5.4.

Поиск программного обеспечения
Как и в случае с пакетами, первая проблема с портами состоит в поиске программного обеспечения. (Смотрите сайт http://www.openports.se поддерживающий удобный интерфейс дерева портов). OpenBSD имеет несколько способов поиска в коллекции портов, в том числе индекс портов, ключевые слова и с помощью SQL.

Индекс портов
Файл /usr/ports/INDEX содержит список всего ПО в дереве портов, упорядоченный по категориям и в алфавитном порядке. Если у вас есть идея о названии требуемого порта, вы можете произвести поиск по файлу. Индекс описывает каждый порт в одной, разделённой строке, вот так:

gcpio-2.11|archivers/gcpio||GNU copy-in/out (cpio)|archivers/gcpio/pkg/
DESCR|The OpenBSD ports mailing-list
|archivers|
STEM->=0.10.38:devel/gettext converters/libiconv|STEM->=0.10.38:devel/
gettext|STEM->=0.10.38:devel/gettext|any|y|y|y|y

Хотя само дерево портов полагает что это весьма удобный формат, он не удобен для чтения пользователем. Чтобы превратить этот формат в более человеческий вид, перейдите в /usr/ports и выполните make print-index. (Этот процесс выводит несколько тысяч строк, так что следует перенаправить его на пейджер). Вот описание того же порта в более читаемом формате:

$ cd /usr/ports
$ make print-index | less
...
Port:
gcpio-2.11
Path:
archivers/gcpio
Info:
GNU copy-in/out (cpio)
Maint: The OpenBSD ports mailing-list

Index: archivers
L-deps: STEM->=0.10.38:devel/gettext converters/libiconv
B-deps: STEM->=0.10.38:devel/gettext
R-deps: STEM->=0.10.38:devel/gettext
...

Объявление Port предоставляет официальное название порта и версию портированного ПО. Это ПО называется gcpio и имеет версию 2.11. Path указывает категорию дерева портов и директорий, где может быть найден порт - в данном случае archivers/gcpio. Строка Info указывает краткую характеристику ПО. Это GNU версия cpio(1). Maint, или maintainer - лицо или группа отвечающая за поддержку этого ПО в дереве портов. Команда портов OpenBSD поддерживает порт gcpio. Наиболее поддерживаемые порты имеют индивидуального мантейнера, а не список рассылок.

Последние три записи описывают другое ПО, необходимое данному. Строка L-deps содержит список разделяемых библиотек, B-deps 0 список ПО необходимого для сборки порта, а R-deps список зависимостей времени исполнения порта.

Что хорошего можно от этого получить? Предположим, что вы поднимаете web-сервер Apache 2. Вы можете произвести поиск по INDEX для портов начинающихся с "apache".

$ grep -i ^apache INDEX
...
apache-httpd-2.2.20p1|www/apache-httpd||apache HTTP server|www/apache-httpd/
pkg/DESCR|The OpenBSD ports mailing-list
|www net|
apr-util-*-!ldap:devel/apr-util converters/libiconv devel/pcre|STEM->=1.21:
textproc/groff|converters/libiconv|any|y|y|y|y

Первые три записи (здесь не показанные) портов, и связанные с Apache не являются ПО web сервера. Четвёртая строка собственно и является нашим портом. Однако, сбор подобной информации из файла индекса является весьма ограниченным. Если вы не знаете названия ПО, или названия пакета OpenBSD, вам будет затруднительно найти порт. В этом случае, следует обратиться к одному из методов описанных в следующих разделах.

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

$ make search key=apache

На моей системе выводится 62 результата. Возможно вам придётся просмотреть несколько страниц, но вы найдёте то что искали. Так же возможно, что вам придётся попробовать несколько ключевых слов для конкретного пакета, т.к. некоторые ключевые слова не имеют попаданий, а другие выводят слишком много результатов.

Поиск с помощью SQL
Пакет sqlports позволяет создать базу данных из файла INDEX, в которой можно производить поиск на основы высокопроизводительных критериев SQL. Например, вы хотите знать все порты зависящие от libiconv и expat. В этом случае sqlports очень вам поможет. Установите его из портов или пакетов и он автоматически создаст базу данных в /usr/local/share/sqlports из файла INDEX, а затем используйте sqlite3 OpenBSD обратитесь к базе данных.

Я не стану обучать вас использованию SQL [4], но в качестве примера покажу, как с помощью sqlports найти порт, название которого включает строку "apache" (можно строить гораздо более сложные запросы чем в моём примере):

$ sqlite3 /usr/local/share/sqlports
sqlite> select fullpkgname from ports where fullpkgname like '%apache%';
apache-couchdb-1.0.1p2
apache-ant-1.8.2p3
apachetop-0.12.6
apache-httpd-2.2.22
modsecurity-apache-1.9.3p5
p5-Apache-ASP-2.61p0
p5-Apache-DB-0.14p3
...

Сервер Apache HTTPD выводится четвёртой строкой, но тут присутвует и ещё десяток портов. Имена начинающиеся с p5- являются модулями Perl.

продолжение следует...

absolute openbsd, bsd, Книги

Previous post Next post
Up