Обновление базовой системы для использования в джейлах
Упрощенный вариант
Этот способ подходит только для версий 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