Этот вариант больше подходит в том случае, если в системе используется нестандартное ядро. Кроме того, он позволяет более точно контролировать процесс обновления.
Более простой вариант, при помощи 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