FreeBSD : Migration ezjail vers iocage

FreeBSD: migrate from ezjail to iocage

Après plusieurs années à me trainer ezjail, je me suis enfin décidé à migrer vers iocage. Depuis FreeBSD 10, le fonctionnement de l'upgrade de RELEASE était compliqué : il fallait d'abord upgrader la basejail avant le système notamment. Avec iocage, je garde le même fonctionnement de ezjail, à savoir le système de basejail. Pour la migration, j'ai récupèré les datas spécifiques de chaques jails vers les nouvelles.

Installation

$ pkg install py37-iocage
$ iocage activate zroot
ZFS pool 'zroot' successfully activated.

Comme mon système est bloqué sur FreeBSD 10.1 à cause d'ezjail, je récupère les sources de cette version pour iocage.

$ iocage fetch
********************************************************************************
fdescfs(5) is not mounted, performance may suffer. Please run:
mount -t fdescfs null /dev/fd
You can also permanently mount it in /etc/fstab with the following entry:
fdescfs /dev/fd  fdescfs  rw  0  0
********************************************************************************

Creating zroot/iocage
Creating zroot/iocage/download
Creating zroot/iocage/images
Creating zroot/iocage/jails
Creating zroot/iocage/log
Creating zroot/iocage/releases
Creating zroot/iocage/templates
Default configuration missing, creating one
[0] 11.2-RELEASE
[1] 11.3-RELEASE
[2] 11.4-RELEASE
[3] 12.0-RELEASE
[4] 12.1-RELEASE
[5] 12.2-RELEASE

Type the number of the desired RELEASE
Press [Enter] to fetch the default selection: (12.1-RELEASE)
Type EXIT to quit: 4
Fetching: 12.1-RELEASE

Je change le point de montage par défaut pour /usr/iocage :

$ zfs set mountpoint=/usr/iocage zroot/iocage

Pour améliorer les performances, je monte le système de fichier file-descriptor :

$ mount -t fdescfs null /dev/fd
$ echo "fdescfs /dev/fd  fdescfs  rw  0  0" >> /etc/fstab

L'environnement est prêt : j'ai les sources 10.1 pour mes jails.

Migration vers iocage

Création des jails iocage

Je veux récupérer toutes mes jails actuelles avec iocage :

$ for name in $(ezjail-admin list | awk '{ print $4 }' | tail -n +3); do iocage create -r 12.1-RELEASE -n $name -b; done

Récupération des données

Une fois que l'ensemble des jails sont créees, il faut récupérer l'ensemble des datas ezjail vers iocage et commencer par les stopper :

$ service ezjail stop
$ for name in $(ezjail-admin list | awk '{ print $4 }' | tail -n +3); do rsync -va --exclude-from=excludejail /usr/jails/$name/ /usr/iocage/jails/$name/root/ ; done

Le contenu du fichier d'exclusion :

/basejail
/bin
/boot
/dev
/lib
/libexec
/rescue
/sbin
/net
/proc
usr/bin
usr/include
usr/lib
usr/libexec
usr/sbin
usr/share
usr/libdata
usr/lib32
usr/ports
usr/sbin
usr/share
usr/src
usr/tests

Paramétrage spécifiques

Attribution des IPs en gardant celles d'origine :

$ for name in $(iocage list -qh | awk '{ print $1 }'); do ip4=`grep ip= /usr/local/etc/ezjail/$name | cut -f 2 -d '"'` && iocage set ip4_addr="${ip4}" $name; done

Autorisation des raw sockets :

$ for name in $(iocage list -qh | awk '{ print $1 }'); do iocage set allow_raw_sockets=1 $name; done

Désactivation de l'auto création du fichier resolv.conf :

$ for name in $(iocage list -qh | awk '{ print $1 }'); do iocage set resolver=/dev/null $name; done

Activation des jails au boot :

$ for name in $(iocage list -qh | awk '{ print $1 }'); do iocage set boot=on $name; done

Cas plus spécifiques

Certaines jails ont des paramètres un peu plus spécifiques notamment celles de zabbix comme expliqué dans un précèdent article. J'ai également une jail openvpn qui nécessite d'établir une route sur l'host directement et au démarrage de la jail. Pour se faire :

$ iocage set sysvshm=new zabbix
$ iocage set sysvsem=new zabbix
$ iocage set exec_prestart="/sbin/ifconfig tun0 inet 192.168.2.1/32 192.168.2.2 && /sbin/route add -net 192.168.2.0/24 192.168.2.2" openvpn
$ iocage set allow_tun=1 openvpn

Vérification

On peut démarrer ses jails et vérifier le bon fonctionnement.

$ iocage start webfront
$ iocage console webfront
webfront ~ ❯❯❯

Si les services tournent, que les datas sont présentes, c'est tout bon.

Upgrade vers FreeBSD 12.2

Dernière étape, passer sur la dernière RELEASE.

$ iocage fetch -r 12.2-RELEASE
Host: 12.1-RELEASE is not greater than target: 12.2-RELEASE
This is unsupported.

Il faut d'abord mettre à jour l'host cette fois ;-). L'host en 12.2, le fetch fonctionne correctement. Pensez à désactiver ezjail avant reboot de l'host :

$ sysrc -X ezjail_enable

Les sources récupérées, on peut passer à l'upgrade de chaque jails :

$ for j in $(iocage list -qh | awk '{ print $1 }'); do iocage upgrade -r 12.2-RELEASE $j ;done

jailname successfully upgraded from 12.1-RELEASE-p13 to 12.2-RELEASE-p4!
Please reboot the jail and inspect.
Remove the snapshot: ioc_upgrade_2021-03-11 if everything is OK

Comme à l'étape précédente, on vérifie que tout fonctionne. Si c'est le cas, on peut supprimer les snapshots :

$ for j in $(iocage list -qh | awk '{ print $1 }'); do iocage snapremove -n ioc_upgrade_2021-03-11 $j ;done

Ansible/iocage/jailname

J'utilise le connecteur jail avec ansible ansible_connection=jail. Avec iocage, j'obtenais cette erreur :

$ ansible jails -m ping
webfront | FAILED! => {
"msg": "incorrect jail name webfront"
}

Issue ouverte sur le github : il faut rajouter le préfixe ioc- sur chaques jails dans l'inventaire.

Suppression ezjail

Au bout de quelques jours d'uptime, on peut définitivement tout supprimer :

$ for j in $(ezjail-admin list | awk '{ print $4 }' | tail -n +3); do ezjail-admin delete $j; done
$ zfs destroy -r zroot/jails
$ pkg delete ezjail

Seul regret avec iocage, c'est sa lenteur due à python. Ezjail n'étant qu'un gros script sh, le temps d'exécution est incomparable…


Commentaires