Обновление ядра и мира FreeBSD

Я бы не сказал что в процессе удаленного администрирования серверов приходится часто обновлять систему, хотя-бы потому, что если это рабочий сервер, то есть на нем работают какие-то сервисы, сайты, всегда есть определенный риск превратить его в нерабочий). Что-бы обновлять систему удаленно, нужен как минимум KVM доступ. Тем не менее, иногда все таки это делать приходится. Весь процесс будем выполнять на виртуалке. Что имеем:
freebsd /# uname -r
8.1-RELEASE
Обновлять будем до, недавно вышедшей, версии FreeBSD 8.2. Вообще, операционная система FreeBSD позволяет сделать бинарное обновление, описание этого есть на официальном сайте:
# freebsd-update upgrade -r 8.2-RELEASE
# freebsd-update install
# shutdown -r now
# freebsd-update install
# freebsd-update install
# shutdown -r now
но если не изменяет память, при использовании НЕ GENERIC ядра, этот вариант не прокатит, хотя в принципе, на время обновления можно перейти на ядро GENERIC. В любом случае, мне ближе обновление из исходников, видишь и контролируешь весь ход обновления. Итак, для начала нужно обновить ( если нет, то залить ) исходные тексты операционной системы. Проверяить текущую версию дерева исходных текстов FreeBSD, установленных в системе ( если они конечно установлены ) можно так:
freebsd /# grep -A 2 'TYPE="' /usr/src/sys/conf/newvers.sh
TYPE="FreeBSD"
REVISION="8.1"
BRANCH="RELEASE-p2"
Есть несколько способов синхронизировать исходники. Рассмотрим 2 варианта обновления.
  • Первый — использовать программу csup ( это более свежая версия утилиты cvsup ), она устанавливается вместе с системой, по-умолчанию.
  • Второй — воспользоваться svn ( subversion ) репозитарием FreeBSD.

Обновление исходных текстов через csup

Идем в /usr/share/examples/cvsup, берем файл standard-supfile и копируем в более удобное место.
freebsd /# cp /usr/share/examples/cvsup/standard-supfile /etc/supfile
Приводим его к такому виду:
*default host=cvsup6.ru.FreeBSD.org 
# Список зеркал можно найти тут http://www.freebsd.org/doc/handbook/cvsup.html#CVSUP-MIRRORS
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_8_2
# Список тегов http://www.freebsd.org/doc/handbook/cvs-tags.html
*default delete use-rel-suffix
*default compress
src-all
После сохранения, запускаем:
csup -g -L 2 /etc/supfile
Запустится синхронизация исходных текстов системы. Длительность зависит от скорости канала.

Обновление исходных текстов через svn ( subversion )

В отличии от csup, svn не входит в стандартную поставку операционной системы FreeBSD, ее нужно установить дополнительно. В портах FreeBSD, кроме обычной subversion существует еще и специализированный вариант subversion-freebsd, для обновления исходников нас интересует именно он.
freebsd /# cd /usr/ports
freebsd /# make -C devel/subversion-freebsd install clean
Для синхронизации через svn можно использовать HTTP или SVN сервер:
freebsd /# svn checkout http://svn.freebsd.org/base/releng/8.2/ /usr/src  # через HTTP
или соответственно
freebsd /# svn checkout svn://svn.freebsd.org/base/releng/8.2/ /usr/src   # через SVN
После завершения, снова глянем версию:
freebsd /# grep -A 2 'TYPE="' /usr/src/sys/conf/newvers.sh
TYPE="FreeBSD"
REVISION="8.2"
BRANCH="RELEASE-p1"
Все как надо. В дальнейшем, для синхронизации, достаточно сделать:
freebsd /# svn update /usr/src/
Можно приступать к сборке.

Обновление мира и ядра

Чистим на всякий случай директорию /usr/obj:
freebsd /# rm -rf /usr/obj
или как рекомендует хендбук:
freebsd /# cd /usr/obj
freebsd /# chflags -R noschg *
freebsd /# rm -rf *
freebsd /# cd /usr/src
freebsd /# make cleandir  # хендбук рекомендует выполнять эту команду дважды (!)
freebsd /# make cleandir
Идем дерево исходных текстов:
freebsd /# cd /usr/src
Мир в контексте операционной системы FreeBSD, это все, что не ядро. Ключ -j команды make позволяет запустить процесс в несколько потоков, ключ -s уменьшает количество информации выводимой на экран в процессе сборки. Команда time просто считает время. затраченное на выполнение следующей за ней команды, чисто для интереса). Запускаем сборку мира и ждем.
freebsd /usr/src# time make -s -j4 buildworld
Если все прошло успешно, получаем:
--------------------------------------------------------------
>>> World build completed on Thu Apr 21 06:43:20 UTC 2011
--------------------------------------------------------------
4014.258u 2388.551s 1:01:03.06 174.7%   5955+2033k 14136+6961io 18494pf+0w
Все это делалось на виртуалке — заняло чвс. Теперь собираем ядро. В параметре KERNCONF, указывается название нашего ядра, если таковое имеется, если данная опция не установлена, будет собрано ядро GENERIC, используемое системой FreeBSD по умолчанию. В данном случае я собираю свое ядро:
freebsd /usr/src# make -j4 -s buildkernel KERNCONF=GARROTTE
На ядро конечно времени ушло куда меньше нежели на мир:
--------------------------------------------------------------
>>> Kernel build for GARROTTE completed on Thu Apr 21 07:31:49 UTC 2011
--------------------------------------------------------------
910.735u 430.353s 14:05.53 158.6%       5824+1908k 630+6573io 8pf+0w
Устанавливаем только что скомпилированное ядро:
freebsd /usr/src# make -s installkernel KERNCONF=GARROTTE
При установке нового ядра происходит слудующее: новое ядро копируется в папку /boot/kernel, текущее перемещается в /boot/kernel.old. В случае, если с новым ядром система не завелась, есть возможность загрузить предыдущую версию из командной строки загручика. Теперь нужно сделать перезагрузку в однопользовательский режим. Делаем либо reboot, а затем на экране загрузчика выбираем Single user mode, цифра 4 в окне загрузчика, либо используем команду shutdown now, переводящую машину в режим single user. В процессе загрузки, будет выдан запрос, ввести полный путь к системной оболочке, тут можно просто нажать Enter, согласившись с предложенным /bin/sh. Если использовали shutdown now, разделы будут смонтированы как нужно, при использовании reboot, будут смонтированы 2 раздела, devfs и корневой раздел, при этом корневой будет смонтирован в режиме read only, то есть только чтение. Если делали reboot, поступаем следующим образом:
# mount -u /  # Перемонтируем корневой раздел в режим чтение/запись
# mount -a      # Монтируем все что прописано в /etc/fstab
теперь выполняем команду
freebsd /# mergemaster -p
Тут нужно быть внимательным смотреть, что mergemaster предлагает сделать с тем или иным конфигом, и выбирать устраивающий вас вариант действий.
  • d - оставить старый вариант файла, удалив новый;
  • i - установить новый, удалив старый;
  • m - построчное сравнение старого и нового файла;
  • v - сравнить файлы еще раз.
При выборе построчного сравнения. на экран быдут выведены обе версии файла, слева — содержимое старого файла, справа — нового. Возможные варианты действий:
  • l - использовать вариант слева, то есть старый;
  • r - использовать вариант справа, то есть новый;
Имейте в виду, тупая установка свежих версий конфигов, не всегда является тем, что вам нужно, поскольку в процессе работы вы могли настраивать какие-то конфиги под свои нужды и выбрав установку новой версии файла, все сделанные изменения в старом файле будут утеряны. После завершения работы над конфигами, устанавливаем мир:
freebsd /# make installworld
Процесс не многим дольше установки ядра, после окончания делаем reboot и проверяем что получилось:
freebsd /# uname -r
8.2-RELEASE-p1
UPD. Спасибо за дополнение. По необходимости, удаляем старые библиотеки:
freebsd /# cd /usr/src && make check-old
freebsd /# yes | make delete-old
freebsd /# yes | make delete-old-libs
чистим за собой /usr/obj
freebsd /# cd /usr/obj && chflags -R noschg * && rm -rf *
В принципе вроде все. Удачного администрирования.

Комментарии

> freebsd /# cd /usr/obj
> freebsd /# chflags -R noschg *
> freebsd /# rm -rf *
> freebsd /# make cleandir # хендбук рекомендует выполнять эту команду дважды (!)
> freebsd /# make cleandir

make cleandir дважды надо делать не в /usr/obj а в /usr/src

После успешного make installworld когда будешь обновлять ПО нужно удалить устарвешие файлы и библиотеки:

# cd /usr/src && make check-old
# yes | make delete-old
# yes | make delete-old-libs

+ удаляем из /usr/obj остатки от make buildworld:
du -sh /usr/obj
cd /usr/obj && chflags -R noschg * && rm -rf *

Спасибо, упустил

Как обновить например с 7.2 до 8.2?

принцип тот-же, но я бы сначала потренировался на кошках, тобишь на виртуалке
гляньте еще это, про мажорные и минорные бинарные апдейты
http://studik.org.ru/freebsd:minor_major_obnovlenija_cherez_freebsd-update

Очень полезная Ваша статья, но не стоит спешить с удаление старых библиотек вот здесь расписана проблема, которая возникает при их удалении
http://forum.lissyara.su/viewtopic.php?f=8&t=22803

Очень нужно учитывать этот аспект.

Очень полезная Ваша статья, но не стоит спешить с удаление старых библиотек вот здесь расписана проблема, которая возникает при их удалении
http://forum.lissyara.su/viewtopic.php?f=8&t=22803

Очень нужно учитывать этот аспект.

время лучше так считать time -p

time -h
У кого-то "punto switcher" сработал?)))

на OS X

Не сказаны нюансы:
1) Весьма не лишним будет почитать /usr/src/UPDATING
2) При сборке мира с помощью clang не все порты могут работать
3) Не сказано что можно попытаться ускорить процесс с помощью -jN у make
4) Для тех кто юзает zfs:
>># mount -u / # Перемонтируем корневой раздел в режим чтение/запись
>># mount -a # Монтируем все что прописано в /etc/fstab
заменить на:
/sbin/zfs mount -a
/sbin/zfs readonly=off YOUR_POOL_NAME

5) Нет акцента на том что после того как загрузились в Single User опция '-p' весьма спасает от многих действий и ее обязательно нужно применять!
После installworld , вполне возможно заюзать:
==> /usr/sbin/mergemaster -iF ,
где :
* '-i' это установить все новое
* '-F' установить файлы которые отличаются только по VCS ID $(FreeBSD)

Вполне возможно кому-то понадобится опция:
* '-P' - очень поможет знать какие из конфигов были заменены

6) Рекомендуется также перед установкой сохранить /etc , cp выполнить не очень долго, а польза существенная!
7) Почитать "http://www.malevanov.spb.ru/freebsd/mergemaster/"

Я еще не пробовал

Включение модулей в ядро (перекомпиляцию) можно делать на "локальной" системе,
потом перелить файл ядра (это один файл в несколько мегабайт) на удалённую систему через SSH.
Я вкомпиливал так IPFW_DUMMYNET в удалённую (рабочую) систему 5.4 (в ней нет такого модуля, только перекомпиляция), причём проблема была с отсутствием исходных кодов на целевой системе.

SVN (Subversion) is a newer source control system. It is not part of the base system, so install devel/subversion. Then check out the source:
# svn checkout svn://svn.freebsd.org/base/releng/9.0/ /usr/src

Other versions will have different URLs, like svn://svn.freebsd.org/base/stable/9/ for 9-STABLE. svn includes a larger history and can take up to twice the amount of disk space as a CVS checkout.

Подскажите, плз., каким образом можно заменить загруженные с помощью svn исходники, удалив старые?

Например с помощью CSUP, больше предпочитаю эту утилитку.

удаленная обнова уже собранного

rsync -av /usr/src root@server1:/usr/src
rsync -av /usr/obj root@server2:/usr/obj

загрузка автоматом после загрузки в single mode

nextboot -o "-s" -k <имя_фдра>

удаление single mode при следующей перегрузке

nextboot -D

подскажите пожалуйста, несколько раз пытался обновить мир с 9.1 release до 9 stable . проблема такая при вводе команды в однопользовательском режиме make installworld фря отвечает : don`t know how to make installworld. Stop
зы ядро обязательно нужно пересобирать перед обновлением мира?

эту команду нужно давать, находясь в каталоге /usr/src

спасибо, только теперь ошибка вылезла ERROR: Required auditdistd user is missing, see /usr/src/UPDATING.
кокого-то пользователя не хватает?
installcheck_UGID ] error code 1

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

для решения проблемы: ERROR: Required auditdistd user is missing

http://storm.in.ua/a115/installcheck_UGID.html

Полезно для CURRENT/WITNESS
- http://blog.cochard.me/2013/06/generating-custom-freebsd-installation.html

перед установкой мира надо в каталог сырцов перейти
cd /usr/src
make installworld

Так в том-то и дело что из этого каталога и пытаюсь собрать мир!

root@free3:/usr/src # make builworld
make: don't know how to make builworld. Stop

Makefile и куча других файлов и папок есть, вроде все на месте.

*ляяя! Только когда запостил коммент увидил ошибку. Ну ёпт.

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

Содержание этого поля является приватным и не предназначено к показу.
Регистр имеет значение
 ooooo     ooo                           ooooooooo.    oooooooooooo        .o   
`888' `8' `888 `Y88. `888' `8 .d88
888 8 oo.ooooo. oooo ooo 888 .d88' 888 .d'888
888 8 888' `88b `88b..8P' 888ooo88P' 888oooo8 .d' 888
888 8 888 888 Y888' 888 888 " 88ooo888oo
`88. .8' 888 888 .o8"'88b 888 888 888
`YbodP' 888bod8P' o88' 888o o888o o888o o888o
888
o888o
Введите код, изображенный в стиле ASCII-арт.