Руководство FreeBSD

         

Вопросы?


19.4.16.1.

19.4.16.2.

19.4.16.3.

19.4.16.4.

19.4.16.5.

19.4.16.6.

19.4.16.1. Нужно ли полностью перестраивать систему при каждом изменении?

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

src/games/cribbage/instr.c

src/games/sail/pl_main.c

src/release/sysinstall/config.c

src/release/sysinstall/media.c

src/share/mk/bsd.port.mk

то перестраивать всю систему незачем. Вы можете просто перейти в соответствующий подкаталог и выдать команду make all install, этого будет достаточно. Однако, если меняется что-то важное, например, src/lib/libc/stdlib, то вы должны перестроить всю систему или по крайней мере те ее части, которые скомпонованы статически.

В конце концов, выбор за вами. Может быть вам нравится перестраивать систему, скажем, каждый вечер, а изменения скачивать ночью. Или вы можете захотеть перестраивать только те вещи, которые менялись, но быть уверенным, что отслежены все изменения.

И, конечно же, всё это зависит от того, как часто вы хотите делать обновление, и отслеживаете ли вы FreeBSD-STABLE или FreeBSD-CURRENT.

19.4.16.2. Компиляция прерывается с большим количеством ошибок по сигналу 11 (или с другим номером сигнала). Что случилось?

Как правило, это говорит о проблемах с оборудованием. (Пере)построение системы является эффективным стресс-тестом для вашего оборудования и частенько выявляет проблемы с памятью. Обычно это проявляется в виде неожиданных сбоев компилятора или получения странных программных сигналов.

Явным указателем на это является то, что при перезапуске процедуры построения она прекращается в различные моменты времени.

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

19.4.16.3. Могу ли я удалить каталог /usr/obj после окончания?

Если отвечать коротко, то да.

Каталог /usr/obj содержит все объектные файлы, которые создаются во время фазы компиляции.
Обычно одним из первых шагов в процессе ``make buildworld'' является удаление этого каталога. В этом случае сохранение /usr/obj после окончания имеет мало смысла; вдобавок, он будет занимать большой объём дискового пространства (на данный момент около 340 МБ).
Однако если вы точно знаете, что делаете, то можете заставить процедуру ``make buildworld'' пропустить этот шаг. Это позволит последующие построения выполняться гораздо быстрее, так как большинство исходных текстов не нужно будет перекомпилировать. Оборотной стороной медали этого подхода является вероятность появления некоторых проблем с зависимостями, что может привести к прерыванию построения по странным причинам. Это частенько вызывает шум в списках рассылки FreeBSD, когда кто-либо жалуется на прерывание процесса построения, не обращая внимания на то, что он пытается срезать углы на повороте.
19.4.16.4. Могут ли быть продолжены прерванные процессы построения?
Это зависит от того, насколько далеко зашел процесс построения перед тем, как вы обнаружили проблему.
В общем случае (и это несложное и быстрое правило) процесс ``make buildworld'' строит новые копии необходимых инструментальных средств (таких, как gcc(1) и make(1)) и системные библиотеки. Затем эти средства и библиотеки устанавливаются. Новые инструментальные средства и библиотеки затем используются для перестроения самих себя, и повторно устанавливаются. Система в целом (теперь включая обычные пользовательские программы, такие, как или grep(1)) теперь перестраивается с новыми системными файлами.
Если вы на последнем шаге, и вы знаете это (потому что просматривали вывод, который сохраняете), то вы можете (достаточно безболезненно) выполнить команду:
... исправление проблемы ...
# cd /usr/src
# make -DNOCLEAN all
При этом результат предыдущего запуска ``make buildworld'' откатываться не будет.
Если вы видите сообщение:
-------------------------------------------------------------- Building everything.. --------------------------------------------------------------


в выводе команды ``make buildworld'', то делать так достаточно безопасно.
Если этого сообщения не было, или вы в этом не уверены, то всегда лучше обезопасить себя, и начать построение с самого начала.
19.4.16.5. Как ускорить процесс построения системы?
Работайте в однопользовательском режиме.
Разместите каталоги /usr/src и /usr/obj в отдельных файловых системах, располагающихся на разных дисках. Если это возможно, то разместите эти диски на разных дисковых контроллерах.
Ещё лучше разместить эти файловые системы на нескольких дисках при помощи устройства (драйвер объединённых дисков).
Выключите генерацию профилирующего кода (установив ``NOPROFILE=true'' в файле /etc/make.conf). Вам это скорее всего никогда не понадобится.
Также в /etc/make.conf установите значение CFLAGS во что-то типа -O -pipe. Оптимизация -O2 выполняется гораздо медленнее, а разница между -O и -O2 обычно несущественна. -pipe позволяет компилятору использовать для связи вместо временных файлов программные каналы, что уменьшает обращение к диску (за счет оперативной памяти).
Передайте утилите make(1) параметр -jn для запуска параллельно нескольких процессов. Обычно это помогает вне зависимости от того, сколько процессоров установлено в вашей машине.
Файловая система, на которой располагается каталог /usr/src, может быть смонтирована (или перемонтирована) с опцией noatime. При этом запись на диск информации о времени последнего доступа к файлам будет отключена. Скорее всего, вам эта информация и не нужна.
# mount -u -o noatime /usr/src
Внимание: В примере предполагается, что /usr/src
располагается на собственной файловой системе. Если это не так (то есть он является частью, скажем, /usr), то вам нужно использовать точку монтирования той файловой системы, а не /usr/src.
Файловая система, на которой располагается /usr/obj, может быть смонтирована (или перемонтирована) с параметром async. Это приведёт к тому, что операции записи на диск будут выполняться асинхронно. Другими словами, запись будет завершаться немедленно, но данные записываться на диск несколькими секундами позже.


Это позволит объединять операции записи и приведёт к значительному приросту производительности.
Внимание: Имейте в виду, что эта опция делает вашу файловую систему менее устойчивой. С этой опцией имеется больше шансов, что при перезагрузке машины после неожиданного сбоя при пропадании напряжения файловая система окажется в невосстановимом состоянии.
Если каталог /usr/obj -- это все, что есть в этой файловой системе, то это не проблема. Если на той же самой файловой системе имеются какие-то важные данные, то проверьте давность ваших резервных копий перед включением этой опции.
# mount -u -o async /usr/obj
Внимание: Как и раньше, если каталог /usr/obj
располагается не на собственной файловой системе, то в примере замените его на имя соответствующей точки монтирования.
19.4.16.6. Что мне делать, если что-то пошло не так?
Скрупулезно проверьте, чтобы в вашем окружении не было мешающих остатков от предыдущих построений. Это достаточно просто.
# chflags -R noschg /usr/obj/usr
# rm -rf /usr/obj/usr
# cd /usr/src
# make cleandir
# make cleandir
Да, команду make cleandir действительно нужно выполнять дважды.
После этого повторите весь процесс снова, начиная с make buildworld.
Если у вас все еще есть проблемы, пришлите текст ошибки и выдачу команды uname -a на адрес списка рассылки freebsd-questions. Будьте готовы ответить на другие вопросы о конфигурации вашей системы!

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