FreeBSD virtual environment management and repository

2020-10 upd: we reached the first fundraising goal and rented a server in Hetzner for development! Thank you for donating !

Внимание! Данные страницы описывают CBSD версии 13.0.x. Если вы используете более раннюю версию, рекомендуется сначала обновиться.

Обновление клеток

Команда jupgrade

			% cbsd jupgrade
			% cbsd jconfig
		
Описание:

Процедура обновления jail всегда сопряжена с определенными рисками в виде нарушения работы сервиса, поэтому, возьмите за правило всегда создавать резервные копии состояния клеток. Если вы работаете на ZFS файловой системе, вы можете воспользоваться командой cbsd jsnapshot для заморозки состояния клетки до начала работ. Например:

			% cbsd jsnapshot mode=create jname=jail1 snapname=before_update
		

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

			% cbsd jsnapshot mode=destroy jname=jail1 snapname=before_update
		

Если файловая система UFS, вы можете создать образ клетки через:

			% cbsd jexport jname=jail1
		

И в случае успешной операции по обновлению, удалить образ jail1.img в каталоге $workdir/export. Под обновлением клетки CBSD будем предполагать только обновление базовых файлов FreeBSD. Процедура обновления 3rd-party ПО для клеток аналогична обновлению ПО в обычной системе. Обновить базу вы можете как между разными версиями системы ( например с версии FreeBSD 9.2 до 9.3, или FreeBSD 9.3 -> FreeBSD 10.1 ), так и обновить файлы в рамках одной и той же версии. Следует помнить, что клетки имеют 2 режима — baserw=1, когда базовая часть у каждой клетки — своя собственная копия расположенная в каталоге $workdir/jails-data/$jail, и baserw=0, когда одна и та же база в каталоге ${workdir}/basejail/base_\*_\*_ver монтируется всем клеткам.

Обновление через базовую утилиту freebsd-update

freebsd-update можно использовать без к привязки к CBSD. Следует учитывать, что утилита работает с официальным ресурсом FreeBSD и сконфигурировать ее на репозиторий CBSD нельзя, те, источник только один.

Обновить базовые файлы для клеток через freebsd-update можно, указав через ключ -b путь к каталогу, используемому CBSD при монтировании клеток с baserw=0. Так, если ваш CBSD $workdir - /usr/jails, то для amd64 и версии 10.0 путь до базы будет /usr/jails/basejail/base_amd64_amd64_10.0. Этот каталог и следует обновить:

% freebsd-update -b /usr/jails/basejail/base_amd64_amd64_10.0 fetch
% freebsd-update -b /usr/jails/basejail/base_amd64_amd64_10.0 install
		

Если у вас нет baserw=1 клеток, то на этом - всё. Если baserw=1 клетки есть, то для их обновления возможны два варианта:

  • Как и в случае выше, для каждого jail вызвать freebsd-update и указать путь к data каталогу клетки ( $workdir/jails-data/$jname )
  • Или, выполнив обновление basejail как написано выше, вызвать:
    cbsd jupgrade jname=XXXX
    			
    для каждой клетки baserw=1 - эта команда переформирует базу ( $workdir/jails-data/$jname ) клетки из файлов в $workdir/basejail/*

Обновление baserw=0 клеток между различными версиями баз средствами CBSD

Вариант с переходом клетки в режиме baserw=0 на новую версию базы является самым простым и заключается в изменении версии в конфигураторе

			% cbsd jconfig jname=XXX
		

Поскольку в этом случае лишь меняется каталог-источник, который линкуется при старте клетки. Пример обновления клетки с версии 9.2 на 10.0.

Исходные данные: есть x86-64 система с базой от FreeBSD 9.2 и клеткой jail1 на этой базе, которую необходимо перевести на 10.0.

При остановленной клетке заходим в конфигуратор по

			% cbsd jconfig jname=jail1
		

и меняем параметр ver на 10.0, после чего выбираем "Commit". Либо, как на снимке — делаем изменение через cbsd jset

При следующем запуске, клетка будет монтировать уже базу 10.0 (на снимке этой базы в системе не оказалось и CBSD предложила ее скачать). Разумеется, при подобном переходе на новую мажорную версию, после этой операции пересобрать ПО в клетке или обновить через pkg — крайне желательная операция, поскольку библиотеки системы изменились. Как минимум, для выявления этого факта можно воспользоваться утилитой libchk.

Обновление baserw=1 клеток между различными версиями баз средствами CBSD

Обновление baserw=1 клеток проходит несколько по иному сценарию, поскольку при этой операции CBSD будет перезаписывать системные файлы старой базы на новые в каталоге клетки по $workdir/jails-data/$jname. Исходные данные — клетка jail1 в режиме baserw (тесть, ее корневой путь PATH по jls указывает в jails-data, а не jail каталог) на версии 9.2. Необходимо обновить на версию 10.0.

Убедимся через утилиту file, которая читает ELF таблицу, что файл /bin/sh клетки принадлежит версии 9x. И тем же образом, проверим версию файла после обновления:

			% file -s /usr/jails/jails-data/jail1-data/bin/sh
			/usr/jails/jails-data/jail1-data/bin/sh: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 9.2, stripped
		

При остановленной клетке выполняем смену версии через cbsd jconfig или cbsd jset, после чего выполняем процедуру обновления:

			% cbsd jupgrade jname=jail1
		

Данная операция заставляет перезаписать все системные базовые файлы в клетке на файлы из вашего оригинального каталога $workdir/basejails/base_\*_\*_ver

Обновление baserw=0,1 клеток в рамках одной версии, переход на stable=1

Иногда бывают случаи, когда необходимо обновить файлы в рамках одной версии, например базу 10.0 на базу 10.0-p1. Для клеток, монтирующих базу через nullfs, достаточно просто перезакачать в каталог $workdir/basejail/base_\*_\*_ver более свежую версию. Для этого вы можете использовать команду:

			% cbsd repo action=get sources=base mode=upgrade
		

— аргумент mode=upgrade разрешает CBSD перезаписать данный каталог новыми файлами, если у вас уже имеется версия базы под этой версией.

Либо, вы можете собрать более свежую версию баз, воспользовавшись Сборка и обновление базы. Также, вы можете перейти с версии базы с RELEASE на STABLE (в этом случае, имя каталога базы будет не X.Y, а X. Тоесть, вместо base_\*_\*_9.2 будет использоваться base_\*_\*_9. Для этого вам необходимо в конфигураторе клетки ( cbsd jconfig ) изменить параметр stable=0 на stable=1 ( либо через cbsd initenv-tui выставить режим работы со STABLE ветками глобально ), и при команде cbsd repo не забыть stable=1 (если не выставлен глобально )

			% cbsd repo action=get sources=base mode=upgrade stable=1
		

Аналогичные правила характеры также для клеток с baserw=1, необходимо лишь не забывать после обновления баз в CBSD запустить процедуру обновления файлов в конкретном jail через cbsd jupgrade. Кроме этого, при условии что у вас в системе есть база соответствующей версии (или вы мигрировали клетку на другой сервер где есть база новее), при запуске клетки baserw, CBSD способна автоматически проверить наличие более свежих файлов для этой версии и выдать соответствующее информационное сообщение "You have a more recent version of the base in …":

Обновление конфигурационных файлов клеток, etcupdate/mergemaster

// to be continued