dadv: (chuck)
[personal profile] dadv

CVS умер, да здравствует SVN - в контексте проекта FreeBSD. Эта заметка полезна только тем, кого по каким-то причинам не устраивает чисто бинарное обновление базовой системы и/или обновление дерева портов через portsnap.

  • Установка SVN.

    В связи с тем, что официальный репозиторий бинарных пакетов на текущий момент недоступен, для использования SVN нужно либо ставить SVN пакетом из сторонних репозиториев (вместе со всеми зависимостями), либо собирать достаточно "тяжелый" порт SVN, что никак не уменьшает проблему множества зависимостей. До FreeBSD-6 (в базовой системе которой появилась команда csup, загружавшая обновления из репозитория CVS) использовалась программа cvsup, написанная на Modula-2. Поэтому сборка cvsup включала в себя сборку компилятора Modula-2, что на тогдашнем железе также было достаточно "тяжелой" зависимостью. Из-за этого общим местом было использование "бинарного" порта или пакета cvsup, который устанавливал бинарник, статически слинкованный с библиотеками Modula-2, не тянущий их в качестве зависимостей. Или даже полностью статический бинарник, который даже libc не требовал.

    Последний вариант очень удобен для "конечных" систем, которым нужно лишь иметь возможность загружать обновления, плюс, может быть, раздавать их узкому кругу доверенных локальных хостов. Удобен он тем, что такой полностью статический пакет быстро устанавливается, причём на любую минорную версию мажорного релиза, включая даже более старые минорные релизы (для них-то обновление особенно актуально). И гарантированно будет работать, разрывая потенциальный цикл "чтобы установить svn, надо обновить порты, а чтобы обновить порты, надо установить svn" в том случае, если portsnap стал почему-либо недоступен из-за своей централизованной модели раздачи обновлений. В отличие от portsnap, система распределения на основе SVN может быть такой же децентрализованной, как и сеть cvsup-серверов в своё время. Для сборки такого "статического" svn есть порт devel/subversion-static

    Пособирал полностью статические пакеты для разных вариантов версий/архитектур и выложил тут. Устанавливаются пакеты одной командой вида pkg_add http://www.grosbein.net/freebsd/svn/subversion-static-1.7.8.amd64.83.nocona.tbz


    Более старых систем у меня уже нет.

  • Обновление дерева портов/исходников через SVN.

    Пакета svn вполне достаточно для того, чтобы выкачать SVN-вариант дерева исходников нужной ветки и/или портов. Обновить через SVN имеющееся дерево, полученное из CVS или какими-то другими путями - не из SVN - нельзя, предварительно нужно переименовать/удалить старый каталог. Стоит отметить, что локальная копия дерева портов/исходников, загруженная таким образом, будет занимать на диске вдвое больше места, чем раньше (через CVS) за счет того, что SVN кроме локального, возможно модифицированного позднее локальными патчами дерева хранит в подкаталоге .svn вторую копию дерева в своём внутреннем формате, позволяя быстро откатить все локальные изменения без обращения к сети.

    svn checkout svn://svn.freebsd.org/base/stable/9 /usr/src
    svn checkout svn://svn.freebsd.org/ports/head /usr/ports

    Обновлять их потом нужно, просто перейдя в /usr/src или в /usr/ports и скомандовав svn update.

    В любой момент можно переключиться на другое зеркало репозиториев SVN командой svn relocate URL-FROM URL-TO в тех же каталогах. Здесь URL-FROM - адрес текущего зеркала, URL-TO адрес нового зеркала. Адрес текущего зеркала можно посмотреть командой svn info | grep Root:

  • Зеркалирование репозитория.

    Для CVS существовал порт cvsup-mirror, с помощью которого можно было иметь у себя не только какие-то отдельные ветки из репозитория, а зеркалировать репозиторий целиком, став таким образом полноценным зеркалом репозитория, из которого могут обновлять различные ветки оконечные локальные хосты. То же самое можно сделать и с SVN. Проще всего для этого выкачать первоначальный "seed" отсюда: ftp://ftp.freebsd.org/pub/FreeBSD/development/subversion/

    Создав, например, каталог /home/svnmirror и развернув в него загруженный архив, мы сэкономим себе манипуляции по созданию репозитория "с нуля" и получим готовое зеркало, которое нужно будет лишь обновить. Заодно и сэкономим себе достаточно много времени и трафика на первоначальное обновление зеркала. К сожалению, по указанному адресу выложены уже достаточно старые "seed", поэтому экономия трафика/времени получается меньше, чем могла бы быть, но тем не менее, она значительна.

    Перед обновлением можно использовать следующую команду, чтобы посмотреть, откуда будет выполняться обновление зеркала:

    svn propget svn:sync-from-url --revprop -r 0 file:///home/svnmirror/base

    При желании можно сменить зеркало на другое:

    svn propset svn:sync-from-url --revprop -r 0 svn://anotherhost/base file:///home/svnmirror/base

    Здесь file:///home/svnmirror/base это URL локального репозитория. Для репозитория портов это может быть file:///home/svnmirror/ports

    Обновление репозитория выполняется иначе, нежели обновление "просто" дерева портов/исходников. Понадобится скрипт такого вида:

    for repo in base ports
    do
      url="file:///home/svnmirror/$repo"
      svn propdel svn:sync-lock --revprop -r 0 $url
      svnsync --non-interactive sync $url
    done

  • Сетевой доступ к своему репозиторию.

    Для того, чтобы предоставить доступ к своему зеркалу по сети в режиме "только чтение" желательно создать непривилегированного псевдо-пользователя svn и группу svn для него, а затем в /etc/rc.conf добавить:

    svnserve_enable="YES"
    svnserve_flags="-d -R --listen-host 0.0.0.0"
    svnserve_data="/home/svnmirror"
    svnserve_user="svn"
    svnserve_group="svn"

    И скомандовать service svnserve start.

Date: 2013-04-06 11:53 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
я же давал ссылку и в листе.
http://zxy.spb.ru/subversion-1.7.8.tbz подоходит для всех систем и архитектур, зависимостей не имеет, протоколы все понимает.

Date: 2013-04-06 12:00 (UTC)
From: [identity profile] dadv.livejournal.com
Я пропустил. Тем лучше, путь будет побольше адресов для загрузки :-)

А точно бинарник от 6.4 будет работать на 7+ без COMPAT в ядре?

Date: 2013-04-06 12:05 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
ты еще попробуй сделать такое ядро, без COMPAT. там внезапные зависмости есть по разным подсистемам. все GENERIC идут с COMPAT, на 10-CURRENT я проверял.

Date: 2013-04-06 12:08 (UTC)
From: [identity profile] dadv.livejournal.com
Я знаю только зависимость COMPAT32 и COMPAT7. Ни то, ни другое вообще говоря, необязательно есть в ядре.

Date: 2013-04-06 12:12 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
на практике такие случаи интереса не представляют -- там все равно не будет билд-окружения

Date: 2013-04-06 12:23 (UTC)
From: [identity profile] dadv.livejournal.com
На практике бывает всякое.

Date: 2013-04-06 22:58 (UTC)
From: [identity profile] sir-dog.livejournal.com
Спасибо

FreeBSD Repos & SVN

Date: 2013-04-07 05:24 (UTC)
From: [identity profile] livejournal.livejournal.com
Пользователь [livejournal.com profile] victor_sudakov сослался на вашу запись в записи «FreeBSD Repos & SVN (http://victor-sudakov.livejournal.com/140677.html)» в контексте: [...] Спасибо Eugene Grosbein, очень полезно http://dadv.livejournal.com/181057.html [...]

Date: 2013-04-07 08:10 (UTC)
From: [identity profile] victor-sudakov.livejournal.com
А что и зачем вот это: "svn propdel svn:sync-lock "

У меня работает просто "/usr/local/bin/svnsync sync --quiet file:///var/svnmirror/base" по крону. Вроде проблем с какими-то локами ни разу не было.

Date: 2013-04-07 08:30 (UTC)
From: [identity profile] dadv.livejournal.com
svnsync лочит локальный репозиторий на время синхронизации и если процесс некорректно завершится (svnsync упадёт, OOM killer его убьет, ядро спаникует), то лок останется и следующее обновление не пройдет.

svn propdel удаляет потенциально висящий лок. На самом деле я такой скрипт ещё оборачиваю в lockf :-)

Date: 2013-04-07 08:43 (UTC)
From: [identity profile] victor-sudakov.livejournal.com
Понятно. Я такую ситуацию лучше уж руками отработаю.

Date: 2013-04-08 09:45 (UTC)
From: [identity profile] yuri-kurenkov.livejournal.com
Спасибо!

Date: 2013-06-10 09:34 (UTC)
From: [identity profile] victor-sudakov.livejournal.com
А теперь у нас есть net/svnup ! Ура!

Profile

dadv: (Default)
Choose your future

July 2024

M T W T F S S
12 34567
891011121314
15161718192021
22232425262728
293031    

Tags

Style Credit

Powered by Dreamwidth Studios