Aller au contenu

Blog ·

Ce qu’une sauvegarde ne contient pas

La même option absente signifie oui sur une machine virtuelle et non sur un conteneur. Voici comment la couverture Proxmox est mesurée au lieu d’être promise.

Par Provibr

Demandez à un panneau de gestion si une machine est sauvegardée et la réponse sera généralement oui. La question intéressante est plus étroite et bien plus difficile : quelles parties se trouvent dans l’archive et lesquelles non. Un conteneur avec un montage lié vers un répertoire de l’hôte détient des données qu’aucun vzdump ne touchera jamais, et un panneau qui dit « sauvegardé » de cette configuration n’est pas optimiste, il fait une promesse au nom du logiciel de quelqu’un d’autre.

Nous avons donc cessé de promettre et commencé à mesurer. Chaque sauvegarde et chaque point de restauration porte désormais une observation de l’état de l’invité à ce moment-là, et le panneau déduit la couverture de cette observation et non du fait qu’une sauvegarde a réussi.

La même absence, deux sens opposés

La raison pour laquelle cela se mesure et ne se raisonne pas tient à une règle de comportement de Proxmox qui va exactement dans le sens inverse pour les deux types d’invité.

Sur un conteneur, un point de montage n’est dans l’archive que si backup=1 y figure. La documentation est explicite : pour inclure un point de montage dans les sauvegardes, activez l’option de sauvegarde correspondante. L’absence signifie non.

Sur une machine virtuelle, un disque est dans l’archive sauf si backup=0 y figure. Cela n’apparaît pas en ces termes dans le manuel ; cela apparaît dans la fonction qui remet sa liste à vzdump, où la valeur est lue comme l’indicateur de sauvegarde du disque avec un par défaut. L’absence signifie oui.

Ligne de configurationDans l’archive ?
rootfs: local-lvm:vm-101-disk-0,size=8Goui, toujours ; la racine ne connaît même pas le champ de sauvegarde
mp0: local-lvm:vm-101-disk-1,mp=/data,backup=1oui
mp0: local-lvm:vm-101-disk-1,mp=/datanon
mp0: /srv/data,mp=/data (montage lié)non ; le contenu des montages liés n’est pas sauvegardé
mp0: /dev/sdb1,mp=/disk (montage de périphérique)non ; il en va de même des montages de périphérique
scsi0: local-lvm:vm-100-disk-0,size=32Goui
scsi1: local-lvm:vm-100-disk-1,backup=0non
ide2: local:iso/debian.iso,media=cdromsans objet
efidisk0: … avec bios: ovmfoui
efidisk0: … sans bios: ovmfnon
tpmstate0: …oui
scsi2: /dev/sdb (passage direct)oui
unused0: local-lvm:vm-100-disk-4non
virtiofs0: dataset-anon

Les deux lignes en gras sont la même absence. Repliez-les en une seule phrase et l’un de vos deux écrans ment, sans qu’aucun des deux ne signale d’erreur.

Lire la source, pas l’intuition

Trois de ces lignes se sont révélées différentes de ce que le plan de ce travail supposait, et les trois ont été tranchées en lisant Proxmox plutôt qu’en argumentant.

D’un disque en passage direct, on avait supposé qu’il s’agissait de données de l’hôte qui restent en arrière, par analogie avec le montage de périphérique d’un conteneur. C’est faux. La fonction qui construit la liste de sauvegarde ne regarde jamais le chemin, et l’étape de préparation transforme un identifiant de volume sans stockage derrière en périphérique de bloc et l’inclut. Se tromper dans le sens qui paraît prudent reviendrait à dire aux clients que des données sont hors de leur archive alors qu’elles y sont, ce qui semble anodin jusqu’à ce qu’on remarque que cela impose une reconnaissance à chaque restauration et apprend ainsi aux gens à cliquer au travers des reconnaissances.

Les disques détachés et les répertoires partagés de l’hôte manquaient tout simplement au plan. Un unusedN est une vraie donnée du client posée sur le stockage sans bus attaché, et vzdump consigne qu’il le saute. Un virtiofsN est un répertoire de l’hôte et jamais un volume, ce qui en fait l’équivalent du montage lié pour une machine virtuelle. Les deux sont de véritables trous de couverture et les deux auraient compté comme complets.

Les préfixes des clés de disque et leurs quantités viennent du même endroit : quatre emplacements IDE, six SATA, trente et un SCSI, seize virtio, un disque EFI, un état TPM, deux cent cinquante-six emplacements inutilisés, dix virtiofs. Une clé en dehors de ces plages n’est pas un disque pour Proxmox, elle ne doit donc pas le devenir ici en silence. Et virtiofs est testé avant virtio, car virtiofs0 commence par virtio : dans l’autre sens, un répertoire partagé de l’hôte serait lu comme un disque et signalé comme sauvegardé.

Inconnu ne s’appelle jamais complet

Les mots à l’écran pour un invité non mesuré sont « non établi », en toutes lettres : ce que contient une sauvegarde n’a pas été établi. Jamais « complète », jamais « hors sauvegarde ». Il y a trois manières d’y arriver et les trois sont réelles : l’invité est d’un type que l’agent ne sait pas lire, l’agent est antérieur à la version qui lit les configurations, ou l’agent a essayé et n’a pas pu accéder.

Ce dernier cas explique pourquoi l’observation porte un indicateur explicite disant que la configuration a été lue. Sans lui, une liste vide de points de montage ne se distingue pas d’un conteneur sans montages supplémentaires, sauf que le second n’existe pas : il y a toujours une racine. Un agent qui n’a pas pu regarder se lirait sinon comme un invité sans rien en dehors de l’archive, ce qui est exactement la défaillance que ce travail existe pour empêcher.

Deux règles poussent dans le même sens. Une configuration de conteneur bien lue mais dépourvue de racine est inconnue et non complète, car nous avons manifestement lu autre chose qu’une configuration de conteneur. Et une configuration de machine virtuelle où rien ne soulève de question de couverture, rien ou seulement des lecteurs optiques, est inconnue pour la même raison : complète signifie que tout y est, et le dire de zéro chose est une affirmation sans mesure dessous. Le prix est connu et accepté : une machine réellement sans disque se lit désormais comme non établie et demande une reconnaissance lors d’une restauration. C’est le côté où se tromper ne coûte rien.

Le verdict est également ordonné à dessein : démontrablement dehors l’emporte sur non mesuré. Un conteneur avec un montage lié et une ligne illisible est partiel et non inconnu, car la part qui compte est prouvée. La ligne illisible ne disparaît pas ; elle garde sa propre ligne avec son propre mot.

Sans objet n’est pas la même chose qu’exclu

Un lecteur optique reçoit un état de couverture à lui, et la distinction n’est pas de la pinaillerie mais l’action qui en découle.

Exclu signifie que des données du client sont hors de l’archive et qu’il existe une case dans Proxmox qui change cela. Un lecteur optique ne porte aucune donnée de cette machine : c’est une image issue d’une bibliothèque, ou le disque d’initialisation refait à chaque démarrage, et Proxmox le saute avant d’évaluer quoi que ce soit d’autre. Si un lecteur optique s’appelait exclu, toute machine avec une image dans son lecteur serait partielle et toute restauration demanderait une reconnaissance à propos d’un lecteur où il n’y a rien. Les gens apprendraient que la reconnaissance ne signifie rien, et alors elle ne signifierait rien.

La ligne figure tout de même dans le tableau, avec son propre mot. Une ligne absente soulève la question de savoir si l’on a seulement regardé, et c’est précisément l’ambiguïté que l’indicateur de lecture supprime.

La reconnaissance échoue du côté sûr

Restaurer une archive dont la couverture est autre chose qu’un « complète » mesuré exige de cocher une case qui nomme ce qui est resté dehors. Y compris pour inconnue, et c’est la part délibérée : un ancien point de restauration, ou une archive créée par quelqu’un d’autre, peut fort bien manquer de données de l’hôte, et la case est l’endroit où le client apprend à le vérifier lui-même. Seule une couverture complète mesurée la saute, car il n’y a alors réellement rien à reconnaître.

La même phrase garde deux portes, le point d’entrée et la fonction derrière, car un écran n’est pas une frontière. Et le bouton de confirmation n’est pas désactivé tant que le panneau est ouvert : un élément désactivé ne peut pas retenir le focus, un dialogue qui désactive celui qui l’a ouvert ne peut donc pas rendre le focus à la fermeture, et une personne au clavier atterrit sur le corps du document. Un état occupé et un assombrissement font le même travail sans casser cela.

Ce qui est resté hors de l’archive est en outre écrit comme événement sur la restauration, au niveau avertissement, avec les points de montage dans ses données. Une restauration qui a réussi en silence en laissant trois répertoires derrière elle doit rester trouvable un mois plus tard par quelqu’un qui n’était pas là.

Ce que nous noterions

  1. Mesurez la couverture, ne la déduisez pas. « La sauvegarde a réussi » et « vos données sont dans la sauvegarde » sont deux affirmations sur deux choses différentes.
  2. Vérifiez si une valeur par défaut est la même des deux côtés de votre abstraction. Ici une option absente signifie oui pour un type d’invité et non pour l’autre, et une phrase partagée est fausse sur exactement un écran sans erreur nulle part.
  3. Lisez le code qui construit réellement la liste, pas seulement le manuel. Trois de nos règles étaient fausses avant cela, et l’une d’elles dans le sens qui paraît prudent.
  4. Donnez un mot propre à ce qui n’est pas mesuré et ne le laissez jamais se confondre avec oui ou non.
  5. Donnez aussi un mot propre à ce qui ne pose pas de question. Un état qui impose une confirmation vide apprend à ignorer les confirmations.
  6. Séparez l’observation du jugement. L’agent rapporte ce qu’il a vu ; une fonction décide de ce que cela veut dire, avec des tests à côté et sans que le rapporteur puisse affirmer une complétude.

Pour être clair sur ce dont il s’agit : les sauvegardes client sont derrière un commutateur de déploiement désactivé par défaut, rien de tout cela n’est achetable aujourd’hui, et les règles ont été vérifiées contre la documentation et le code de Proxmox et non contre un hyperviseur maison en fonctionnement. Trois choses restent non prouvées ou volontairement hors périmètre. La couverture d’un point de restauration particulier est héritée de l’exécution qui l’a produit plutôt que lue dans l’archive. Les disques de machine virtuelle portant backup=0 sont visibles dans ce tableau et nulle part ailleurs dans le produit. Et une machine réellement sans disque se lit comme non établie, un prix préféré à l’alternative.

Issu du travail de sauvegarde sur Provibr. Pourquoi une restauration jamais testée n’est pas une sauvegarde est dans une sauvegarde jamais restaurée, et ce que les trois modes de vzdump garantissent réellement est dans les modes vzdump de Proxmox : ce qu’ils garantissent.

Commencez avec un hôte et un agent

Créez un compte, installez l’agent avec une seule commande et connectez votre premier hôte Proxmox. La période d’essai dure 14 jours et ne demande aucune coordonnée de paiement.