Этот вариант больше подходит в том случае, если в системе используется нестандартное ядро. Кроме того, он позволяет более точно контролировать процесс обновления.
Более простой вариант, при помощи freebsd-update, описан в статье FreeBSD: обновление системы при помощи freebsd-update.
Утилита для работы через SVN не входит в стандартную поставку FreeBSD, поэтому её необходимо установить отдельно из портов. Если порты ещё не установлены в системе – процесс описан в статье FreeBSD: установка коллекции портов (Ports Collection).
Раньше существовало два отдельных порта – subversion и subversion-freebsd, при чём для использования во в FreeBSD подходил только второй. Сейчас оба порта объеденены.
Приступаем к установке:
# cd /usr/ports/devel/subversion && make BATCH=yes install clean
Теперь можно приступать к первой загрузке текущих исходных кодов. SVN может работать как через собственный SVN-протокол, так и через обычный HTTP/HTTPS.
Перед первой загрузкой обновлений – лучше удалить старые исходные коды:
# rm -rf /usr/src
Загружаем обновления через SVN:
# svn checkout svn://svn.freebsd.org/base/releng/9.0/ /usr/src
Через HTTP:
# svn checkout http://svn.freebsd.org/base/releng/9.0/ /usr/src
Обратите внимание на указание версии, коды которой необходимо загрузить. Более подробно о различиях в версиях можно почитать в статье FreeBSD: CURRENT, STABLE и RELEASE версии.
Узнать исходные коды для какой версии у вас загружены в данный момент можно командой:
# grep -A 2 ‘TYPE=”‘ /usr/src/sys/conf/newvers.sh
TYPE=”FreeBSD”
REVISION=”9.0″
BRANCH=”RELEASE”
Посмотреть, какие версии имеются в SVN-репозитории сейчас можно на странице проекта http://svnweb.freebsd.org/base/releng/.
При использовании SVN допустимы сокращения опций – co вместо checkout и up – вместо update.
После первой загрузки исходных кодов – загрузку обновлений можно выполнять командой:
# svn update /usr/src/
Что бы обновить порты – выполняем:
# svn checkout svn://svn.freebsd.org/ports/head /usr/ports
Для того, что бы проводить загрузку автоматически – можно написать простой скрипт:
#!/bin/sh
# Sources
svn update /usr/src
# Ports
svn update /usr/ports
# Documentation
svn update /usr/doc
И добавляем задачу в cron:
# crontab -e
@weekly /home/setevoy/svnup.sh
После загрузки обновлений очень полезно ознакомиться с файлом /usr/src/UPDATING, в котором описаны изменения в версиях.
Повторно проверим версию установленных исходных текстов:
# grep -A 2 ‘TYPE=”‘ /usr/src/sys/conf/newvers.sh
TYPE=”FreeBSD”
REVISION=”9.0″
BRANCH=”RELEASE-p7″
Теперь можно приступать к сборке “мира” и ядра.
Для начала – необходимо очистить рабочий каталог, в котором будет происходить сборка:
# cd /usr/obj
# chflags -R noschg *
# rm -rf *
# cd /usr/src
# make cleandir
Последнюю команду рекомендуется повторить два раза.
Приступаем к сборке “мира” (т.е. всего, что не относится к ядру). Для утилиты make укажем два ключа:
-j – запустить процесс в несколько потоков, для более быстрой обработки;
-s – меньшее количество информации, выводимой в процессе сборки на консоль.
Так же – можно добавить команду time, что бы подсчитать время, затраченное на выполнение команды, указанной после неё:
# cd /usr/src
# time make -s -j4 buildworld
Собираем ядро:
# time make -j4 -s buildkernel
Если хотите собрать собственное ядро – укажите параметр KERNCONF:
# make -j4 -s buildkernel KERNCONF=SETBSD1
Для этого необходимо сначала сконфигурировать своё ядро, как описано в сттаье FreeBSD: сборка собственного ядра и поместить его в каталог – /usr/src/sys/{amd64,i386}/conf. Если параметр KERNCONF не указать – будет собрано дефолтное ядро GENERIC.
Устанавливаем новое ядро:
# make -s installkernel
————————————————————–
>>> Installing kernel GENERIC
————————————————————–
kern.bootfile: /boot/kernel/kernel -> /boot/kernel.old/kernel
…
Как видно из листинга выше – при установке нового ядра старое копируется в каталог /boot/kernel.old/, а новое устанавливается в /boot/kernel/. В случае возникновения проблем при загрузке системы с новым ядром – можно будет загрузить старое.
Далее выполняем перезагрузку в Single User Mode (однопользовательский режиме):
# reboot
В меню загрузки нажимаем 6, что бы активировать загрузку в Single User:
По окончании загрузки будет предложено выбрать шел, оставляем предложенный /bin/sh:
При загрузке в однопользовательском режиме монтируются только 2 раздела – корневой / в режиме read-only и раздел /dev.
Перемонтируем корневой раздел в режиме read-write:
# mount -u /
И смонтируем остальные разделы, описанные в файле /etc/fstab:
# mount -a
Теперь самая “интересная” часть – сравнение и установка новых конфигурационных файлов. Запускаем утилиту mergemaster:
# mergemaster -p
Рассмотрим работу с ней подробнее
Первые две строки – имя файла, который сейчас обрабатывается. В данном случае это файл /etc/group и его две редакции – отмеченная “—“ старая, созданная 02-06-2013, и отмеченная “+++” новая версия, созданная 04-06-2013.
Варианты действий:
d – оставить старый вариант файла, удалив новый;
i – установить новый, удалив старый;
m – построчное сравнение старого и нового файла;
v – сравнить файлы еще раз.
Строки, отмеченные знаком минуса – это строки из старого файла, которых нет в новом. Строки отмеченные знаком плюса – наоборот, строки в новом файле, которых нет в старом.
В примере видно, что в новом файле пользователь setevoy не принадлежит в группе wheel и отсутствует группа setevoy. Решение – удалить новый, и оставить на месте старый файл, жмём d.
Более сложный пример – сравнение двух файлов и их слияние. Нажимаем кнопку m и переходим к построчному сравнению:
Слева – строки из старого файла, справа – из нового. Соответственно, выбираем из какой части взять информацию, которая будет внесена в новый файл:
l – из левой (старый);
r – из правой (новый).
В данном случае название файла берём из нового варианта – жмём r.
Далее видим строку, которой вообще нет в новом файле – но она есть в старом – сохраняем её кнопкй l:
По окончании процесса – будет предложено выбрать действие с файлом:
i – (install) установить новый файл;
r – (re-do) повторно провести сравнение файлов;
v – (view) просмотреть получившийся файл.
После установки нового /etc/master.passwd сразу предлагается провести обновление информации и сгенерировать новую БД паролей:
ВАЖНО: будьте особенно внимательны при слиянии файлов /etc/group и /etc/master.passwd, что бы не потерять всех пользователей.
Теперь можно устанавливать “мир”:
# cd /usr/src
# make -s installworld
Запускаем установку новых конфигурационных файлов уже в автоматическом режиме:
# mergemaster -a
И перезагружаемся в нормальный режим:
# reboot
После перезагрузки проверяем версию ядра:
# uname -v
FreeBSD 9.0-RELEASE-p7
И версию “мира”:
# uname -r
9.0-RELEASE-p7
Обновление завершено.
Остаётся несколько последних действий.
Удаляем старые библиотеки и прочий “мусор”:
# cd /usr/src && make check-old
# make delete-old
# make delete-old-libs
Очищаем рабочий каталог, в котором проводилась сборка:
# cd /usr/obj/
# chflags -R noschg *
# rm -rf *
Ссылки по теме:
http://sysblog.krasnov.me