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