Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> настройка —> Обновление ОС и портов через SVN.

Обновление ОС и портов через SVN.

Автор: Al.


В связи с тем, что проект FreeBSD окончательно перешел на SVN, небольшая заметка на тему что это такое и как этим пользоваться. Я не претендую на полное описание SVN. Это не более, чем краткий справочник использования SVN в контексте исходных кодов FreeBSD.

Subversion (также известная как «SVN») — свободная централизованная система управления версиями, официально выпущенная в 2004 году компанией CollabNet Inc.
wikipedia(c)

Русским языком SVN - это некая база для хранения файлов с историей их изменений и комментариями. Основная целевая аудитория - разработчики, которые используют ее для хранения исходных текстов программ и истории изменения.

SVN(subversion) можно условно разделить на клиентскую часть и серверную. Серверная - локально хранит исходники, историю и т.п. Клиент же только получает необходимые файлы с сервера.
Для рядового обновления нескольких серверов, я думаю, нет смысла держать полную копию у себя (ставить серверную часть). Можно просто ограничиться скачиванием необходимых файлов утилитой svnup. При наличии многих серверов для обновления и/или желания работать с SVN имеет смысл установка собственного SVN-зеркала и использование полноценного клиента с возможностью коммита и т.п. (subversion). Рассмотрим оба варианта и начнем с простого.

Простое обновление.

Ставим легковесный SVN-клиент svnup
#cd /usr/ports/net/svnup
#make all install clean
===>  License BSD accepted by the user
=> svnup-0.56.tar.xz doesn't seem to exist in /var/distfiles/.
=> Attempting to fetch http://jcm.dsl.visi.com/freebsd/svnup/svnup-0.56.tar.xz
svnup-0.56.tar.xz                             100% of 9536  B   17 kBps
===> Fetching all distfiles required by svnup-0.56 for building
===>  Extracting for svnup-0.56
=> SHA256 Checksum OK for svnup-0.56.tar.xz.
===>  Patching for svnup-0.56
===>  Configuring for svnup-0.56
===>  Building for svnup-0.56
cd /var/tmp/ports/usr/ports/net/svnup/work/svnup-0.56 &&  
cc -o svnup -O2 -pipe -fno-strict-aliasing svnup.c  -lmd
===>  Installing for svnup-0.56
===>   Generating temporary packing list
===>  Checking if net/svnup already installed
install  -s -o root -g wheel -m 555 svnup-0.56/svnup /usr/local/bin/
install  -o root -g wheel -m 444 svnup-0.56/svnup.1 /usr/local/man/man1/
===>   Compressing manual pages for svnup-0.56
===>   Registering installation for svnup-0.56
===>  Cleaning for svnup-0.56

Обновляем порты с SVN.
# svnup -h svn.freebsd.org -b /ports/head -l /usr/ports

В связи с выходом новой версии svnup, обновление будет выглядеть вот так
# svnup ports -h svn.freebsd.org -b /ports/head -l /usr/ports/ -p svn

Где
-h - хост, откуда берем исходники.
-b - ветка, которую тянем.
-l - куда кладем.
-r - еще можно указать ревизию тут. Если не указано, берется самая последняя.
-p - протокол, используемый для подключения к серверу SVN.
ports - секция из файла /usr/local/etc/svnup.conf. Можно создать несколько секций (для портов, релиза, стейбла), указать в каждой все необходимые параметры заранее и запускать обновление просто указав необходимую секцию. Например, так
# svnup ports

В моем же примере я переопределил все нужные мне параметры в командной строке несмотря на то, что часть из них уже имеется в конфиге. В секция defaults задаются глобальные параметры svnup, которые учитываются при работе с любой другой секцией. Указать ее явно (# svnup defaults) нельзя.
Секции используются либо не используются в зависимости от версии svnup.

Аналогично и для исходников. Не забудьте сделать копию конфигурационного файла ядра.
# svnup -h svn.freebsd.org -b /base/releng/9.1/ -l /usr/src

Отдельный разговор про ветки.
Заходим на http://svnweb.freebsd.org/. Тут можно посмотреть содержимое svn-сервера svn.freebsd.org в веб-формате. Ветка с исходниками - base. В ней нас интересуют 4 ветки:

head    - тут текущая основная разрабатываемая версия.
release - После выпуска релиза он попадает сюда.
releng  - текущая ветка с версией. Сюда добавляются только фиксы/секюрити/исправления багов после релиза. Рекомендуется для обновлений.
stable  - Текущая ветка для разработки. Релизы выпускаются из нее, в нее же добавляются новые фичи, багфиксы и т.п на стадии тестирования. К слову, security advisories сначала появляются тут и тестируются тут же, после чего уже попадают в releng. Но код все еще может быть нестабильным. Это еще одна ветка при разработке, а не ресурс для конечных пользователей (C)handbook

Как итог. Если мы хотим обновиться до, например, 8.3 со всеми текущими фиксами, используем /base/releng/8.3/. Если хотим обновиться до последней версии восьмерки, используем /base/stable/8/ и получим 8.4

Создание собственного зеркала

Если хочется иметь локальную копию svn-сервера и/или возможность коммитить и удобно откатываться, ставим subversion. Пакет содержит как серверную часть, так и клиентскую.
#cd /usr/ports/devel/subversion
#make all install clean

Сервер. Установка SVN сервера с использованием уже имеющейся базы. Для настройки сервера используется утилита svnsync.

1. Качаем SVN базу с
ftp://ftp.freebsd.org/pub/FreeBSD/development/subversion/

Например, если мы хотим держать локальную копию портов, качаем svnmirror-ports-r301235.tar.xz. Аналогично для исходников и документации.

2. Распаковываем ее в папку, где будет лежать база. Назовем ее, наример, /var/svn/
#mkdir /var/svn/
#cd /var/svn/
#tar -vxf  svnmirror-ports-r301235.tar.xz

3. Обновляем базу до текущей версии (ревизии). Сервер, откуда обновляться, уже установлен.
#svnsync sync file:////var/svn/ports

Можно посмотреть, что получилось
#svnsync info file:////storage/local_pool/svn/ports
Source URL: svn://svn.freebsd.org/ports
Source Repository UUID: 35697150-7ecd-e111-bb59-0022644237b5
Last Merged Revision: 315795

4. Теперь раздаем базу. Раздавать можно через модуль apache - mod_dav_svn (об этом подробнее расписано в http://www.lissyara.su/articles/freebsd/www/svn+apache+trac/), можно через встроенный svnserve.
Второе - более простой вариант. Добавляем необходимое в /etc/rc.conf. Флаг -R переключает сервер в режим "только для чтения", т.е. клиент сможет получать файлы, но не сможет их менять на сервере несмотря на настройки в конфигурационный файлах (ports/conf/svnserve.conf, например. Там же можно сделать и авторизацию).
svnserve_enable="YES"
svnserve_flags="-d -R --log-file=/var/log/svn.log --listen-port=3690"
svnserve_data="/var/svn"
svnserve_user="svn"
svnserve_group="svn"

Запускаем сервер
#/usr/local/etc/rc.d/svnserve start

Клиент. Для работы в качестве клиента используется утилита svn
В данном примере используется локальный сервер SVN. Если установка локального сервера не проводилась, следует заменить его адрес на адрес публичного сервера.

Скачиваем коллекцию портов. Есть два варианта получить порты. Первый - порты и историю коммитов (изменений). Второй - просто коллекцию портов. Первый вариант "тяжелее" примерно на 500Мб, но зато позволяет "откатываться" до предыдущих версий (ревизий) и смотреть историю изменений.

Первый вариант. Обновляем все, включая историю ревизий
#svn checkout svn://127.0.0.1/ports/head /usr/ports

Второй вариант. Получаем только порты. Без дополнительной информации. --force если папка ports не пуста.
#svn export --force svn://127.0.0.1/ports/head /usr/ports/

Если использовался первый вариант, можно посмотреть историю ревизий и, при случае, откатиться

1. Смотрим изменения через svn. Последние 5 ревизий.
#svn log --limit=5 /usr/ports/lang/php5/
------------------------------------------------------------------------
r314716 | ale | 2013-03-20 12:15:37 +0400 (ср, 20 мар 2013) | 5 lines

Update to 5.4.13 release.

PR:      ports/177082
Submitted by:   Rustem Alimov <rustem.alimov@gmail.com>

------------------------------------------------------------------------
r313958 | ale | 2013-03-12 14:33:04 +0400 (вт, 12 мар 2013) | 5 lines

Suhosin will never reappear, remove commented out code.
Fix plist when CLI is not selected [1].

Submitted by:   Gergely CZUCZY <gergely.czuczy@harmless.hu> [1]

------------------------------------------------------------------------
r312912 | ale | 2013-02-25 14:30:40 +0400 (пн, 25 фев 2013) | 2 lines

Update to 5.4.12 release.

------------------------------------------------------------------------
r310812 | ale | 2013-01-22 12:20:05 +0400 (вт, 22 янв 2013) | 2 lines

Update to 5.4.11 release.

------------------------------------------------------------------------
r309326 | ale | 2012-12-21 01:15:05 +0400 (пт, 21 дек 2012) | 2 lines

Update to 5.4.10 release.

2. Например, нам надо поставить порт php 5.4.10. Ему соответствует ревизия 309326. Синхронизируем.
#svn up -r 309326 /usr/ports/lang/php5/

3. Проверяем
Смотрим информацию о каталоге.
#svn info /usr/ports/lang/php5
Path: /usr/ports/lang/php5
Working Copy Root Path: /usr/ports
URL: svn://127.0.0.1/ports/head/lang/php5
Repository Root: svn://127.0.0.1/ports
Repository UUID: 35697150-7ecd-e111-bb59-0022644237b5
Revision: 309326
Node Kind: directory
Schedule: normal
Last Changed Author: ale
Last Changed Rev: 309326
Last Changed Date: 2012-12-21 01:15:05 +0400 (пт, 21 дек 2012)

Убеждаемся, что версия порта соответствует.
#cat /usr/ports/lang/php5/distinfo 
SHA256 (php-5.4.10.tar.bz2) = c5bf...7e4

В догонку смотрим отличия между r309326 и текущей ревизией (HEAD)
#svn diff -r 309326:HEAD /usr/ports/lang/php5/Makefile
#svn diff -r 309326:HEAD /usr/ports/lang/php5/Makefile | grep PORTVERSION



размещено: 2013-04-29,
последнее обновление: 2013-08-20,
автор: Al


Alex Keda, 2013-05-27 в 11:08:28

всегда приятно найти неизвестную статью на своём же сайте...
да ещё и первой ссылкой в яндексе =))

quest, 2013-08-20 в 11:27:39

В строке для обновления портов
# svnup ports -h svn.freebsd.org -b /ports/head -l /usr/src/ -p svn
по видимому ошибка, место назначения для портов /usr/ports/, а то скопипастил и зафигачил себе порты в src

Al, 2013-08-20 в 12:02:35

Поправил)

Игорь, 2013-11-01 в 13:47:15

svn co svn://svn.FreeBSD.org/ports/head /usr/ports
svn co svn://svn.freebsd.org/base/releng/9.2 /usr/src
все...



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0468 секунд
Из них PHP: 31%; SQL: 69%; Число SQL-запросов: 76 шт.
Исходный размер: 37085; Сжатая: 8941