Installation de Calculate en LXC
Updated 7 Novembre 2026

cl-lxc est un utilitaire en ligne de commande pour créer, configurer et mettre à jour des conteneurs LXC avec Calculate Linux. Cette page s'adresse à ceux qui déploient et maintiennent de tels conteneurs sur un hôte exécutant Calculate Linux : le conteneur est préparé une fois, puis mis à jour avec des images préparées - exactement comme le fait Calculate Linux sur l'hôte lui-même.
Cette page s'applique à cl-lxc 0.1.5.
Objectif de l'utilitaire
Par rapport à la création manuelle d'un conteneur, cl-lxc offre plusieurs fonctionnalités :
- le conteneur est mis à jour avec des images préparées : d'abord la nouvelle image rootfs est préparée (--prepare), puis le conteneur bascule dessus (--upgrade) - exactement comme la mise à jour de Calculate Linux installé sur l'hôte ; le basculement lui-même ne prend que quelques secondes ;
- le /var/calculate du conteneur est externalisé vers un répertoire séparé situé à côté du conteneur, puis monté dans celui-ci (montage bind) - le même schéma que le partitionnement par défaut de Calculate Linux lui-même, où /var/calculate occupe une partition séparée : elle est plus grande et reste intacte lors de la réinstallation de la distribution. Les données du conteneur survivent donc au basculement d'image ;
- le conteneur est créé accompagné de modèles Calculate qui reprennent les paramètres du miroir binaire et du service réseau ;
- l'image de base est téléchargée une seule fois depuis le miroir et mise en cache - chaque nouveau conteneur n'accède pas au réseau ;
- les arbres Portage, les paquets binaires et les distfiles sont montés depuis l'hôte (bind), si bien qu'un conteneur neuf occupe environ 1.5 GB au lieu d'une copie complète du système ; pour référence, un arbre Portage partagé occupe environ 600 MB - c'est exactement ce qui n'est pas dupliqué dans chaque conteneur, tandis que le cache des paquets et des distfiles atteint plusieurs gigaoctets avec le temps ;
- sur btrfs, le cache et les conteneurs sont créés comme des sous-volumes, et la copie du rootfs utilise reflink.
L'utilitaire est issu de calculate-toolkit, où il est apparu en 2022 ; il a ensuite été séparé en un paquet distinct.
Installation
Installez le paquet app-containers/cl-lxc :
emerge -a cl-lxc
L'utilitaire fonctionne avec app-containers/lxc, qui est installé automatiquement en tant que dépendance. Toutes les commandes de cette page s'exécutent en tant que root.
Prérequis pour l'hôte
cl-lxc conserve les conteneurs dans le répertoire défini par l'option globale de LXC lxc.lxcpath, qui doit pointer vers /var/calculate/lxc. Dans Calculate Linux, cette valeur est déjà définie pour vous : lors de l'installation de app-containers/lxc, le fichier /etc/lxc/lxc.conf est fusionné par un modèle de la distribution.
Les arbres Portage, les paquets binaires et les distfiles sont montés dans le conteneur depuis l'hôte - sur Calculate Linux, ils y sont par défaut et vous n'avez pas besoin de les créer : ce sont les dépôts dans /var/db/repos, les paquets binaires dans /var/cache/edb/binhost et les archives des paquets dans /var/calculate/packages et /var/calculate/distfiles. Les arbres Portage et /var/cache/edb/binhost sont montés en lecture seule - le conteneur ne peut pas les modifier. L'écriture est autorisée dans packages et distfiles, mais une falsification n'y présente pas de risque : les arbres Portage enregistrent les sommes de contrôle des paquets source, et les paquets binaires ont les leurs dans l'index de /var/cache/edb/binhost.
Un pont réseau sur l'hôte n'est pas requis. S'il n'y a pas de pont, le conteneur reste dans l'espace de noms réseau de l'hôte et utilise ses adresses. Si /sys/class/net contient une interface correspondant à br*, le conteneur reçoit une interface virtuelle veth avec une adresse MAC aléatoire à administration locale, rattachée à ce pont.
Syntaxe et options
Utilisation : cl-lxc [OPTIONS?] <container_name>. Le nom du conteneur est le seul argument positionnel ; il se place à la fin de la ligne. Le nom doit commencer par une lettre et peut contenir des lettres latines, des chiffres, des tirets bas, des traits d'union et des points ; le nom scratch est réservé par l'image de base.
| Option | Argument | Action |
|---|---|---|
| -P, --profile | requis | Profil du conteneur ; la valeur spéciale list affiche la liste des profils |
| --url | requis | URL du dépôt git des profils |
| -c, --create | — | Créer un nouveau conteneur |
| --path | requis | Stocker le conteneur au chemin indiqué (un lien subsiste dans /var/calculate/lxc) |
| -p, --prepare | — | Préparer une image rootfs en vue de la mise à jour |
| -u, --upgrade | — | Mettre à jour le conteneur à partir de l'image préparée |
| --diff | — | Afficher les différences de paquets entre versions |
| -R, --clear_cache | — | Supprimer les images en cache |
| -m, --mirror | requis | Miroir de Calculate Linux, par défaut mirror.calculate-linux.org |
| -h, --help | — | Aide complète sur les options |
Toutes les options n'ont pas de forme courte : --url, --path et --diff ne sont disponibles qu'en forme longue.
Création d'un conteneur
Créez un conteneur :
* Downloading Calculate Linux ... [ ok ] Creating container test * Copying base rootfs ... [ ok ] * Preparing base mount paths ... [ ok ] * Moving /var/calculate to a separate mount point ... [ ok ] * Running container setup ... [ ok ] * Configuring utility variables ... [ ok ] * Preparing first boot setup script ... [ ok ] * Creating templates ... [ ok ] Your container is ready. To start it, please run 'lxc-start test'.
La ligne "Downloading Calculate Linux" n'apparaît que lors de la première création - l'image de base téléchargée reste dans le cache, et les conteneurs suivants sont construits à partir d'elle. Si un conteneur du même nom existe déjà, l'utilitaire refuse de le créer.
Après la création, les éléments suivants apparaissent sur le disque :
- /var/calculate/lxc/test/config - la configuration LXC du conteneur ;
- /var/calculate/lxc/test/rootfs/ - le système de fichiers racine ;
- /var/calculate/lxc/test/calculate/ - le répertoire monté dans le conteneur en tant que /var/calculate (comme dans le partitionnement par défaut des systèmes complets) : variables de mise à jour, modèles et données du conteneur ;
- /var/calculate/lxc/.cache/scratch/ - le cache de l'image de base.
Une fois généré, le fichier de configuration du conteneur ressemble à ceci :
#------------------------------------------------------------------------------ # Modified cl-lxc-0.1.5 # For additional config options, please look at lxc.container.conf(5) #------------------------------------------------------------------------------ #------------------------------------------------------------------------------ # Distribution configuration #------------------------------------------------------------------------------ lxc.include = /usr/share/lxc/config/common.conf lxc.arch = x86_64 #------------------------------------------------------------------------------ # Network configuration #------------------------------------------------------------------------------ lxc.net.0.type = none #------------------------------------------------------------------------------ # Security configuration #------------------------------------------------------------------------------ #lxc.cap.drop = #------------------------------------------------------------------------------ # Lifecycle and shutdown behavior #------------------------------------------------------------------------------ # Use SIGPWR for halt signal to stop container instantly with openrc-init lxc.signal.halt = SIGPWR #------------------------------------------------------------------------------ # Filesystem / rootfs #------------------------------------------------------------------------------ lxc.rootfs.path = dir:/var/calculate/lxc/test/rootfs lxc.uts.name = test # Mount /dev/shm as tmpfs lxc.mount.entry = none dev/shm tmpfs rw,nosuid,nodev,create=dir # Bind mount points lxc.mount.entry = /var/calculate/lxc/test/calculate var/calculate none rw,bind 0 0 lxc.mount.entry = /var/calculate/repos/container var/db/repos/container none ro,bind 0 0 lxc.mount.entry = /var/db/repos/calculate var/db/repos/calculate none ro,bind 0 0 lxc.mount.entry = /var/db/repos/gentoo var/db/repos/gentoo none ro,bind 0 0 lxc.mount.entry = /var/cache/edb/binhost var/cache/edb/binhost none ro,bind 0 0 lxc.mount.entry = /var/calculate/packages var/calculate/packages none rw,bind 0 0 lxc.mount.entry = /var/calculate/distfiles var/calculate/distfiles none rw,bind 0 0
Dans ce fichier, le nom du conteneur apparaît dans les chemins du rootfs et dans le nom du système ; les lignes lxc.mount.entry font monter dans le conteneur les arbres Portage de l'hôte (en lecture seule), les répertoires des paquets et des distfiles (en écriture) et le /var/calculate séparé. Le conteneur hérite des domaines et des adresses DNS de l'hôte.
Avant le premier démarrage, le conteneur reçoit un script /etc/local.d/firststart.start, qui, au démarrage, se supprime lui-même ainsi que le fichier temporaire /etc/calculate/calculate.env - de cette façon, la configuration initiale n'est pas répétée aux démarrages suivants.
Lancez le conteneur et connectez-vous immédiatement à celui-ci pour voir comment les services ont démarré :
Runlevel: default net.eth0 [ stopped ] local [ started ] Dynamic Runlevel: hotplugged Dynamic Runlevel: needed/wanted Dynamic Runlevel: manual
lxc-info donne un résumé de l'état du conteneur - vous pouvez indiquer le nom sans aucune option :
Name: test State: RUNNING PID: 745677 IP: 10.2.8.18
L'IP dans la sortie est égale à l'adresse de l'hôte : il n'y a pas de pont sur l'hôte, et le conteneur utilise son espace de noms réseau. Pour obtenir un shell dans le conteneur, exécutez attach sans commande :
lxc-attach test
Votre propre jeu de paquets et préparation de l'image
Le système dans le conteneur se maintient comme un Calculate ordinaire : les jeux de paquets et les masques Portage se configurent dans le conteneur. Par exemple, ajoutez vim au jeu custom :
lxc-attach test -- sh -c 'echo app-editors/vim >> /etc/portage/sets/custom; cat /etc/portage/sets/custom'
lxc-attach test -- emerge -q app-editors/vim
Le paquet a été installé à partir des paquets binaires de l'hôte. Une fois la configuration du conteneur ajustée à la composition de paquets dont vous avez besoin, préparez l[HTML_REMOVED]image rootfs en vue des futures mises à jour (la sortie ci-dessous est abrégée : la progression du téléchargement et la liste des paquets sont omises) :
Creating container test_new * Copying base rootfs ... [ ok ] * Preparing base mount paths ... [ ok ] * Running container setup ... [ ok ] * Configuring utility variables ... [ ok ] * Preparing first boot setup script ... [ ok ] * Moving installed packages, flags and masks from main container ... [ ok ] * Creating mount points ... [ ok ] * Preparing first boot setup script ... [ ok ] * Starting container ... [ ok ] Synchronisation des dépôts * Vérification du dépôt actuel ... [ ok ] * Vérification des mises à jour de Distros ... [ ok ] * Vérification des mises à jour de Calculate ... [ ok ] * Vérification des mises à jour de Gentoo ... [ ok ] * Synchronisation terminée Configuration système * Correction des paramètres ... [ ok ] * Mise à jour des fichiers de configuration ... [ ok ] * System sync finished! Launching package update Mise à jour des paquets * Liste des paquets à installer * 6 packages will be installed, 0 KiB will be downloaded * Fetching... ... [ ok ] * (1 sur 6) Manages the /usr/bin/vi symlink * Compilation de app-eselect/eselect-vi-20221122 ... [ ok ] * Installation de app-eselect/eselect-vi-20221122 ... [ ok ] * (2 sur 6) Portable fork of NaCl, a higher-level cryptographic library * Compilation de dev-libs/libsodium-1.0.22 ... [ ok ] * Installation de dev-libs/libsodium-1.0.22 ... [ ok ] * (3 sur 6) Standalone version of Vim's xxd * Compilation de dev-util/xxd-2025.08.24-r1 ... [ ok ] * Installation de dev-util/xxd-2025.08.24-r1 ... [ ok ] * (4 sur 6) Vim and gvim shared files * Compilation de app-editors/vim-core-9.2.1202 ... [ ok ] * Installation de app-editors/vim-core-9.2.1202 ... [ ok ] * (5 sur 6) Vim, an improved vi-style text editor * Compilation de app-editors/vim-9.2.1202 ... [ ok ] * Installation de app-editors/vim-9.2.1202 ... [ ok ] * (6 sur 6) Vim plugin: Gentoo and Portage syntax highlighting * Compilation de app-vim/gentoo-syntax-16 ... [ ok ] * Installation de app-vim/gentoo-syntax-16 ... [ ok ] Suppression des paquets devenus inutiles * Calcul des dépendances ... [ ok ] Recompilation des modules dépendants * Mise à jour des bibliothèques réservées ... [ ok ] * Mise à jour des fichiers de configuration ... [ ok ] * Votre système a bien été mis à jour ! * Stopping container ... [ ok ] * Saving image for update ... [ ok ] * Removing temporary container directory test_new ... [ ok ] * Image for update ready. Now you can run 'cl-lxc -u test' to update.
La préparation transfère dans l'image les réglages Portage de l'utilisateur - les fichiers custom des répertoires /etc/portage/package.accept_keywords/, package.mask/, package.unmask/ et package.use/, le jeu /etc/portage/sets/custom et /etc/portage/repos.conf/custom.conf - elle définit le nom d'hôte et les paramètres du système, met à jour le système dans le conteneur, puis enregistre l'image terminée dans le cache à côté du conteneur. Pour votre conteneur, l'image sera stockée dans /var/calculate/lxc/.cache/rootfs-name - dans l'exemple ci-dessus, il s'agit de rootfs-test ; chaque nouvelle préparation remplace l'image précédente. Le conteneur temporaire dans lequel l'image a été construite est supprimé après la préparation.
Mise à jour du conteneur
La mise à jour bascule le conteneur sur l'image préparée :
Preparing to start new root * Moving image to test/rootfs2 ... [ ok ] * Copying network settings from main container ... [ ok ] * Copying hash of root password ... [ ok ] * Copying ssh keys ... [ ok ] * Copying nftables rules ... [ ok ] * Preparing first boot setup script ... [ ok ] * Setting up new root ... [ ok ] * Stopping container test [ ok ] * Launching container test [ ok ] Container updated.
Sans image préparée, la mise à jour ne démarre pas : lancez d'abord la préparation (--prepare), puis seulement --upgrade ; ces deux opérations peuvent être combinées en une seule exécution.
Pendant la mise à jour, les paramètres réseau issus de /etc/conf.d/net, le hachage du mot de passe root, les clés ssh de l'hôte et les règles nftables sont transférés dans le nouveau rootfs. Le nouveau système de fichiers racine reçoit un numéro de séquence : rootfs1, rootfs2, et la configuration du conteneur est réécrite pour le référencer ; l'ancienne racine n'est pas supprimée et continue d'occuper de l'espace - nettoyez-la manuellement dès que vous êtes certain qu'aucun retour en arrière ne sera nécessaire.
Le premier démarrage du nouveau système effectue l'installation : les modèles sont fusionnés et le réseau est configuré ; après cela, le script de démarrage se supprime lui-même. Si le conteneur était en cours d'exécution, il est redémarré automatiquement sur le nouveau rootfs ; s'il était arrêté, il reste arrêté et est démarré avec la commande lxc-start.
Profils de conteneur
Dans Calculate Linux, un profil est un ensemble de modèles et de valeurs préconfigurées des variables calculate.env et ini.env ; il fait installer les paquets dont il a besoin par une mise à jour du système. Les profils sont décrits dans le fichier profiles/profiles.desc du dépôt des profils de conteneur ; par défaut, https://github.com/calculatelinux/container est utilisé, et un autre dépôt se définit avec l'option --url. L'utilitaire affiche toujours lui-même la liste des profils disponibles - l'ensemble évolue avec le temps, fiez-vous donc à sa sortie :
cl-lxc -P list
Profile: * scratch/amd64/20 (stable) * steam/amd64/20 (exp)
Le profil est appliqué lors de la création du conteneur : -P avec un nom de profil pris dans la liste est passé en même temps que -c. Le conteneur est démarré, le profil est basculé dans celui-ci et les paquets du profil sont installés via cl-update ; si les modèles du profil ont ajouté des lignes à la configuration LXC, le conteneur est redémarré pour les appliquer. Vous pouvez changer le profil d'un conteneur déjà créé lors de la préparation de l'image : -P combiné à --prepare applique le nouveau profil si celui présent dans le rootfs diffère.
Sans -P explicite, le premier profil de la liste est sélectionné. Le répertoire où chercher est nommé d'après le dernier élément de l'URL du dépôt, fournie par --url ou utilisée par défaut. L'utilitaire cherche le fichier des profils à trois endroits successifs : /var/db/repos/[HTML_REMOVED], puis /var/calculate/repos/[HTML_REMOVED]; s'il ne le trouve à aucun de ces endroits, il clone le dépôt dans /var/calculate/tmp/update/[HTML_REMOVED] et, lors des exécutions suivantes, se contente de le mettre à jour. L'ordre est le même avec ou sans --url : un dépôt de ce nom déjà synchronisé sur l'hôte prime, et le clonage n'a jamais lieu.
Suppression de cache et remarques générales
Les images en cache (le scratch de base et le rootfs préparé) occupent de l'espace et doivent parfois être réinitialisées. Utilisez l'option -R pour la suppression, en combinaison avec une autre opération - par exemple avec la création d'un nouveau conteneur. Les options et l'état des conteneurs sont d'abord vérifiés, et les caches ne sont supprimés qu'ensuite ; après la suppression, l'image de base est à nouveau téléchargée lors de la création suivante.
Un seul cl-lxc peut s'exécuter à la fois.
Modèles de conteneur
À la création du conteneur, deux modèles Calculate et un fichier décrivant les propriétés du répertoire sont déposés dans son futur /var/calculate - ils sont fusionnés dans le système au premier démarrage.
Le répertoire d'en-tête des modèles /var/calculate/lxc/test/calculate/templates/default/.calculate_directory :
/var/calculate/lxc/test/calculate/templates/default/.calculate_directory
# Calculate env=install ac_install_live==on append=skip
Les enregistrements du répertoire sont appliqués au stade de l'installation du système (env=install) et uniquement quand le système démarre en mode live (ac_install_live==on) ; append=skip ne contribue pas au chemin de fusion.
Le modèle du miroir binaire portage.binhost. Il n'a pas d'adresse fixe : lors de la préparation du conteneur, la ligne PORTAGE_BINHOST est reprise du système hôte - l'utilitaire la copie depuis la sortie de emerge --info afin que le conteneur se mette à jour depuis le même miroir binaire que l'hôte. Par exemple, lorsque l'hôte utilise le miroir https://mirror.koddos.net/calculate-linux (les Pays-Bas sur la liste officielle des miroirs), le modèle ressemble à ceci :
/var/calculate/lxc/test/calculate/templates/default/portage.binhost
# Calculate mergepkg(sys-apps/portage)!= path=/etc/portage/make.conf name=binhost protected comment=# PORTAGE_BINHOST="https://mirror.koddos.net/calculate-linux/grp/x86_64"
La ligne PORTAGE_BINHOST est écrite dans le fichier /etc/portage/make.conf du conteneur ; la condition mergepkg(sys-apps/portage)!= désigne le paquet auquel le modèle est associé, sys-apps/portage (elle se déclenche lorsque ce paquet est en cours de configuration), tandis que protected empêche la suppression du fichier avec ce paquet.
Le modèle du service réseau runlevel.eth0 :
/var/calculate/lxc/test/calculate/templates/default/runlevel.eth0
# Calculate mergepkg(sys-apps/openrc)!= path=/etc/runlevels/default name=net.eth0 protected link=/etc/init.d/net.lo symbolic
Le modèle crée un lien symbolique net.eth0 dans le niveau d'exécution par défaut du conteneur, pointant vers le script de démarrage réseau /etc/init.d/net.lo, pour que l'interface soit activée au démarrage.
Pour plus d'informations sur le mécanisme de fusion des modèles, voir l'article Templates.
Fonctionnalités de btrfs
Si le répertoire des conteneurs est sur btrfs, cl-lxc met à profit les capacités du système de fichiers : le cache et chaque conteneur sont créés sous forme de sous-volumes distincts, et la copie du rootfs (depuis l'image de base et lors de la mise à jour) se fait avec reflink - la nouvelle copie partage les blocs de l'original tant qu'elle ne commence pas à les modifier. Le sous-volume est créé non pour un rootfs unique mais pour tout le répertoire du conteneur : il contient les systèmes de fichiers racine rootfs, rootfs1, …, le fichier de configuration et le répertoire calculate monté dans le conteneur en tant que /var/calculate. Un instantané d'un seul sous-volume capture donc tout le conteneur - cela facilite les sauvegardes. La suppression du cache et des conteneurs temporaires sur btrfs se fait également avec les outils standards des sous-volumes.