Синхронизация source-tree(cvsup) и сборка новой системы(make world)

Добавление: для тех кто хочет апгрейдить 3.x -> 4.-Stable и кому лень
читать `less /usr/src/UPDATING` рекомендую сперва просмотреть начало и
затем следовать процедуре описанной в завершении _опуса_.

1. Две ветви системы FreeBSD: Stable и Current.

 Командой разработчиков OS FreeBSD была выбрана следующая тактика и стратегия
развития системы:

 - направление Stable, версия стабильной системы FreeBSD на момент
   разработки со всеми вытекающими из НАЗВАНИЯ выводами

 - направление Current, стратегическая версия системы, те в этой ветке
   закладывается новый, современный подход к системе, зачастую система
   существенно перерабатывается с тем чтобы в дальнейшем осуществить
   переход Current -> в следующюу НОВУЮ реализацию Stable.
    Одним словом Current - это development ветка системы FreeBSD.

Примечание: чтобы все стало ясно, приведем пример,(это лишь пример и мои мысли)

 - FreeBSD 3.x [последний Release == 3.5] - видимо это тупиковая ветка.
 - FreeBSD 4.x-Stable [последний Release == 4.0], как сказано выше -
   стабильная система или приближение к ней
 - FreeBSD 5.x-Current - новая система, которая вероятно заменит в
   будущем ветку 4.x-Stable

 Вероятно в какой-то момент версия 4.x-Stable устареет и возможно станет
тупиковой веткой, а ей на смену придет версия 5.x, которая в свою очередь
станет 5.x-Stable, а следующим стратегическим направлением возможно
станет 6.x-Current и тд и тп - думаю смысл понятен.

2. Для чего нужно синхронизировать ВСЮ систему?

 Для тех кто планирует иметь СТАБИЛЬНУЮ систему, включая свежие правки
security и тд и тп вероятно имеет смысл иметь альтернативный ОСНОВНОМУ
сервер, на котором производить серьезные изменения и после тщательного
тестирования переводить в "боевой режим" заменив ОСНОВНОЙ.

- стабильное ядро
- новые драйвера/драйвера для нового оборудования
- security

3. Настройка синхронизации source-tree.

 Ограничимся рассмотрением синхронизации системы будь то STABLE или
CURRENT с использованием "CVSUP".

 1) после установки "новой" системы для синхронизации source-tree
   посредством cvsup, его cvs или cvsbin необходимо предварительно
   установить из портов (подразумевается что при ИНСТАЛЛЯЦИИ системы)
   вы попросили установить не только sources самой системы, но и дерево
   портов - /usr/ports
    Однако проще воспользоваться установкой пакета cvsup-it, поскольку
   установка его из портов требует достаточно длительного периода времени.
   CVSUP-IT - это на самом деле простой front-end для настройки параметров
   синхронизации и непосредственно запуска синхронизации после настройки,
   сам же пакет, как упоминалось выше, зависит от cvsup-bin, который
   имеется в виде пакета и принудительно устанавливается при установке
   cvsup-it.

 2) я советую установить систему с необходимым минимумом пакетов и даже
   не настраивая XFree86, затем перегрузиться и установить cvsup-it -
   настроить файлы конфигурации: supfiles и на этом завершить саму установку
   cvsup-it если вы планируете время от времени синхронизировать свою систему
   или делать это ежедневно по-расписанию.
    С тем чтобы вручную сделать изменения в конфигурационных файлах supfiles
   и создать скрипт для запуска по cron'у, например положив его в
   '/etc/periodic/daily' или '/etc/periodic/weekly'

Примеры настройки конфигурации CVSUP и скриптов:

4. Сборка новой системы - из нового дерева sources.

Важно: Лучше заранее прочитать ТО ЧТО написано в /usr/src:

  - README
  - UPDATING

и соответственно знать какие изменения претерпела система за прошедшее время,
нежели терзать себя поисками и расспросами ТОГО ЧТО У ВАС "под носом".

-----------------------------------------------------------------------------
Внимание: в зависимости от того на какой RELEASE или RELENG вы делаете upgrade,
          проверьте описание изменений в файле /usr/src/UPDATING, в последних
          релизах переменная KERNEL заменена на KERNCONF! А процедура сборки
          системы и ядра УНИФИЦИРОВАНА следующим образом:

используемые теги:

tag=HEAD или tag=. - тег для CURRENT ветки FreeBSD

tag=RELENG_5_0 - только для скачивания изменений security и bug-fixes RELEASE-5.0

tag=RELENG_4 - для скачивания STABLE-4 текущей ветки

tag'и вида:

RELENG_4_X: RELENG_4_7, RELENG_4_6, и тд и тп заканчивая RELENG_4_3 - это теги
исключительно для патчей security и bug-fixes к RELEASE-4.X (4.7, 4.6 ... 4.3)

tag'и вида:

RELENG_4_Y_0_RELEASE: RELENG_4_7_0_RELEASE, RELENG_4_6_2_RELEASE ...
RELENG_2_2_0_RELEASE  - это теги самих релизов RELEASE-4.X.Z.

у портов и документации: ports & docs, теги tag=.

cd /usr/src
make buildworld     [-DPARAM-1 -DPARAM-2 ... ]
make buildkernel KERNCONF=ИМЯ_ЯДРА
make installkernel KERNCONF=ИМЯ_ЯДРА
[reboot                                           ]
[boot -s            загружаемся в single-user mode]
make installworld   [-DPARAM-1 -DPARAM-2 ... ]
reboot

Прим: -DPARAM - позволяет задать опции при сборке системы
      чаще всего я опускал фазу перезагрузки после `make installkernel` и
выполнял ее после `make installworld`, в зависимости от версии релиза, при
сборке ядра может использоваться либо переменная KERNEL, либо KERNCONF.
-----------------------------------------------------------------------------

 Сборка новой системы из дерева исходников укрупненно выглядит так:

      Вариант 1              |         Вариант 2
-------------------------------------------------------------------
- cd /usr/src                | cd /usr/src
- make world                 | make buildworld
 --- анализ ---              |  --- анализ ---
                             | make installworld

Примечание: `make world`==`make buildworld; make installworld`
           те он объединяет ОБА этапа, иногда бывает удобно их
разделить, выбор - на ваше усмотрение и в зависимости от ситуации-целей.

  Дополнительный шаг в случае изменений в ядре и/или /usr/sbin/config

                 cd /sys/i386/conf
  /usr/obj/usr/src/usr.sbin/config/config MYKERNEL
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

не случайно выделена новая утилита `config` - будьте внимательны, иначе
возможны проблемы:

- новое ядро и старые binaries системы (не работают `ps`, `top` и тд и тп)
- старое ядро и новые binaries (проблемы с загрузкой или полная чехарда...)

- запускаем mergemaster для замены старого варианта дерева "/" на новый
из "/var/tmp/temproot" - я бы не назвал эту операцию ОБЯЗАТЕЛЬНОЙ, но
в случае перехода от 3.x -> 4.-Stable в /etc появляется масса нового.

Отступление:

Mergemaster
~~~~~~~~~~~
 MERGEMASTER - это обычный скрипт, который сравнивает основные
НАСТРОЕЧНЫЕ файлы системы, например из "/etc":

/etc/dafaults/rc.conf
             /...
/etc/login.*
    /rc*

и тд и тп - ничего необычного в этом НЕТ, происходят изменения в системе,
в ее security, настроечных файлах, окружения среды, опции компилятора и
тд и тп...

 Запуск MERGEMASTER - не есть ОБЯЗАТЕЛЬНАЯ, но ЖЕЛАТЕЛЬНАЯ ОПЕРАЦИЯ благодаря
которой вы можете отследить различные изменения, а вот принятие решения
на предмет замены ваших ТЕКУЩИХ конфигурационных файлов НА АКТУАЛЬНЫЕ -
есть процесс принятия решения ИСКЛЮЧИТЕЛЬНО ВАМИ!

Перед запуском `mergemaster` проверьте наличие переменных среды:
PAGER и определите привычную для вас утилиту, для меня /usr/bin/less :)

либо заранее настройте ваш $HOME/.mergemasterrc и определитесь как вам удобнее
использовать mergemaster - в автоматическом режиме:

 mergemaster -a

 или ручном:

 mergemaster [-i] [-t /path/to/temp/root]
                   ^^^^^^^^^^^^^^^^^^^^^- задание альтернативного создания
                   дерева тому что by default /var/tmp/temproot
             ^^^^- автоматически добавлять в систему ТЕ НАСТРОЕЧНЫЕ файлы
             которых в системе НЕ БЫЛО (те то новое что появилось в данной
             версии)

Ничего сложно в использовании `mergemaster` - НЕТ:

 "i" - нажимаем и в результате _новый_ файл заменяет ВАШ ТЕКУЩИЙ
 "m" - merge, слить оба файла в ОДИН, ОНО вам НАДО?
  - простое нажатие клавиши "ВВОД" :) оставляет ВАШИ настройки,
  а _новый_ оставляет для того чтобы вы могли проанализировать и сравнить
  его позже с вашим, найти этот _новый_ файл можно в "/var/tmp/temproot/..."
или там где вы задали при запуске mergemaster c ОПЦИЕЙ [-t /path/to/temp/root"]
Нет смысла разбирать ВСЕ опции по-скольку и сам mergemaster и его опции НУ
ОЧЕНЬ ПРОЗРАЧНЫ и ПОНЯТНЫ, ГЛАВНОЕ - НЕ УДАЛЯЙТЕ дерево "/var/tmp/temproot/..."
по завершении работы `mergemaster` если вы все же не поняли как это работает.

Примечание: используйте свои /etc/rc.conf, /etc/make.conf, /etc/rc.local.conf
            вместо изменения содержимого /etc/defaults/... - тем самым сохраните
кучу своего времени нежели каждый раз наводить ревизию содержимого /etc/defaults
 Так например, security & crypto идет в одной упаковке в SOURCES и если вы
захотели ИМЕТЬ у себя метод криптования IDEA, просто добавьте соответствующую
строку в свой /etc/make.conf, саму строку возьмите из /etc/defaults/make.conf.
 Теперь RSA идет как подпрограммы из библиотек OpenSSL, а RSAINTL и ее порты
удалены из системы за ненадобностью.

И последнее, после того как вы успешно собрали И СИСТЕМУ И НОВОЕ ЯДРО, можете
смело удалить директорию /usr/obj/usr и /sys/compile/ИМЯ_ВАШЕГО_ЯДРА, тем
самым освободите свою FS=/usr, не забудьте ТОЛЬКО ПОСЛЕ успешной ПЕРЕСБОРКИ :)
 Мб я съел чего или ... , можете удалять /usr/obj/* когда угодно, просто иной
раз удобно оставить объектники для дальнейших сборок системы, собственные
изменения или дополнения и тд и тп.

             Только ТЕПЕРЬ можно ПЕРЕГРУЖАТЬСЯ!!!
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Step by Step:

1. Проверить файлы логов после очередной отработки `cvsup` на предмет
  изменения Kernel и /usr/sbin/config - ЕСЛИ ТАКОВЫЕ ИМЕЮТСЯ, настоятельная
  рекомендация пересобрать НОВОЕ ЯДРО после ПОЛНОЙ сборки системы!!!

2. Человек != Робот, если что-либо НЕ ПОМНИТСЯ:

- cd /usr/share/doc/handbook
- READ makeworld.html
- READ kernelconfig.html
- `man mergemaster` или `less /usr/sbin/mergemaster`

3. Подготовительный этап - "на FreeBSD надейся - но сам не плошай"

- откатываем "рабочую" директорию '/etc':

cp -Rp /etc /path/to/etc.work
      или
tar -cf - -C /etc . | tar xpf - -C /path/to/etc.work

[4.] В принципе можно пропустить, но желающие могут сделать листинг
или копию УСТРОЙСТВ - '/dev' - для последующего сравнения с новой и
добавления отсутствующих устройств - `cd /dev ; ./MAKEDEV device_name`

5. Посмотреть рекомендации в новом SOURCE-TREE.

- ПРОСМОТРЕТЬ и при желании настроить /etc/make.conf и /etc/defaults/make.conf

обратите внимание на следующие строки:

----------------------------------------------------------------------------
# мои предпочтения

#--lavr, нет надобности в RSA так как это часть OpenSSL встроенного в
# систему, как и OpenSSH
#RSAREF=YES                         [лично мне по НРАВУ RSA]

USA_RESIDENT=NO                    [справедливо для non-USA :)
CFLAGS= -O -pipe                   [с данными ключами компиляция идет "всегда"]
NOPROFILE=     true                [если вам не нужно proflibs - ускоряет]
COMPATXX=       yes                [поддержка совместимости с прежними версиями]
...
...
...                                остальное на ваше усмотрение...
----------------------------------------------------------------------------

- cd /usr/src
- less README
- less UPDATE

и при желании - посмотреть имеющиеся там Makefiles, бывает полезно.

6. Приступаем к самой СБОРКЕ.

Предупреждение: в качестве SHELL'а подразумевается Bourne-shell или Bash,
                так что будьте осторожны с экранированием и перенаправлением
                ввода-вывода в командной строке. Не используйте в качестве
                основы для '/path[/to/file.log]' директорию '/tmp', она же
                почистится после `reboot` и тогда очень трудно будет отыскать
                "концы".

Вариант 1.
----------

По идее, правильно было бы перейти в "single-user mode" - для ЭТАПА
"installworld" - замена binaries системы, но "ОБЫЧНО" - все проходит
успешно и в "multi-user mode" - решать вам...

- cd /usr/src
- script /path/to/mkworld.log [можно использовать для дальнейшего
                               перенаправления ввода-вывода от 'make' -
                               завершением будет команда `exit`]

- make world
  ... идет сборка системы ... [при желании можно наблюдать: more или less логи]
- exit
             СБОРКА НОВОЙ СИСТЕМЫ ЗАВЕРШЕНА
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- less /path/to/mkworld.log   [посмотрели - проанализировали, приняли решение]
- mergemaster                 [интерактивный запуск анализа НОВОГО '/root',
                               который будет в /var/tmp/temproot, и ПРИНЯТИЯ
                               решения о ВНЕСЕНИИ изменений]

             СБОРКА НОВОГО ЯДРА
             ~~~~~~~~~~~~~~~~~~

- cd /sys/i386/conf
- /usr/obj/usr/src/usr.sbin/config/config MYKERNEL
- cd ../../compile/MYKERNEL
- make depend
- make
- make install
- АНАЛИЗ "НОВЫХ": '/root', '/etc', '/dev'
- fastboot                    [перезагрузка и смотрим ЧТО получили]

Важное:
~~~~~~~
[не забудьте что ваше СТАРОЕ - РАБОЧЕЕ ЯДРО теперь == kernel.old и в случае
неудачи при загрузке всегда можно выйти из положения:

процесс загрузки:

loading kernel...
boot.... пошел отсчет секунд для загрузки... - нажали "пробел" или что-либо
отличное от "Enter" и вышли в "ЗАГРУЗЧИК":

unload kernel
load kernel.old
boot -s              [single user mode - потому что не известно как старое
                      ядро будет работать с новыми binaries системы]

Вариант 2.
----------

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

[multi-user mode]

- cd /usr/src 
- make buildworld > /path/to/mkbuild.log 2>&1
 ... параллельно можно работать и смотреть `less /path/to/mkbuild.log`
  завершился

для чистоты можно перейти в single-user mode:
- shutdown -k now  или kill -TERM 1 == kill -1 1

- make installworld > /path/to/mkinstall.log 2>&1 
- mergemaster -a -t /var/tmp/newroot [пускаем mergemaster на автомате "-a"
                                     все различия при этом будут оставлены для 
                                     _ручного_ изменения в /var/tmp/newroot ]
или

- mergemaster -a      - от верхнего отличается default_dir=/var/tmp/temproot

 --- остальные действия как в "Варианте 1"

Примечание: если посмотреть внимательно Makefiles в '/usr/src', то увидим что
там есть ВСЕ:

- запуск cvsup
- построение системы:

  a) make world
  b) make buildworld && make installworld
- построение ядра

Хорошая идея сделать у себя СВОЙ Makefile, под свои нужды, например:

- cd $HOME
- "create Makefile"

Ниже пример с комменатриями: (ВНИМАНИЕ - Makefile не проверен, это всего лишь
                              заготовка под будующий ПУСКАЧ)

Примечание: я бы совместил full-supfile и secure-supfile в один supfile
и тянул бы все с cvsup.ru.freebsd.org - те русских CVS зеркал, ибо там
все уже должно быть как надо, подразумевается security.

Комментарий к примечанию - поскольку в мире лицензий crypto произошло много
изменений, больше НЕТ НЕОБХОДИМОСТИ отделять их от Full-Sources, достаточно в
настроечном sup-file'е указать "src-all", потому как OpenSSH/OpenSSL идут
в системе by-default и OpenSSL использует RSA, а /usr/ports/security/linrsaintl
удален из портов за ненадобностью, как и RSAINTL=YES из /etc/make.conf, НО
если вы хотите имет возможность использования алгоритма IDEA, добавьте в свой
/etc/make.conf:

MAKE_IDEA=     YES     # IDEA (128 bit symmetric encryption)

 Держать supfile можно на выбор:

/etc/supfile
/usr/local/etc/supfile
или
/etc/cvsup/supfile
/usr/local/etc/cvsup/supfile

Логи же соединения cvsup удобнее держать там где место логам: /var/log
а логи изменений-перекачки source-tree внутри /var/log/cvsup/sup-ДАТА.

Предупреждение: данный Makefile лишь как набросок того что можно сделать
                под свои нужды, работоспособность не проверена
------------------------ что-нибудь типа Makefile --------------------------
#
# Makefile for build new system or kernel.
#
# cvsup_note:
#
# for run cvsup with minimal command options set cvsaup_basedir in your
# "supfiles", otherwise run cvsup with options:
#
# cvsup -g -L 1 -z -b CVSUPbaseDir -c CVSUPcollDir /path/to/your-supfile
#
#       cvsup_basedir_by_default=/usr/local/etc/cvsup - must be exist!!!
#       cvsup_colldir_by_default=/cvsup_basedir/sup   - source changes log
#

DATE=`date "+%H.%M-%d.%m.%y"`
CVSUPlogDIR=/var/log
CVSUPbaseDir=/var/log/cvsup
CVSUPcollDir=${CVSUPbaseDir}/sup-${DATE]

MYKERNEL=/sys/i386/conf/LAVR

update:
        @if [ ! -d ${CVSUPcollDir} ]; then \
                mkdir ${CVSUPcollDir}; \
                cp /sys/i386/conf/LINT $[CVSUPcollDir} \
        fi
        cvsup -g -L1 -z -b ${CVSUPbaseDir} -c ${CVSUPcollDir} /usr/local/etc/cvsup/supfile 2>&1 | tee /var/log/cvsup-log.${DATE};

build:
        cd /usr/src; \
        make buildworld 2>&1 | tee /var/tmp/mkbuild.${DATE};

install:
        cd /usr/src; \
        make installworld 2>&1 | tee /var/tmp/mkinstall.${DATE};

world:  
        cd /usr/src; \
        make world 2>&1 | tee /var/tmp/mkworld.${DATE};


kernel:
        @if [ -f ${MYKERNEL} ]; then \
              (cd /sys/i386/conf && \
              config ${MYKERNEL} && \
              cd ../../compile/${MYKERNEL} && \
              make depend && \
              make && \
              make install && \
              make clean) 2>&1 | tee /var/tmp/mkkernel.${DATE};
        else \
              @echo
              @echo You must the first CREATE and EDIT ${MYKERNEL}
              @echo only after that "make kernel" should be POSSIABLE!
              @echo
              @false
        fi 

newkernel:
        @if [ -f ${MYKERNEL} ]; then \
              (cd /sys/i386/conf && \
              /usr/obj/usr/src/usr.sbin/config/config ${MYKERNEL} && \
              cd ../../compile/${MYKERNEL} && \
              make depend && \
              make && \
              make install && \
              make clean) 2>&1 | tee /var/tmp/mkkernel.${DATE};
        else \
              @echo
              @echo You must the first CREATE and EDIT ${MYKERNEL}
              @echo only after that "make kernel" should be POSSIABLE!
              @echo
              @false
        fi

merge:
        /usr/sbin/mergemaster -a 2>&1 | tee /var/tmp/mkmerge.{DATE};

clean:
        chflags -R noschg /usr/obj/;
        rm -rf /usr/obj/*;
        rm -rf /var/tmp/mk*;

clobber:
        clean
        rm -rf /usr/src/*;

all:
        update
#world newkernel merge

---------------------- end of Makefile template ----------------------------

Вступление: по-скольку ВСЕ течет и ВСЕ изменяется, изменяется и сам
/usr/src/Makefile и сборка системы, ну и сама система, то к данному
пункту следует подходить ОЧЕНЬ аккуратно!!!
На настоящий момент подъем 3.x -> 4.x ПОЛНОСТЬЮ описан в:

         /usr/src/UPDATING

Одна из рекомендаций с www.freebsd.org - поднимать 3.x до 4.x через
upgrade из Install, который в свою очередь выполнять с CD-ROM.

Важно:
       - помнить что изменились драйвера устройств, те не забыть сделать
         MAKEDEV и внести соответствующие изменения в /etc/fstab

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

Upgrade системы 3.x -> 4.-Stable в соответствии с /usr/src/UPDATING,
Step by Step:

 Для начала отступление:

Upgrade - в случае ИЗМЕНЕНИЯ ЯДРА В-С-Е-Г-Д-А подразумевает ПЕРЕЗАГРУЗКУ,
а в данном случае: 3.x -> 4.-Stable -> reboot == 100% [однократный в случае
полного успеха - что по большому счету, маловероятно...]

Примечание: Для наиболее успешного апгрейда и минимального количества
reboot == 1, не забудьте ПОПРАВИТЬ-ВОССТАНОВИТЬ ВСЕ НЕОБХОДИМОЕ из старой
"/etc": rc.conf, make.conf, rc.conf.local, и тд и тп ВСЕ что будет
изменено, для этого ЛУЧШЕЕ запустить `mergemaster` без параметров - для
интерактивного принятия решения и "пометки на манжетах" ЧТО изменилось
для дальнейшей РУЧНОЙ ПРАВКИ.
 Не забудьте что в 4.-Stable OpenSSH является ЧАСТЬЮ системы, дабы не
перехлестнуться с SSH.

Если у вас "боевой" сервер, то вероятно лучше настроить cvsup на закачку
дерева НЕ поверх /usr/src, а в иное место, варианты:

- если есть место на локальных дисках, то непосредственно на рабочей машине;
- нет места, подмонтировать и засапить туда;

- ядро бы тоже лучше собрать на похожей МАШИНЕ, но уже с 4.-Stable;
- ... ньюансы возможны разные ...

Вывод: делать СЕРЬЕЗНЫЙ UPGRADE на "БОЕВОМ" сервере ОПАСНО.

1. Правильно настроили cvsup и ничего не забыли:

  - лучше выбрать ВСЕ
  - не забыть про включение SECURITY в supfile, теперь все встроено в систему

2. Запустили cvsup и выкачали ВСЕ дерево, желательно порты тоже, но их можно
  держать на другой машине.

  - просмотрели логи cvsup и убедились что ВСЕ ok.

3. cd /usr/src

-----------------------------------------------------------------------------
Внимание: в зависимости от того на какой RELEASE или RELENG вы делаете upgrade,
          проверьте описание изменений в файле /usr/src/UPDATING, в последних
          релизах переменная KERNEL заменена на KERNCONF! А процедура сборки
          системы и ядра УНИФИЦИРОВАНА следующим образом:

cd /usr/src
make buildworld     [-DPARAM-1 -DPARAM-2 ... ]
make buildkernel  KERNCONF=ИМЯ_ЯДРА
make installkernel  KERNCONF=ИМЯ_ЯДРА
[reboot                                           ]
[boot -s            загружаемся в single-user mode]
make installworld   [-DPARAM-1 -DPARAM-2 ... ]
reboot

Прим: -DPARAM - позволяет задать опции при сборке системы
      чаще всего я опускал фазу перезагрузки после `make installkernel` и
выполнял ее после `make installworld`, в зависимости от версии релиза, при
сборке ядра может использоваться либо переменная KERNEL, либо KERNCONF.
-----------------------------------------------------------------------------

  - отредактировать /etc/make.conf [советуют закомментить Kerberos, я бы
   посоветовал убрать все > -O для компилятора, уж очень много с этим было
   граблей при сборке ядра в 4.-Stable, -O -pipe - достаточно, лучше
   не экспериментировать... не забудьте оставить compatxx

  - make buildworld

... построили ...

4. строим НОВОЕ ЯДРО и инсталлируем его - описано выше.
   (будьте осторожны с /usr/sbin/config)

  или можно сделать через make не выходя из /usr/src, при этом не забыв
  создать ваш - /sys/i386/conf/MYKERNEL (где MYKERNEL - имя вашего ядра)

  - make buildkernel KERNEL=<MYKERNEL>
  - make installkernel KERNEL=<MYKERNEL>

  - chflags noschg /kernel
  - chflags noschg /MYKERNEL
  - mv /kernel /kernel.old
  - mv /MYKERNEL /kernel
  - chflags schg /kernel

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

  - cp /dev/MAKEDEV /dev/MAKEDEV.orig
  - cp /usr/src/etc/MAKEDEV /dev/MAKEDEV
  
  тут вы можете придумать по вкусу:

  - записываем наличие текущих устройств:
  - ls -l | awk '{print $1, $2, $3, $4, $5, $6, $NF}' > /var/tmp/dev_old.out

  - создаем новые, поскольку могут меняться major/minor
  - cd /dev && ./MAKEDEV all [это тонкое и СТРЕМНОЕ место, при создании
    новых - соответствующие им старые должны быть удалены! см. MAKEDEV -
    та еще штучка]

  - записываем НОВОЕ состояние устройств:
  - ls -l | awk '{print $1, $2, $3, $4, $5, $6, $NF}' > /var/tmp/dev_new.out

  - сравниваем и создаем недостающие из старых:
  - diff /var/tmp/dev.out /var/tmp/dev2.out

  - зачастую РАЗЛИЧИЕ в слайсах, например:
  - ./MAKEDEV sd0s1

  Я не могу дать готового решения, только рекомендацию:

старая система:  IDE-devices == wdXsYz   SCSI-devices == sdXsYz (2.2.x)
                                                      == daXsYz (3.x)

новая система    IDE-devices == adXsYz   SCSI-devices == daXsYz (4.stable)
                             == wdXsYz - оставили наименование от старого
                 драйвера для совместимости, точнее для памяти.

где X - номер диска или канала, а Y - номер слайса/slice, z - имя партиции.

так вот `sh MAKEDEV all` создаст вам устройства для первых четырех дисков:

-  ide: ad0 ad1 ad2 ad3
- scsi: da0 da1 da2 da3

 технология создания дисков проста:

- cd /dev && ./dev/MAKEDEV adX   [ X - номер диска ]
- cd /dev && ./dev/MAKEDEV ad0sY [ Y - номер слайса ]

вот в таком духе..., например:

- cd /dev
- ./MAKEDEV ad6
или
- ./MAKEDEV ad6s1a[b[c...]]

Слайсы и партиции смотрите в вашем /etc/fstab - ваших дисков.

5. Строим модули для ЯДРА и создаем новые devices для нового драйвера
  дисков - adX (ATA)

  - модули
  - cd /usr/src/sys/modules
  - make install

  - диски
  - cd /usr/src/sbin/mknod
  - make install

  если вы не создали дисковые devices после сборки ядра - создайте сейчас,
  как это делается, см. выше.

6. Теперь советуется перегрузиться в single-user mode, точнее:

  - reboot
  - boot -s [single-user mode]

Примечание: жаль попробовать не на чем - чуется мне что вовсе не обязательно
            тут перегружаться, в крайнем случае просто перейти в single-user
            mode: kill -1 1 и продолжить операцию "UPGRADE"

7. Устанавливаем утилиту install-info для update file/dir info.
 
   cd /usr/src
   cd gnu/usr.bin/texinfo/install-info
   make install

8. Устанавливаем бинарники новой системы.

  - cd /usr/src
  - make installworld

Примечание: если получили сообщение от библотеки ld-elf.so :

- ld-elf.so cannot load libc.so - выполняем:
- 'ldconfig -R /usr/obj/usr/src/lib/libc' и повторяем
- make installworld

9. Устанавливаем НОВЫЙ '/root' из '/var/tmp/temproot' через mergemaster

  - mergemaster

10. Перезагружаемся обычным образом или fastboot.

  - reboot or fastboot
   

11. Новая система работает - проверяем сервисы.


Copyleft Andrey Lavrentyev