FreeBSD: обновление системы из исходных кодов с помощью SVN

Автор: | 06/06/2013
 

freebsd_logoЭтот вариант больше подходит в том случае, если в системе используется нестандартное ядро. Кроме того, он позволяет более точно контролировать процесс обновления.

Более простой вариант, при помощи 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:

freebsd_update_svn_1

По окончании загрузки будет предложено выбрать шел, оставляем предложенный /bin/sh:

freebsd_update_svn_2

При загрузке в однопользовательском режиме монтируются только 2 раздела – корневой / в режиме read-only и раздел /dev.

Перемонтируем корневой раздел в режиме read-write:

# mount -u /

И смонтируем остальные разделы, описанные в файле /etc/fstab:

# mount -a

freebsd_update_svn_3

Теперь самая “интересная” часть – сравнение и установка новых конфигурационных файлов. Запускаем утилиту mergemaster:

# mergemaster -p

freebsd_update_svn_4

Рассмотрим работу с ней подробнее

Первые две строки – имя файла, который сейчас обрабатывается. В данном случае это файл /etc/group и его две редакции – отмеченная “—“ старая, созданная 02-06-2013, и отмеченная “+++” новая версия, созданная 04-06-2013.

Варианты действий:

d – оставить старый вариант файла, удалив новый;
i – установить новый, удалив старый;
m – построчное сравнение старого и нового файла;
v – сравнить файлы еще раз.

Строки, отмеченные знаком минуса – это строки из старого файла, которых нет в новом. Строки отмеченные знаком плюса – наоборот, строки в новом файле, которых нет в старом.

В примере видно, что в новом файле пользователь setevoy не принадлежит в группе wheel и отсутствует группа setevoy. Решение – удалить новый, и оставить на месте старый файл, жмём d.

Более сложный пример – сравнение двух файлов и их слияние. Нажимаем кнопку m и переходим к построчному сравнению:

freebsd_update_svn_6

Слева – строки из старого файла, справа – из нового. Соответственно, выбираем из какой части взять информацию, которая будет внесена в новый файл:

l – из левой (старый);
r – из правой (новый).

В данном случае название файла берём из нового варианта – жмём r.

Далее видим строку, которой вообще нет в новом файле – но она есть в старом – сохраняем её кнопкй l:

freebsd_update_svn_7

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

i – (install) установить новый файл;
r – (re-do) повторно провести сравнение файлов;
v – (view) просмотреть получившийся файл.

После установки нового /etc/master.passwd сразу предлагается провести обновление информации и сгенерировать новую БД паролей:

freebsd_update_svn_8

ВАЖНО: будьте особенно внимательны при слиянии файлов /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://habrahabr.ru

http://vniz.net

http://unix.uz

http://vds-admin.ru

http://sysblog.krasnov.me