J'ai un fichier clairsemé, dans lequel seuls certains blocs sont alloués:
~% du -h --apparent-size example
100K example
~% du -h example
52K example
Je voudrais savoir quels blocs du fichier sont réellement alloués. Existe-t-il un appel système ou une interface noyau qui pourrait être utilisé pour obtenir une liste des allocations ou des trous de fichier?
La simple vérification d'une chaîne de zéros suffisamment longue (l'approche utilisée par GNU cp, rsync, etc.) ne fonctionne pas correctement:
~% cp example example1
~% du -h example1
32K example1
Il a détecté d'autres séquences de zéros réellement allouées.
la source
--fibmap
de l'hdparm
utilitaire. Voir le manuel.Il existe une collection de programmes python appelés sparseutils qui utilisent
SEEK_HOLE
etSEEK_DATA
déterminent quelles sections du fichier sont représentées comme des trous et lesquelles sont des données. L'utilisation est assez simple.mksparse
peut être utilisé pour générer un fichier clairsemé selon une disposition donnée.Le
sparsemap
programme peut être utilisé pour imprimer la mise en page sur stdout:la source
Cela dépend du système de fichiers. Je ne pense pas que ce soit un appel, ce qui peut expliquer pourquoi de nombreux outils ne gèrent pas bien la copie de fichiers épars. La chaîne d'outils GNU utilise la recherche de gros blocs de zéros car cela leur permet de supprimer les blocs alloués inutilisés. De nombreux outils de copie convertissent un fichier clairsemé en un fichier avec tous les blocs alloués.
Vous devrez probablement ouvrir l'inode et analyser le résultat. Le format d'inode dépend du système de fichiers. Certains systèmes de fichiers peuvent contenir une partie de vos données dans l'inode lui-même.
la source
SEEK_DATA
et desSEEK_HOLE
paramètreslseek()
, comme il en existe dans Solaris: opensolarisforum.org/man/man2/lseek.html