Обновление из исходного кода


Просьба обратить внимание оформление заявок tenderstyle.ru.

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

Модификации FreeBSD, выпускаемые различными разработчиками, становятся доступными на серверах FreeBSD по всему миру в течение часа (точнее, 66 минут). Основной (master) сервер FreeBSD, предназначенный для хранения исходного кода, отслеживает все изменения в этом коде и авторов этих изменений. Разработчики могут «зарегистрировать» (check in) новый исходный код, а пользователи — «захватить» (check out) последние версии с помощью системы параллельных версий (Concurrent Versions System, CVS). Система параллельных версий — подходящий инструмент для управления исходным кодом, но совершенно непригодный для его распространения. Система CVS предъявляет большие требования к системным ресурсам и полосе пропускания и, похоже, стремится вывести из строя жесткий диск сервера. Поскольку все ресурсы Проекта FreeBSD кем-то дарятся, их следует расходовать как можно бережнее. Так, в Проекте FreeBSD для распространения исходного кода вместо CVS применяется собственный протокол доступа к хранилищу CVS. Он намного быстрее, эффективнее, «легче» для серверов и, как правило, удобнее для поддержки миллионов пользователей, разбросанных по всему миру. Информация с основного CVS-хранилища исходного кода дублируется на серверах CVSup по всему миру, а пользователи подключаются к серверам и загружают исходный код с помощью программы csup.

CSUP, CVSUP, CVS и SUP?

В документации и на веб-сайтах по FreeBSD часто упоминается инструмент CVSup, применяемый для обновления исходного кода. Нужды среднего пользователя вместо CVSup обслуживает программа csup, поэтому вы можете просто игнорировать любые ссылки на программы CVSup или cvsup(1). Однако во многих документах, имеющих отношение к обновлениям, по-прежнему упоминают CVSup. Например, серверы зеркал называются серверами cvsup, примеры конфигурационных файлов располагаются в каталоге /usr/share/example/cvsup и т. д. Название CVSup являет собой комбинацию из названий CVS и sup (Software Update Protocol — протокол обновления программного обеспечения). Иногда вам будут встречаться названия этих инструментов, но знать их необязательно.

Программа csup подключается к зеркалу FreeBSD CVSup, сравнивает свою локальную копию исходного кода с версией, доступной на сервере, и копирует все изменения на локальный жесткий диск. Звучит сложно, но на самом деле процесс очень прост.

Начнем с того, что выясним — установлен ли исходный код в системе, в каталоге /usr/src. Содержимое этого каталога должно быть примерно следующим:

# ls /usr/src
COPYRIGHT         UPDATING          include           sbin
LOCKS             bin               kerberos5         secure
MAINTAINERS       contrib           lib               share
Makefile          crypto            libexec           sys
Makefile.inc1     etc               ports-supfile     tools
ObsoleteFiles.inc games             release           usr.bin
README            gnu               rescue            usr.sbin

Это корневой каталог дерева исходного кода FreeBSD, который содержит весь исходный код, необходимый для сборки программ и ядра FreeBSD. Исходный код подробно рассматривается в главе 11. При желании можно просмотреть эти каталоги и узнать, что представляет собой исходный код.

Если этот каталог пуст, значит, исходный код не установлен. Не беда. Исходный код можно инсталлировать с установочного компакт-диска. Для этого надо выполнить следующие команды, войдя в систему с правами root:

# mount /dev/acd0c /cdrom
# cd /cdrom/src
# ./install.sh all

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

Какой бы метод установки исходного кода вы ни избрали, начните с исходного кода для уже установленной версии FreeBSD. Например, компакт-диски FreeBSD 7.0 содержат исходный код для FreeBSD 7.O. Этот исходный код может пригодиться при администрировании системы, но он непригоден для выполнения обновлений — если пересобрать исходный код из FreeBSD 7.0, вы просто переустановите FreeBSD 7.O. Программа csup сравнит исходный код на диске и исходный код, доступный в Интернете, а затем загрузит код, отражающий изменения между версиями. Далее csup «приложит» эти отличия (diffs) к исходному коду на диске и приведет его в соответствие с исходным кодом нужной версии. Это намного эффективнее, чем загружать все 450 Мбайт дерева исходного кода! Если между обновлениями вышел один или два «выпуска», csup загрузит только один или два мегабайта, необходимых для изменения исходного кода на диске.

Применяя csup для обновления дерева исходного кода, надо указать, что обновлять, из какого источника и каким образом.

Выбор supfile

Программа csup использует конфигурационный файл, или supfile, определяющий параметры обновления локального хранилища исходного кода. Примеры supfiles для обновления до различных версий можно найти в каталоге /usr/share/examples/cvsup. После выбора или создания своего supfile, отвечающего вашим требованиям, можно постоянно использовать этот файл. Последняя версия каталога /usr/share/examples/cvsup содержит следующие примеры:

cvs-supfile
Позволяет загружать все хранилище исходного кода FreeBSD. Большинство пользователей в этом не нуждается, но разработчики FreeBSD находят такую возможность удобной. Этот файл необходим лишь тем, кто подготавливает собственные «выпуски» системы, включая образы дискет, компакт-дисков и т. д. Чтобы загрузить все CVS-хранилище, вместо csup следует использовать инструмент CVSup.

doc-supfile
Позволяет извлечь всю документацию FreeBSD на всех доступных языках (включая FAQ, Справочник и сопутствующие статьи).

gnats-supfile
Предназначен для тех, кто хочет иметь локальную копию базы данных с сообщениями о неполадках во FreeBSD (Problem Report (PR) database). Большинству пользователей она не нужна.

ports-supfile
Позволяет обновить дерево «портов» до последней версии (глава 11).

stable-supfile
Позволяет обновить исходный код до последней версии -stable.

standard-supfile
Позволяет получить исходный код для последней используемой версии FreeBSD. Если была установлена моментальная копия FreeBSD 7-stable, с помощью этого файла будет выполнено обновление исходного кода до последней версии FreeBSD 7-stable. Если была установлена версия -current, обновление будет выполнено до последней версии -current. Если была установлена ветка с исправленными ошибками FreeBSD 7.1, будет выполнено обновление до последней ветки -errata этой версии. (Ранее файл standard-supfile применялся исключительно для обновления версии -current.)

www-supfile
Предназначен для загрузки последней версии веб-сайта FreeBSD.

Различные компоненты, которые можно обновить с помощью csup, называются коллекциями (collections). Например, есть коллекция исходного кода, коллекция документации (doc-supfile), коллекция «портов» (port-supfile) и т. д. Многие коллекции разбиты на подкол лекции: дерево исходного кода включает в себя подколлекции для таких компонентов, как программы userland, компиляторы, ядро и т. д. При обновлении FreeBSD главный интерес представляет коллекция исходного кода.

Модификация supfile

Выбранный supfile нужно настроить в соответствии с предъявляемыми требованиями. Прежде всего, скопируйте образец supfile в /etc и откройте его в удобном редакторе. Строки, начинающиеся со знака решетки (#), представляют собой комментарии. Во всех образцах supfiles комментариев больше, чем настоящих конфигурационных записей. Большинство supfiles содержат по крайней мере шесть записей, например:

Прежде всего нужно выбрать зеркало с исходным кодом, или сервер CVSup. Полный список серверов можно найти на веб-сайте FreeBSD, в общем случае имена серверов имеют формат cvsup<номер>.<код_страны>.freebsd.org. Например, можно найти сервер cvsup15.us.freebsd.org (пятнадцатый сервер CVS на территории Соединенных Штатов), cvsup2.si.freebsd.org (второй сервер на территории Словении) и т. д. Выполните ping до каждого сервера, чтобы найти сервер с наименьшим временем отклика для вашего сегмента Интернета, или воспользуйтесь программой /usr/ports/sysutils/fastest_cvsup для автоматического определения самого быстрого сервера CVSup. Его имя нужно вписать в строку default host (хост по умолчанию), заменив CHANGE_ THIS.freebsd.org (1).

Строка default base (база данных по умолчанию) (2) определяет каталог, где будут сохраняться файлы состояния, включая список обновленных файлов. Это ускорит последующие обновления. По умолчанию эти файлы сохраняются в каталоге /var/db/sup.

Строка default prefix (префикс по умолчанию) (3) — это место, куда будет помещена выбранная коллекция. По умолчанию для этого служит подкаталог src в префиксном каталоге или, в данном случае, — /usr/src. Для установки исходного кода в каталог, отличный от /usr/src, необходимо изменить этот путь. Содержимым этого каталога управляет программа csup(1), и она может стереть все, что ей не принадлежит.

Строка default release («выпуск» по умолчанию) (4) — определяет тип хранилища, с которым производится синхронизация, в данном случае — это CVS-хранилище. Метка tag (5) — это ветка в хранилище, то есть выбранная версия FreeBSD. В таблице 13.1 приведены примеры наиболее типичных меток.

Таблица 13.1. Типичные теги версий FreeBSD

Метка Версия
RELENG_7 FreeBSD 7-stable
RELENG_6 FreeBSD 6-stable
RELENG_7_0 FreeBSD 7.0-release с исправлениями
. FreeBSD 7-current

Если разработчик удалил некоторые файлы с исходным кодом из основного хранилища FreeBSD, программа csup тоже должна удалить эти файлы из вашей системы, чтобы обеспечить идентичность копий. Строка default delete (удалять по умолчанию) (6) дает программе csup права на это. Точно так же параметр use-rel-suffix позволяет csup задействовать общий базовый каталог для нескольких версий исходного кода, не смешивая их.

Параметр compress (сжатие) (7) позволяет сократить трафик ценой увеличения нагрузки на процессор. Используйте эту возможность.

В заключение небходимо сообщить программе csup, какая коллекция должна обновляться. Флаг src-all (8) предписывает csup обновить все дерево исходного кода. В файле stable-supfile есть список закомментированных подколлекций, таких как usr.bin (содержимое каталога /usr/bin), contrib (содержимое каталога /usr/src/contrib), sys (ядро) и т. д. Теоретически можно обновить только один раздел дерева исходного кода, но в общем случае это далеко не лучшая идея. Установка программы /usr/bin из FreeBSD-current в версию FreeBSD-stable чревата непредсказуемыми сбоями, а значит, не поддерживается.

В одном supfile можно указать несколько коллекций. Например, мне нужен доступ к коллекции исходного кода для последней версии FreeBSD 7-stable. Как ответственному за документацию FreeBSD мне нужна последняя коллекция документации. Наконец, мне необходимо последнее дерево «портов», чтобы можно было устанавливать самое свежее программное обеспечение. FreeBSD содержит отдельные примеры supfiles для каждой из этих коллекций, они находятся в каталоге /usr/share/examples/cvsup. Но я не хочу запускать csup отдельно для каждой коллекции, поэтому просто перечислю их в одном файле supfile.

Полный пример supfile

Вот содержимое моего файла supfile, включая все изменения, необходимые для обновления моего исходного кода:

Замечу, что я внес в файл примера очень мало изменений. Здесь я указал ближайший сервер CVSup (1) и нужную мне версию FreeBSD (2). Особый интерес вызывают последние две записи, в которых добавлены коллекции ports-all (3) и doc-all (4). Коллекции, не относящиеся к исходному коду, не имеют «выпусков» и вариантов, которые есть у коллекций исходного кода. Значит, если указать версию RELENG_7 дерева «портов», сервер не поймет, чего от него хотят, и обновления не будут загружены. Если к названию коллекции дописать ключевое слово tag=., csup загрузит последнюю версию этой коллекции.

Блокирование обновлений: файл refuse

Мне требуется полное дерево исходного кода и полное дерево документации, но меня интересуют только отдельные части дерева «портов». Если заглянуть в каталог /usr/ports, можно увидеть подкаталоги для программного обеспечения на арабском, французском, немецком, венгерском, японском, корейском, польском, португальском, русском, украинском и вьетнамском языках. Безусловно, мне приятно, что данное программное обеспечение доступно и тем, кто говорит на этих языках, но вероятность того, что мне понадобятся эти программы, колеблется между «ничтожно мала» и «равна нулю». Чтобы предписать csup не обновлять эти каталоги, создайте файл /var/db/sup/refuse, который выглядит примерно так:

ports/arabic
ports/french
ports/gernan
...
ports/vietnamese

В файле refuse не должно быть комментариев!

Файл refuse можно создать для любых компонентов FreeBSD, однако лучше не указывать в нем что-либо из /usr/src. Если отказаться от обновления существенной системной программы, эта программа в какой-то момент будет несовместима с системой.

Система интерпретирует файл refuse на основе сопоставления подстрок. Строка sys блокирует обновление всех программ, содержащих слово sys, в том числе исходный код ядра в /usr/src/sys. Аккуратно заполняйте строки файла refuse, чтобы заблокировать только то, что вы хотите заблокировать!

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

Кроме того, в применении файла refuse есть определенный риск. Обновление только части дерева исходного кода может вызвать ошибки в процессе сборки программ. Коллекция «портов» создавалась как единое целое, и отказ от обновления ее отдельных частей может вызывать проблемы. Несмотря на то что дерево документации хорошо структурировано, проблемы бывают даже здесь. Файл refuse может стать источником многих проблем, но только вы решаете — использовать его или нет.

Обновление исходного кода системы

После создания supfile зайдите в систему с учетной записью root и запустите csup, введя следующую команду:

Первое, что мы видим, — это неприятное предупреждение (1) о том, что программа csup не смогла подключиться к длинной строке шестнадцатеричных чисел. Эта длинная строка — адрес протокола IPv6, который поддерживается операционной системой FreeBSD, но еще не поддерживается большинством интернет-провайдеров. После этого программа csup выводит имена всех файлов, подвергающихся изменениям, и в конце — сообщение Finished successfully (выполнено успешно).

Поздравляю! Теперь у вас самая свежая версия дерева исходного кода.

Получение полного дерева исходного кода с помощью csup

Программу csup можно запускать и без установленного дерева исходного кода. Программа сравнит все, что у вас есть (ничего), с тем, что требуется (все), и установит отсутствующие компоненты (полное дерево). Однако администраторы зеркал предпочитают, чтобы вы устанавливали исходный код с компакт-диска, если, конечно, он у вас имеется; они предоставляют серверы, трафик и стремятся обслужить как можно больше желающих. Полное несжатое дерево исходного кода занимает порядка 450 Мбайт дискового пространства, тогда как для обновления имеющегося дерева потребуется загрузить всего несколько мегабайт. Даже применяя сжатие, вы сильно понизите пропускную способность. Для подобного поведения есть профессиональный термин невежливость (rude).

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