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