Ich habe eine spärliche Datei, in der nur einige Blöcke zugeordnet sind:
~% du -h --apparent-size example
100K example
~% du -h example
52K example
Ich möchte wissen, welche Blöcke der Datei tatsächlich zugeordnet sind. Gibt es einen Systemaufruf oder eine Kernel-Schnittstelle, über die eine Liste der Zuordnungen oder der Dateilöcher abgerufen werden kann?
Das einfache Suchen nach einer ausreichend langen Folge von Nullen (der von GNU cp, rsync usw. verwendete Ansatz) funktioniert nicht richtig:
~% cp example example1
~% du -h example1
32K example1
Es wurden andere Folgen von Nullen erkannt, die tatsächlich zugewiesen wurden.
quelle
--fibmap
derhdparm
Nützlichkeit. Siehe das Handbuch.Es gibt eine Sammlung von Python-Programmen namens sparseutils , die verwenden
SEEK_HOLE
undSEEK_DATA
bestimmen, welche Abschnitte der Datei als Löcher dargestellt werden und welche Daten sind. Die Verwendung ist recht einfach.mksparse
kann verwendet werden, um eine Sparse-Datei gemäß einem bestimmten Layout zu generieren.Das
sparsemap
Programm kann verwendet werden, um das Layout auf stdout zu drucken:quelle
Das hängt vom Dateisystem ab. Ich glaube nicht, dass dies ein Aufruf ist, weshalb viele Tools das Kopieren von Dateien mit geringer Dichte möglicherweise nicht gut handhaben. Die GNU-Toolkette sucht nach großen Nullenblöcken, um nicht verwendete zugewiesene Blöcke zu entfernen. Viele Kopiertools konvertieren eine Datei mit geringer Dichte in eine Datei, der alle Blöcke zugewiesen sind.
Sie müssen wahrscheinlich den Inode öffnen und das Ergebnis analysieren. Das Inode-Format ist dateisystemabhängig. Einige Dateisysteme haben möglicherweise einen Teil Ihrer Daten im Inode selbst.
quelle
SEEK_DATA
undSEEK_HOLE
Parametern fürlseek()
, wie es sie in Solaris gibt: opensolarisforum.org/man/man2/lseek.html