Андрей Смирнов
Время чтения: ~14 мин.
Просмотров: 1

freebsd-update — бинарное обновление системы

Как часто бывает, зацепив одну, на первый взгляд, маленькую тему, с желанием быстро все узнать и все настроить, приходится закапываться в дремучие дебри и читать не одну статью и/или мануал. Так и получилось у меня в этот раз. Изначально было желание просто узнать, как обновлять порты (или исходные тексты портов) чтоб при желании, устанавливать не устаревшее ПО, но пришлось закопаться немного по глубже. Эта статья предназначена только для новичков во 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_82) Проводим первую синхронизацию, командой (#csup -L 2 /etc/supfile), с замороженной веткой нашего релиза RELENG_8_1_0_RELEASE 3) Удаляем из нашего supfile директиву list: src-all tag=RELENG_84) проводим вторую синхронизацию с веткой 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) reboot2. Мир (система) Мир — это пользовательские программы – типа: 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Примеры более тонкого управления исходными текстамиДополнительная информация по запуску mergemasterportdowngrade — откатываем нужный порт до любой ранее версииportupgrade — `обновлялка` установленных портов.

  • 17-07-2010
  • 16 375

Статьи / Система

Несомненно, правильный путь обновления системы лежит через пересборку мира (make world). Но есть путь и попроще. Он основан на бинарном обновлении системы через freebsd-update. Данная утилита уже имеется в основной системе. Ее описание гласит, что freebsd-update предназначена для получения, установки и отката бинарных обновлений системы и обновления имеются только для тех релизов и архитектур, которые подготовлены командой разработчиков, в частности для веток RC, RELEASE, BETA.Команд у нее немного. Вот основныеfetch — получает обновления для текущей архитектуры и конфиграцииcron — случайно, с промежутком от 1 до 3600 секунды выполняет fetch для получения обновлений. Если обновления имеются, то шлется письмо, обычно на имя root. upgrade — получает файлы, необходимые для обновления на новый релиз. Прежде чем использовать, ознакомьтесь с анонсами и правилами обновления для нового релиза, если требуется выполнение дополнительных действий.install — устанавливает полученные обновления.rollback — удаляет установленные обновления.Обычно, для текущих обновлений выполняется

#freebsd-update fetch#freebsd-update install

В том случае, если патчи безопасности относились к ядру (ядро или модули), по завершению работы freebsd-update систему необходимо будет перезагрузить. Для регулярной отработки этой операции, можно воспользоваться cron(8), поместив в него следующую строчку:

 @daily                                  root    freebsd-update cron

Эта строчка заставит freebsd-update каждый день проверять наличие обновлений для вашей системы. В том случае, если патчи безопасности имеются, они будут сохранены на локальный диск, но не применены. Применение патчей необходимо проводить вручную.Утилита freebsd-update в состоянии обновлять только GENERIC-ядро. В том случае, если Вы используете ядро собственной сборки, Вам потребуется его перекомпилировать после каждой отработки freebsd-update, в которой затронуты изменения относящиеся к ядру. freebsd-update также может обнаруживать и обновлять GENERIC ядро, по пути /boot/GENERIC (если оно существует), поэтому, хранить еще одно ядро в /boot/GENERIC — это хорошая идея. Уровень патчей на системе идентифицирует число, следующее за буквой ‘p’ в имени релиза (команда uname -r).Внимание! Вы можете обновлять систему, будучи загруженным на собственном ядре, однако всегда рекомендуется иметь в системе копию стандартного ядра, расположенного в /boot/GENERIC каталоге. Его можно получить, например, с установочного диска FreeBSD:

  mount /cdrom  cd /cdrom/X.Y-RELEASE/kernels ./install.sh GENERIC

Где X.Y — это релиз системы, который Вы используете. Помимо этого, GENERIC ядро можно собрать из исходных кодов:

  cd /usr/src  env DESTDIR=/boot/GENERIC make kernel  mv /boot/GENERIC/boot/kernel/* /boot/GENERIC  rm -rf /boot/GENERIC/boot

Шаг1: получение обновленийДля того, чтобы обновить систему на определенный релиз, freebsd-update необходимо запускать с ключем -r, где после ‘r’ указывается конечная версия системы. Например:

#freebsd-update -r 8.1-RELEASE upgrade

заставит freebsd-update получить те дополнения, которые необходимы для FreeBSD 8.1-RELEASE. В процессе отработки, будут выведены те категории системы, которые будут подлежать обновлению. Нажатием ‘y’ (или Enter) на вопрос «Does this look reasonable (y/n)? y» Вы подтверждаете, что freebsd-update будет скачивать перечисленные категории на локальный диск. В том случае, если система запущена не на GENERIC ядре, вы получите об этом соответствующее уведомление: WARNING: This system is running a «MYKERNEL» kernel, which is not a kernel configuration distributed as part of FreeBSD 8.0-RELEASE. This kernel will not be updated: you MUST update the kernel manually before running »/usr/sbin/freebsd-update install» Это предупреждение на этом этапе можно игнорировать. Новое GENERIC ядро можно использовать как промежуточный шаг в процессе обновления. После того, как необходимые категории будут сохранены начнется процесс их применения. Скорость операции зависит от скосрости и загрузки Вашей машины. Возможно, в процессе слияния конфигурационных файлов, система может столкнуться с трудностями и запустив редактор, потребует от Вас ручного вмешательства. Обратите внимание, что на данном этапе, все изменения и слияния конфиг-файлов происходят в другом каталоге, поэтому, в случае проблем (пропажа питания), система загрузиться в привычное состояние, а шаги по обновлению придется делать заново. Шаг2: применение обновлений для ядра

# freebsd-update install

На этом этапе будут обновлено ядро и модули ядра. После этого шага, система нуждается в перезагрузке. Если система работает не на GENERIC ядре, используйте nextboot(8) для установки ядра следующей загрузки:

  nextboot -k GENERIC

Перезагрузка:

shutdown -r now 

Шаг3: применение обновлений userlandПосле перезагрузки, freebsd-update должна быть запущена вновь, для обновления базовых утилит и библиотек.

freebsd-update install

Внимание! Поскольку на этом этапе возможна инсталляция библиотек более старших версий, сторонее ПО (например устанавливаемое из портов) требуется переустанавливать. Для этого можно воспользоваться утилитами (ports-mgmt/portupgrade, ports-mgmt/portinstall). Если в данный момент времени эта процедура невозможна, прочтите пункт ‘c’ в замечениях. Если Вами используется не GENERIC ядро, самое время, чтобы его перестроить и установить ( cd /usr/src && make kernel KERNCONF=«MYKERNEL» )

shutdown -r now

Поздравляю, процесс обновления завершен. freebsd-11.0-.jpg

Добрый день уважаемые читатели! 10 октября 2016 года состоялся релиз версии 11.0

Обновляться я не спешил, подождал немного, как выпустят патчи и т.п. Теперь пора написать статью про Обновление FreeBSD!

Обновляться будем через стандартное системное приложение freebsd-update. Ничего сложного в этом нет.

Обновление FreeBSD Freebsd 10.3 -> 11.0

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

freebsd-update fetch  freebsd-update install

После чего перезагружаемся:

reboot

Далее приступаем непосредственно к обновлению системы:

freebsd-update upgrade -r 11.0-RELEASE

freebsd-update-upgrade-r-11.0-RELEASE.png На вопрос — отвечаем положительно Теперь ожидаем загрузки файлов. Занимает это примерно около часа. Не зависимо от «железа». Не знаю почему так, но и на живой машине (мощной) и на виртуалке этот процесс занимал приблизительно одинаковое время. После применения патчей (тем более, если вы пересобирали ядро) будут задаваться вопросы по поводу изменения конфигов. Здесь смотрим внимательно, что делаем!

После этого он покажет список файлов, которые будут заменены/изменены. Я просто пролистал вниз кнопкой «PageDown«.

freebsd-update-upgrade-r-11.0-RELEASE_1.png

После загрузки файлов можно переходить непосредственно к обновлению самой системы до 11 версии. Для этого запускаем:

freebsd-update install

freebsd-update-upgrade-r-11.0-RELEASE_2.png

Первый этап пройден, было обновлено «Ядро». Теперь перезапускаем нашу систему:

freebsd-update-upgrade-r-11.0-RELEASE_3.png

Вот уже запустилось новое ядро. Запускаем продолжение обновления:

freebsd-update install

freebsd-update-upgrade-r-11.0-RELEASE_4.png

После окончания второго этапа снова перезагружаемся и снова запускаем 3-й этап обновления:

freebsd-update install

После последнего перезагружаться уже не обязательно, но желательно.

Вот и все, система была обновлена на версию 11.0. Оказалось это не так сложно, все очень легко. Единственное что приходится ждать, пока все скачается и обновится.

После обновления я столкнулся с проблемой:

pkg upgrade   Shared object "libssl.so.7" not found, required by "pkg"

Ну и не один пакет не запускался…

Помогла переустановка всех пакетов:

pkg-static upgrade -f

После этого все нормально заработало!

Используемые источники:

  • https://habr.com/post/113441/
  • https://unix.uz/articles/system/50-freebsd-update-binarnoe-obnovlenie-sistemy.html
  • https://sysadmin-note.ru/obnovlenie-freebsd-s-10-3-do-11-0/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации