Welche Funktionen gibt es zum Bearbeiten von Sparse-Dateien unter Linux?

Welche Funktionen gibt es zum Bearbeiten von Sparse-Dateien unter Linux?

Was sind Funktionen zum Manipulieren von Sparse-Dateien unter Linux? (sagen wir in C, Hinweise zu anderen Systemen sind herzlich willkommen) zB:

  • Machen Sie ein Loch in die Feile, indem Sie einen Teil des Inneren entfernen
  • Untersuchen Sie die Struktur, z. B. generieren Sie eine Sequenz von Paaren, die den Anfang und das Ende von getrennten kontinuierlichen Datenblöcken kennzeichnen.
  • Teilen Sie die Datei an einem bestimmten Punkt in zwei Teile auf, indem Sie den Blockbereich neu zuweisen (also ohne die eigentlichen Daten zu verschieben).
  • Inodes und andere relevante Aspekte untersuchen? (Vielleicht ist es möglich, einige Blöcke im Copy-on-Write-Verfahren mehreren Dateien zuzuweisen?)

Kontext:

Die ursprüngliche Frage, die mir in den Sinn kam und zu der ich gelangte, war die nach man rsyncder folgenden --sparseOption:

Warum steht die Option rsyncvon --sparsein Konflikt mit --inplace?

Handelt es sich um eine Einschränkung der Dateisystemaufruf-API?

Aus Sicht der Datenstruktur würde ich, wenn die Quelldatei mit geringer Dichte als Folge nicht kontinuierlicher Datenblöcke betrachtet wird, von der „r“-Synchronisierung erwarten, dass die Bereiche, die an der Quelle nicht vorhanden sind, am Ziel freigegeben, fehlende zugewiesen und der Rest entsprechend aktualisiert wird (sogar mit dem standardmäßigen Rolling-Hash-Algorithmus von rsync, der alle verbleibenden Sequenzen als eine behandelt oder jede Sequenz separat ausführt).

Referenz:

man rsync
   -S, --sparse
          Try to handle sparse files efficiently so they take up less space on the destination.  Conflicts with --inplace because it's

Es ist nicht möglich, Daten sparsam zu überschreiben.

Antwort1

Sparse-Dateien sind so konzipiert, dass sie für den Benutzerbereich transparent sind: Löcher werden durch die Suche nach ungenutzten Bereichen erzeugt und als Blöcke von Nullen gelesen. Sie können nicht mit Standard-Benutzerbereich-APIs erkannt werden, zumindest noch nicht – wiewies darauf hinvonStéphane Chazelas, zumindest Solaris und Linux unterstützen das SEEK_DATAundSEEK_HOLE lseek(2)Flags, die es Userspace-Programmen ermöglichen, Schwachstellen zu finden. Diese Flags könnenzu POSIX hinzugefügtirgendwann.

Dies erklärt die Inkompatibilität zwischen rsync' --sparseund --inplaceOptionen: beim Schreiben in eine vorhandene Dateitragbar, es können keine Löcher in vorhandenen Daten entstehen. --sparsefunktioniert, indem die gesamte Datei neu geschrieben wird und (lange) Folgen von Nullen übersprungen werden, was auf Betriebssystemen und Dateisystemen, die diese unterstützen, zu spärlich besetzten Dateien führt.

Unter Linux können Sie Details zur Spärlichkeit von Dateien abrufen mit demfiemapioctl, Und e2fsprogs'filefrag(8); sehenDetaillierte Sparse-File-Informationen zu Linux. Auf der Schreibseite können Siefallocate(2)(und das praktischefallocate(1)Utility), um Löcher in eine vorhandene Datei zu stanzen, sodass diese spärlich wird, wenn die Löcher ganze Blöcke abdecken. Die Unterstützung ist dateisystemabhängig – derzeit unterstützen nur XFS, btrfs, ext4 und tmpfs diese Operationen. Neuere Kernel (seit 4.1) undsehrNeuere Versionen util-linuxunterstützen das Einfügen von Löchern in Dateien und das Verschieben des Inhalts nach dem Loch ( fallocate -i, eingeführt in util-linux2.30, das bald veröffentlicht werden soll).

Ihre letzten beiden Fragen betreffen Operationen am Dateisystem und ich bin mir nicht sicher, ob es einen generischen Systemaufruf oder ioctl gibt, um solche Operationen durchzuführen. reflink-kompatible Dateisysteme ermöglichen es Dateien, ihren Inhalt zu teilen. Dies kann erreicht werden durchdie FICLONEund FICLONERANGEioctls.

verwandte Informationen