Обновление установленных «портов»


Если дерево «портов» обновляется с помощью программы csup, то любое программное обеспечение, установленное из «портов», будет иметь самый последний номер версии. Но как быть с приложениями, установленными раньше? Операционная система следит за зависимостями между дополнительными пакетами, и обновление одной программы часто влечет за собой обновление десятков других программ. Справиться с таким обновлением вручную будет очень нелегко. Нельзя ли просто сказать: «Обнови-ка мне Apache», — и дать возможность системе FreeBSD самой разобраться с зависимостями? Для решения этой задачи у FreeBSD есть два инструмента — portupgrade(8) и portmaster(8).

Программа portupgrade — это оригинальный инструмент обновления «портов» FreeBSD. Она написана на языке Ruby и поддерживает работу с базами данных информации, получаемой из дерева «портов».

Программа portmaster — это сценарий командного интерпретатора, способный решать наиболее типичные задачи управления программным обеспечением без привлечения дополнительного программного обеспечения или баз данных, не охватывая при этом все возможные случаи. Мы поговорим о программе portmaster, хотя она и не столь всеобъемлюща, как программа portupgrade. Она намного проще, следовательно, при работе с ней у вас будет меньше шансов ошибиться.

Начальная установка portmaster

Загляните в /usr/ports/potrs-mgmt/portmaster. Этот «порт» устанавливается обычной командой make install clean. После установки запустите команду роrtmaster -L, чтобы увидеть, что скажет программа об установленных «портах». Это может занять несколько минут, поэтому я рекомендую перенаправить вывод команды в файл и после проанализировать его в спокойной обстановке. (Можно также использовать команду portmaster -l; она работает быстрее и предоставляет информацию о зависимостях, но не отмечает устаревшие «порты».)

# portmaster -L > portmaster.out

Программа portmaster делит «порты» на категории в зависимости от взаимоотношений между ними, учитывая программное обеспечение, которое требуется для нормальной работы каждого пакета. Например, я пишу эту книгу в OpenOffice.org. Для корректной работы ООо требуются система X Window System, различные программы с графическим интерфейсом, библиотеки системы безопасности, разнообразные шрифты и кухонная мойка с утилизатором отходов мощностью от 5.5 лошадиных сил. Ни одна из этих программ не является частью базовой системы FreeBSD, и если их не установить, ООо не сможет работать. Поэтому эти программы перечислены в ООо как зависимости. В свою очередь, все эти программы определяют ООо как зависимую программу. Такая структура взаимоотношений позволяет программе portmaster строить дерево зависимостей между «портами», и при обращении к «портам» portmaster использует терминологию деревьев.

Дерево «портов» начинается с корня (root ports), «порты», находящиеся в корне, сами не имеют зависимостей и от них не зависят другие программы. Например, сама программа portmaster не зависит от какого-либо другого программного обеспечения, кроме себя самой, и ни одна программа в системе не требует наличия portmaster. К корню дерева «портов» обычно относят еще несколько программ, таких как bash, sudo и zip.

«Порты», составляющие ствол дерева (trunk ports), не имеют зависимостей, но они необходимы для других программ. В эту категорию попадают многие разделяемые библиотеки для работы с графикой, шифрованием и математическими функциями, а также различные языки программирования и сценариев. Например, если вы работаете с языком Perl, то базовая установка Perl наверняка может рассматриваться как «порт» из ствола дерева.

Выше на дереве находятся ветви (branch ports). «Порты» в ветвях сами зависят от других программ и от них зависят другие программы. Типичными представителями «портов» в ветвях дерева являются Java, X Window System и механизмы отображения веб-броузера.

«Порты» в листьях (leaf ports) — это концы ветвей дерева, они зависят от других программ, но ни одна программа не зависит от них. Типичные представители листьев дерева «портов» — это текстовые редакторы, крупногабаритные пакеты офисных приложений, веб-броузеры, программы обмена сообщениями в Интернете и т. д.

При обновлении «портов» изменение в стволе или в ветви дерева «портов» может затронуть его листья. Неудивительно, если при обновлении графической библиотеки до версии, несовместимой с предыдущей, перестанут работать все программы, использующие эту библиотеку.

Идентификация ненужного программного обеспечения

Часто многие из нас устанавливают программное обеспечение только на время, но, наигравшись с ним, забывают удалить его. При обновлении есть смысл удалить эти пакеты, чтобы не тратить время на их модернизацию. Это как раз тот самый момент, когда сведения о «портах» в корне и листьях дерева оказываются особенно ценными.

Список «портов», который выводит portmaster, начинается с корня дерева. Пройдите по списку и отыщите программы, которые вам больше не нужны. Если вы не уверены, что сможете отыскать пакет, запустите команду whereis имя_пакета, чтобы определить, где находится «порт». Ознакомьтесь с описанием пакета, чтобы освежить память, и, если вам не удалось распознать программу или вы вспомнили, что она вам не нужна, можете деинсталлировать ее. Если это окажется что-то важное, всегда можно выполнить повторную установку. Проделайте то же самое для «портов»-листьев в конце списка. К чему обновлять то, что не нужно?

При вызове с ключом программа portmaster деинсталлирует «порт» и все его зависимости, если они не требуются другим «портам». Например, после деинсталляции OpenOffice.org у меня появится масса ненужных «портов». Команда portmaster -e openoffice.org-2.2.0 удалит ООо и все «порты», необходимые для ООо, но не нужные другим программам.

Идентификация и обновление программного обеспечения

Кандидаты на обновление в выводе portmaster(8) выглядят примерно так:

===>>> linux_base-fc-4_8
        ===>>> New version available: linux_base-fc-4_9

На моем ноутбуке в настоящий момент установлен пакет linux_base версии 4_8, и программа обнаружила, что доступна версия 4_9. Стоит ли обновляться при таком незначительном изменении в номере версии? Может, стоит, а может, и нет. Всегда можно заглянуть в хронологию FreeBSD CVSWeb данного пакета и посмотреть, что изменилось. Если в этой версии были исправлены критические уязвимости, то почти наверняка следует обновить программу, а если изменения незначительные, нет смысла возиться с обновлением. В любом случае решать вам.

Если вы решили выполнить обновление, просто передайте программе portmaster имя «порта», который требуется обновить. Можно передать только имя «порта», полный путь к базе данных пакетов для этого «порта» или использовать другие способы, с которыми можно ознакомиться на странице руководства portmaster(8).

# portmaster linux_base-fc-4_8

Сначала portmaster отыщет все зависимости, которые необходимо обновить в рамках данного обновления, и запустит задания по обновлению этих «портов». Также будет запущена загрузка distfiles для обновляемого «порта» и его зависимостей. В первую очередь portmaster выполнит начальные этапы процесса сборки, требующие взаимодействия с пользователем. Программа постарается получить от вас всю необходимую информацию в самом начале, чтобы потом вы могли отойти с уверенностью в том, что процесс обновления не остановится на полпути, ожидая, пока вы нажмете клавишу Enter.

Всегда есть риск, что процесс обновления завершится с ошибкой. Если установить новую версию невозможно без деинсталляции старой, в случае ошибки можно остаться и без старой, и без новой версии программы. Однако portmaster не просто деинсталлирует «порт»; программа создает резервную копию пакета старой версии. Эта резервная копия удаляется только в случае успешного завершения процесса обновления, но вы можете запретить удаление, использовав ключ -b. Резервные копии сохраняются в каталоге /usr/ports/packages/All. К тому же, если обновляется целая серия пакетов, portmaster сохраняет резервные копии всех зависимых пакетов до полного окончания процесса обновления. Если попытка обновить OpenOffice.org с помощью portmaster потерпит неудачу, потребуется восстановить прежнюю версию OpenOffice.org вместе со всеми зависимостями. Программа portmaster приложит максимум усилий, чтобы не оставить вас с малопригодной смесью старого и нового программного обеспечения.

Я предпочитаю сохранять резервные копии до тех пор, пока не буду уверен, что новая версия программы работает именно так, как мне надо, но некоторые читатели поумнее меня не нуждаются в таких вот ремнях безопасности.

Принудительная пересборка

portmaster не в состоянии идентифицировать все причины, по которым «порт» следует обновить или переустановить. Например, на моем тестовом сервере присутствует последняя версия программы sudo(8). Если проверить список разделяемых библиотек, необходимых программе, можно заметить кое-что любопытное:

Помните, выше в этой главе библиотеки libutil.so.5 (1) и libc.so.6 (2) были идентифицированы как устаревшие? Если бы я по неопытности стер их, программа sudo перестала бы работать. Теперь мне нужно отыскать все программы, требующие наличия этих библиотек, portmaster не понимает, что нужно обновить программу sudo, но я-то вижу, что ее необходимо переустановить. Я мог бы перейти в каталог «порта» и выполнить команду make deinstall && make reinstall, но есть способ гораздо проще:

# portmaster sudo

Эта команда вынудит portmaster пересобрать sudo(8). В процессе сборки sudo автоматически свяжется с более новой библиотекой, удалив одну зависимость от этого устаревшего файла. Если то же самое надо сделать с листом дерева «портов», то можно использовать ключ -f, который предписывает программе portmaster(8) пересобрать все зависимости, и неважно — требуется это или нет.

Пересборка восходящих зависимостей

Программа portmaster автоматически обновляет программы, от которых зависит программа, требующая обновления, но от нее можно также потребовать пересобрать все программы, которые зависят от обновляемой программы. Это запросто может вызвать пересборку большого числа «портов», особенно когда речь заходит о критически важных библиотеках. Используйте ключ -r, чтобы потребовать от portmaster проверить как нисходящие, так и восходящие зависимости.

Внимание! Полный вперед!

portmaster с ключом попытается обновить все, что сочтет нужным. С комбинацией ключей -af portmaster выполнит пересборку всех «портов».

Изменение зависимостей

Бывает, что один «порт» нужно заменить другим. Предположим, мне захотелось заменить Emacs 20 на Emacs 21. Программа portmaster может выполнить это самостоятельно, если задать ей ключ -o. В качестве аргументов этого ключа следует указать новый «порт» и старый, установленный «порт» именно в таком порядке:

# portmaster -о editors/emacs20 editors/emacs21

Это не совсем типичная ситуация, но после нескольких таких изменений, произошедших в течение последних лет, я рад, что эта возможность есть.

Пропуск «портов»

Иногда отказ от обновления «порта» действительно необходим, даже если при этом возникает рекурсия. Например, когда я выполняю сборку OpenOffice.org, мой ноутбук занят этим целый день. Мне бы не хотелось, чтобы обновление OpenOffice.org происходило в результате обновления другого компонента; я предпочитаю обновлять этот пакет самостоятельно.

portmaster проверяет каждый каталог в базе данных пакета на наличие файла +IGNOREME. Если этот файл присутствует, portmaster не будет обновлять такой пакет в ходе обновления других пакетов.

# cd /var/db/pkg/openoffice.org-2.0.20060818
# touch +IGN0REME

Теперь, даже если я начну обновлять библиотеку, от которой зависит OpenOffice.org, и прикажу программе portmaster обновить все программы, зависящие от этой библиотеки, portmaster не станет обновлять ООо. В результате подобного обновления зависимостей ООо может выйти из строя, но выбирая этот путь, я иду на риск сознательно.

Другие особенности portmaster

Настоятельно рекомендую прочитать страницу руководства portmaster(8), чтобы ознакомиться с функциями, предлагаемыми этой программой для решения ваших проблем. Вы можете возобновить прерванную сборку; посмотреть, что сделала бы программа portmaster, если бы вы предложили ей обновить систему; сохранить пакеты в вашем репозитарии пакетов и т. д. Если у вас возникли проблемы с обновлением «порта», portmaster наверняка сможет предложить решение.

Уменьшение размера дерева «портов»

С течением времени растет и дерево «портов». Отчасти это хорошо, так как в дереве появляются новые «порты». Отчасти это необходимое зло, так как в дереве сохраняются устаревшие версии программ, которые вы только что обновили. В остальном этот рост было бы желательно предотвратить, так как в системе остаются файлы, которые когда- то были необходимы, а теперь уже не нужны. Например, когда я обновил пакет до версии Fedora Core 4, файлы пакета Fedora Core 3 стали ненужными. Поиск и удаление ненужных файлов позволит сэкономить гигабайты дискового пространства, которое, между прочим, не бесконечно. Хотя portmaster предоставляет возможность удаления ставших ненужными файлов distfiles, тем не менее предварительно стоит выполнить глобальный поиск таких файлов.

Программа portmaster может отыскивать устаревшие файлы distfiles. Если запустить команду portmaster --clean-distfiles, portmaster(8) идентифицирует каждый устаревший файл distfile и предложит удалить его. Если запустить команду portmaster --clean-distfiles-all, portmaster(8) молча удалит устаревшие файлы distfiles.

Другая распространенная проблема — когда после установки «порта» не выполняется команда make clean. Нередко я хотел бы иметь простой доступ к исходному коду для ознакомления с программой, поэтому не чищу свои «порты». В конечном счете я забываю об этом, а ставшие ненужными файлы продолжают занимать дисковое пространство. Работая над этим разделом, я обнаружил, что забыл удалить временные файлы после последней сборки OpenOffice.org; неудивительно, что у меня на диске так мало свободного места! «Порты» операционной системы FreeBSD легко поддаются массовой чистке; достаточно зайти в каталог /usr/ports и запустить команду make clean NOCLEANDEPENDS=yes. В результате будет выполнен рекурсивный обход дерева «портов» и для каждого из них будет исполнена команда make clean, которая удалит каждый рабочий каталог.

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

Комментарии запрещены.