Eine Datei auf einem bestimmten Dateisystem zeichnet sich durch seine referenzierten Indexknoten aka Inode . Solange es Verweise auf diesen Inode gibt, sei es auf der Festplatte (als Dateiname verknüpft, kann mehrmals existieren) oder "im Arbeitsspeicher" (geöffneter Dateideskriptor aka fd, Einhängepunkt, mmaped ...) die Datei und Ihre Daten bleiben auf der Festplatte. Wenn kein Verweis mehr vorhanden ist, wird er wirklich gelöscht und der Speicherplatz wieder freigegeben. Wenn die Plattenreferenz zu 0 wird, auch wenn noch Verweise "im Speicher" vorhanden sind, gibt es keine Möglichkeit, sie mit einem neuen Namen zu verknüpfen, da für den Benutzer keine Kernel-API vorhanden ist, die es beispielsweise erlaubt, einen Inode zu verknüpfen, auf den fd oder das referenzierte Element verweist Inode Wert selbst, es ist nur nach Dateinamen (es sei denn, auf einem angemessenes Dateisystem mit dunklen und gefährlicher Magie : debugfs ln
).
Der Linux-Kernel bietet noch einige Möglichkeiten, auf diese Datei mit dem /proc
Pseudo-Dateisystem zuzugreifen . Jede geöffnete Datei in wird als Symlink angezeigt, der auf eine Datei verweist. Der Dateiname ist kosmetische Information (und kann falsch sein, wenn die Datei nicht verknüpft wurde), aber die Datei selbst wird als die eigentliche Datei betrachtet, wie sie vom Kernel gesehen wird./proc/PID/fd/
In diesem Fall ist die als VM-Backend verwendete VM weiterhin vorhanden, solange die VM ausgeführt wird. Sie kann jedoch nicht erneut auf die Festplatte gesetzt werden. Was leicht zu tun ist, ist es mit einem entsprechenden Befehl zu kopieren, zum Beispiel:
cp --sparse=always /proc/PID/fd/12 > backup
.
Da die VM läuft, kann dies zu einem inkonsistenten Ergebnis führen: Das Dateisystem (in der Datei) kann sich während des Kopiervorgangs ändern und inkonsistent und beschädigt werden. Sie können also entweder die VM einfrieren, wenn ihr Hypervisor dies zulässt, und die Festplattendatei der VM nicht schließt, wenn sie eingefroren ist, oder fügen Sie der namenlosen Datei eine neue Referenz hinzu und stoppen Sie die VM. Wenn Sie keine Chance ergreifen möchten, fügen Sie die Referenz trotzdem hinzu, bevor Sie sie einfrieren. Jeder Befehl, der die Datei liest und lange genug dauert, ist in Ordnung. Zum Beispiel:
$ sleep 99999 < /proc/PID/fd/12 & [1] 12087
Sie sollten jetzt überprüfen, ob auf /proc/12087/fd/0
dieselbe ... (deleted)
Datei verwiesen wird.
Die VM kann jetzt eingefroren oder sogar gestoppt werden (kann dann jedoch nicht erneut gestartet werden). Da das Dateisystem nicht mehr aktiv ist, sollte die Sicherung konsistent sein (bei Wiederherstellung des Dateisystem-Journals, wenn sie einfach eingefroren wird). Die Verwendung cp
mit der Option --sparse=always
scheint eine gute Wahl zu sein, wenn die Festplattendatei der VM "faul" war und meist leer war, um weniger Speicherplatz zu benötigen.