Сборка FreeBSD из исходного кода


После обновления исходного кода изучите файл /usr/src/UPDATING. В этом файле в обратном хронологическом порядке приведены все предупреждения и замечания, относящиеся к изменениям в исходном коде, которые могут представлять интерес для тех, кто выполняет сборку программ из исходного кода. Здесь указаны действия, которые, возможно, придется выполнить перед сборкой системы из исходного кода, а также описаны все существенные изменения системной функциональности. Если вы хотите, чтобы система осталась работоспособной после обновления, четко следуйте инструкциям, изложенным в этом файле. Кроме того, стоит проверить новые конфигурационные файлы ядра GENERIC или NOTES на предмет новых параметров и интересных изменений в ядре.

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

Настройка параметров сборки FreeBSD

Помните, как в главе 11 обсуждался файл /etc/make.conf? Для сборки самой системы во FreeBSD используется отдельный файл с настройками параметров сборки. Параметры в файле /etc/make.conf влияют на сборку любого программного обеспечения в системе, а параметры в файле /etc/src.conf — только на сборку самой FreeBSD из исходного кода.

Сборка «мира»

В первую очередь необходимо собрать обновления в пространстве пользователя (userland):

# cd /usr/src
# make buildworld

Команда make buildworld прежде всего задействует исходный код, чтобы собрать инструменты, необходимые для сборки системного компилятора. После этого она инициирует сборку компилятора и сопутствующих библиотек. Наконец, с помощью новых инструментов, компилятора и библиотек будет собрано все базовое программное обеспечение FreeBSD. (Все это напоминает сборку автомобиля по инструкции, которая начинается так: «Спуститесь в шахту и накопайте железной руды».) Результаты работы make buildworld помещаются в /usr/obj. Эта процедура может занять до нескольких часов, в зависимости от производительности аппаратного обеспечения. При этом можно продолжать работать и в ходе исполнения команды make buildworld, если ваше аппаратное обеспечение функционирует достаточно устойчиво; потребляя системные ресурсы, эта команда не требует внимания.

Убедитесь, что команда make buildworld выполнилась без ошибок! Если она завершилась с кучей сообщений вроде тех, что появляются при неудачном компилировании ядра, то процесс обновления следует остановить. В главе 2 рассказано, как получить помощь. Никогда не пытайтесь установить поврежденные или неполные обновления.

Сборка, установка и тестирование ядра

Лучший способ протестировать обновления — это собрать новое ядро GENERIC. Это позволит отгородиться от проблем, связанных с нестандартным ядром, и оценить возможные проблемы, касающиеся системы FreeBSD в целом. Самые активные из вас, безусловно, могут обновить свое ядро с нестандартной конфигурацией, но если что-то пойдет не так, нужно попробовать собрать ядро GENERIC. He забудьте сравнить конфигурацию своего ядра с конфигурацией ядра GENERIC, чтобы охватить все изменения в вашей нестандартной конфигурации.

По умолчанию в процессе обновления собирается ядро GENERIC. Если вам нужно обновить нестандартное ядро, определите имя ядра с помощью переменной KERNCONF. Задать значение этой переменной окружения можно из командной строки, в файле /etc/make.conf или в файле /etc/src.conf.

Собрать ядро можно одним из двух способов. Команда make buildkernel соберет новое ядро, но не установит его. В этом случае установку ядра можно выполнить следующей за make buildkernel командой make installkernel. Команда make kernel выполнит обе эти команды подряд. Используйте способ, который больше соответствует вашим планам. Например, если мне нужно обновить систему во время воскресной профилактики, я могу выполнить команды make buildworld и make buildkernel в течение предшествующей недели, чтобы сэкономить несколько часов моего драгоценного выходного дня. Однако до назначенного дня профилактических работ я не хочу устанавливать новое ядро — если в пятницу обнаружатся какие-либо проблемы и потребуется перезагрузка, желательно загрузить старое, рабочее ядро, а не новое. В воскресенье утром, когда я буду готов к выполнению обновления, я запущу команду make installkernel. С другой стороны, при обновлении системы у себя на ноутбуке я предпочитаю запускать команду make kernel. Итак, чтобы обновить свое нестандартное ядро, я должен выполнить команду:

# make KERNCONF=HUMVEE kernel

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

Установив новое ядро, выполните загрузку системы в однопользовательском режиме. Система должна перезапуститься без сбоев. Однако пользовательские программы могут работать не так, как ожидалось; многие из них зависят от интерфейсов, реализуемых ядром, которые могут измениться в результате обновления. Обычно об этом явно упоминается в файле /usr/src/UPDATING. Если с новым ядром система работает без сбоев, можно продолжать. В противном случае подробно опишите возникшую проблему и загрузите старое ядро, чтобы восстановить работу служб на то время, пока вы будете заниматься решением проблемы.

Оптимизация за счет многопоточной сборки

Для повышения скорости сборки опытные системные администраторы наверняка используют ключ -j утилиты make. Этот ключ позволяет запустить несколько процессов сборки и воспользоваться преимуществами многопроцессорной системы. Если в вашей системе несколько процессоров или в процессоре несколько ядер, ключ -j поможет ускорить сборку FreeBSD. Наиболее разумно — задать число процессов сборки, на единицу большее числа имеющихся процессоров. Например, если у вас четырехъядерный процессор, есть смысл использовать пять процессов сборки, введя команду make -j5 buildworld && make -j5 kernel.

Официально Проект FreeBSD не поддерживает выполнение обновлений с применением ключа -j, даже несмотря на то, что многие разработчики используют его. Если процесс сборки терпит неудачу при запуске с ключом -j, то прежде чем жаловаться, попробуйте запустить сборку без этого ключа.

Подготовка к установке нового «мира»

Осторожно! Из этой точки нет возврата! Здесь легко можно решить проблемы, связанные с новым ядром, — достаточно лишь загрузить старое, хорошо зарекомендовавшее себя ядро, но как только будет установлен свежесобранный «мир», вернуться назад можно будет только с помощью резервной копии. Прежде чем двинуться дальше, проверьте наличие резервной копии или хотя бы признайте, что прямо сейчас вам предстоит сделать первый шаг туда, откуда не вернуться.

Если новое ядро не вызывает проблем, можно приступить к установке свежесобранной системы. Во-первых, убедитесь, что система может установить новые двоичные файлы. Каждая новая версия FreeBSD предполагает, что предыдущая версия поддерживает все учетные записи и группы, необходимые для новой версии. Если владельцем некоторой программы должен быть определенный пользователь и его учетная запись отсутствует в системе, то процесс обновления завершится ошибкой. Тут на сцену выходит программа mergemaster(8).

mergemaster сравнивает файлы, находящиеся в каталоге /etc, с новыми файлами /usr/src/etc, выявляет различия между ними и либо устанавливает новые файлы, либо откладывает их для оценки различий или даже предлагает объединить отличающиеся конфигурационные файлы в один. Это очень удобно сделать при выполнении обновлений. Вы запускаете программу mergemaster первый раз перед установкой нового «мира», чтобы убедиться, что система в состоянии установить новые двоичные файлы, а затем второй раз — после установки, чтобы синхронизировать содержимое каталога /etc с остальной системой.

Начнем с запуска программы mergemaster(8) в режиме предварительной оценки — с ключом . В этом режиме, в частности, программа сравнит /etc/master.passwd и /etc/group и выявит все учетные записи и группы, которые должны присутствовать в системе, чтобы команда installworld выполнилась успешно.

В этих начальных сообщениях с тремя символами «звездочки» mergemaster описывает свои действия. Первое сообщение гласит, что mergemaster не смогла обнаружить базу данных для выполнения автоматического обновления (1).

Многие обновления программа mergemaster может выполнить автоматически, как это будет показано ниже в этой главе, mergemaster устанавливает временный каталог /etc в /var/tmp/temproot (2), где сохраняются новые конфигурационные файлы, которые затем будут сравниваться с существующими. Далее следует первое сравнение.

Очень важный момент: программа mergemaster первым упоминает имя нового сравниваемого файла (1). Затем следуют имена двух различных версий сравниваемых файлов, причем сначала приводится имя существующего файла (2), а затем — имя обновленной версии файла (3). Проницательный читатель может обратить внимание на странные даты файлов — если работает старая версия FreeBSD, тогда почему файл паролей в ней более новый? Эти даты соответствуют датам последнего изменения файлов. Мой файл паролей последний раз изменялся 3 ноября 2006 года, тогда как версия файла в /usr/src не изменялась с 6 июня 2005 года. Просто пользователь моей системы вдруг обновил свой пароль, вот и все!* Обратите внимание на плюсы и минусы в начале строк. Минус означает, что эта строка находится в имеющемся файле, а плюс — в версии файла из каталога /usr/src.

Это наглядно иллюстрируют следующие две строки, которые выводит программа mergemaster. Первая строка (6) помечена минусом — это текущая учетная запись пользователя root. Вторая строка (7) — это учетная запись в обновленном файле. Вероятно, следует сохранить текущую запись — было бы нежелательно «обновить» ее, очистив пароль!

Немного ниже видим, что картина изменилась:

Строка с учетной записью пользователя _dhcp (1) начинается с плюса, и для нее нет соответствующей строки, начинающейся с минуса. В настоящее время в системе отсутствует пользователь _dhcp. Если в конфигурации по умолчанию появляется новый пользователь, это означает, что данный пользователь — владелец каких-либо программ или файлов в новой системе. Если не добавить такого пользователя, установка потерпит неудачу.

Еще чуть ниже пара строк:

Строка, начинающаяся с минуса (1), — это моя учетная запись. Не удивительно, что она отсутствует в базовом дистрибутиве FreeBSD. Безусловно, мне следует сохранить свою учетную запись, чтобы пережить процедуру обновления.

Решения, решения… Удалить ли временный (новый) файл master.passwd? Исключено — нам необходима учетная запись пользователя _dhcp, чтобы установить обновленную версию FreeBSD. Установить новую версию master.passwd? Но тогда будут уничтожены существующие учетные записи. Если у вас имеются какие-нибудь сомнения, можно просмотреть различия еще раз. Единственный способ двинуться дальше, не уничтожив прежнюю конфигурацию и не нарушив функциональность новой системы, — это объединить два файла. Введите m.

Программа mergemaster разделит окно пополам с помощью утилиты sdiff(1). В левой половине выводится начало существующего файла, в правой — новой версии файла. На экране отображаются только отличающиеся участки. Далее введите r (right — справа) и l (left — слева), чтобы выбрать запись слева или справа, которая должна попасть в наш новый файл master.passwd.

# $FreeBSD: src/etc/master.passwd,v 1.39 2005 | # $FreeBSD: src/etc/ master.passwd,v 1.40 2005

Слева — версия 1.39 файла, справа — версия 1.40. Программа mergemaster использует эти номера версий (как и многие другие инструменты) для определения необходимости выполнять обновление, поэтому наш новый файл должен иметь обновленный номер версии. Введем r, чтобы использовать запись справа, после чего mergemaster выведет следующее отличие.

root:$1$GtDsdFlU$F5mTAagzalt7dHImUsNSL1:0:0:: | root::0:0::0:0:Charlie &:/ root:/bin/csh

Слева — существующая учетная запись пользователя root с измененным паролем, справа — учетная запись этого же пользователя с паролем по умолчанию. Нам следует взять запись из существующего файла паролей, поэтому вводим l.

> _dhcp:*:65:65::0:0:dhcp programs:/var/empty:/

Это новая учетная запись, для нее нет соответствующей старой записи. Нам следует создать пользователя _dhcp, чтобы команда installworld выполнилась успешно, поэтому нажимаем клавишу r.

mwlucas:$1$zxU7ddkN$9GUEEVJH0r.owyAwU0NFX1:10 <

А это моя учетная запись. Мне хотелось бы сохранить возможность входить в систему под своей учетной записью, поэтому лучше я введу l.

После обхода всех различий mergemaster представит следующие варианты выбора:

Никогда не помешает просмотреть содержимое объединенного файла, если вы не уверены в том, что не придется ничего исправлять. Просмотрите объединенный файл, введя v, и если все в порядке, установите его, введя i.

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

В заключение mergemaster сравнит содержимое /etc/make.conf с файлом make.conf из /usr/src. Сведения об изменившихся или удаленных параметрах будут выведены на экран для изучения.

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