Blog ·
Was ein Backup nicht enthält
Dieselbe fehlende Option bedeutet bei einer virtuellen Maschine ja und bei einem Container nein. So haben wir die Proxmox-Abdeckung gemessen statt versprochen.
Von Provibr
Fragt man ein Verwaltungspanel, ob eine Maschine gesichert ist, lautet die Antwort meist ja. Die interessante Frage ist enger und deutlich schwerer: welche Teile davon liegen im Archiv und welche nicht. Ein Container mit einer Bind-Einhängung auf ein Verzeichnis des Wirtssystems hat Daten, die kein vzdump je berührt, und ein Panel, das über diese Konfiguration „gesichert“ sagt, ist nicht optimistisch, es gibt ein Versprechen im Namen fremder Software ab.
Wir haben also aufgehört zu versprechen und angefangen zu messen. Jedes Backup und jeder Wiederherstellungspunkt trägt nun eine Beobachtung davon, wie der Gast zu diesem Zeitpunkt aussah, und das Panel leitet die Abdeckung aus dieser Beobachtung ab und nicht daraus, dass ein Backup gelang.
Dieselbe Abwesenheit, zwei gegensätzliche Bedeutungen
Der Grund, warum das gemessen und nicht überlegt werden muss, ist eine Verhaltensregel von Proxmox, die für die beiden Gastarten genau in die andere Richtung geht.
Bei einem Container liegt ein Einhängepunkt nur dann im Archiv, wenn backup=1 dabeisteht. Die Dokumentation ist deutlich: um einen Einhängepunkt in Backups aufzunehmen, aktivieren Sie die Backupoption dafür. Abwesenheit bedeutet nein.
Bei einer virtuellen Maschine liegt eine Platte im Archiv, sofern nicht backup=0 dabeisteht. Das steht so nicht im Handbuch; es steht in der Funktion, die vzdump seine Liste übergibt, wo der Wert als Backupmerkmal der Platte mit dem Standardwert eins gelesen wird. Abwesenheit bedeutet ja.
| Konfigurationszeile | Im Archiv? |
|---|---|
rootfs: local-lvm:vm-101-disk-0,size=8G | ja, immer; die Rootfs kennt das Backupfeld gar nicht |
mp0: local-lvm:vm-101-disk-1,mp=/data,backup=1 | ja |
mp0: local-lvm:vm-101-disk-1,mp=/data | nein |
mp0: /srv/data,mp=/data (Bind-Einhängung) | nein; der Inhalt von Bind-Einhängungen geht nicht mit |
mp0: /dev/sdb1,mp=/disk (Geräte-Einhängung) | nein; dasselbe gilt für Geräte-Einhängungen |
scsi0: local-lvm:vm-100-disk-0,size=32G | ja |
scsi1: local-lvm:vm-100-disk-1,backup=0 | nein |
ide2: local:iso/debian.iso,media=cdrom | nicht zutreffend |
efidisk0: … mit bios: ovmf | ja |
efidisk0: … ohne bios: ovmf | nein |
tpmstate0: … | ja |
scsi2: /dev/sdb (Durchreichung) | ja |
unused0: local-lvm:vm-100-disk-4 | nein |
virtiofs0: dataset-a | nein |
Die beiden fetten Zeilen sind dieselbe Abwesenheit. Faltet man sie in einen Satz, lügt eines der beiden Bildschirme, und keines von beiden meldet einen Fehler.
Die Quelle lesen, nicht die Intuition
Drei dieser Zeilen fielen anders aus, als der Plan für diese Arbeit annahm, und alle drei wurden entschieden, indem Proxmox gelesen statt argumentiert wurde.
Von einer durchgereichten Platte wurde angenommen, sie sei Wirtsdatenbestand, der zurückbleibt, in Anlehnung an die Geräte-Einhängung eines Containers. Das stimmt nicht. Die Funktion, die die Backupliste aufbaut, schaut nirgends auf den Pfad, und der Vorbereitungsschritt macht aus einer Datenträgerkennung ohne Speicher dahinter ein Blockgerät und nimmt sie mit. Das in der sicher wirkenden Richtung falsch zu haben, würde Kunden erzählen, dass Daten außerhalb ihres Archivs liegen, die darin sind, was harmlos klingt, bis man merkt, dass es bei jeder Wiederherstellung eine Bestätigung erzwingt und Menschen so beibringt, Bestätigungen wegzuklicken.
Abgetrennte Platten und geteilte Wirtsverzeichnisse fehlten schlicht im Plan. Ein unusedN ist echter Kundendatenbestand, der ohne Bus daran auf dem Speicher liegt, und vzdump protokolliert, dass er ihn überspringt. Ein virtiofsN ist ein Verzeichnis des Wirtssystems und nie ein Datenträger, damit das Gegenstück zur Bind-Einhängung bei einer virtuellen Maschine. Beide sind echte Lücken in der Abdeckung und beide wären als vollständig gezählt worden.
Die Präfixe der Plattenschlüssel und ihre Anzahl stammen von derselben Stelle: vier IDE-Plätze, sechs SATA, einunddreißig SCSI, sechzehn Virtio, ein EFI-Datenträger, ein TPM-Zustand, zweihundertsechsundfünfzig ungenutzte Plätze, zehn Virtiofs. Ein Schlüssel außerhalb dieser Bereiche ist für Proxmox keine Platte, also darf er hier auch nicht still zu einer werden. Und virtiofs wird vor virtio geprüft, denn virtiofs0 beginnt mit virtio: andersherum würde ein geteiltes Wirtsverzeichnis als Platte gelesen und als gesichert gemeldet.
Unbekannt heißt nie vollständig
Die Worte auf dem Bildschirm für einen ungemessenen Gast lauten „nicht festgestellt“, ausgeschrieben: was ein Backup enthält, wurde nicht festgestellt. Nie „vollständig“, nie „nicht im Backup“. Es gibt drei Wege dorthin, und alle drei sind real: der Gast ist eine Art, die der Agent nicht lesen kann, der Agent ist älter als die Version, die Konfigurationen überhaupt liest, oder der Agent versuchte es und kam nicht heran.
Dieser letzte Fall ist der Grund, warum die Beobachtung ausdrücklich vermerkt, dass die Konfiguration gelesen wurde. Ohne dieses Merkmal ist eine leere Liste von Einhängepunkten nicht von einem Container ohne zusätzliche Einhängungen zu unterscheiden, außer dass es den zweiten nicht gibt: eine Rootfs ist immer da. Ein Agent, der nicht nachsehen konnte, läse sich sonst als Gast ohne irgendetwas außerhalb des Archivs, und genau dafür gibt es diese Arbeit.
Zwei Regeln drücken in dieselbe Richtung. Eine Containerkonfiguration, die gelesen wurde und keine Rootfs enthält, ist unbekannt und nicht vollständig, denn offenbar wurde etwas gelesen, das keine Containerkonfiguration war. Und eine Konfiguration einer virtuellen Maschine, in der nichts steht, wozu eine Abdeckungsfrage gehört, nichts oder nur CD-Laufwerke, ist aus demselben Grund unbekannt: vollständig bedeutet, dass alles enthalten ist, und das über null Dinge zu sagen ist eine Behauptung ohne Messung darunter. Der Preis ist bekannt und akzeptiert, nämlich dass eine wirklich plattenlose Maschine sich nun als nicht festgestellt liest und bei einer Wiederherstellung um eine Bestätigung bittet. Das ist die Seite, auf der ein Irrtum nichts kostet.
Auch das Urteil ist absichtlich geordnet: nachweislich außerhalb schlägt nicht gemessen. Ein Container mit einer Bind-Einhängung und einer unlesbaren Zeile ist teilweise und nicht unbekannt, denn der entscheidende Teil ist bewiesen. Die unlesbare Zeile verschwindet nicht; sie behält ihre eigene Zeile mit ihrem eigenen Wort.
Nicht zutreffend ist nicht dasselbe wie ausgeschlossen
Ein CD-Laufwerk erhält einen eigenen Abdeckungszustand, und die Unterscheidung ist keine Spitzfindigkeit, sondern die daraus folgende Handlung.
Ausgeschlossen heißt, dass Kundendaten außerhalb des Archivs liegen und es in Proxmox ein Häkchen gibt, das das ändert. Ein CD-Laufwerk trägt keine Daten dieser Maschine: es ist ein Abbild aus einer Bibliothek oder die Cloud-Init-Platte, die bei jedem Start neu entsteht, und Proxmox überspringt es, bevor er irgendetwas anderes bewertet. Hieße ein CD-Laufwerk ausgeschlossen, wäre jede Maschine mit einem Abbild im Laufwerk teilweise gesichert und jede Wiederherstellung verlangte eine Bestätigung über ein Laufwerk, auf dem nichts steht. Menschen lernten, dass die Bestätigung nichts bedeutet, und dann bedeutet sie nichts.
Die Zeile steht trotzdem in der Tabelle, mit ihrem eigenen Wort. Eine fehlende Zeile wirft die Frage auf, ob überhaupt nachgesehen wurde, und genau diese Mehrdeutigkeit nimmt das Lesemerkmal weg.
Die Bestätigung ist fehlersicher
Ein Archiv zurückzuspielen, dessen Abdeckung etwas anderes als ein gemessenes „vollständig“ ist, verlangt ein Häkchen, das benennt, was außerhalb lag. Auch bei unbekannt, und das ist der bewusste Teil: ein alter Wiederherstellungspunkt oder ein Archiv, das jemand anders anlegte, kann durchaus Wirtsdaten vermissen lassen, und das Häkchen ist die Stelle, an der der Kunde lernt, das selbst nachzuprüfen. Nur ein gemessenes vollständig überspringt es, denn dann gibt es wirklich nichts zu bestätigen.
Derselbe Satz bewacht zwei Türen, den Endpunkt und die Funktion dahinter, denn ein Bildschirm ist keine Grenze. Und die Bestätigungsschaltfläche wird nicht deaktiviert, solange das Fenster offen ist: ein deaktiviertes Element kann keinen Fokus halten, ein Dialog, der seinen eigenen Öffner deaktiviert, kann den Fokus beim Schließen also nicht zurückgeben, und ein Tastaturnutzer landet auf dem Dokumentkörper. Ein Beschäftigt-Zustand und Abdunkeln leisten dasselbe, ohne das zu zerbrechen.
Was außerhalb des Archivs lag, wird zusätzlich als Ereignis auf der Wiederherstellung geschrieben, auf Warnstufe, mit den Einhängepunkten in seinen Daten. Eine Wiederherstellung, die still gelang und dabei drei Verzeichnisse zurückließ, sollte einen Monat später von jemandem auffindbar sein, der nicht dabei war.
Was wir aufschreiben würden
- Messen Sie die Abdeckung, leiten Sie sie nicht ab. „Das Backup gelang“ und „Ihre Daten liegen im Backup“ sind zwei Aussagen über zwei verschiedene Dinge.
- Prüfen Sie, ob ein Standardwert auf beiden Seiten Ihrer Abstraktion derselbe ist. Hier bedeutet eine fehlende Option bei der einen Gastart ja und bei der anderen nein, und ein gemeinsamer Satz ist auf genau einem Bildschirm falsch, ohne irgendwo einen Fehler.
- Lesen Sie den Code, der die Liste wirklich aufbaut, nicht nur das Handbuch. Drei unserer Regeln waren falsch, bis wir das taten, und eine davon in der Richtung, die sich sicher anfühlt.
- Geben Sie „nicht gemessen“ ein eigenes Wort und lassen Sie es nie mit ja oder nein zusammenfallen.
- Geben Sie „hier gibt es keine Frage“ ebenfalls ein eigenes Wort. Ein Zustand, der eine bedeutungslose Bestätigung erzwingt, bringt Menschen bei, Bestätigungen zu übergehen.
- Trennen Sie Beobachtung und Urteil. Der Agent meldet, was er sah; eine Funktion entscheidet, was das bedeutet, mit Tests daneben und ohne dass der Melder Vollständigkeit behaupten könnte.
Zur Klarheit darüber, was das ist: Kundenbackups liegen hinter einem Ausrollschalter, der standardmäßig aus ist, nichts davon ist heute käuflich, und die Regeln wurden gegen Dokumentation und Quelltext von Proxmox geprüft und nicht gegen einen eigenen laufenden Hypervisor. Drei Dinge sind unbewiesen oder bewusst außerhalb des Umfangs. Die Abdeckung eines einzelnen Wiederherstellungspunkts wird vom erzeugenden Lauf geerbt statt aus dem Archiv selbst gelesen. Platten virtueller Maschinen mit backup=0 sind in dieser Tabelle sichtbar und sonst nirgends im Produkt. Und eine wirklich plattenlose Maschine liest sich als nicht festgestellt, ein Preis, den wir der Alternative vorgezogen haben.
Aus der Backuparbeit an Provibr. Warum eine ungetestete Wiederherstellung kein Backup ist, steht in ein Backup, das nie zurückgespielt wurde, und was die drei vzdump-Modi wirklich zusichern, steht in vzdump-Modi in Proxmox: was sie zusichern.