Manière appropriée de manipuler des conteneurs LXC sur btrfs

11

Disons que nous avons un serveur avec lxc installé et un conteneur lxc utilisé comme img de base /var/lib/lxc/ubuntu_base. Pour plus de simplicité, oublions les changements de configuration après avoir copié l'img de base.

certaines personnes suggèrent d'utiliser des sous-volumes et des instantanés pour créer de nouveaux conteneurs, mais on pourrait facilement faire cp - reflink avec des résultats similaires.

Alors, quelle est la meilleure façon (ou la meilleure) de gérer plusieurs conteneurs?

  • instantanés

Cette méthode semble la meilleure, mais des commandes comme lxc-destroy ne fonctionneront pas car elles ne pourront pas supprimer le répertoire.

btrfs subvolume snapshot /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
  • cp avec reflink

Je ne sais pas s'il existe une différence de performances entre ce ou des instantanés

cp --reflink=always /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
  • ou Y a-t-il une autre meilleure façon de faire cela que je ne connais pas.

Éditer:

Une chose que j'ai vue avec l'option reflink, c'est que vous ne pouvez pas supprimer le conteneur de base si d'autres sont en cours d'exécution, car le /procet /devsont montés et n'ont jamais été modifiés, donc la référence est toujours la même. Mais la fermeture de tous les conteneurs recopiés semble aider.

zidarsk8
la source
J'ai utilisé la fonction d'instantané de btrfs pour créer de nouveaux conteneurs - et cela fonctionne bien (provisionnement assez rapide, etc.). Cependant, btrfs a un cache de pages par sous-volume - donc bien que l'utilisation d'instantanés soit rapide / efficace en espace disque, vous finirez probablement par avoir plusieurs copies de ce qui est effectivement le même binaire en mémoire.
David Goodwin

Réponses:

2

Je suis sur Ubuntu LTS 14 et je viens de lancer ce qui suit (pour la première fois même) et cela a fonctionné comme un charme:

lxc-stop -n ubuntu_base
lxc-clone -o ubuntu_base -n ubuntu_base_c1 -s
lxc-start -n ubuntu_base_c1 -d # make changes if needed
lxc-stop -n ubuntu_base_c1
lxc-snapshot -n ubuntu_base_c1

L'utilisation de -s avec lxc-clone prendra un instantané si le magasin de sauvegarde est btrfs (dans votre cas).

Vérifiez le nouveau clone / instantanés avec

lxc-ls -f
btrfs subvolume list /var/lib/lxc

J'espère que cela pourra aider!

dapithor
la source
1
Notez que ces jours-ci, vous devez spécifier btrfs comme magasin de sauvegarde lorsque vous exécutez lxc-create ou lxc-clone vous donnera un overlayfs à la place.
Lester Cheung
Pour créer simplement un nouveau conteneur "léger", il semble que les deux premières lignes suffisent (lxc-stop et lxc-clone), grâce à l' -soption, et que les trois dernières (lxc_start, lxc_stop, lxc_snapshot) ne sont qu'un processus d'aide pour gérer les futures évolutions des conteneurs. Est-ce correct ?
lalebarde
3

si vous utilisez des sous-volumes btrfs pour lxc, vous devez ajouter l'option user_subvol_rm_alloweddans votre /etc/fstab. Exemple extrait d'un fichier fstab:

UUID=XXXXXXXXXXXXXXXXXXXXXX / btrfs subvol=@,user_subvol_rm_allowed,defaults 0 0

l'option vous permettra de supprimer subvol sans être root, uniquement utilisateur normal. Cette capacité est utilisée par lxc lorsque les snapshots vont dans les sous-volumes btrfs

Yonsy Solis
la source
3

Je suppose que cela dépend de la taille de votre image de base. Je créerais probablement un nouveau conteneur lxc et utiliserais Salt / Puppet etc. pour provisionner mes conteneurs et seulement lxc-clone pour des conteneurs relativement plus gros (par exemple des conteneurs de développement avec beaucoup d'outils installés et configurés).

Notez que lxc-clone utilisera le même magasin de sauvegarde que la source. Donc, pour utiliser le sous-volume, vous devrez créer vos conteneurs avec "-B btrfs". Par exemple:

lxc-create -B btrfs -n mycontainer -t ubuntu

Ensuite, clonez-le avec:

lxc-clone -s mycontainer mynewcontainer

Dans le cas où vous utilisez zfs pour stocker vos conteneurs, il existe une --zfsrootoption supplémentaire pour lxc-create afin que vous puissiez choisir un zpool autre que le "tank" par défaut. Par exemple:

lxc-create -B zfs --zfsroot=data/lxc

Partagez et profitez!

Lester Cheung
la source
Je suis sur Debian Wheezy avec BTRFS. Il semble que l'option -B btrfssoit utilisée par défaut - je suppose que mon debian est configuré avec BTRFS. En fait, j'ai créé mon premier conteneur (un debian wheezy 32 bits) sans cette option, et un sous-volume a été créé pour cela.
lalebarde
@lalebarde qui est probablement -B besten action mais bon à savoir!
Lester Cheung