Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> настройка —> cvs, svn, portsnap

Обновление исходных текстов: cvsup, csup, svn, portsnap

Автор: Fomalhaut.


ОГЛАВЛЕНИЕ

ОБНОВЛЕНИЕ ИСХОДНЫХ ТЕКСТОВ СИСТЕМЫ

  • ВАРИАНТ №1: из CVS репозитория
  • ВАРИАНТ №2: из SVN репозитория
    ОБНОВЛЕНИЕ ПОРТОВ
  • ВАРИАНТ №1: из CVS репозитория
  • ВАРИАНТ №2: утилитой portsnap
  • ВАРИАНТ №3: используя SVN
    ОБНОВЛЕНИЕ ДОКУМЕНТАЦИИ
    ИСПОЛЬЗОВАНИЕ УТИЛИТЫ fastest_cvsup
    ОБНОВЛЕНИЕ ЧЕРЕЗ PROXY
  • В случае portsnap
  • В случае CVS
  • В случае SVN
    ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

    ОБНОВЛЕНИЕ ИСХОДНЫХ ТЕКСТОВ СИСТЕМЫ

    ВАРИАНТ №1: из CVS репозитория
    Для обновления через CVS используются утилиты cvsup и csup. В настоящий момент старая утилита cvsup заменена на обновлённую csup (собственно всё обновление, это переписывание утилиты с Modula-2 на C). Но т.к. cvsup и csup практически идентичны, то вся разница обновления ими будет в использовании разных имён утилиит и всё, а для краткости рассмотрим их обе в виде csup, как более новой.
    Единственная разница: csup присутствует в системе сразу, а cvsup необходимо установить:
    $ pkg_add -r cvsup-without-gui
    Fetching ftp://ftp.freebsd.org/pub/FreeBSD/.../cvsup-without-gui.tbz... Done.
    

    В дальнейшем всё будет описано для csup.
    Для настройки параметров обновления создаём файл /root/updatesys.cvs:
    $ cat /root/updatesys.cvs
    *default host=cvsup6.ru.FreeBSD.org
    *default base=/var/db
    *default prefix=/usr
    *default release=cvs
    *default delete use-rel-suffix
    *default compress
    *default tag=RELENG_8
    src-all
    

    Строка
    *default host=cvsup6.ru.FreeBSD.org
    

    корректируется для указания наиболее удобного (скорости и пр.) сервера обновлений - на странице описания параметров cvsup/csup выбираем CVS сервер, с которого будем брать порты и и вместо cvsup6.ru прописываем его.
    Так же можно указать до какой версии необходимо обновить исходные тексты системы. Для этого из списка тэгов CVSup выбираем нужный вариант и прописываем его. Например, обновление до релиза 8.1 со всеми исправлениями на момент обновления:
    *default release=cvs tag=RELENG_8_1_0_RELEASE
    

    Более детально параметры обновления через CVSup описаны в файле ports-supfile:
    $ find /* -name ports-supfile
    /usr/share/examples/cvsup/ports-supfile
    

    Хешируем имена программ, описанных в переменной окружения PATH:
    $ rehash
    


    Некоторые командные процессоры для ускорения поиска выполнимых файлов и команд кэшируют имена программ, доступных для вызова из каталогов, перечисленных в переменной окружения PATH.
    Если используется один из таких командных процессоров, то перед использованием только что добавленных программ вам может понадобиться вызвать команду rehash после установки порта. Эта команда будет работать с такими оболочками, как, например, tcsh.
    При работе с такими командными процессорами, как sh или bash, необходимо пользоваться командой hash -r. Дополнительную информацию можно найти в документации к вашему командному процессору.


    Всё готово, запускает обновление:
    $ cvsup -L 2 /root/updatefile.cvs
    

    Можно добавить ключик -z (компрессия) для экономии траффика.

    ВАРИАНТ №2: из SVN репозитория
    Ещё в 2008 году разработчики решил заменить систему управления версиями: вместо CSV решено проект перевести на SVN (subversion). Рекомендуется пользоваться именной этой системой контроля версий для обновления, т.к.


    levsha: "из-за того, что основным репозиторием для исходников системы сейчас является svn, а в cvs идет экспорт, иногда вылазят глюки из-за кривого экспорта. Из-за отсутствия в cvs атомарного коммита нескольких файлов есть шанс счекаутить себе исходники с частичным коммитом"

    В FreeBSD до 10 версии утилита svn не была введена в базовую систему, поэтому необходимо первоначально её установить:
    $ cd /usr/ports/devel/subversion
    $ make install clean
    


    В портах раньше было два пакета subversion: непосредственно subversion и subversion-freebsd. И только второй подходил для цели обновления системы через SVN, т.к. для этих целей в него были добавлены специфические патчи.
    Сейчас subversion-freebsd из портов исчез: вероятно патчи перенесли в основной пакет subversion.
    С обновлением subversion до версии 1.8 поддержка neon для доступа к SVN по протоколам HTTP/HTTPS прекращена. В случае использования этих протоколов необходимо при сборке subversion в опциях указать поддерку SERF (WebDAV/Delta-V (HTTP/HTTPS) repo access module).


    С выходом 10 версии упрощённая версия svn в системе уже присутствует: в форме утилиты svnlite. Поэтому в дальнейшем всё описывается утилитой svnlite.
    Первый раз скачивается база исходных текстов - файлов проекта (два варианта):
    $ svnlite checkout http://svn.freebsd.org/base/releng/11.0/ /usr/src  # через HTTP
    $ svnlite checkout svn://svn.freebsd.org/base/releng/11.0/ /usr/src   # через SVN
    

    В дальнейшем достаточно будет выполнять:
    $ svnlite update /usr/src/
    

    Вместо checkout и update можно использовать сокращённые варианты написания этих подкоманд: co и up, соответственно.
    Посмотреть, как версия исходных кодов установлена:
    $ grep -A 2 'TYPE="' /usr/src/sys/conf/newvers.sh
    TYPE="FreeBSD"
    REVISION="11.0"
    BRANCH="RELEASE-p1"
    

    Вот и выяснили, что 11 версия наконец-то зарелизилась!. :)

    ОБНОВЛЕНИЕ ПОРТОВ

    ВАРИАНТ №1: из CVS репозитория
    Через описанный выше файл /root/updatefile.cvs можно обновлять исходные тексты системы и портов одновлременно, достаточно в вышеприведённый вариант файла /root/updatefile.cvs добавить строчки:
    *default tag=.
    ports-all
    

    Т.к. присвоение соответствующих переменных идёт последовательно, то тэг для обновления системы сменится для обновления портов на ".".
    Если файлы для обновления системы и портов разные, то делает копия /root/updatefile.cvs (например, в /root/updateports.cvs) и в новом файле две последние строчки меняются на эту пару.
    Стоит заострить внимание, что тэги для исходных текстов портов и системы - различные. И меня сильно отругали на freebsd@conference.jabber.ru за не чтение хэндбука. А в хэндбуке прописано, что для портов - одно дерево портов. Т.е. '.'. Но сами значения можно посмотреть на странице портов в выпадающем списке 'Show only files with tag:'.
    Всё готово, запускает обновление:
    $ cvsup -L 2 /root/updateports.cvs
    

    Так же можно добавить ключик -z (компрессия) для экономии траффика.
    После обновления необходимо проиндексировать скачаные порты:
    $ cd /usr/ports
    $ make fetchindex
    

    Индексирование портов - процедура, забывание выполнения которой чревато проблемами с установкой/обновлением программ из портов.

    ВАРИАНТ №2: утилитой portsnap
    Обновление командой portsnap - рекомендуемый метод обновления исходных текстов портов.
    Для первого запуска:
    $ portsnap fetch
    $ portsnap extract
    


    Процедура первый раз выполняется достаточно долго: утилита копирует архив всей системы портов. А в дальнейшем буду скачиваться только обновления.

    Для всех последующих запусков:
    $ portsnap fetch
    $ portsnap update
    

    Индексация портов произойдёт по окончанию обновления автоматически.
    Если есть машина с FreeBSD, где порты, обновлённые через portsnap уже есть, то можно загрузить базу портов оттуда, чтобы не скачивать ещё раз с Интернета:
    $ cd /var/db
    $ rm -rf portsnap
    $ scp -r <user_name>@<computer>:/var/db/portsnap .
    $ portsnap extract
    

    Вданном случае <user_name> - имя пользователя на машине, откуда будем скачивать порты, а <computer> - имя или IP-адрес этой машины.

    ВАРИАНТ №3: используя SVN
    Идентично обновлению исходных текстов системы:
    # Первый раз
    $ svnlite checkout svn://svn.FreeBSD.org/ports/head /usr/ports
    # Последующие обновления
    $ svnlite up /usr/ports
    

    Т.е. всё взаимодействие - стандартными командами SVN.

    ОБНОВЛЕНИЕ ДОКУМЕНТАЦИИ

    Идентично обновлению исходных текстов системы:
    # Первый раз
    $ svnlite checkout svn://svn.FreeBSD.org/doc/head /usr/doc
    # Последующие обновления
    $ svnlite up /usr/doc
    

    Т.е., опять же, всё взаимодействие - стандартными командами SVN.

    ИСПОЛЬЗОВАНИЕ УТИЛИТЫ fastest_cvsup

    Задача утилиты fastest_cvsup - поиск оптимального по скорости доступа сервера с CVS репозиторием.
    $ cd /usr/ports/sysutils/fastest_cvsup/
    $ make install clean & rehash
    

    Это скрипт на Perl, который по разным признакакм выбираем наиболее быстрый (на момент тестирования) сервер с CVS репозиторием: по времени отклика на ping, скорости создания соединения.
    Применение:
    $ fastest_cvsup -q -c ru
    

    Описание ключей на русском:
    -h  - вывод этой справки
    -q - "тихий режим". Возвращает самый быстрый сервер и статус-бар;
    -Q - "очень тихий режим". Статус - бар отсутствует. Выдает только результат
    -r - использовать список удаленных серверов с FreeBSD Handbook
    -c country_codes - позволяет указать код страны (Пример: ua,uk,ru)
    -c tld - использовать сервера в Top Level Domain (оффициальные - самые верхние)
    -c local - использовать сервера настроенных как local в скрипте
    -c all - использовать все FreeBSD сервера.
    

    Таким образом можно узнать самый быстрый сервер на момент тестирования. Делать это каждый раз при обнолвлении  не очень удобно. Но это можно автоматизировать скриптом (спасибо lissyara):
    $ cat /root/updateports.sh
    #!/bin/sh
    
    #========================================
    # Обновление исходных текстов
    # cvsup6 - CVS-репозиторий по умолчанию
    #========================================
    # Аргументы командной строки:
    # ports - обновить дерево портов
    # src - обновить системные исходники
    #========================================
    if test -f /usr/local/bin/fastest_cvsup
    then
       srv="`fastest_cvsup -q -c ru`"
    else
       srv="cvsup6.ru.freebsd.org"
    fi
    
    # Проверка аргументов командной строки
    if ["x$1"="xports"]
    then
       cvsfile="/root/updateports.cvs"
       dir="/usr/ports"
    elif ["x$1"="xsrc"]
    then
       cvsfile="/root/updatesys.cvs"
       dir="/usr/src"
    else
       echo "Unknown argument: expected ports or src"
    fi
    
    # Обновление
    cd $dir
    csup -h $srv -g -L 2 $cvsfile
    
    # Если обновлялись порты - проиндексировать
    if ["x$1"="xports"]
    then
       make fetchindex
    fi
    

    Ключи для скрипта (ports и src) соответственно, позволяют обновить дерево портов и исходники системы.

    ОБНОВЛЕНИЕ ЧЕРЕЗ PROXY

    В случае portsnap
    При необходимости работы через proxy-сервер необходимо прописать параметры подключения к этому серверу (не забыв 192.168.1.4:8080/8021 заменить на IP-адрес и порт вашего proxy-сервера):
    1. для bash в файл ~/.bashrc дописать
    export HTTP_PROXY='192.168.1.4:8080'
    export FTP_PROXY='192.168.1.4:8021'
    export http_proxy='192.168.1.4:8080'
    export ftp_proxy='192.168.1.4:8021'
    export HTTP_PROXY_AUTH=basic::username:password
    

    2. для cshrc в файл ~/.cshrc дописать
    setenv HTTP_PROXY      http://192.168.1.4:8080
    setenv FTP_PROXY       http://192.168.1.4:8021
    setenv http_proxy      http://192.168.1.4:8080
    setenv ftp_proxy       http://192.168.1.4:8021
    setenv HTTP_PROXY_AUTH basic::username:password
    

    Команда portsnap "понимает" работу через proxy-сервер. Установка программ из портов так же будет происходить через указанный proxy-сервер.

    В случае CVS
    Для обновления исходных текстов системы через CVS можно воспользоваться программой prtunnel(сработает через HTTP_PROXY):
    $ cd /usr/ports/net/prtunnel
    $ make install clean
    

    После этого - запустить демона:
    $ prtunnel -u 'proxyuser' -p 'passw0rd' -t http -H 192.168.1.4 \
    -P 8080 -D 5999 cvsup6.ru.FreeBSD.org 5999
    prtunnel daemon started
    Waiting for connection to port 5999...
    

    Остаётся в файлах /root/updatesys.cvs и /root/updateports.cvs исправить опрашиваемый узел на:
    *default  host=localhost
    

    Всё: теперь обычным образом пользуемся csup-ом:
    $ csup -L 2 /root/updatesys.cvs
    $ csup -L 2 /root/updateports.cvs
    

    Можно несколько автоматизировать данный процесс, используя возможности команды make. Для этого в конфигурационный файл /etc/make.conf необходимо добавить:
    
    SUP_UPDATE=     yes                   # разрешить обновление через make
    SUP=            /usr/bin/csup         # путь и имя программы работы с CVS
    SUPFLAGS=       -g -L 2               # используемые параметры csup
    SUPHOST=        cvsup6.ru.FreeBSD.org # не обязательно, если прописан в .cvs
    SUPFILE=        /root/updatesys.cvs   # файл обновления src
    PORTSSUPFILE=   /root/updateports.cvs # файл обновления ports
    


    Если ещё возможность обновлять документы, но я сам никогда не делал этого и никто из знакомых этим не пользуется на практике (тоже в /etc/make.conf) - закоментированы у меня:
    # DOCSUPFILE=             /root/csupfile.doc
    # DOC_LANG=               en_US.ISO8859-1 ru_RU.KOI8-R
    # NO_DOCUPDATE=         yes
    



    Теперь достаточно войти в соотвествующий каталог и запустить обновление:
    $ cd /usr/src/
    $ make update
    

    Для обновления портов надо переместиться, естественно, в каталог /usr/ports/.

    В случае SVN
    Создадим в каталоге пользователя подкаталок .subversion и в кём файл конфигурации servers (я делаю это для root-а):
    $ mkdir ~/.subversion
    $ touch ~/.subversion/servers
    

    Это каталог конфигурации Subversion для данного пользователя. Потом, после первого запуска там появятся и другие файлы настроек, в том числе и config.
    Содержимое servers в плане работы через proxy:
    [groups]
    
    [global]
    http-proxy-host = 192.168.1.4   # proxy-сервер
    http-proxy-port = 8080          # порт proxy
    http-proxy-username = user_name # имя на proxy
    http-proxy-password = p@ssw0rd  # пароль на proxy
    

    Другие параметры для servers и config.

    ВОЗМОЖНЫЕ ПРОБЛЕМЫ

    В случае, если при использовании svnlite update в выводимой информации есть похожие сообщения:
    Updating '.':
    Skipped 'contrib' -- Node remains in conflict
    Skipped 'UPDATING' -- Node remains in conflic
    Skipped 'sys' -- Node remains in conflict
    At revision 239171.
    Summary of conflicts:
    Skipped paths: 3

    то можно сделать:
    $ svnlite revert -R /usr/src
    

    эта субкоманда (revert) служит для разрешения конфликтных ситуаций в svn.

    ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

    1. Команды svn: коротко по русски;
    2. Управление версиями в Subversion (для Subversion 1.3).



    размещено: 2011-01-11,
    последнее обновление: 2016-09-29,
    автор: Fomalhaut


    Dog, 2011-01-16 в 13:31:53

    Для svn в базовой системе есть утилитка svnsync(1) - инструмент с очень урезанным функционалом, которого, впрочем, для обновления дерева исходных кодов вполне хватает.

    dog@dog:~> uname -sr
    FreeBSD 8.2-RC2


    dog@dog:~> svnsync help
    general usage: svnsync SUBCOMMAND DEST_URL  [ARGS & OPTIONS ...]
    Type 'svnsync help <subcommand>' for help on a specific subcommand.
    Type 'svnsync --version' to see the program version and RA modules.

    Available subcommands:
      initialize (init)
      synchronize (sync)
      copy-revprops
      info
      help (?, h)

    Le1, 2011-01-16 в 15:29:42

    Нормально написал, просто все это давно не новое, а так молодец, так держать ...

    Fomalhaut, 2011-01-16 в 16:12:51

    Le1: Согласен. Но только кому не новое, а вот для только начинающих - очень актуально: вопросов очень много, а ориентироваться в том, где и как искать и спрашивать - не все сразу могут/умеют.

    Fomalhaut, 2011-01-16 в 20:39:59

    Dog: Может я не там и не так искал, но svnsync не нашёлся в манах по 8.1. Зато отлично нашёлся в портах 8.1, как часть всё тех же subversion.
    Если всё таки не так и не там ищу, направте, плз.

    Dog, 2011-01-16 в 23:08:19

    [/b]2Fomalhaut[b]: упсь, сорри!
    Да, эта команда отсутствует в базовой системе, чушь я написал.
    Дело в том, что когда еще только шли разговоры о переходе с CVS на SVN и первое время после начала перехода, несколько раз в официальной рассылке поднимали вопрос о внесении в базовую систему минимального инструмента для работы с SVN (собственно svnsync), потом все заглохло, а я почему-то считал, что все-таки внесли. На домашней тачке у меня subversion-freebsd установлен, соответственно данная команда есть, а я не проверил ее расположение.
    Прошу прощения.

    Fomalhaut, 2011-01-17 в 1:09:17

    Dog: Будем ждать, когда включат. :)

    vintovkin, 2011-01-17 в 15:51:58

    можно добавить в .cshrc
    setenv HTTP_PROXY "http://10.0.0.50:3128"
    setenv FTP_PROXY "http://10.0.0.50:3128"
    setenv HTTP_PROXY_AUTH "basic::username:password"
    setenv FTP_PROXY_AUTH "basic::username:password"

    Fomalhaut, 2011-01-17 в 16:48:14

    Dog: Сегодня наткнулся на некий порт:
    esvn - SVN клиент.
    Не щупал ещё.

    vintovkin: Ну HTTP-то в статье описано. ;)
    Можно, конечно, и FTP добавить.

    mvalery, 2011-02-08 в 13:30:32

    Использую типовой supfile. Полностью подходит.

    # csup -L 2 -h cvsup5.ru.freebsd.org  /usr/share/examples/cvsup/ports-supfile

    Пробовал так же автоматизировать поиск быстрейшего сервера, но оказалось, что некоторые сервера cvsup очень бысто отвечают утилите fastest_cvsup, однако ничего не хотят отдавать. Обновление обламывается.

    # csup -L 2 -h `fastest_cvsup -Qcru` /usr/share/examples/cvsup/ports-supfile

    rmn, 2011-02-25 в 23:17:33

    >$ cat /root/updateports.sh
    >#!/bin/sh
    >
    >#========================================
    ># Обновление исходных текстов
    ># cvsup6 - CVS-репозиторий по умолчанию
    >#========================================
    ># Аргументы командной строки:
    ># ports - обновить дерево портов
    ># src - обновить системные исходники
    >#========================================
    >if test -f /usr/local/bin/fastest_cvsup
    >then
    >   srv = "`fastest_cvsup -q -c ru`"
    >else
    >   srv = "cvsup6.ru.freebsd.org"
    >fi

    ну и что за пробелы вокруг оператора '=' в скрипте? :)

    Alex Keda, 2011-02-25 в 23:30:44

    Это, поди, кривое наследие баша, или чего-то около того =)
    в оригинале, оно у меня без пробелов было.

    # upd: cvsup7 very slov from SPB
    # 2010-06-10 in 13:01 - add fastest_cvsup
    if test -f /usr/local/bin/fastest_cvsup
    then
           srv="`fastest_cvsup -q -c ru`"
    else
           srv="cvsup7.ru.freebsd.org"
    fi

    fm2clipper, 2011-07-18 в 12:36:36

    Спс за статью все получилось с первого раза

    Devapath, 2012-01-24 в 17:56:25

    При обновлении через утилиту SVN обратите внимание!

    уже нет- /usr/ports/devel/subversion-freebsd
    но есть- /usr/ports/devel/subversion

    salimk, 2012-05-29 в 10:08:50

    Скачал исходники при помощи svn, собрал мир и ядро,
    начал делать mergemaster почти во всех файлах в заголовках вместо
    # $FreeBSD: src/etc/master.passwd,v 1.42.2.1 2011/09/23 00:51:37 kensmith Exp $
    было только
    # $FreeBSD $
    думаю ладно, установил ядро и мир, по перли косяки типа:
    Undefined symbol "_ThreadRuneLocale"
    там еще что было не помню,
    буду пользоваться привычным csup -ом

    pandemodium, 2012-08-13 в 12:13:46

    Настраивал portsnap для работы через прокси. В csh все заработало а в bash'e нет.

    Ошибочка в статье: вместо
    export HTTP_PROXY='192.168.1.4:8080' нужно писать export HTTP_PROXY='http://192.168.1.4:8080' иначе не работает

    и еще:
      "для chsrc в файл ~/.chsrc дописать" правильно все-таки ~/.cshrc   опечатка-с

    Fomalhaut, 2012-08-13 в 14:25:56

    За очепятку - спасибо: исправил.
    А вот по первому что сказать - не знаю: у меня всё работает: http://paste.org/52878

    Devapath, 2013-02-15 в 15:45:05

    ВНИМАНИЕ !!!
    С 28 февраля 2013 года порты FreeBSD перестанут быть доступны через CVS и CVSup, т.е. их нельзя будет зеркалировать или синхронизировать для поддержания в актуальном виде через такие инструменты как CVSup. Причиной прекращения поддержки CVS является переход к использованию Subversion для разработки и поддержания дерева портов, в то время как используемые средства экспорта SVN в CVS имеют ряд ограничений, приводящих к затруднениям при организации работы зеркал.

    Пользователям предлагается спланировать переход на portsnap или svn для обновления дерева портов. Например, для обновления можно использовать команды:


      svn co https://svn0.us-west.FreeBSD.org/ports/head /usr/ports
      cd /usr/ports && svn update

    http://lists.freebsd.org/pipermail/freebsd-announce/2012-September/001435.html

    iZEN, 2013-10-03 в 19:29:28

    В базовой системе FreeBSD 10.0 есть клиент SVN, позволяющий провести синхронизацию каталогов /usr/src (и, скорее всего, /usr/ports) без установки Subversion из порта.

    Достаточно включить:
    WITH_SVN=true
    в файл конфигурации /etc/src.conf и пересобрать систему.
    Команды для работы с синхронными копиями каталогов те же.

    guest, 2014-01-27 в 18:53:00

    FreeBSD 10.0 RELEASE
    - Subversion has been imported into the base system and is installed as svnlite. svnlite should only be used for checking out the FreeBSD source trees and committing, and does not replace the full Subversion port. [r251886]



  •  

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

    © lissyara 2006-10-24 08:47 MSK

    Время генерации страницы 0.0483 секунд
    Из них PHP: 51%; SQL: 49%; Число SQL-запросов: 77 шт.
    У Вас отключено GZIP-сжатие в браузере. Размер страницы 70643