Обновление FreeBSD от и до

    Как часто бывает, зацепив одну, на первый взгляд, маленькую тему, с желанием быстро все узнать и все настроить, приходится закапываться в дремучие дебри и читать не одну статью и/или мануал. Так и получилось у меня в этот раз. Изначально было желание просто узнать, как обновлять порты (или исходные тексты портов) чтоб при желании, устанавливать не устаревшее ПО, но пришлось закопаться немного по глубже.
    Эта статья предназначена только для новичков во FreeBSD, опытные профи тут вообще ни чего нового, думаю, для себя не найдут. По этому, если вы на «ты» с этой системой, можете смело пропускать дальнейший текст.
    Информации на эту тему хватает, но из 6-10 заметок и статей я взял, так скажем, лучшие наработки и опыт, и записал их в одну, с ссылками на более полные статьи, так что при желании можно получить более подробную информацию по каждому пункту.
    Содержание статьи:
    1) Выбор ПО для обновления исходных текстов.
    2) Процесс обновления исходных текстов системы и портов.
    3) Обновление системы(ядро и мир).
    4) Обновление портов при помощи pkg_*, portupgrade, portdowngrade.
    5) Заключение
    6) Дополнительная литература.

    Выбор ПО для обновления исходных текстов


    Итак, при обновлении исходных текстов я выделил 2 подраздела – это исходные тексты системы и исходные тексты портов.
    1) При обновлении исходных текстов системы можно воспользоваться либо CVS либо SVN репозиторием. SVN более новая разработка и предназначен заменить устаревший cvs, соответственно svn имеет более широкий функционал при работе с версиями исходных текстов. Но т.к. я FreeBSD использую в качестве шлюза и каждые несколько дней обновлять систему и дополнительные утилиты не собираюсь, было решено остановиться на старом добром cvs, т.к. svn требует установить не малое кол-во дополнительного ПО, а глобальных плюсов для моих задач я в svn не увидел. Для работы с cvs репозиторием будет использоваться утилита csup (тоже самое что и cvsup но написанная на С), входящая в стандартный состав freebsd, то есть дополнительно ставить ни чего не нужно (обновление через SVN рассмотрено в доп-ой литературе в конце статьи).
    2) Обновление исходных текстов для портов возможно только из CVS репозитория, для этого можно воспользоваться либо csup либо portsnap. Portsnap является рекомендуемой системой обновления портов и она так же предустановленна в системе, ее и будем использовать.

    Процесс обновления исходных текстов системы и портов.


    Настройка csup для обновления исходных текстов системы.

    Для настройки параметров обновления создаём файл /etc/supfile:
    *default host=cvsup6.ru.FreeBSD.org
    *default base=/var/db
    *default prefix=/usr
    *default release=cvs
    *default delete use-rel-suffix
    *default compress
    #*default release=cvs tag=RELENG_8_1_0_RELEASE
    *default release=cvs tag=RELENG_8
    src-all


    примеры тегов для дерева src-all:
    RELENG_8 — Ветка FreeBSD 8-STABLE
    RELENG_8_1 — Ветка FreeBSD 8.1 в которую идут патчи безопасности
    RELENG_8_1_0_RELEASE — «Замороженный» снепшот состояния кода FreeBSD 8.1 в момент его релиза

    Всё готово, запускаем обновление:
    # csup -L 2 /etc/supfile
    Можно добавить ключик -z (компрессия) для экономии траффика.

    Если файл настройки только что создан, и эта программа раньше никогда не использовалась, то вы можете начать беспокоится а все ли пройдет удачно… Есть простой способ для пробного запуска без затрагивания ваших драгоценных файлов. Просто создайте где-нибудь пустой каталог и поместите его в качестве дополнительного аргумента командной строки:
    # mkdir /var/tmp/dest
    # cvsup supfile /var/tmp/dest

    Указанный каталог будет использоваться в качестве места назначения всех обновлений. CVSup будет работать с файлами из /usr/src, но не станет изменять или удалять их. Вместо этого все обновления файлов будут помещены в /var/tmp/dest/usr/src. При запуске таким способом CVSup оставит также неприкосновенным каталог base. Новые версии этих файлов будут записаны в указанный каталог. Если у вас есть права на чтение каталога /usr/src, вам даже не потребуется работать под root для выполнения пробного обновления.

    Обновление портов через portsnap

    Для первого запуска:
    $ portsnap fetch
    $ portsnap extract

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


    Fastest cvsup

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

    Применение:
    $ fastest_cvsup -q -c ru

    Обновление системы (ядро и мир), теория.


    Предположим, что мы поставили себе свежеиспеченую FreeBSD 8.1-RELEASE, и захотели обновить ее до ветки FreeBSD 8-STABLE. Нам необходимо произвести синхронизацию тех исходных текстов которые у нас есть на диске, с репозиторием — скачать новые части.
    Последовательность действий такова:
    1) составляем supfile и помещаем в него директиву list. В которой указываем под каким именем должен будет сохранен checkouts файл:
    src-all tag=RELENG_8_1_0_RELEASE list=RELENG_8
    2) Проводим первую синхронизацию, командой (#csup -L 2 /etc/supfile), с замороженной веткой нашего релиза RELENG_8_1_0_RELEASE
    3) Удаляем из нашего supfile директиву list:
    src-all tag=RELENG_8
    4) проводим вторую синхронизацию с веткой RELENG_8 — обновляем исходники до STABLE

    Суть идеи в следующем — при работе csup она использует checkouts файлы для того чтобы сравнивать информацию о версиях файлов на локальном диске и на сервере, и проводить синхронизацию только изменившихся. Сразу после установки системы, в директории /var/db/sup никаких checkouts файлов для синхронизируемых нами коллекций еще нет. Трюк в том, чтобы сначала их создать. Так как у нас релиз 8.1 и исходники установлены от него же, то проведя первую «синхронизацию» с «замороженным» тегом этого же самого релиза RELENG_8_1_0_RELEASE мы сможем построить актуальные checkouts файлы. Первая синхронизация по сути нечего не синхронизирует, а только энумерует файлы на диске и в репозитории, да строит базу данных — checkouts файл. После первой синхронизации мы получим в директории /var/db/sup поддиректорию src-all.
    В ней будет файл с именем checkouts.cvs:RELENG_8 – т.к. мы это указали в директиве list. Как только мы начнем вторую синхронизацию с сервером, то csup будет точно знать какие версии файлов надо передать, а что надо удалить. Синхронизация будет выполнена более чисто, займет меньше времени и потребует меньше трафика.

    Обнолвене системы (ядро и мир), пркатика.


    uname –v – узнаем текущую версию ядра
    uname –r — узнаем текущую версию системы
    Обновление лучше всего разбить на 2 части, сборка – компиляция исходников и дальнейшая инсталляция. Заниматься этим приходится не часто по этому, для меня, лучше всего делать все схематично, так проще отлавливать возможные косяки.

    I) Сборка

    1. Ядро
    1) cd /usr/src/
    2) rm -R /usr/obj/*
    (Если при удаление выдало ошибки по поводу установленных флагов, то необходимо выполнить команду #chflags -R noschg * )
    3) make clean && make clean
    4) make -sj4 buildkernel KERNCONF=YOUR_KERNEL_HERE
    (YOUR_KERNEL_HERE — название ядра которое лежит в папке /usr/src/sys/i386/conf. Но заметьте, вы путь не указываете, а указываете только имя файла. Советую переименовать файл, чтобы скомпилилось новое ядро, а не то что было до обновления системы)
    Где j4 — компилировать в 4 потока. Рекомендуется для однопроцессорных машин, т.к. компиляция в большей степени требовательная к системе ввода-вывода, а не процессору. Для многопроцессорных это значение можно увиличить. s — уменьшает количество выводимой инфы на экран.)

    2. Мир (система)
    1) cd /usr/src/
    2) rm -R /usr/obj/*
    3) make cleandir && make cleandir – (make cleandir делать дважды рекомендует хандбук)
    4) make -sj4 buildworld

    II) Инсталляция

    1. Ядро
    1) make installkernel KERNCONF=YOUR_KERNEL_HERE
    2) reboot
    2. Мир (система)
    Мир — это пользовательские программы – типа: grep, awk, sh, chmod и прочего. Короче всё, что не входит в ядро и модули ядра. Перед сборкой рекомендуется вернуть к стандартному виду /etc/make.conf. В случае проблем — если что-то не собирается или не инсталлится — стоит посмотреть, что там и убрать лишнее.
    В процессе инсталляции мира, в идеале нужно запускать программу mergemaster. Эта программа определяет разницу между вашими конфигурационными файлами в каталоге /etc и конфигурационными файлами из дерева исходных текстов /usr/src/etc. Это является рекомендуемым способом синхронизации системных конфигурационных файлов с теми, что размещены в дереве исходных текстов.
    Для пересборки мира лучше зайти в однопользовательский режим(single-user):
    1) mount -u /
    2) mount -a
    3) rm -R /usr/obj/*
    4) /usr/src/usr.sbin/mergemaster –p
    Если есть отличия, то на экране появляется сообщение об этом.
    Первой строкой в нем идет имя файла, который не соответствует новым требованиям, а ниже сами отличия.
    Знаком "-" помечаются строки, которые утилита собирается удалить,
    а "+" — которые будут добавлены.
    В конце предлагаются следующие варианты:
    d — удалить предлагаемый вариант и оставить старый;
    i — установить предлагаемый вариант, удалив старый;
    m — сравнить построчно старый и предлагаемый вариант;
    v — посмотреть отличия в файлах снова.
    5) cd /usr/src/
    6) make installworld
    7) mergemaster
    8) reboot
    9) cd /usr/src/
    10) make delete-old

    Обновление портов при помощи pkg_*, portupgrade, portdowngrade.


    1) #portsnap fetch update – обновление портов.
    2) # pkg_version -v | grep “need” — Вывод списка портов, которые надо обновить
    3) #pkg_create -b port_name – Возможность создать пакеты для нужных портов с последющей установкой через pkg_add
    4) #pkg_add -i -f port_name.tbz – Установка пакета без зависимостей. После такой установки проще всего откатится на предыдущую версию.

    Использование утилиты portupgrade

    Найти можно тут — /usr/ports/ports-mgmt/portupgrade
    1) portupgrade -nr port_name – выводит подробную информацию о будущей установке пакета (какие файлы и зависимости обновятся)
    2) portupgrade -ir port_name
    Ключ -i указывает на то, чтобы при апгрейде опрашивался пользователь в случаях, когда есть выборки (yes/no).
    Ключ -r указывает обновлять нижестоящую цепочку зависимостей порта.

    При апдейте с помощью portupgrade важным козырем является файл настроек /usr/local/etc/pkgtools.conf, в котором содержатся параметры передаваемые порту при сборке (хэш MAKE_ARGS). Полезно отредактировать подобные настройки в этом файле под свои нужды и последующие обновления будут проходить без лишних проблем.
    Также нужные параметры можно выдрать в случае переустановки порта или при переходе на какую-то новую версию, да и это полезно бывает для поддержания совместимости установок между серверами. Например, много нервов может убить разнящаяся кодировка установленного mysql при переносе какого-то сайта между серверами.
    Бывают случаи, когда надо железно запретить обновления для определенного порта. Имена таких портов можно указать в хэше HOLD_PKGS в файле pkgtools.conf, например так запрещаем обновление midnight commander’a:
    HOLD_PKGS = [
    'mc-*',
    ]

    Утилита portdowngrade

    Позволяет откатится на предыдущую версию.
    Установка:
    # cd /usr/ports/ports-mgmt/portdowngrade
    # make DEFAULT_CVS_SERVER="anoncvs@anoncvs1.FreeBSD.org:/home/ncvs" install clean


    Использование:
    #portdowngrade port_name – выводит список предыдущих версий порта и дает возможность выбрать и установить нужную версию.

    Заключение


    Вот такой вот получился мануал, по полному обновлению FreeBSD. Я только изучаю эту ОС по этому на открытие чего то нового не претендую, но лично мне намного удобнее пользоваться одной статьей чем 5-ю, 6-ю и т.д. для каждой отдельной утилиты, по этому мануал я составлял для себя, но может, он так же, окажется, кому то полезным!

    Литература


    Управление версиями в Subversion
    Обновление исходных текстов: cvsup, csup, svn, portsnap
    Использование csup
    Примеры более тонкого управления исходными текстами
    Дополнительная информация по запуску mergemaster
    portdowngrade — откатываем нужный порт до любой ранее версии
    portupgrade — `обновлялка` установленных портов.
    Поделиться публикацией

    Похожие публикации

    Комментарии 22
      +9
      к чему перепечатывать здесь FreeBSD Handbook?
        –2
        Ответ в «Заключении»

        Да и потом из хэнбука тут не так уж и много, все остальное опыт людей, а это иногда по важнее манов.
          +7
          да тут из хэндбука всё, за исключением пары флагов у команд!

          Фря всегда отличалась от линуксов хорошей тщательно написанной документацией на русском языке, которую в 99% достаточно было просто прочитать и не лезть в форумы/блоги за решением какой-нибудь проблемки, а подобные статьи — есть способ привлечения в коммьюнити балбесов, не могущих освоить чтение более чем одной страницы. А потом, прочитав подобное руководство и попытавшись сделать что-нибудь своими кривыми руками, вышеуказанные балбесы начинают засорять тематические форумы и списки рассылки.
            +1
            Ну если человек балбес, то мне кажется он начнет засорять форумы и рассылки в любом случае…
            Да и не пользуются такие поисковиками и не читают такие вот статейки, тем более с таким большим кол-ом знаков… Сразу идут на тем-ий форум и не пользуясь поиском создают новую тему. Те кто бывает на форумах часто такое наблюдают. Так что не думаю что такая мини статья способствует полному отупению кого либо. ;)
          0
          ag-up.com/?p=310 — короче, проще, быстрее и оно работает ;)
            +2
            То, что после csup отлично описано в /usr/src/Makefile строки с 51 по 61.

            У вас ошибочки — надо перед установкой мира делать mergemaster -p и не забывать насполедок делать make delete-old && make delete-old-libs

            А если почитать хэндбук, то можно дополнительно узнать, что надо делать ребут после установки ядра и до установки мира — чтобы в случае проблем можно было остаться со старой версией системы (загрузить старое ядро а потом двинуть его в /boot/kernel).

            А ещё — если уж хочется коротких, быстрых, работающих рецептов — то после установки мира надо делать не mergemaster, а mergemaster -iFU не нажимать > 9000 раз кнопочку i для установки файлов конфигов в которых сменилась только строка с версией cvs.

            Да, опять таки надо перегружаться после установки мира, и только после этого делать make delete-old.

            P.S.
            официальная документация рулит, лишние 15 минут на чтение — и волосы будут мягкими и шелковистыми, а перхоть пропадёт =)
              0
              Поправил, теперь всё шоколадно, уже протестил на себе — работает.
          +1
            0
            Изучать что-то новое для себя это всегда хорошо. В посте не сказано про бинарное обновление при помощи freebsd-update.
            portupgrade штука конечно хорошая, но за собой тянем много зависимостей. Советую так же посмотреть в сторону порта portmaster, он обновляется гораздо чаще и написан на C. Правда в нем еще пока не весь функционал portupgrade.
            # pkg_version -v | grep “need” — Вывод списка портов, которые надо обновить
            эту команду можно заменить на pkg_version -v -L=
              +1
              «portmaster, он обновляется гораздо чаще и написан на C»
              Гм, вообще-то portmaster это такой sh-скрипт.

              Вывод списка портов с сортировкой по наличию зависимостей\зависимых portmaster -l и проверкой на наличие обновлений: portmaster -L
              0
              Про хендбук верно выше заметили.
              А вообще советую автору изучить:
              1. Бинарное обновление системы
              2. Настройка portupgrade для бинарного обновления ПО, с возможностью сборки из портов отдельных приложений.

              Пересобирать мир и порты это конечно хорошо, но только до тех пор, пока есть куча свободного времени и терпения.
              :)
                +3
                Получилось много, как уже сказали копипаста хендбука, и ни о чем. Тот же:
                $ portsnap fetch
                $ portsnap extract
                удобнее вводить в одну строчку: portsnap fetch update

                Зато понаписали кучу всего о чем даже большинство админов не вспоминает, пока может ну раз в год-два не понадобится, и тогда проще свериться с мануалом.

                Содержание статьи:
                1) Выбор ПО для обновления исходных текстов.
                2) Процесс обновления исходных текстов системы и портов.
                3) Обновление системы(ядро и мир).
                4) Обновление портов при помощи pkg_*, portupgrade, portdowngrade.
                5) Заключение
                6) Дополнительная литература.

                1) portsnap, freebsd-update, portmaster
                2) запускаем portsnap
                3) запускаем freebsd-update
                4) запускаем portmaster
                5) make love
                6) man, freebsd handbook
                  +1
                  Написали для i386, его пользуют только на <4GB RAM…
                    0
                    2 lDeNl
                    Прочтите Absolute freebsd 2bd edition. (FreeBSD подробное руководство)
                    Опыт переданный Майклом Лукасом бесценен и крайне полезен.
                      0
                      Да именно эту книгу и читаю, пока что треть одолел. Но книга классная (сравниваю с тем, что читал по продуктам от MS).
                      0
                      Статья очень пригодится для тех кто ни хочет читать handbook. Хотя правильнее смотреть первоисточник.
                        +1
                        VBart, полностью согласен в выборе программ.

                        Как мне ответили на одном форуме.
                        Вопрос бинарное или из исходников.
                        Бинарное — быстро, не оптимизировано по тебя
                        Из Исходников — медленно, оптимизировано под тебя

                        На деле
                        Бинарное — быстро и удобно,
                        Из исходников — медленно и неудобно
                          0
                          >3) make clean && make clean
                          Никогда не делал. Ни при сборке ядра, ни при сборке мира. Я не прав?
                            0
                            Да что вы мусолите эту тему, она сотни раз разжевана и пережёвана. В хендбуке всё понятно, да и если трудности возникают, ответы ищутся моментально.
                              –1
                              Как все сложно то… в этих бсд…
                                0
                                Что сложного-то?

                                Сборка ядра — правка конфига, и три команды, включая ребут.

                                В этих ваших линупсах/виндах это вообще невозможно.
                                0
                                Вот бы кто рассказал как удаленно обновить БСД, когда загрузка в single-mode недоступна.

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                Самое читаемое