FreeBSD Repos & SVN
2013-04-06 15:14![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
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
- subversion-static-1.7.8.amd64.91.core2.tbz - собран на FreeBSD-9.1/amd64 с оптимизацией кода под core2, будет работать на 9.0 и новее;
- subversion-static-1.7.8.amd64.83.nocona.tbz - собран на FreeBSD-8.3/amd64 с оптимизацией кода под Pentium-4 (на более ранних процессорах не пойдет), будет работать на 8.0 и новее;
- subversion-static-1.7.8.i386.83.core2.tbz - собран на FreeBSD-8.3/i386 с оптимизацией кода под core2, будет работать на 8.0 и новее.
- subversion-static-1.7.8.i386.74.i386.tbz - собран на FreeBSD-7.4/i386 (без оптимизации кода под 486 и новее), будет работать на 7.0 и новее;
- subversion-static-1.7.8.i386.64.i386.tbz - собран на FreeBSD-6.4/i386 (без оптимизации кода под 486 и новее), будет работать на 6.0 и новее.
- subversion-static-1.7.8.amd64.91.core2.tbz - собран на FreeBSD-9.1/amd64 с оптимизацией кода под core2, будет работать на 9.0 и новее;
Более старых систем у меня уже нет.
Пакета 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
.
no subject
Date: 2013-04-06 11:53 (UTC)http://zxy.spb.ru/subversion-1.7.8.tbz подоходит для всех систем и архитектур, зависимостей не имеет, протоколы все понимает.
no subject
Date: 2013-04-06 12:00 (UTC)А точно бинарник от 6.4 будет работать на 7+ без COMPAT в ядре?
no subject
Date: 2013-04-06 12:05 (UTC)no subject
Date: 2013-04-06 12:08 (UTC)no subject
Date: 2013-04-06 12:12 (UTC)no subject
Date: 2013-04-06 12:23 (UTC)no subject
Date: 2013-04-06 22:58 (UTC)FreeBSD Repos & SVN
Date: 2013-04-07 05:24 (UTC)no subject
Date: 2013-04-07 08:10 (UTC)У меня работает просто "/usr/local/bin/svnsync sync --quiet file:///var/svnmirror/base" по крону. Вроде проблем с какими-то локами ни разу не было.
no subject
Date: 2013-04-07 08:30 (UTC)svn propdel удаляет потенциально висящий лок. На самом деле я такой скрипт ещё оборачиваю в lockf :-)
no subject
Date: 2013-04-07 08:43 (UTC)no subject
Date: 2013-04-08 09:45 (UTC)no subject
Date: 2013-06-10 09:34 (UTC)