FreeBSD - Обновление - "пересборка мира"


Материал из Wiki - Iphoster - 'the best ever hosting and support

Перейти к: навигация, поиск

Обновление FreeBSD - "пересборка мира"


--anton 22:32, 11 августа 2010 (UTC)


Перед синхронизацией сорцов при необходимости нужно забекапить конфиг ядра:

# cp /usr/src/sys/i386/conf/KERNEL1 ~/


Скачать исходные тексты с svn/cvs/etc репозиториев.
CVS теги:

Пример - release ветка:
RELENG_8_1
RELENG_8_2 
Пример - stable ветка: RELENG_8
Пример - head ветка: . (точка)
Все CVS теги: http://www.freebsd.org/doc/en/books/handbook/cvs-tags.html

Синхронизируем исходные тексты используя утилиту, которая входит в базовую систему - csup:

% ls /usr/share/examples/cvsup/
README           gnats-supfile    refuse.README    www-supfile
cvs-supfile      ports-supfile    stable-supfile
doc-supfile      refuse           standard-supfile
% cp /usr/share/examples/cvsup/stable-supfile /etc/supfile 
% egrep -v "^#" /etc/supfile | grep -v ^$ *default host=cvsup6.ua.FreeBSD.org *default base=/var/db *default prefix=/usr *default release=cvs tag=RELENG_8 *default delete use-rel-suffix *default compress src-all % csup /etc/supfile


Как вариант, скачать сорцы с svn репозитория(в примере качаем сорцы для 8-STABLE):

Установить svn client:
# cd /usr/ports/devel/subversion-freebsd && make config install clean 
% rm -fr /usr/src % rm -fr /var/db/sup/src-all % cd /usr % svn co http://svn.freebsd.org/base/stable/8 src (по протоколу HTTP) или: % svn co svn://svn.freebsd.org/base/stable/8 src (по протоколу SVN) В следующий раз просто: % cd /usr/src/; svn up - для того чтобы обновить/добавить/удалить сорцы для этой ветки, а не выкачивать снова все.

Официальный SVN репозиторий FreeBSD проекта(web) - http://svn.freebsd.org/viewvc/base/


Посмотреть примечания к обновлению:

% more  /usr/src/UPDATING

Посмотреть для какой версии сорцы:

% grep -A 1 'REVISION=' /usr/src/sys/conf/newvers.sh
REVISION="8.1"
BRANCH="STABLE"


Обязательно сделать бекап работающего ядра (при первом фейле - ядро будет как kernel.old, а при второй неудаче уже здесь будет ядро с которого нельзя будет загрузиться):

% cp -Rp /boot/kernel /boot/kernel.good


По требованию правим конфиг файл ядра - /usr/src/sys/i386/conf/KERNEL1
Создание конфигурационного файла ядра может быть выполнено используя файлы:

/usr/src/sys/conf/NOTES  --- для опций, которые не зависят от архитектуры
/usr/src/sys/i386/conf/NOTES  --- опции, только для архитектуры i386

Выполняем процедуру обновления и слияния файлов:

# cd /usr/obj - удаляем все из /usr/obj (если есть)
# chflags -R noschg *
# rm -rf *
# cd /usr/src
# make -j2 buildworld   - собираем мир в 2 потока (результат сохраняется в /usr/obj)
# make buildkernel KERNCONF=KERNEL1 - собираем ядро
# make installkernel KERNCONF=KERNEL1 - устанавливаем ядро
# nextboot -o "-s" -k kernel - следующая загрузка в однопользовательском режиме с новым ядром
# reboot - перезагрузка
# adjkerntz -i -  синхронизации времени с CMOS. 
# mount -a -t ufs - монтируем разделы с UFS

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

1) закомментировать все стартующие сервисы в /etc/rc.conf, кроме sshd
2) shutdown -r now - перезагрузить машину
3) не забыть после обновления включить все сервисы обратно
# mergemaster -p - пре-установочное слияние, 
# cd /usr/src
# make -j2 installworld - установка мира
# mergemaster -Ui
# reboot
------
mount -a -t ufs  - -a смонтиовать все ФС описанные в /etc/fstab, -t - тип ФС, по умолчанию ufs
mergemaster -Ui
    -i          Automatically install any files that do not exist in the des-
                tination directory.
    -U          Attempt(попытка) to auto upgrade files that have not been user modi-   
                fied.
    -p          Pre-buildworld mode.  Compares(сравнивать) only files known to be essen-
                tial(важные) to the success of {build|install}world, including
                /etc/make.conf.

mergemaster - утилита, которая сравнивает существующие конфигурационные файлы с теми, которые собирается установить.

При этапе вмешивания со стороны пользователя при слиянии файлов будет предложено такие опции:

* d - оставить существующий файл без изменений, а новый удалить
* i - установить новый файл, переписав старый
* m - построчно сравнить существующий и новый файлы:
  * ? [тут еще не разобрался как сделать чтобы использовал оба файла]
  * l - использовать файл с левой стороны
  * r - использовать файл с правой стороны
* v - просмотреть различия в файлах еще раз


Не меняйте shell root - могут возникнуть потенциальные проблемы!!

Если бы я поменял шелл root на какой-нибудь /usr/local/bin/... , то после make delete-old-libs этот шел перестал бы быть работоспособен практически гарантированно, так как завязан на старые библиотеки, 
которые я удалил. В результате ни su, и login root я сделать не смог бы.


При переходе с одной мажорной версии к другой(например 7.Х->8.Х) перед delete-old надо пересобрать порты  % portupgrade -afrR и потом удалять старые файлы. Также возможно потребуется поставить /usr/ports/misc/compatxx/ - для совместимости с предыдущими версиями.


Чистим старые библиотеки и файлы (интерактивно):

# cd /usr/src
# make check-old
# make delete-old && make delete-old-libs
To remove old files and directories run 'make delete-old'.
To remove old libraries run 'make delete-old-libs'.

Либо чтобы не подтверждать удаления для каждого файла выполните:

# yes | make delete-old
# yes | make delete-old-libs


Удаляем /usr/obj/usr - остатки от make buildworld:

# du -sh /usr/obj
 1,9G	/usr/obj
# chflags -R noschg /usr/obj/usr
# rm -rf /usr/obj/usr
# cd /usr/src
# make cleandir
# make cleandir


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

# du -sh /boot/kernel*
154M	/boot/kernel
144M	/boot/kernel.good
154M	/boot/kernel.old
# rm -rf /boot/kernel.old


Если проблемы с загрузкой и инициализацией ядра, выполнить(при наличии kernel.good):

прервать загрузку
unload
load /boot/kernel.good/kernel
load /boot/kernel.good/acpi.ko
boot


Что означает p1, p2.... после выхода релиза?
Первая пересборка, вторая пересборка...... с соответсвующими исправлениями!


Ключи make для /usr/src:

# The user-driven targets are:
#
# universe -     *Really* build *everything* (buildworld and
# all kernels on all architectures).
# buildworld -     Rebuild *everything*, including glue to help do
# upgrades.
# installworld -     Install everything built by "buildworld".
# world - buildworld + installworld, no kernel.
# buildkernel -     Rebuild the kernel and the kernel-modules.
# installkernel -     Install the kernel and the kernel-modules.
# installkernel.debug
# reinstallkernel -     Reinstall the kernel and the kernel-modules.
# reinstallkernel.debug
# kernel -     buildkernel + installkernel.
# doxygen -     Build API documentation of the kernel, needs doxygen.
# update -     Convenient way to update your source tree (cvs).
# check-old -     List obsolete directories/files/libraries.
# check-old-dirs -     List obsolete directories.
# check-old-files -     List obsolete files.
# check-old-libs -     List obsolete libraries.
# delete-old -            Delete obsolete directories/files/libraries.
# delete-old-dirs -     Delete obsolete directories.
# delete-old-files -     Delete obsolete files.
# delete-old-libs -      Delete obsolete libraries.


Файл - инструкция по обновлению - /usr/src/Makefile



Ссылки:

Индекс цитирования