Откомпилируйте и установите новое ядро



Чтобы получить полную отдачу от вашей новой системы, вы должны перекомпилировать ядро. Это практически необходимость, так как отдельные структуры в памяти могут меняться, и программы типа ps(1) и top(1) не будут работать, пока версии ядра и исходных текстов системы не будут совпадать.

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

В FreeBSD важно выполнить buildworld перед сборкой нового ядра.

Замечание: Если вы хотите построить собственное ядро и уже подготовили файл конфигурации, просто используйте KERNCONF=MYKERNEL следующим образом:

# cd /usr/src

# make buildkernel KERNCONF= MYKERNEL

# make installkernel KERNCONF= MYKERNEL

Заметьте, что, если вы установили kern.securelevel в значение, превышающее 1, и установили флаг noschg или подобный на бинарный файл ядра, то вы будете вынуждены перейти в однопользовательский режим для того, чтобы воспользоваться installkernel. В противном случае вы должны выполнять эти команды без проблем. Обратитесь к справочным страницам об init(8) для получения подробной информации о kern.securelevel и chflags(1) для получения информации о различных флагах файлов.

Перезагрузитесь в однопользовательский режим

Для проверки работоспособности ядра вы должны перезагрузить систему и перейти в однопользовательский режим. Сделайте это, следуя указаниям в Разд. 22.4.5.

Установите новые версии системных программ

Если вы компилировали достаточно свежую версию FreeBSD, в которой имеется команда make buildworld, то для установки новых версий программ вы должны теперь выполнить команду installworld.

Запустите

# cd /usr/src

# make installworld

Замечание: Если при выполнении команды make buildworld вы задавали значения каких-либо переменных, то при выполнении make installworld вы должны задать те же самые переменные. Это не всегда так для остальных параметров; например, при выполнении installworld никогда не должен использоваться параметр -j.

Например, если вы выполняли команду:

# make -DNO_PROFILE buildworld

то результат её выполнения должен устанавливаться командой

# make -DNO_PROFILE installworld

В противном случае будет делаться попытка установить библиотеки для профилирования, которые не компилировались на этапе выполнения команды make buildworld.

Обновите файлы, не обновленные по команде make installworld

При перестроении системы не будут обновляться некоторые каталоги (в частности, /etc, /var и /usr) с конфигурационными файлами.

Самым простым способом обновить такие файлы является запуск утилиты mergemaster(8), хотя можно сделать это и вручную, если вам так больше нравится. Вне зависимости от выбранного вами способа обязательно сделайте резервную копию каталога /etc на случай, если произойдёт что-то непредвиденное.

Mergemaster

Утилита mergemaster(8) является скриптом для оболочки Боурна, которая поможет вам в определении разницы между вашими конфигурационными файлами в каталоге /etc и конфигурационными файлами из дерева исходных текстов /usr/src/etc. Это является рекомендуемым способом синхронизации системных конфигурационных файлов с теми, что размещены в дереве исходных текстов.

Для начала просто наберите mergemaster в приглашении командной строки и посмотрите, что происходит. mergemaster построит временное окружение для пользователя root, начиная от /, а затем заполнит его различными системными конфигурационными файлами. Эти файлы затем будут сравниваться с теми, что установлены в вашей системе. В этот момент файлы, которые имеют отличия, будут выданы в формате diff(1), где знак + будет означать добавленные или изменённые строки, а знак - будет означать строки, которые были либо полностью удалены, либо заменены на новые. Обратитесь к страницам справочной системы по команде diff(1) для получения более полной информации о синтаксисе команды diff(1) и формате выдачи отличий в файлах.

Затем mergemaster(8) выдаст вам каждый файл, в котором есть изменения, и в этот момент у вас есть возможность либо удалить новый файл (который будем считать временным), установить временный файл в его неизменённом виде, объединить временный файл с установленным на данный момент, либо просмотреть выдачу diff(1) ещё раз.

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

Выбор установки немодифицированного временного файла приведёт к замене текущего файла новым. Для большинства немодифицированных файлов это является подходящим вариантом.

Выбор варианта с объединением файла приведёт к вызову текстового редактора, содержащего текст обоих файлов. Теперь вы можете объединить их, просматривая оба файла на экране, и выбирая те части из обоих, что подходят для окончательного варианта. Когда файлы сравниваются на экране, то нажатие l выбирает содержимое слева, а нажатие r выбирает содержимое справа. В окончательном варианте будет файл, состоящий из обеих частей, который и будет установлен. Этот вариант используется для файлов, настройки в которых изменялись пользователем.

Выбор повторного просмотра diff(1)-разниц выдаст вам разницы между файлами, как это делала утилита mergemaster(8) до того, как запросила вас о выборе.

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

Обновление в ручном режиме

Однако если вы хотите произвести обновление вручную, то вы не можете просто скопировать файлы из /usr/src/etc в /etc и получить работающую систему. Некоторые из этих файлов сначала нужно ''установить''. Это нужно потому, что каталог /usr/src/etc не является копией того, что должен содержать ваш каталог /etc. Кроме того, есть файлы, которые должны присутствовать в /etc, но которых нет в /usr/src/etc.

Если вы используете mergemaster(8) (как это рекомендуется), то вы можете перейти сразу к следующему разделу.

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

Сделайте резервную копию вашего каталога /etc : Хотя, в теории, никаких автоматических действий с этим каталогом не производится, всегда лучше чувствовать себя уверенным. Так что скопируйте имеющийся каталог /etc в какое-нибудь безопасное место. Запустите что-то вроде:

# cp -Rp /etc /etc.old

-R задает выполнение рекурсивного копирования, а -p сохраняет даты, владельца файлов и тому подобное.

Вам нужно создать шаблонную структуру каталогов для установки нового содержимого /etc и других файлов. Подходящим местом является /var/tmp/root, и в нём потребуется разместить некоторое количество подкаталогов.

# mkdir /var/tmp/root

# cd /usr/src/etc

# make DESTDIR=/var/tmp/root distrib-dirs distribution

Эти команды приведут к созданию нужной структуры каталогов и установке файлов. Множество каталогов, созданных в /var/tmp/root, будут пустыми и должны быть удалены. Проще всего сделать это так:

# cd /var/tmp/root

# find -d . -type d | xargs rmdir 2>/dev/null

Эти команды удалят все пустые каталоги. (Стандартный поток диагностических сообщений перенаправляется в /dev/null для исключения предупреждений о непустых каталогах.)

Теперь /var/tmp/root содержит все файлы, которые должны быть помещены в соответствующие места в /. Теперь пройдитесь по каждому их этих файлов и определите, чем они отличаются от имеющихся у вас файлов.

Заметьте, что некоторые из файлов, которые были установлены в каталог /var/tmp/root, имеют первым символом ''.''. На момент написания единственными такими файлами являлись файлы начальных скриптов командных процессоров в /var/tmp/root/ и /var/tmp/root/root/, хотя могут быть и другие (зависит от того, когда вы это читаете). Обязательно пользуйтесь командой ls -a, чтобы выявить их.

Проще всего сделать это путём сравнения двух файлов при помощи команды diff(1):

# diff /etc/shells /var/tmp/root/etc/shells

Эта команда покажет разницу между вашим файлом /etc/shells и новым файлом /var/tmp/root/etc/shells. Используйте это для определения того, переносить ли сделанные вами изменения или скопировать поверх вашего старого файла.

Называйте новый корневой каталог ( /var/tmp/root ) по дате, чтобы вы смогли легко выявить разницу между версиями: Частое перестроение системы означает также и частое обновление /etc, которое может быть несколько обременительным.

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

1. Выполните перестроение системы обычным образом. Когда вы вам потребуется обновить /etc и другие каталоги, дайте целевому каталогу имя на основе текущей даты. Если вы делаете это 14 февраля 1998 года, то вы можете сделать следующее:

# mkdir /var/tmp/root-19980214

# cd /usr/src/etc

# make DESTDIR=/var/tmp/root-19980214 \

Distrib-dirs distribution

2. Перенесите изменение из этого каталога, как это описано выше.

Не удаляйте каталог /var/tmp/root-19980214 после окончания этого процесса.

3. Когда вы загрузите самую последнюю версию исходного кода и перестроите систему, выполните шаг 1. Это даст вам новый каталог, который может называться /var/tmp/root-19980221 (если вы ждете неделю между обновлениями).

4. Теперь вы можете видеть изменения, которые были сделаны за прошедшую неделю, выполнив при помощи команды diff(1) рекурсивное сравнение двух каталогов:

# cd /var/tmp

# diff -r root-19980214 root-19980221

Как правило, здесь содержится гораздо меньше отличий, чем между каталогами /var/tmp/root-19980221/etc и /etc. Так как отличий меньше, то и легче перенести эти изменения в ваш каталог /etc.

5. Теперь вы можете удалить более старый из двух каталогов /var/tmp/root-*:

# rm -rf /var/tmp/root-19980214

6. Повторяйте этот процесс всякий раз, когда вам нужно перенести изменения в каталог /etc.

Для автоматической генерации имён каталогов можно использовать команду date(1):

# mkdir /var/tmp/root-`date "+%Y%m%d"`

Перезагрузка

Теперь вы сделали всё. После того, как вы проверили, что всё на месте, можете перегрузить систему. Простая команда shutdown(8) должна это сделать:

# shutdown -r now

Завершение

Теперь у вас имеется успешно обновлённая система FreeBSD. Поздравляем!

Если что-то работает неправильно, можно с лёгкостью перестроить конкретную часть системы. Например, если вы случайно удалили файл /etc/magic в процессе обновления или переноса /etc, то команда file(1) перестанет работать. В таком случае это можно исправить вот так:

# cd /usr/src/usr.bin/file

# make all install

Вопросы?

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.

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

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

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

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

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

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

Каталог /usr/obj содержит все объектные файлы, которые создаются во время фазы компиляции. Обычно одним из первых шагов в процессе make buildworld является удаление этого каталога. В этом случае сохранение /usr/obj после окончания имеет мало смысла; вдобавок, он будет занимать большой объём дискового пространства (на данный момент около 340 МБ).

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

4. Могут ли быть продолжены прерванные процессы построения?

Это зависит от того, насколько далеко зашел процесс построения перед тем, как вы обнаружили проблему.

В общем случае (и это несложное и быстрое правило) процесс make buildworld строит новые копии необходимых инструментальных средств (таких, как gcc(1) и make(1)) и системные библиотеки. Затем эти средства и библиотеки устанавливаются. Новые инструментальные средства и библиотеки затем используются для перестроения самих себя, и повторно устанавливаются. Система в целом (теперь включая обычные пользовательские программы, такие, как ls(1) или grep(1)) теперь перестраивается с новыми системными файлами.

Если вы на последнем шаге, и вы знаете это (потому что просматривали вывод, который сохраняете), то вы можете (достаточно безболезненно) выполнить команду:

… исправление проблемы …

# cd /usr/src

# make -DNO_CLEAN all

При этом результат предыдущего запуска make buildworld откатываться не будет.

Если вы видите сообщение:

--------------------------------------------------------------

Building everything..

--------------------------------------------------------------

в выводе команды make buildworld, то делать так достаточно безопасно.

Если этого сообщения не было, или вы в этом не уверены, то всегда лучше обезопасить себя, и начать построение с самого начала.

5. Как ускорить процесс построения системы?

• Работайте в однопользовательском режиме.

• Разместите каталоги /usr/src и /usr/obj в отдельных файловых системах, располагающихся на разных дисках. Если это возможно, то разместите эти диски на разных дисковых контроллерах.

• Ещё лучше разместить эти файловые системы на нескольких дисках при помощи устройства ccd(4) (драйвер объединённых дисков).

• Выключите генерацию профилирующего кода (установив ''NO_PROFILE=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 располагается не на собственной файловой системе, то в примере замените его на имя соответствующей точки монтирования.

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 (http://lists.FreeBSD.org/mailman/listinfo/freebsd-questions). Будьте готовы ответить на другие вопросы о конфигурации вашей системы!


Дата добавления: 2018-10-26; просмотров: 144; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!