Прикладная демонология, практические рецепты

Обновление базовой системы для использования в джейлах

Упрощенный вариант

Этот способ подходит только для версий FreeBSD 10.x и новее.
В имени базовой файловой системы можно не указывать patch-level, так как теперь эта информация легко устанавливается:

/bin/freebsd-version -u

Сама процедура обновления проста:

freebsd-update -b /jails/11.0-RELEASE-amd64 fetch
freebsd-update -b /jails/11.0-RELEASE-amd64 install

Проверяем результат:

/jails/11.0-RELEASE-amd64/bin/freebsd-version -u

При необходимости копируем исправленный nscd:

cp -p /usr/sbin/nscd /jails/11.0-RELEASE-amd64/usr/sbin

Можно сделать snapshot для дальнейшего использования:

zfs snapshot tank/jails/11.0-RELEASE-amd64@p4
zfs send -vR tank/jails/11.0-RELEASE-amd64@p4 > /var/eztools/11.0-RELEASE-amd64

После этого надо перезапустить все джейлы, использующие данную базовую систему:

ezjail-admin restart [foo ... bar]

Изготовление snapshot

Выполняем штатную процедуру установки ezjail.
При этом создаются файловые системы tank/jails/basejail (она нам и нужна) и tank/jails/newjail (нам она не актуальна).
У нас не используется файловая система tank/jails/basejail, поэтому операция безопасна.
При создании tank/jails/basejail ezjail автоматически производит обновление до последнего patch-level (его номер виден в выводе ezjail-admin install).

env UNAME_r=10.3-RELEASE ezjail-admin install -msh ftp2.de.freebsd.org
zfs destroy tank/jails/newjail

Удаляем временные snapshots, созданные автоматически при процедуре обновления:

zfs list -rtsnapshot -Honame tank/jails/basejail | xargs -n1 zfs destroy

В версиях FreeBSD 9.x и 10.x есть известная проблема с /usr/bin/nscd (кеширование отрицательных результатов резолвинга навсегда).
Пока она не устранена, надо заменять бинарный файл исправленным.
Предполагаем, что на самом сервере уже имеется правильная версия, если нет, то копируем ее из ansible:

cp -p /usr/sbin/nscd /jails/basejail/usr/sbin

Делаем snapshot и сохраняем в файл с именем нового patch-level:

zfs snapshot tank/jails/basejail@ok
zfs send -v tank/jails/basejail@ok > /var/eztools/11.0-RELEASE-amd64

Удаляем временную файловую систему:

zfs destroy -r tank/jails/basejail

Применение обновления

Восстанавливаем snapshot в новую файловую систему:

zfs recv -v tank/jails/11.0-RELEASE-amd64 < /var/eztools/11.0-RELEASE-amd64

Постепенно переключаем джейлы на ее использование:

jail:
-   base: 9.3-RELEASE-amd64
+   base: 10.0-RELEASE-p14-amd64

Выкатываем конфигурации ezjail и перезапускаем джейлы:

ansible-playbook ezjail.yml -D -l foo
ezjail-admin restart bar

В джейле обновляем базовые конфигурационные файлы:

ezjail-admin console bar
mergemaster -p
mergemaster -iFU

Выкатываем конфигурации самих джейлов и перезапускаем их:

ansible-playbook 42.yml -D -l bar
ezjail-admin restart bar