Il y a deux choses : mettre à jour l'hôte et donc les binaires LXC et mettre à jour le contenu des conteneurs.
Si tu mets à jour ton hôte sans mettre à jour tes conteneurs, il y a quand même une étape à faire : l'autostart ne fonctionne plus avec le mécanisme de liens symboliques dans /etc/lxc/auto pointant vers les confs dans /var/lib/lxc/<nom_lxc>/config mais avec une option « lxc.start.auto = 1 » dans le config de chaque LXC qui doit être démarré au boot de l'hôte. Il faut donc l'ajouter dans chaque conteneur puis « rm -rf /etc/lxc/auto ».
Si tu mets à jour les conteneurs sans mettre à jour l'hôte (qui reste donc à Wheezy), t'es obligé de virer systemd du conteneur car soit t'as aucun message d'erreur, soit « Failed to mount tmpfs at /dev/shm: No such file or directory » au lancement du conteneur. Voir
http://shaarli.guiguishow.info/?NGJVow . Toutes les méthodes pour contourner ce problème (voir
https://blog.iwakd.de/lxc-jessie-under-wheezy, par exemple), monter les cgroups utilisés par systemd hors du conteneur ou utiliser les options « lxc.autodev » et « lxc.kmsg » ne fonctionne pas avec la version de LXC packagée dans Wheezy.
Une autre piste est d'utiliser wheezy-backports dont la version actuelle (1.0.6-6) de LXC, qui inclus un fix de la version 1.0.7 upstream (voir /usr/share/doc/lxc/changelog.Debian.gz « Adding patch from lxc 1.0.7 to make lxc-debian work with systemd »), permet de lancer des conteneurs Jessie+systemd sans problèmes. Mais, pour ceux et celles qui le faisait avant de mettre à jour, il n'est plus possible de supprimer la capability sys_admin (voir plus bas) car le bout de conf nécessaire « lxc.cgroup.use = @all » n'est pas implémenté. Il y aura le problème du spawn des tty à résoudre, voir plus bas.
Si tu mets à jour les conteneurs à Jessie sur un hôte Jessie, il y a le mécanisme d'autostart qui change de base (voir plus haut) et si tu veux conserver systemd à l'intérieur des conteneurs, il y a plusieurs choses à changer (voir
https://wiki.debian.org/fr/LXC#Incompatibilit.2BAOk-s_avec_systemd que j'ai déjà shaarlié d'ailleurs) :
* options « lxc.autodev » et « lxc.kmsg »
* spawn des tty
* désactiver totalement les services udev et systemd-udevd
* bonus : désactiver la capability sys_admin
Pour les options « lxc.autodev » et « lxc.kmsg », c'est simple, elles sont déjà intégrées dans un template dans /usr/share/lxc/config/debian.common.conf. Il suffit d'inclure ce fichier dans la config de chaque conteneur Jessie : « lxc.include = /usr/share/lxc/config/debian.common.conf ». C'est aussi l'occassion de mettre un coup de peigne dans les fichiers de conf de tes conteneurs puisque beaucoup de choses (capabilities supprimées, mount de /proc et /sys, nombre de consoles, limites sur les cgroups,...) ont été factorisées dans ce fichier. Normalement, dans le fichier de conf de chaque conteneur, il doit rester uniquement rootfs, name, arch, points de montage spécifiques (lxc.mount et lxc.mount.entry), config réseau et flag de démarrage au boot de l'hôte. Notons que leur absence ne pas problème sur toutes les infras : j'ai eu le problème sur une infra et pas sur une autre. Les deux en lxc 1.0.6-6+deb8u1 au moment de la migration.
Pour un spawn correct des tty, j'ai déjà tout noté dans un autre shaarli :
http://shaarli.guiguishow.info/?qkFhrQ .
La désactivation des services udev et systemd-udevd ne semble pas nécessaire (j'ai des LXC de test qui tournent à merveille depuis plusieurs semaines malgrè la non-désactivation de ces services...), elle n'est pas faite par défaut lors de la création d'un nouveau conteneur mais si tu veux la faire quand même : sudo systemctl mask udev.service systemd-udevd.service
J'avais pour habitude de virer la capability sys_admin de mes conteneurs. L'ennui, c'est que systemd a besoin de monter des trucs, les cgroups, entre autres alors qu'il faut la capability sys_admin pour utiliser mount. Pour résoudre ce problème, il faut (voir
https://github.com/debops/ansible-lxc/issues/15) :
* Autoriser l'usage de toutes les classes de cgroups avec « lxc.cgroup.use = @all » dans /etc/lxc/lxc.conf (qui peut ne pas exister et qu'il faut donc créer) afin d'éviter l'erreur « Failed to mount cgroup at /sys/fs/cgroup/systemd: Operation not permitted »
* Virer la capability sys_admin en ajoutant « lxc.cap.drop = sys_admin » dans la conf' de chaque conteneur.
* Afin d'éviter l'erreur « Failed to mount tmpfs at /dev/shm: Operation not permitted », il faut monter les fs nécessaires au boot, en dehors du conteneur en mettant tout ce qui suit dans /var/lib/lxc/<nom_conteneur>/fstab (auquel on fait référence dans la conf de chaque conteneur avec « lxc.mount = /var/lib/lxc/<nom_conteneur>/fstab » qui est config auto dans les conteneurs fraîchement créés) :
« lxc.mount.entry = tmpfs dev/shm tmpfs rw,nosuid,nodev,create=dir 0 0
lxc.mount.entry = tmpfs run tmpfs rw,nosuid,nodev,mode=755,create=dir 0 0
lxc.mount.entry = tmpfs run/lock tmpfs rw,nosuid,nodev,noexec,relatime,size=5120k,create=dir 0 0
lxc.mount.entry = debugfs sys/kernel/debug debugfs rw,relatime 0 0
lxc.mount.entry = mqueue dev/mqueue mqueue rw,relatime,create=dir 0 0
lxc.mount.entry = hugetlbfs dev/hugepages hugetlbfs rw,relatime,create=dir 0 0 »
Comme les items 2 et 3 doivent être ajoutés à la conf' de chaque LXC et que la répétition de bouts de conf', c'est mal, on préférera faire un template dans /etc/lxc/drop_sys_admin_cap.conf par exemple et l'inclure dans chaque config de LXC. Son contenu est bêtement la somme des deux derniers tirets.
Et si tu veux monter un tmpfs ou autre uniquement pour un conteneur, t'auras compris que sa place est dans /var/lib/lxc/<nom_conteneur>/fstab. Pour la syntaxe, voici un exemple de ligne : « tmpfs media/test tmpfs size=100M,rw 0 0 ». Le point de montage est relatif à la racine du conteneur donc il ne faut pas de « / » au début. Donc pas de /media/test, par exemple.
Si tu ajoutes une nouvelle ligne dans le /etc/fstab du conteneur, elle sera transformée en unit systemd et le prochain reboot se passera mal : mount échouera : « mount: permission denied » donc l'unit échouera : « media-test.mount mount process exited, code=exited status=32 Failed to mount /media/test. Unit media-test.mount entered failed state. » donc le boot se finira dans le shell de maintenance : « [FAILED] Failed to mount /media/test. See 'systemctl status media-test.mount' for details. [DEPEND] Dependency failed for Local File Systems [...] Give root password for maintenance ».
Notons qu'avec la version de LXC présente dans wheezy-backports et Jessie (v1.0.6-6), seul le spawn des tty et le drop de la cap sys_admin en bonus sont à étudier : le reste fonctionne out-of-box (même si les options ne sont pas définies...). Même pour des conteneurs créés sous wheezy et mis à jour depuis wheezy.
Synthèse :
* Si tu màj uniquement l'hôte, t'as uniquement le nouveau mécanisme d'autostart à prendre en compte ;
* Si tu màj uniquement les conteneurs :
* Les conteneurs ne booteront plus sauf à utiliser la version de LXC présente dans les backports ;
* Tu ne peux plus retirer la capability sys_admin si tu le faisais ;
* Tu devras régler le problème de spawn des tty ;
* Si tu màj hôte et conteneurs :
* Tu as le nouveau mécanisme d'autostart à prendre en compte ;
* Tu devras régler le problème de spawn des tty ;
* Il y a quelques manipulations supplémentaires à faire pour retirer la capabilitie sys_admin ;
* Il se peut que t'aies besoin de poser les paramètres « lxc.autodev » et « lxc.kmsg ».