OpenSVC : piloter des conteneurs LXC sur datasets ZFS avec snapshots et réplication sous Debian/Ubuntu

20 juillet 2026 — par admin_libra

Piloter des conteneurs LXC manuellement via des scripts lxc-start est souple mais fragile : l’ordre de démarrage, les dépendances inter-services, la supervision et la réplication restent entièrement à la charge de l’administrateur. OpenSVC est un orchestrateur de services léger et open source conçu précisément pour ce cas d’usage : décrire un service comme un ensemble de ressources ordonnées — datasets ZFS, systèmes de fichiers, conteneur, synchronisation — et le piloter de façon déclarative.

Couplé à ZFS, OpenSVC exploite nativement zfs snapshot, zfs send et zfs recv pour garantir des snapshots journaliers et la réplication vers un nœud distant. Le résultat : un conteneur LXC dont le cycle de vie complet — démarrage, arrêt, snapshot, synchronisation, failover — est géré par un seul outil, sans crontab à maintenir ni script de réplication fragile.

Ce guide part d’un serveur Debian 12 (Bookworm) ou Ubuntu 24.04 LTS avec OpenZFS et LXC déjà opérationnels, et couvre l’installation d’OpenSVC 2.1, la préparation du dataset ZFS, la définition complète du service, la planification des snapshots quotidiens et la mise en place de la réplication zfs send/recv vers un nœud DR.

Prérequis système

ZFS et LXC opérationnels

Avant d’installer OpenSVC, vérifiez que les briques de base sont en place :

# Vérifier que ZFS est chargé et qu'un pool existe
zpool status

# Vérifier que lxc-create est disponible
lxc-create --version

# Installer les dépendances si nécessaire
apt install -y zfsutils-linux lxc lxc-templates

Pour la réplication zfs send/recv, un second serveur avec accès SSH depuis root sans mot de passe est requis. Configurez l’échange de clés si nécessaire :

# Depuis node1 : copier la clé publique root vers node2
ssh-copy-id [email protected]

# Tester la connexion sans mot de passe
ssh [email protected] "hostname"

Installation d’OpenSVC 2.1

Téléchargement et installation du paquet

OpenSVC fournit un paquet .deb directement depuis son dépôt officiel. L’installation se fait via dpkg, sans dépôt APT à configurer :

# Télécharger le paquet OpenSVC 2.1 (à répéter sur chaque nœud)
curl -o /tmp/opensvc.latest https://repo.opensvc.com/deb/2.1/current

# Installer le paquet
dpkg -i /tmp/opensvc.latest

# Vérifier la version installée
om node version

Le script de post-installation génère automatiquement une clé RSA 2048 bits pour l’authentification inter-nœuds, crée les répertoires de configuration sous /etc/opensvc/ et active le service systemd.

Démarrage du daemon

# Activer et démarrer le daemon OpenSVC
systemctl enable --now opensvc.service

# Vérifier l'état du daemon
om daemon status

# Afficher le tableau de bord interactif
om mon

La commande om mon affiche en temps réel l’état des nœuds et des services — c’est votre outil de supervision principal au quotidien.

Configuration du cluster deux nœuds (optionnel pour la réplication)

Si vous disposez de deux nœuds pour la réplication, initialisez le cluster :

# Sur node1 : configurer le heartbeat et récupérer le secret
om cluster set --kw hb#1.type=unicast
om cluster get --kw cluster.secret

# Sur node2 : rejoindre le cluster (remplacer SECRET et NODE1)
om daemon join --secret SECRET --node node1.example.com

# Sur node1 : vérifier que les deux nœuds sont visibles
om node ls

Préparation du dataset ZFS

Création du dataset dédié au conteneur

On suppose un pool ZFS existant nommé tank. On crée un dataset hiérarchique pour isoler les données de chaque conteneur :

# Dataset racine pour tous les conteneurs OpenSVC
zfs create tank/lxc

# Dataset spécifique au conteneur "webprod"
zfs create tank/lxc/webprod

# Définir explicitement le point de montage
zfs set mountpoint=/srv/lxc/webprod tank/lxc/webprod

# Activer la compression LZ4 (recommandé avec LXC)
zfs set compression=lz4 tank/lxc/webprod

# Vérifier
zfs list -o name,mountpoint,used,available,compression tank/lxc/webprod

Création du conteneur LXC sur le dataset

On crée le conteneur LXC directement dans le dataset ZFS (voir notre guide LXC pour les détails de configuration réseau) :

# Créer le conteneur LXC dans le répertoire du dataset ZFS
lxc-create -n webprod -t debian -- -r bookworm -a amd64 
    --rootfs /srv/lxc/webprod/rootfs

# Adapter la configuration LXC pour pointer vers le dataset
cat >> /var/lib/lxc/webprod/config << 'EOF'
lxc.rootfs.path = dir:/srv/lxc/webprod/rootfs
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.ipv4.address = 10.0.3.100/24
lxc.net.0.ipv4.gateway = 10.0.3.1
EOF

# Tester le démarrage manuel une fois
lxc-start -n webprod && lxc-info -n webprod

# Arrêter : OpenSVC prendra la main ensuite
lxc-stop -n webprod

Définition du service OpenSVC

Création et édition du service

Un service OpenSVC est un fichier INI placé sous /etc/opensvc/. Chaque section est une ressource typée. OpenSVC respecte un ordre de démarrage implicite : diskfscontainersync.

# Créer un service vide nommé "webprod"
om webprod create --kw nodes=$(hostname)

# Ouvrir la configuration dans l'éditeur
om webprod edit config

Voici le fichier de configuration complet à saisir — copiez et adaptez les noms de nœuds et de datasets :

# /etc/opensvc/webprod.conf

[DEFAULT]
# Démarrage automatique du service sur le nœud actif
orchestrate = start
nodes = node1.example.com
drpnodes = node2.example.com

[fs#1]
# Dataset ZFS monté avant le démarrage du conteneur
type = zfs
dev = tank/lxc/webprod
mnt = /srv/lxc/webprod
mnt_opt = defaults
# Rester monté sur le nœud standby pour faciliter le failover
standby = true

[container#1]
# Pilotage du conteneur LXC par OpenSVC
type = lxc
name = webprod
cf = /var/lib/lxc/webprod/config
start_timeout = 60
stop_timeout = 30

[sync#1]
# Snapshots ZFS journaliers du dataset conteneur
type = zfssnap
dataset = tank/lxc/webprod
recursive = true
# Conserver 7 snapshots (rétention 1 semaine)
snap_count = 7
# Plage horaire : entre 01h00 et 02h00, une fois par heure max
schedule = 01:00-01:59@60

[sync#2]
# Réplication vers le nœud DR via zfs send/recv
type = zfs
src = tank/lxc/webprod
dst = tank/lxc/webprod
target = drpnodes
recursive = true
# Planifier après les snapshots locaux
schedule = 02:00-03:00@61

Note : orchestrate = start démarre le service automatiquement sur le nœud actif. Pour un basculement automatique haute disponibilité, utilisez orchestrate = ha en combinant plusieurs entrées dans nodes — OpenSVC décidera seul du nœud maître.

Rôle de chaque ressource

  • fs#1 (type zfs) : OpenSVC monte et démonte le dataset automatiquement lors des transitions start/stop. standby = true maintient le dataset monté sur le nœud secondaire pour raccourcir le temps de failover.
  • container#1 (type lxc) : OpenSVC appelle lxc-start/lxc-stop et surveille l’état du conteneur via lxc-info. Si le processus meurt, OpenSVC peut le redémarrer selon la politique configurée.
  • sync#1 (type zfssnap) : Crée des snapshots ZFS locaux nommés @opensvc.webprod.sync#1.YYYY-MM-DD.HHMM. Le paramètre snap_count = 7 supprime automatiquement les snapshots excédentaires.
  • sync#2 (type zfs) : Utilise zfs send -I et zfs recv via SSH pour transférer les deltas incrémentaux vers le nœud DR. Un snapshot @sent sert de référence pour les transferts suivants.

Démarrage et gestion du service

Premières opérations

# Afficher l'état détaillé de toutes les ressources
om webprod print status

# Démarrer le service sur le nœud local
om webprod start --local

# Vérifier que le conteneur est bien démarré
lxc-info -n webprod

# Déclencher une synchronisation manuelle de l'ensemble des syncs
om webprod sync all

# Arrêter proprement le service (conteneur puis démontage ZFS)
om webprod stop --local

Synchronisation initiale vers le nœud DR

Avant la première synchronisation incrémentale, OpenSVC doit envoyer un snapshot complet vers le nœud DR :

# Synchronisation initiale complète vers le nœud DR
om webprod sync nodes

# Vérifier les snapshots créés côté source
zfs list -t snapshot -o name,creation tank/lxc/webprod

# Vérifier la réception côté DR
ssh node2.example.com "zfs list -t snapshot tank/lxc/webprod"

OpenSVC crée automatiquement un snapshot @sent sur la source et la destination pour marquer l’état de synchronisation. Les exécutions planifiées suivantes n’envoient que les deltas entre @sent et le dernier snapshot — ce qui minimise la bande passante réseau.

Surveillance au quotidien

# Tableau de bord interactif (rafraîchissement automatique)
om mon

# Logs du service (toutes les ressources)
om webprod logs

# Prochain passage du scheduler pour chaque ressource sync
om webprod print schedule

# Vérifier la configuration actuelle
om webprod print config

Planification fine des snapshots et de la réplication

La directive schedule d’OpenSVC accepte la syntaxe HH:MM-HH:MM@durée où la durée est en minutes. Exemples courants :

# Snapshot quotidien strictement à 01h00
om webprod set --kw sync#1.schedule="01:00-01:30@30"

# Réplication deux fois par jour (02h et 14h)
om webprod set --kw sync#2.schedule="02:00-02:30@30 14:00-14:30@30"

# Désactiver temporairement la réplication sans supprimer la ressource
om webprod set --kw sync#2.disable=true

# Forcer une synchronisation immédiate hors planning
om webprod sync nodes

Le daemon OpenSVC gère entièrement le scheduler interne — aucune entrée crontab n’est nécessaire. Les exécutions sont tracées dans les logs du service et visibles via om webprod print schedule.

À lire également

Références

Index complet

Tous les articles (58)

Date Article Tags
20/07/2026 SSL : Certificat Let's Encrypt avec Certbot sur Debian/Ubuntu (sans Snap) apache certbot certificat 20/07/2026 MariaDB : Tuning mariadb server sous debian / ubuntu et operation de maintenance sauvegarde/restauration debian innodb maintenance 20/07/2026 MariaDB : Mise en place d'une réplication Master → Slave base-de-données binlog debian 20/07/2026 OpenSVC : piloter des conteneurs LXC sur datasets ZFS avec snapshots et réplication sous Debian/Ubuntu conteneurs debian haute-disponibilité 20/07/2026 SCREEN : utilisation et cas d'usage des screens sous Linux administration bash debian 20/07/2026 EtherPAD : installation et configuration d'Etherpad collaboration debian editeur-collaboratif 20/07/2026 Wazuh 4.14 : déployer un SIEM/XDR open source sur Debian/Ubuntu compliance debian fim 20/07/2026 Incus 7.x : gérer conteneurs système et VMs sur Debian/Ubuntu — le successeur communautaire de LXD conteneurs debian incus 20/07/2026 Restic : sauvegardes incrémentielles chiffrées sur Debian et Ubuntu backup chiffrement debian 20/07/2026 Restic : sauvegardes chiffrées et dédupliquées sur Debian/Ubuntu automatisation backup chiffrement 30/06/2026 PHP : gérer plusieurs versions PHP-FPM avec les dépôts Sury sur Debian/Ubuntu administration apache debian 22/06/2026 OS : Cycle de vie LTS et mise à jour des distributions — apt dist-upgrade et do-release-upgrade sous Debian / Ubuntu apt cycle-de-vie debian 17/06/2026 APT : Guide complet de la gestion des paquets sous Debian et Ubuntu administration apt debian 17/06/2026 SHELL : Guide des commandes les plus usuelles et commandes couteau suisse awk bash commandes 17/06/2026 SUDO : implémentation et sécurisation des accès sur Debian/Ubuntu administration audit authentification 17/06/2026 ProFTPd : authentification MySQL centralisée, FTPs (SSL) et SFTP sur Debian/Ubuntu authentification debian ftp 09/06/2026 Fail2ban — configuration avancée et filtres personnalisés bruteforce debian fail2ban 07/06/2026 Docker : comment récupérer de l'espace disque cache conteneurs debian 07/06/2026 Graylog 7 — Centralisation et analyse de logs : l'alternative à ELK sur Debian/Ubuntu centralisation debian elk 07/06/2026 OpenZFS : tiering avec L2ARC et SLOG pour les workloads mixtes cache l2arc nvme 07/06/2026 Scripting Bash avancé — pièges, bonnes pratiques et optimisation automatisation bash bonnes-pratiques 07/06/2026 AppArmor sur Debian/Ubuntu : profils, modes et confinement applicatif apparmor audit confinement 07/06/2026 Durcissement SSH — au-delà des clés publiques 2fa authentification cryptographie 27/05/2026 LXD 6.x : orchestration de conteneurs Linux avec profils et clustering administration clustering conteneurs 27/05/2026 Keepalived — VIP flottante et load balancing sans matériel dédié debian failover haute-disponibilité 27/05/2026 Btrfs sur Linux — snapshots, sous-volumes et compression en pratique administration btrfs compression 21/05/2026 CVE-2026-42945 (NGINX Rift) : analyse et remédiation sur Debian/Ubuntu cve debian heap-overflow 21/05/2026 Tuning kernel Linux — paramètres sysctl essentiels pour la production debian kernel mémoire 21/05/2026 DRBD : réplication de blocs entre deux serveurs en temps réel cluster debian drbd 15/05/2026 CVE-2026-23918 — vulnérabilité Apache 2.4.66 : analyse et correctifs sur Debian/Ubuntu (hors Debian 11) apache cve debian 15/05/2026 CVE-2026-31431 (Copy Fail) — Analyse et remédiation sur Debian/Ubuntu algif_aead copy-fail cve 12/05/2026 Pacemaker et Corosync — cluster haute disponibilité Linux cluster corosync debian 12/05/2026 WireGuard : monter un VPN mesh entre plusieurs serveurs Linux chiffrement linux mesh 12/05/2026 Netdata — monitoring temps réel sans configuration complexe alertes dashboard linux 12/05/2026 nftables en pratique — remplacer iptables sur Debian/Ubuntu debian firewall iptables 12/05/2026 Podman : alternative rootless à Docker — installation et migration conteneurs docker kubernetes 02/05/2026 Prometheus et Grafana sur Debian — installation, configuration et dashboards pratiques alertmanager dashboard debian 02/05/2026 Ansible : automatiser la gestion de serveurs Linux avec des playbooks administration ansible automation 28/04/2026 ZFS sur Linux : snapshots, clones et RAID-Z en pratique administration compression filesystem 28/04/2026 eBPF sur Linux : observabilité et traçage kernel avec bpftrace et BCC bcc bpftrace diagnostic 23/04/2026 Analyse de la mémoire sur Linux — vmstat, free, smem diagnostic mémoire monitoring 23/04/2026 Sécurité Linux — Firewall iptables et nftables firewall iptables nftables 23/04/2026 ZFS sur Linux — Installation et gestion avancée administration filesystem stockage 23/04/2026 Gestion des services avec systemd sur Debian et Ubuntu administration debian services 23/04/2026 Gestion des ressources cgroups v1/v2 avec LXC cgroups conteneurs lxc 23/04/2026 Centralisation logs avec ELK Stack — Elasticsearch, Kibana, Filebeat elasticsearch elk filebeat 23/04/2026 Supervision avec Zabbix 7.0 LTS sur Debian/Ubuntu debian monitoring supervision 23/04/2026 Plusieurs versions PHP-FPM sur Apache Debian/Ubuntu apache debian php-fpm 23/04/2026 Sécurisation avancée PHP-FPM — Multi-VirtualHosts Apache/Nginx apache nginx php-fpm 23/04/2026 Optimisation PHP-FPM — Guide de tuning d'un pool optimisation performance php-fpm 29/07/2025 Docker sur Debian/Ubuntu : Installation, Configuration et Utilisation conteneurs debian docker 03/07/2025 Serveur VPN WireGuard sous linux réseau sécurité vpn 03/07/2025 Authentification par clé publique sur un serveur SSH authentification cryptographie sécurité 27/06/2025 Surveillance et diagnostic d’un serveur Linux avec vmstat, iotop et htop diagnostic htop monitoring 27/06/2025 Mémoire : Utilisation des Huge Pages et implémentation hugepages mémoire noyau 27/06/2025 Mémoire Swap et paramétrage swappiness mémoire noyau performance 18/06/2025 Installation et Configuration des Conteneurs LXC sur Linux administration conteneurs lxc 18/06/2025 Gestion des journaux avec syslog et journalctl administration journalctl logs