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

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

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

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

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

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

# make KERNCONF=HUMVEE kernel

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

Установив новое ядро, выполните загрузку системы в однопользовательском режиме. Система должна перезапуститься без сбоев. Однако пользовательские программы могут работать не так, как ожидалось; многие из них зависят от интерфейсов, реализуемых ядром, которые могут измениться в результате обновления. Обычно об этом явно упоминается в файле /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 -р

О [2] Unable to find mtree database. Skipping auto-upgrade.

(Перевод: Невозможно отыскать базу данных mtree. Пропуск функции auto-upgrade.)

© *** Creating the temporary root environment In /var/tmp/temproot *** /var/tmp/temproot ready for use

*** Creating and populating directory structure In /var/tmp/temproot (Перевод: Создание временного корневого каталога в /var/tmp/temproot /var/tmp/temproot готов к использованию

Создание и заполнение структуры каталогов в /var/tmp/temproot)

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

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

О -# $FreeBSD: src/etc/master.passwd,v 1.39 2005/06/06 20:19:56 brooks Exp $

0 +# $FreeBSD: src/etc/master.passwd,v 1.40 2005/06/06 20:19:56 brooks Exp $ #

@ – root:$1$GtDsdFlU$F5mTAagzalt7dHImUsNSL1:0:0::0:0:Laptop Admin:/root:/ bin/csh

© +root::0:0::0:0:Charlie &:/root:/bin/csh

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

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

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

_pflogd:*:64:64::0:0:pflogd privsep user:/var/empty:/usr/sbin/nologin О +_dhcp:*:65:65::0:0:dhcp prog rams:/var/empty:/usr/sbin/nologin uucp : *: 66 : 66::0:0:UUCP pseudo-user

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

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

nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/usr/sbin/nologin О -mwlucas:$1$zxU7ddkN$9GUEEVJH0r.owyAwUONFXI:1001:1001::0:0:Michael W Lucas: /

home/mwlucas:/bin/tcsh

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

Use ‘d’ to   delete the temporary ./etc/master.passwd

Use ‘1’ to   Install the temporary ./etc/master.passwd

Use ‘m’ to   merge the temporary and Installed versions

Use ‘v’ to   view the diff results again

Default Is   to leave the temporary file to deal with by hand

How should   I deal with this9 [Leave It for later] m

(Перевод:’d’ – удалить временный файл . /etc/master, passwd ‘1’ – установить временный файл ./etc/master.passwd ‘m’ – объединить временный файл и существующую версию ‘v’ – просмотреть различия еще раз

По умолчанию временный файл будет оставлен для обработки вручную

Что делать с новой версией9 [Оставить на будущее])

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

Программа mergemaster разделит окно пополам с помощью утилиты sdiff(l). В левой половине выводится начало существующего файла, в правой – новой версии файла. На экране отображаются только отличающиеся участки. Далее введите г (right – справа) и 1 (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 использует эти номера версий (как и многие другие инструменты) для определения необходимости выполнять обновление, поэтому наш новый файл должен иметь обновленный номер версии. Введем г, чтобы использовать запись справа, после чего mergemaster выведет следующее отличие.

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

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

> _dhcp:*:65:65::0:0:dhcp prog rams:/var/empty:/

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

mwlucas:$1$zxU7ddkN$9GUEEVJH0г.owyAwUONFXI:10 <

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

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

Use ‘1’   to install merged file

Use ‘r’   to re-do the merge

Use ‘v’   to view the merged file

Default   is to leave the temporary file to deal with by hand

*** How should I deal with the merged file9 [Leave it for later]

(Перевод: ‘i’ – установить объединенный файл ‘г’ – повторить процедуру объединения ‘v’ – просмотреть объединенный файл

По умолчанию временный файл будет оставлен для обработки вручную Что делать с объединенным файлом9 [Оставить на будущее])

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

*** Merged version of ./etc/master.passwd installed successfully *** Temp ./etc/group and installed have the same CVS Id, deleting *** Comparison complete

Do you wish to delete what is left of /var/tmp/temproot9 [no] у (Перевод: *** Объединенная версия файла . /etc/master.passwd успешно установлена *** Временный файл ./etc/group имеет то же самое значение Id в CVS, удален *** Сравнение завершено

Желаете удалить то, что осталось в /var/tmp/temproot9 [нет])

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

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

Установка «мира»

Оставаясь в однопользовательском режиме, можно выполнить установку обновленной системы FreeBSD, выполнив команду make install- world. После этого по экрану побегут строки, большая часть из которых будет содержать слово install.

#           cd /usr/src

#           make installworld

Некоторые программы и файлы могут оказаться ненужными в системе. Чтобы увидеть эти устаревшие файлы, запустите команду make check-old.

#           make check-old

>» Checking for old files /usr/sbin/pccardc /usr/share/man/man8/pccardc.8.gz

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

>» Checking for old libraries /lib/libc rypto.so.4 /us r/lib/libssl.so.4 /usr/lib/libroken.so.8 /lib/libatm.so.3 /lib/libc.so.6

В заключение вашему вниманию будет представлен список ставших ненужными каталогов. Удалять каталоги приходится очень редко – я могу вспомнить только семь таких случаев с момента появления команды make check-old.

Если вы не используете какие-либо из устаревших программ и каталогов, удалите их командой make delete-old. Перед удалением каждого файла утилита make(l) запросит подтверждение.

Устаревшие разделяемые библиотеки

Устаревшие разделяемые библиотеки требуют особого внимания. Этими библиотеками пользуются многие программы сторонних производителей. Если удалить такую библиотеку, программа просто не запустится. Крайне нежелательно, например, удалить библиотеку, если ее использует приложение, предназначенное для решения чрезвычайно важных задач. Единственный способ восстановить работоспособность такой программы – повторно скомпилировать ее или заменить библиотеку. Разделяемые библиотеки рассматривались в главе 12. Если библиотека не требуется для работы ни одной программе, ее можно удалить. Однако проверять все программы, чтобы выяснить, не используют ли они ту или иную библиотеку, весьма нелегко.

Проверим, для примера, список устаревших библиотек, приведенный выше. Одна из них – libc.so.6. Заглянув в каталог /lib, я увидел, что там присутствует библиотека libc.so.7. Скорее всего, мне не требуются сразу две библиотеки libc.so.6 и libc.so.7. Однако от библиотеки libc зависит слишком многое – это как главная городская магистраль. Если я удалю ее, может получиться так, что программы, установленные из «портов», просто перестанут работать. Присутствие этой устаревшей библиотеки в ближайшее время никак не повредит системе – оставив устаревшие библиотеки в дополнение к новым, вы обеспечите работоспособность системы и сможете не спеша выполнить переустановку дополнительного программного обеспечения. Порядок обновления «портов» мы рассмотрим ниже в этой главе.

В любом случае, если вы считаете, что ни одна из перечисленных библиотек не представляет никакого интереса, их можно удалить, но я настоятельно рекомендую перед удалением сохранить резервные копии всех библиотек. Для этого достаточно скопировать их в каталог old-libs где-нибудь в файловой системе. Обнаружив, что какое-то важное приложение не запускается, вы легко сможете восстановить его работоспособность. Чтобы работоспособность программ сохранилась, но при этом сами библиотеки хранились отдельно, можно записать устаревшие библиотеки в каталог /usr/lib/compat. Другой вариант состоит в том, чтобы использовать утилиту libchk (/usr/ports/sysutils/libchk) для идентификации программ, использующих ту или иную библиотеку.

И снова mergemaster

Мы почти у цели! Мы уже обновили информацию об учетных записях и группах в каталоге /etc, теперь нужно обновить остальные файлы. У программы mergemaster много специализированных функций, все они описаны на страницах руководства. Я могу порекомендовать две из них, наиболее полезные с моей точки зрения.

После добавления файла в базовую установку FreeBSD нет смысла сравнивать его с чем бы то ни было. С ключом -i программа mergemaster автоматически установит файлы в каталог /etc. Завершив работу, mergemaster выведет список установленных файлов.

Есть еще один набор файлов, которые меня совсем не интересуют и которые я никогда не редактирую. Например, в операционной системе FreeBSD присутствуют десятки сценариев запуска, расположенные в каталоге /etc/rc.d. Поскольку я не изменяю эти файлы, то могу просто установить более новые версии этих сценариев. Ключ -U предписывает программе mergemaster автоматически обновлять любые системные файлы, которые я не редактировал.

# mergemaster -ill

mergemaster просмотрит все файлы в /etc и проверит их принадлежность к базовому дистрибутиву FreeBSD. Принцип действия программы mergemaster в этом случае точно такой же, как и в случае с подготовкой к установке, поэтому здесь мы не будем углубляться в подробности. Выполните перезагрузку – и вы получите обновленную систему! Теперь можно побеспокоиться об обновлении портов.

Наконец, ключ -Р предписывает программе mergemaster сохранять замещаемые файлы, при этом нужно указать каталог для сохранения копий в файле /etc/mergemaster.rc. Вообще я предпочитаю заранее создавать резервную копию всей системы, тем не менее для сохранения замещаемых файлов в локальной файловой системе можно использовать ключ -Р, что позволит вернуть файлы на место быстрее, чем восстановление из резервной копии.

Определите нужные значения параметров в файле .mergemasterrs из своего домашнего каталога или в файле /etc/mergemaster.rc. Некоторые очень удобные параметры из тех, что находятся в конфигурационном файле, невозможно задать в командной строке, например, я всегда изменяю содержимое файла /etc/motd, поэтому нахожу параметр IGN0RE_M0TD=yes весьма полезным.

Обновление в однопользовательском режиме

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

Это еще один пример ситуации, когда здравый смысл может нарушить ваши планы на месяц. В редких случаях разработчики FreeBSD вносят в систему некоторые низкоуровневые изменения, требующие установки в однопользовательском режиме. Могут возникать конфликтные ситуации, если особо важные программы не смогут работать, если были установлены в многопользовательском режиме. Если в такой редкой ситуации окажется файл /bin/sh, вы попадете в мир кошмаров. В этом случае у вас останется единственный способ восстановить систему: вынуть жесткий диск из сервера, установить его на другую машину, скопировать с него все нужные данные, отформатировать диск и вновь установить на него систему. Или можно загрузиться с ком- пакт-диска восстановления системы и молиться, чтобы ваших навыков хватило для решения этой задачи.1

Обновление в многопользовательском режиме может породить и другие проблемы, такие как трудноуловимая гонка за ресурсами, пробле-

Это глас опыта. Не поступайте так в действительности.

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

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

NFS и обновление

Вам нужно обновить много компьютеров? Вспомните о сетевой файловой системе (NFS), которая рассматривалась в главе 8. Соберите новую систему и все ваши ядра на центральном, самом быстром сервере, а затем экспортируйте каталоги /usr/src и /usr/obj этой системы всем остальным клиентам. Использование этих томов NFS для работы команд make installkernel и make installworld позволит сэкономить время при сборке программных компонентов на других машинах и гарантирует, что во всех системах FreeBSD будут установлены одни и те же двоичные файлы.

Источник: ЛукасМ. FreeBSD. Подробное руководство, 2-е издание. – Пер. с англ. – СПб.: Символ- Плюс, 2009. – 864 е., ил.

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий