[OpenBSD]

[FAQ-Index] [Глава 4 - Установка OpenBSD 5.2] [Глава 6 - Сеть]

5 - Сборка системы из исходников


Содержание



5.1 - OpenBSD's Flavors

Существует три flavors (разновидности) OpenBSD: Графически, разработка этих версий выглядит приблизительно так:
       ,------o-----------o----X                    4.9 Stable
       |      .           .
       |      .    ,------o---------o----X          5.0 Stable
       |      .    |      .         .
       |      .    |      .    ,----o----------o--> 5.1 Stable
       |      .    |      .    |    .          .
       |      .    |      .    |    .    ,-----o--> 5.2 Stable
       |      .    |      .    |    .    |     .
       |      .    |      .    |    .    |     .
 -->4.9Rel----->5.0Rel----->5.1Rel----->5.2Rel----> Current

          Время --->

Ветка -current используется для разработки следующего релиза -release OpenBSD. Каждые шесть месяцев, когда выходит новая версия OpenBSD, -current замораживается и становится релизом -release: официальной точкой в дереве исходных кодов. Исходники в релизах никогда не меняются; это то, что находится на CD и FTP серверах.

Ветка -stable базируется на коде из -release и является ответвлением основной линии разработки OpenBSD. Когда в -current вносятся серьёзные исправления, они переносятся (back ported) в -stable; по этой причине -stable также известна, как »patch-branch«. На приведённой иллюстрации вертикальные пунктирные линии обозначают исправления ошибок, включаемые в ветви -stable. Следует также отметить, что ветвь 4.9-stable подходит к концу вместе с 5.1-release, а 5.0-stable заканчивается с 5.2-release -- старые релизы поддерживаются обычно до появления двух последующих. Поддержка старых релизов отнимает время и ресурсы, в то время как мы продолжаем поддерживать старые релизы, мы могли бы сконцентрироваться на новых возможностях. Ветка -stable целенаправленно поддерживается легко перестраиваемой из -release той же версии (например переход от 5.2-release к 5.2-stable).

Ветка -stable - это тот же -release плюс патчи, находящиеся на странице errata (пер. с англ. – «опечатка, описка»), и некоторые изменения, не входящие в список errata. Обычно на практике -stable работает аналогично -release’у, на котором он и основан. Если man страницы должны быть изменены, они, возможно, не будут занесены в -stable. Другими словами, поддержка нового устройства НЕ будет добавлена в -stable и, скорее всего, поддержка новых возможностей не будет добавлена.

Стоит отметить, что обозначение "-stable" не подразумевает то, что -current ненадежен. Скорее, -current изменяется и развивается, тогда как поведение и API -stable не изменяются, и вам не придется изучать заново свою систему, или изменять конфигурационные файлы, или испытывать проблемы с установкой дополнительных приложений в систему.

В действительности, так как мы надеемся непрерывно совершенствовать OpenBSD, вы можете даже обнаружить, что -current надежней чем -stable, более безопасна, и, конечно же, включает новые функции. Можно сказать, что -current является »лучшей« версией OpenBSD.

Большинству пользователей рекомендуется использовать либо -stable либо -release. Как уже было сказано, много пользователей используют -current, и, что очень важно, некоторые делают это для обнаружения ошибок и тестирования новых возможностей. Несмотря на это, если вы не знаете, как правильно объяснить, определить и бороться с проблемой, не говорите себе (или еще кому-либо), что вы «помогаете проекту» используя -current. «Это не работает!» -- не очень полезное сообщение об ошибке. Сообщение: «Недавние изменения, внесенные в драйвер pciide, нарушили совместимость с моим Slugchip-based IDE интерфейсом, dmesg работающей и нарушенной системы следующий …» -- может помочь разработчикам (разумеется оно должно быть на английском языке).

Бывает, что обычные пользователи хотят быть в «центре событий» и используют -current. Обычно, объяснением этому является то, что этот пользователь имеет устройство не поддерживаемое -release (и соответственно –stable), или хочет использовать новую возможность в –current. В этом случае выбор падает либо на -current, либо на то, чтобы не использовать это устройство, и, обычно, -current оказывается «меньшим злом». При этом пользователю не следует рассчитывать на детальную помощь от разработчиков.

Snapshots

Между формальными релизами OpenBSD, на FTP серверах выкладываются промежуточные релизы (snapshots). Под промежуточным релизом (snapshot) подразумевают откомпилированное дерево исходного кода на момент его копирования, для конкретной платформы. Запомните, на некоторых платформах snapshot'ы приходится ждать по нескольку дней, прежде чем они будут доступны. Так же, вам никто не может пообещать, что snapshot'ы будут полностью рабочими или вообще установятся. Частые изменения требуют проверки, что может вызвать задержки при выпуске snapshot'a. Под некоторые платформы snapshot'ы выпускаются почти каждый день, под другие они выходят значительно реже. Если вы решили использовать -current, то самый последний snapshot это то, что вам нужно, а также обновление до самого свежего snapshot'a необходимо для того, чтобы скомпилировать -current из исходных текстов.

Иногда спрашивают о том, существует ли возможность получить точную копию кода, который использовался при создании snapshot'а. Ответ на этот вопрос - Нет. Во-первых, для этого нет никаких серьезных причин. Во-вторых, snapshot'ы собираются по желанию, как позволяет время и как позволяют ресурсы. На быстрых платформах за день может быть создано несколько snapshot'ов, в то время как на медленных платформах их создание может занять несколько недель. Предоставление тэгов или отметок для snapshot'ов в дереве исходных кодов будет весьма непрактичным. В третьих, срезы (snapshots) часто содержат экспериментальный код, ещё не отправленный в дерево исходников.

Upgrade в сравнении с Update

Вы будете часто встеречаться с терминами "upgrading" (модернизация) и "updating" (обновление) при установке OpenBSD. Хотя эти слова схожи, применительно к OpenBSD необходимо видеть разницу в их использховании в данном случае.

Upgrading (модернизация) - процесс установки новой версии OpenBSD, с новой функциональностью. Например, переход от v5.1 к v5.2, или переход от среза (snapshot) 12 июня к срезу (snapshot) 20 июня. При модернизации (upgrading), как правило, вы должны ознакомиться с Following -current or the Upgrade guide (при смене релиза) для проведения необходимых изменений для запуска новой версии OpenBSD.

Updating (обновление) - процесс применения патчей к системе для улучшения качества работы БЕЗ изменения ее основной функциональности или совместимости на уровне бинарников. Обычно это выполняется наложением патча на исходный код или используя stable . Когда вы обновляете "update" вашу систему, она переходит от -release до -stable (или -release с наложенными патчами) той же самой версии, что и был изначально сам релиз. К примеру, 5.2-release стал 5.2-stable. В дальнейшем вы можете обновить его до более новой -stable той же самой версии. Обычно процесс обновления update более сложен, так как надо менять файлы /etc или другие конфигурационные системные файлы.

Таким образом, вы можете установить систему (к примеру, 5.1-release) используя CD, в дальнейшем обновить систему до 5.1-stable, а затем модернизировать (upgrade) до версии 5.2-release с CD, и, опять-таки, в дальнейшем обновить (update) перед модернизацией до следующего release.

Поддерживайте соответствие (синхронизация)

Важно понять, что OpenBSD - это целая операционная система, которую необходимо рассматривать в целом, а не как ядро плюс набор утилит. Вы должны быть уверены, что ваше ядро, "пользовательская часть" (вспомогательные программы и файлы) и дерево портов синхронизированы, иначе могут произойти неприятные вещи. Говоря по-другому (потому что люди продолжают совершать эту ошибку), вы не сможете запустить новейшие порты на старой системе или пересобрать ядро из -current и ожидать, что оно заработает на пользовательской части от release. Да, это означает, что вам необходимо обновлять свою систему, если вы хотите запустить новые программы, которые были добавлены в дерево портов сегодня. Извините, но еще раз, OpenBSD имеет ограниченные ресурсы.

Также необходимо понять, что процесс обновления поддерживается только в одном направлении: от старых версий к новым, и от -stable до -current. Вы не можете запустить 5.2-current (или snapshot), а потом решить, что для вас это слишком опасно, и откатиться до 5.1-stable. Единственный официальный способ вернуться к старой версии - переустановить систему с нуля. Вы вольны выбирать любой другой путь но, в этом случае не ожидайте поддержки от команды разработчиков OpenBSD.

Да, это также означает, что вы должны хорошо подумать, прежде чем переходить на -current.

5.2 - Зачем собирать систему из исходников?

На самом деле, весьма вероятно, что вам это не потребуется.

Несколько причин, почему НЕ нужна перекомпиляция:

Несколько причин, по которым у вас действительно может возникнуть желание или необходимость компиляции из исходных кодов:

Разработчики OpenBSD регулярно выкладывают новые сборки, основанные на коде ветки -current. С большой долей вероятности этого вполне должно хватить для использования ветки -current.

Наиболее распространенная причина сборки из исходников — следование ветке -stable, для которой это единственная поддерживаемая возможность.

Wird -current aus dem Quelltext übersetzt, so ist es SEHR empfehlenswert, dies nur auf einer Maschine zu machen, auf deren Konsole man uneingeschränkten Zugriff hat. Es wird Zeiten im Entwicklungsprozess geben, in denen die Diskrepanz zwischen deinem neuen Betriebssystemkern und deinem alten Userland dazu führt, dass das System über das Netzwerk nicht ansprechbar ist. Dies ist kein Problem mit einem korrekt erzeugten -stable.

5.3 - Сборка OpenBSD из исходников

5.3.1 - Введение в процесс сборки

Сборка OpenBSD из исходных текстов включает в себя последовательность из нескольких шагов: Существует пара дополнительных шагов, которые некоторые пользователи возможно захотят выполнить, в зависимости от назначения (целей) сборки и того, установлен ли X:

5.3.2 - Установка или Upgrade до самой последней версии

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

У вас есть Конечная цель Обновить бинарник до затем ...
старый -release новый release новейший release Все готово!
-release -stable новейший release загрузить и собрать -stable
старый -stable -stable новейший release загрузить и собрать -stable
-release -current последний Snapshot (optional) загрузить и собрать -current
старый -current -current последний Snapshot (optional) загрузить и собрать -current

Рекомендуется, что бы вы устанавливали бинарники по средствам функции "Upgrade", которая есть на установочном носителе. Если это не представляется возможным вы можете распаковать бинарники как описано здесь. К сожалению вы должны будете сделать полный процесс обновления, включая создание пользователей и внесение других изменений в каталог /etc.

5.3.3 - Загрузка исходников

Исходные коды OpenBSD находятся под управлением системы версий CVS, поэтому cvs(1) также может быть использован и для получения исходного кода вашей локальной машины для дальнейшей компилиции. Это может быть выполнено с использованием AnonCVS-сервера (компьютера с публично доступной копией всего репозитория CVS проекта OpenBSD) или с локального CVS репозитория с помощью CVSup, или при помощи CVSync, которая доступна в виде пакета. CVSup также может использоваться в режиме "checkout", что мы рассматривать в данном руководстве не будем. Если у вас несколько машин, и вы хотите сохранить дерево исходного кода, вы можете настроить синхронизацию локального CVS-репозитария при помощи CVSup или CVSync.

После того, как вы выбрали, какой AnonCVS сервер вы будете использовать, следует загрузить ("checkout") дерево исходников, после чего сохранить и обновиться ("updates") для поддержания актуальных файлов в вашем локальном дереве.

Команды CVS(1) имеют много опций, некоторые из них необходимы для получения и обновления дерева исходных кодов. Некоторые команды могут привести к неполадкам. Важно понимать, что и в каком направлении вы делаете.

В случае -current

Предположим, что мы используем какой-нибудь AnonCVS сервер, anoncvs@anoncvs.example.org:/cvs. Мы также предполагаем, что вы используете sh(1) как командную оболочку, если вы используете другую оболочку, некоторые команды могут отличаться.

Для загрузки -current CVS дерева исходиков:

    # cd /usr
    # export CVSROOT=anoncvs@anoncvs.example.org:/cvs
    # cvs -d$CVSROOT checkout -P src

После загрузки вы можете его обновить:

    # cd /usr/src
    # export CVSROOT=anoncvs@anoncvs.example.org:/cvs
    # cvs -d$CVSROOT up -Pd
В случае -stable
Если вы хотите загрузить альтернативную "ветвь" дерева, отличную от -stable, используйте для этого опцию -r:
    # cd /usr
    # export CVSROOT=anoncvs@anoncvs.example.org:/cvs
    # cvs -d$CVSROOT checkout -rOPENBSD_5_2 -P src
Это позволит получить исходники ветки OPENBSD_5_2, которая также известна как "Patch branch" или »-stable«. Подобным образом вы можете обновить код:
    # cd /usr/src
    # export CVSROOT=anoncvs@anoncvs.example.org:/cvs
    # cvs -d$CVSROOT up -rOPENBSD_5_2 -Pd
Фактически, CVS достаточно хорош для использования "тегов" в проверенной файловой системе, поэтому вам не нужно помнить часть командной строки -rOPENBSD_5_2, он сам будет помнить об этом, пока вы не очистите его или не установите новый тег, используя опцию -A для обновления. Однако лучше предоставлять больше информации при помощи опций для CVS.

Пока рассмотрены только »src« исходники, в то время как вам предстоит сделать те же самые действия для »xenocara« и »ports«. Поскольку все части OpenBSD должны быть синхронизированы, то все деревья исходников, которые вы используете, следует извлечь и обновить вместе. Возможно комбинирование (показано для -stable):

    # export CVSROOT=anoncvs@anoncvs.example.org:/cvs
    # cd /usr
    # cvs -d$CVSROOT checkout -rOPENBSD_5_2 -P src ports xenocara
В любом случае, обновления должны затрагивать каждую директорию.

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

Предварительная подготовка деревьев: src.tar.gz, sys.tar.gz

Несмотря на то, что вы можете загрузить полное дерево исходников с AnonCVS-сервера, зачастую вы можете сэкономить много времени и трафика посредством предварительной загрузки дерева с исходными файлами или с компакт-диска OpenBSD или с FTP-сервера. Это особенно актуально, если вы работаете с веткой -stable, так как между ней и -release относительно немного различий.

Для распаковки исходников с CD в /usr/src (предполагая что CD смонтирован в /mnt):

    # cd /usr/src; tar xzf /mnt/src.tar.gz
    # cd /usr; tar xzf /mnt/xenocara.tar.gz
    # cd /usr; tar xzf /mnt/ports.tar.gz
Исходные коды, которые доступны для загрузки с FTP серверов разделены на два файла для уменьшения времени скачивания для тех, кто желает работать только с одной частью дерева исходников. Файл sys.tar.gz содержит в себе файлы для сборки ядра, а src.tar.gz содержит все другие "userland" утилиты за исключением дерева портов и исходников X11. Тем не менее, в большинстве случаев вам будут нужны оба эти файла. Файлы src.tar.gz и sys.tar.gz находятся в /usr, применение загруженных файлов:
    # cd /usr/src
    # tar xzf ../sys.tar.gz
    # tar xzf ../src.tar.gz
    # cd /usr
    # tar xzf xenocara.tar.gz
    # tar xzf ports.tar.gz

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

Советы при работе с CVS

Как уже отмечалось ранее, некоторые опции являются обязательными для получения коректного дерева src-исходников OpenBSD. Вышеописанная опция »-P« одна из них: Она удаляет ("prunes") пустые директории. За эти годы, директории создавались и удалялись в дереве исходных кодов OpenBSD, а иногда имена старых каталогов сейчас используются в качестве имён файлов. Без опции »-P« ваше новое отлаженное дерево НЕ БУДЕТ успешно скомпилированно.

Аналогично с опцией »-d« в команде "update" - она создаёт новые каталоги, которые могут быть добавлены к дереву, при начальной отладке. Для успешного обновления не забудьте использовать опцию -Pd.

Опытные CVS пользователи могут возразить, почему в данном примере использовался CVSROOT, поскольку cvs(1) запишет местоположения CVS сервера в проверенном дереве. Это верно, однако есть достаточно времени, где каждый может отменить anoncvs сервер по умолчанию. Многие люди рекомендуют всегда указывать хранилище прямо. Стоит так же отметить, переменная окружения CVSROOT может быть использована непосредственно в cvs(1) только в том случае, если ничто другое её не перезаписывает (т.е., без неё cvs(1) выдаст ошибку), тогда как определение её в командной строке cvs(1) презапишет все другие значения.

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

    $ more ~/.cvsrc
    cvs -q -danoncvs@anoncvs.example.org:/cvs
    diff -up
    update -Pd
    checkout -P
Этот файл будет заставлять cvs(1) использовать сервер anoncvs@anoncvs.example.org:/cvs, исключая обычно ненужный вывод (»-q« обозначает »quiet«, т.е. тихий) для всех операций, "cvs up" команда по умолчанию с использованием -Pd, "cvs diff" по умолчанию для обеспечения "unified diffs" из-за опции »-u« и "cvs checkout" будет использовать опцию »-P«. Хотя это удобно, но если вы забудете, что этот файл существует или попытаетесь выполнить команды, которые вы привыкли использовать на машине без этого файла, у вас могут возникнуть проблемы.

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

5.3.4 - Сборка ядра

В данном руководстве мы будем рассматривать сборку только стандартных ядер (GENERIC или GENERIC.MP). Чаще всего это именно то, что вам необходимо. Не следует приступать к сборке специализированного ядра, если вы не освоили сборку стандартного.

Понятно, ядро СИЛЬНО связано с аппаратной частью системы. Исходный код ядра находится в каталоге /usr/src/sys. Некоторая часть кода ядра OpenBSD используется для всех поддерживаемых платформ, другие специфичны для конкретных архитектур. Если вы посмотрите деректории /usr/src/sys/arch/ некоторые вещи могут вас немного смутить -- к примеру, здесь есть каталоги mac68k, m68k и mvme68k. В данном случае, системы mvme68k и mac68k работают с использованием одного и того же процессора, однако данные системы различаются весьма сильно, что потребовало использования сильно отличных друг от друга ядер (в дизайне компьютера есть еще много чего кроме процессора!). Тем не менее, некоторые части исходников ядра являются общими, потому часть общего кода ядра помещена в директорию m68k. Если вы просто собираете ядро, без изменения базовой архитектуры, вам не придется работать с каталогом m68k, вы будете работать исключительно с архитектурно-ориентированным каталогом, например mvme68k.

Сборка ядра осуществляется на основе конфигурационных файлов, которые находятся в каталоге /usr/src/sys/arch/<your platform>/conf. Сборка ядра производится с помощью программы config(8), и в итоге скомпилированное ядро будет находится в каталоге /usr/src/sys/arch/<your platform>/compile/<KernelName>. Пример для платформы i386:

# cd /usr/src/sys/arch/i386/conf
# config GENERIC
# cd ../compile/GENERIC
# make clean && make
    [... jede Menge Ausgabe ...]
# make install
Замените "i386" в первой строке на то, что необходимо. Узнать какое название платформы в вашем случае, можно используя исполнив на вашей платформе команду machine(1), следовательно, в любом случае вы можете использовать следующую команду cd /usr/src/sys/arch/`machine`/conf вместо указанного в первой строке.

На данном этапе мы должны перезагрузить компьютер для использования нового ядра. Заметим, что новое ядро следует запустить перед следующим этапом, хотя, если речь идет об обновлении до очередного среза (snapshot-а), это не важно. Однако иногда изменения API приводят к тому, что старое ядро не может исполнять новые приложения, новое ядро будет запускать старые приложения.

Помните, что для компиляции ядра не понадобятся права root, но они понадобятся для того, чтобы его потом установить.

5.3.5 - Сборка окружения пользователя (userland)

OpenBSD использует особый способ сборки. Способы сборки, возможно, известные вам по другим ОС, наверняка не сработают в OpenBSD, а если вы спросите "почему?", мы только улыбнемся в ответ.

5.4 - Сборка релиза

Что такое "релиз" и зачем мне его собирать?

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

Процесс сборки релиза использует созданные в /usr/obj бинарные файлы процессом, описанным ранее, так что вы должны сначала завершить предыдущие этапы, и в каталоге /usr/obj не должно ничего мешать. Ситуация, при которой может возникнуть проблема, возникает, если вы используете memory disk в качестве /usr/obj, что может в итоге привести к перезагрузке компьютера между шагами "build" и "release".

Процесс сборки релиза потребует два рабочих каталога, которые мы назовем DESTDIR и RELEASEDIR. Все файлы, которые являются частью "чистой (сlean)" OpenBSD устанавливаются в отведенное для них место в DESTDIR. Затем они будут упакованы с помощью tar(1) и помещены в RELEASEDIR. В завершении процесса RELEASEDIR должна будет содержать полный релиз OpenBSD. Процесс создания релиза также использует в работе /mnt, поэтому следует позаботиться о том, чтобы данной точкой монтирования процесс создания релиза мог воспользоваться без проблем. Для примера мы будем использовать DESTDIR - /usr/dest и RELEASEDIR - /usr/rel.

Для сборки релиза OpenBSD используются утилита crunchgen(8), она создает единый бинарный файл из большого количества отдельных программ. Имя этого исполняемого файла определяется запущенным компонентом.

Для создания релиза вам потребуются права root.

Создание релиза

Определите ваши DESTDIR и RELEASEDIR переменные окружения:
# export DESTDIR=/usr/dest
# export RELEASEDIR=/usr/rel
Очистим содержимое DESTDIR и создадим необходимые каталоги:
# test -d ${DESTDIR} && mv ${DESTDIR} ${DESTDIR}.old && rm -rf ${DESTDIR}.old &
# mkdir -p ${DESTDIR} ${RELEASEDIR}
RELEASEDIR обычно не требует очистки перед запуском процесса сборки релиза, однако, если имеются изменения в версии релиза или названиях файлов, старые файлы во избежании конфликтов лучше удалить. Вы также можете удалить этот каталог перед запуском.

Начинаем сборку релиза:

# cd /usr/src/etc
# make release
После того, как релиз собран, хорошей идеей будет убедиться, что нужные нам файлы создались в DESTDIR. Их не так много на этом этапе.
# cd /usr/src/distrib/sets
# sh checkflist
Теперь вы имеете полный комплект созданных и проверенных файлов в RELEASEDIR. Эти файлы могут использоваться для установки или обновления OpenBSD на других машинах.

Официалоьные инструкции по созданию релиза находятся в release(8).

Замечание: если вы захотите использовать эти файлы для установки или обновлении через/используя HTTP, создайте файл "index.txt", который будет содержать список всех новых файлов, вошедьших в релиз.

# /bin/ls -1 >index.txt
Если вы полностью собрали релиз, вы можете использовать эти файлы для стандартной установки или обновления на другом компьютере, или, если хотите обновиться до -stable, просто распакуйте tar-архивы в корневом каталоге (на целевой машине).

5.5 - Сборка X (Xenocara)

Начиная с 7-ой версии X.org, разработчики стали использовать "модульное строение", разделив исходники X.org на более трехсот так или иначе связанных друг с другом пакетов.

Для упрощения жизни пользователей OpenBSD была разработана система, получившая название Xenocara. Эта система "конвертирует" X обратно в одно общее большее дерево исходных кодов. В качестве дополнительного бонуса, этот процесс сборки гораздо больше похож на процесс сборки, используемый остальными компонентами OpenBSD. В предыдущих версиях это было не так.

Официальные инструкции по сборке X содержатся на вашем компьютере в файле /usr/xenocara/README и в release(8).

Загрузка исходного кода

"Обычное" месторасположение дерева исходных кодов xenocara - /usr/xenocara, также исходники хранятся в модуле xenocara в CVS. Таким образом, процесс загрузки заключается в следующем:
$ cd /usr
$ cvs -qdanoncvs@anoncvs.example.org:/cvs checkout -P xenocara

Сборка Xenocara

Для сборки стандартного дерева xenocara OpenBSD не требуется никаких дополнительных инструментов.
# cd /usr/xenocara
# rm -rf /usr/xobj/*
# make bootstrap
# make obj
# make build
Если вы захотите внести изменения в исходный код, вам потребуется несколько дополнительных пакетов. Подробности в файле /usr/xenocara/README.

Сборка релиза

Действия такие же, как при сборке самой системы. После сборки X, мы определяем DESTDIR и RELEASEDIR с теми же целями, которые были определены нами ранее. RELEASEDIR может быть тем же самым каталогом, что и прежде, а вот DESTDIR будет очищен и создан заново в процессе сборки. Если все делать аккуратно, проблем возникнуть не должно, однако "безопаснее" использовать другой каталог для DESTDIR.

В данном примере мы используем для DESTDIR и RELEASEDIR /usr/dest и /usr/rel соответственно . Это должно быть выполнено после процесса сборка, описанного ранее.

# export DESTDIR=/usr/dest
# export RELEASEDIR=/usr/rel
# test -d ${DESTDIR} && mv ${DESTDIR} ${DESTDIR}- && \
     rm -rf ${DESTDIR}- &
# mkdir -p ${DESTDIR} ${RELEASEDIR}
# make release
По завершении процесса вы получите полный комплект файлов в $RELEASEDIR.

5.6 - Зачем мне своё ядро?

Cкорее всего - не за чем.

Свое, нестандартное ядро - это ядро, собранное с файлом конфигурации, отличающимся от ОБЫЧНОГО GENERIC файла конфигурации. Оно может быть собрано на основе исходников всех деревьев -release, -stable или -current, так же как и GENERIC ядро. И в то время как компиляция GENERIC ядра поддерживается командой OpenBSD, компиляция нестандартного/вашего ядра - нет.

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

Причины которые могут сподвигнуть на сборку собственного ядра:

Несколько причин не собирать свое ядро:

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

К тому же, разработчики чаще всего игнорируют сообщения об ошибках на пользовательских ядрах, за исключением случаев когда проблема воспроизведена и на GENERIC ядре. Имейте ввиду.

5.7 - Сборка своего ядра

Полагаем, что вы прочитали вышенаписанное и, несмотря на это, готовы приступить. Также предположим, что ваши цели не могут быть достигнуты конфигурированием в процессе загрузки Boot time configuration (UKC>), или с помощью config(8) на стандартном ядре GENERIC. Если же это не так, используйте GENERIC.

Процес создания ядра OpenBSD по умолчанию управляется с помощью конфигурационных файлов в директории /usr/src/sys/arch/<arch>/conf/. Для всех архитектур имеется файл для генерации стандартного ядра GENERIC, который используется при создании стандартного ядра OpenBSD для данной платформы. Также там могут находиться другие конфигурационные файлы для создания специализированных ядер, к примеру, для систем с небольшим количеством памяти, бездисковых станций и так далее.

config(8) обрабатывает конфигурационный файл, создает и работает с катологом для компиляции ../compile, при стандарной установке это /usr/src/sys/arch/<arch>/compile/. config(8) также создает Makefile и другие файлы, необходимые для процесса сборки ядра.

Параметры конфигурации ядра (Kernel Configuration Options) позволяют вам управлять функциональностью ядра. Управление опциями позволит вам создать ядро с поддержкой только того аппаратного обеспечения, что вам необходимо, без поддержки ненужных вам устройств. Параметров для конфигурации ядра много. Здесь мы рассмотрим только некоторые, наиболее часто используемые. Ознакомтесь на странице руководства (man) options(4) с полным списком параметров. Поскольку эти параметры время от времени меняются, не лишним будет проверить соответствие для вашей версии OpenBSD. Также не помешает ознакомиться с примерами конфигурационных файлов для вашей архитектуры.

Не добавляйте, не удаляйте, не меняйте параметры вашего ядра без надобности! Не редактируйте стандартный конфигурационный файл GENERIC!!! Только ядра, построенные на базе стандартной конфигурации GENERIC, поддерживаются группой разработки OpenBSD; опции в /usr/src/sys/arch/<arch>/conf/GENERIC и /usr/src/sys/conf/GENERIC поставляются с опциями авторов OpenBSD (то есть, НЕИЗМЕНЕННЫМИ). Ответом на ваше письмо о проблемах с вашим ядром практически однозначно приведет к ответной просьбе воспроизвести вашу проблему на ядре GENERIC. Не все параметры совместимы друг с другом, некоторые сочетания параметров могут привести к неработоспособности системы. Нет никакой гарантии, что собранное вами с вашими параметрами вообще сможет запуститься. Не гарантируется, что все будет нормально после использования config(8).

С конфигурационными файлами для указанных платформ можно ознакомиться здесь:

Ознакомтесь с этими файлами. В начале каждого из них вы увидите:

     include "../../../conf/GENERIC"
Это ссылка на конфигурационный платформеннонезависимый конфигурационный файл, в нем - единые настройки для всех платформ. Созавая свою конфигурацию, на забудьте заглянуть в /sys/conf/GENERIC.

Параметры ядра помещаются в файл конфигурации ядра в виде:

option      Name
или
option      Name=Параметр
К примеру, для включения опции "DEBUG" в ядре, добавьте следующее:
option      DEBUG
Опции конфигурации ядра OpenBSD транслируются в опции препроцессора компилятора, таким образом, что параметр типа DEBUG будет откомпилирован с опцией -DDEBUG, что эквивалентно добавлению #define DEBUG непосредственно в код ядра.

Возможно, вы захотите изменить параметр, стандартно находящийся в файле src/sys/conf/GENERIC. Можно, конечно, внести поправки и в копию этого файла, но куда лучше воспользоваться инструкцией rmoption. Для примера, если вы хотите отключить встроенный в ядро отладчик (не рекомендуется!), вы можете добавить строку:

     rmoption DDB
Опция DDB в вашем стандартном конфигурационном файле src/sys/conf/GENERIC включена, но строка rmoption деактивирует её.

Пожалуйста, еще раз просмотрите options(4) для дополнительной информации об опциях. Обратите внимание, некоторые опции имеют свои страницы руководств - прочитайте все, что имеется, перед тем как что либо добавить или удалить из ядра.

Собираем свое ядро

Для примера мы будем собирать ядро для boca(4) ISA multi-port serial card. Карта не включена в ядро GENERIC по причине конфликтов с другими драйверами. Еще одной причиной необходимости сборки собственного ядра - использование RAIDframe, который достаточно велик для включения в обычное kernel. Есть два способа конфигурирования собственного ядра: скопировать файл GENERIC в файл с другим именем и сконфигурировать его, или создать "wrapper" файл, "включающий" стандартный GENERIC и содержащий параметры, отличающиеся от GENERIC. В данном случае наш "wrapper" файл будет выглядеть так:
include "arch/i386/conf/GENERIC"

boca0  at       isa? port 0x100 irq 10     # BOCA 8-port serial cards
com*   at       boca? slave ?
Две строки относительно карты boca(4) мы копируем из GENERIC и раскомментируем их, редактируем по необходимости прерывания IRQ. Преимуществом использования "wrapper" является то, что мы вынесли все изменения из GENERIC, и GENERIC можно автоматически обновлять пор мере необходимости. Недостатком является невозможность удаления драйверов (что, конечно же, плохая идея).

Еще один способ создания собственного конфигурационного файла ядра является копирование GENERIC в файл с другим именем и его редактирование по мере необходимости. Недостаток данного способа - неудобство автоматического обновления файла в будущем - нам потребуется руками переносить изменения из GENERIC в наш конфигурационный файл.

Полное описание создания собственного ядра есть в man-странице config(8).

5.8 - Конфигурация во время загрузки

Иногда вы можете столкнуться с ситуацией, когда ядро обнаруживапет устройство, но используемое прерывание IRQ неправильно. А вам изначально необходимо использование этого устройства. Ну что ж, OpenBSD позволяет воспользоваться конфигурацией на этапе загрузки, без перекомпиляции ядра. Воспользоваться этой возможностью в первый раз, когда это требуется, есть правильный подход к решению проблемы. После перезагрузки вам снова придется повторять эти действия. Так что это временное решение, и в дальнейшем стоит решить проблему используя config(8). Ваше ядро должно иметь опцию option BOOT_CONFIG, которую имеет GENERIC ядро.

Большую часть этого документа можно найти на странице руководства boot_config(8).

Для загрузки в User Kernel Config, или UKC, используйте опцию -c при загрузке.

boot> boot hd0a:/bsd -c
Или другое ядро, которое надо загрузить. После этого появится приглашение UKC. Здесь вы сможете вводить команды, изменяющие поведение ядра. Например, вы можете работать с устройствами, включать и отключать их.

Вот список команд UKC.

Закончив конфигурирование, выполните quit или exit для продолжения загрузки. После этого следует сохранить постоянные изменения ядра, как это описывается в "Использование config(8) для изменения параметров ядра".

5.9 - Использование config(8) для настройки ядра

Опции -e и -u, используемые с config(8), могут хорошо сэкономить время, затрачиваемое на компиляцию ядра. Параметр -e позволяет войти в UKC (User Kernel Config) на исполняемой системе. Изменения вступят в силу после перезагрузки. Параметр -u проверяет, были ли внесены изменения в ядро ​​во время загрузки, т.е. использовали ли вы параметр boot -c для входа в UKC во время загрузки системы.

В примере ниже показано как отключить ep*-устройства в ядре. Для избежания проблем лучше воспользоваться опцией -o для записи в указанный другой файл. К примеру: config -e -o bsd.new /bsd запишет изменения в bsd.new. В примере не используется параметр -o, поэтому изменения просто игнорируются, а не записывается в файл конфигурации ядра. Для дополнительной информации об ошибках обратитесь к странице руководства config(8).

$ sudo config -e /bsd
OpenBSD 5.2 (GENERIC) #278: Wed Aug  1 10:04:16 MDT 2012
    deraadt@i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC
warning: no output file specified
Enter 'help' for information
ukc> ?
        help                                Command help list
        add             dev                 Add a device
        base            8|10|16             Base on large numbers
        change          devno|dev           Change device
        disable         attr val|devno|dev  Disable device
        enable          attr val|devno|dev  Enable device
        find            devno|dev           Find device
        list                                List configuration
        lines           count               # of lines per page
        show            [attr [val]]        Show attribute
        exit                                Exit, without saving changes
        quit                                Quit, saving current changes
        timezone        [mins [dst]]        Show/change timezone
        bufcachepercent [number]            Show/change BUFCACHEPERCENT
        nkmempg         [number]            Show/change NKMEMPAGES
ukc> list
  0 video* at uvideo* flags 0x0
  1 audio* at uaudio*|sb0|sb*|gus0|pas0|ess*|wss0|wss*|ym*|eap*|envy*|eso*|sv*|n
eo*|cmpci*|clcs*|clct*|auacer*|auglx*|auich*|auixp*|autri*|auvia*|azalia*|fms*|m
aestro*|esa*|yds*|emu* flags 0x0
  2 midi* at umidi*|sb0|sb*|ym*|mpu*|mpu*|autri*|eap*|envy* flags 0x0
  3 drm* at inteldrm*|radeondrm* flags 0x0
  4 inteldrm* at vga0|vga* flags 0x0
  5 radeondrm* at vga0|vga* flags 0x0
  6 radio* at udsbr*|bktr0|fms* flags 0x0
  7 vscsi0 at root flags 0x0
  8 softraid0 at root flags 0x0
  9 nsphy* at url*|udav*|mos*|axe*|aue*|xe*|ef*|hme*|lii*|bce*|ale*|alc*|age*|jm
e*|et*|nfe*|stge*|vge*|bnx*|bge*|lge*|nge*|msk*|sk*|ste*|se*|sis*|wb*|tl*|vte*|v
r*|pcn*|sf*|ti*|gem*|ne0|ne1|ne2|ne*|ne*|ne*|epic*|sm0|sm*|dc*|dc*|re*|re*|rl*|r
l*|mtd*|fxp*|fxp*|xl*|xl*|ep0|ep*|ep*|ep*|ep*|ep* phy -1 flags 0x0
 10 nsphyter* at url*|udav*|mos*|axe*|aue*|xe*|ef*|hme*|lii*|bce*|ale*|alc*|age*
|jme*|et*|nfe*|stge*|vge*|bnx*|bge*|lge*|nge*|msk*|sk*|ste*|se*|sis*|wb*|tl*|vte
*|vr*|pcn*|sf*|ti*|gem*|ne0|ne1|ne2|ne*|ne*|ne*|epic*|sm0|sm*|dc*|dc*|re*|re*|rl
*|rl*|mtd*|fxp*|fxp*|xl*|xl*|ep0|ep*|ep*|ep*|ep*|ep* phy -1 flags 0x0
[...snip...]
ukc> disable ep
 95 ep* disabled
 96 ep* disabled
281 ep0 disabled
282 ep* disabled
283 ep* disabled
340 ep* disabled
ukc> quit
not forced

В вышеуказанном примере мы отключили все ep*-устройства в ядре; ядро не будет их искать. Иногда, когда вы используете UKC, при параметре boot -c вам потребуется сделать изменения постоянными, т.е. сохранить их. Для этого надо использовать опцию -u. В следующем примере компьютер загружается в UKC, и отключаются устройства wi(4). Поскольку изменения, сделанные при boot -c НЕ являются постоянными, их надо сохранить. В примере показывается, как в boot -c сохранить изменения при использовании нового ядра bsd.new.

$ sudo config -e -u -o bsd.new /bsd
OpenBSD 5.2 (GENERIC) #278: Wed Aug  1 10:04:16 MDT 2012
    deraadt@i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC
Processing history...
161 wi* disabled
162 wi* disabled
417 wi* disabled
Enter 'help' for information
ukc> quit

5.10 - Более подробный вывод при загрузке

Получение более подробного вывода может быть очень полезно при отладке в процессе загрузки. Если вы не можете загрузиться с загрузочной дискеты и вам нужна дополнительная информация, просто перезагрузитесь. После появления приглашения "boot>" , загрузитесь используя boot -c. Вы попадете в UKC>, затем:
UKC> verbose
autoconf verbose enabled
UKC> quit

Теперь вы сможете получить более подробный вывод при загрузке.

5.11 - Общие вопросы, советы и проблемы при сборке

Чаще всего к проблемам при сборке приводит невнимательность. Есть отдельные проблемы при сборке -current из-за новых изменений в дереве с исходниками, но проблемы при сборке -release или -stable чаще всего вызваны ошибками самого пользователя.

Чаще всего можно столкнуться со следующими:

Вот еще некоторые проблемы, с которыми можно столкнуться:

5.11.1 - Ошибка "Signal 11" при сборке

Сборка OpenBSD и других программ из исходников гораздо сильнее нагружает аппаратную часть, чем большинство других задач. В результате этого, если имеются поблемы в работе оборудования, они скорее всего проявятся в процессе сборки. Signal 11 обычно возникает при аппаратных проблемах, чаще всего с памятью, реже при проблемах процессора, материнской платы или перегрева. Ваша система должна работать очень стабильно, иначе сборка окажется невозможной.

Вы, вероятно, предпочтете найти причину проблемы и заменить компоненты, ибо проблемы могут себя проявить и в будущем. Если у вас появились такие проблемы, а оборудование вы тем не менее хотите использовать, используйте snapshot или release.

Для получения дополнительной информации смотрите Sig11 FAQ.

5.11.2 - "make build" завершился ошибкой "cannot open output file snake: is a directory"

Это результат одной из двух ошибок: Внимательно следите за точностью исполнения инструкций в процессе загрузки исходников и сборки.

5.11.3 - Моя система не работает без IPv6!

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

5.11.4 - Ой! Я забыл сначала создать /usr/obj каталог!

Выполнив "make build" до выполнения "make obj", вы получите кучу солянку из файлов, разбросанных в /usr/src каталоге. Это плохо. Чтобы не загужать исходники (src tree) снова, удалите obj-файлы:
    # cd /usr/src
    # find . -type l -name obj | xargs rm
    # make cleandir
    # rm -rf /usr/obj/*
    # make obj

5.11.5 - Совет: Вынесите /usr/obj на отдельный раздел

Если вы часто пересобираете ядро или другие компоненты системы, вам будет удобней выделить отдельный раздел для /usr/obj. Польза от этого - быстрее сделать это:
    # umount /usr/obj
    # newfs DeineObjPartition
    # mount /usr/obj
чем это: rm -rf /usr/obj/*

5.11.6 - Если я не хочу собирать некоторые части дерева?

Конечно вы можете не собирать некоторые компоненты. Эти компоненты могут быть установленны с помощью пакетов, либо вы можете просто собрать "мини" release. Используйте для этого опциию SKIPDIR в /etc/mk.conf.

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

5.11.7 - Что еще почитать, чтобы лучше в этом разобраться?

Вот некоторые ресурсы:

5.11.8 - Не вижу ни одного среза snapshots на FTP. Откуда их можно скачать?

Snapshot'ы могут не выкладываться (или долго не меняться) непосредственно перед выходом -release.

5.11.9 - Как получить последнюю версия компилятора (gcc)?

Просто установите последний snapshot.

5.11.10 - Наилучший способ обновления /etc, /var и /dev?

В соответствии с политикой, программы из дерева OpenBSD автоматически не модифицируют /etc. Это означает, что всегда необходимые изменения должен сделать администратор. Обновление не является исключением. Для обновления файлов в этих каталогах сначала определите, какие изменения произошли в файлах дистрибутива (distribution), и затем внесите их вручную.

К примеру, посмотреть изменения можно так:

    # cd /usr/src/etc
    # ls -lt |more

Для просмотра изменений в /etc между выбранными версиями OpenBSD можно воспользоваться CVS. К примеру, просмотреть изменения между 5.1 и 5.2 можно так:

    # cd /usr/src/etc
    # cvs diff -u -rOPENBSD_5_1 -rOPENBSD_5_2
Для сравнения 5.2 и -current ("HEAD"):
    # cd /usr/src/etc
    # cvs diff -u -rOPENBSD_5_2 -rHEAD
Скрипт /dev/MAKEDEV не обновляется в процессе сборки, однако он устанавливается при обновлении бинарных пакетов. Скопировать (если требуется) и запустить скрипт перед обновлением будет хорошей идеей:
    # cd /dev
    # cp /usr/src/etc/etc.`machine`/MAKEDEV ./
    # ./MAKEDEV all

Перед тем, как сделать изменения, сохраните на всякий случай резервные копии.

Обычно изменения /etc между релизами включают в себя:

Эти изменения описаны в upgrade52.html (для 5.2-release) или current.html (для -current).

5.11.11 - Есть ли простой способ просмотреть все изменения в ФС?

Время от времени файлы и каталоги добавляются и удаляются из file hierarchy. Кроме того может измениться и информация о владельцах (ownership). Самый простой способ убедиться в актуальности - использовать утилиту mtree(8).

Сначала получите последний исходник, затем выполните:

    # cd /usr/src/etc/mtree
    # install -c -o root -g wheel -m 600 special /etc/mtree
    # install -c -o root -g wheel -m 444 4.4BSD.dist /etc/mtree
    # mtree -qdef /etc/mtree/4.4BSD.dist -p / -u

Ваш file hierarchy теперь актуален.

5.11.12 - Возможна ли кросс-компиляция? Почему нет?

Инструменты для кросс-компиляции есть в системе, и используются для портирования её на новые платформы. Однако, для общего использования они не поддерживаются.

Когда разработчики начинают поддерживать новую систему, они сосредотачиваются на работе именно для этой системы/архитектуры/платформы. Сборка системы значительно нагружает и саму ОС, и машину, что само по себе является хорошим тестом работоспособности. По этой причине проект OpenBSD использует процесс создания платформ, называемый "native building", т.е. процесс сборки на той же платформе, для которой она собирается. Без такого процесса трудно быть уверенным, что система работает действительно стабильно, а не просто загружается.

[FAQ-Index] [Глава 4 - Установка OpenBSD 5.2] [Глава 6 - Сеть]


[back] www@openbsd.org
$OpenBSD: faq5.html,v 1.2 2013/01/18 07:15:55 ajacoutot Exp $