Eu tenho um arquivo esparso, no qual apenas alguns blocos são alocados:
~% du -h --apparent-size example
100K example
~% du -h example
52K example
Gostaria de saber quais blocos do arquivo estão realmente alocados. Existe uma interface de chamada ou kernel do sistema que possa ser usada para obter uma lista das alocações ou dos buracos do arquivo?
Simplesmente verificar uma série de zeros longa o suficiente (a abordagem usada pelo GNU cp, rsync, etc) não funciona corretamente:
~% cp example example1
~% du -h example1
32K example1
Ele detectou outras seqüências de zeros que foram realmente alocadas.
fonte
--fibmap
dahdparm
utilidade. Veja o manual.Há uma coleção de programas python chamados sparseutils que usam
SEEK_HOLE
eSEEK_DATA
determinam quais seções do arquivo são representadas como buracos e quais são dados. O uso é bastante direto.mksparse
pode ser usado para gerar um arquivo esparso de acordo com um determinado layout.O
sparsemap
programa pode ser usado para imprimir o layout no stdout:fonte
Depende do sistema de arquivos. Não acredito que seja uma ligação, e talvez por isso muitas ferramentas não lidam bem com a cópia de arquivos esparsos. A cadeia de ferramentas GNU usa a busca de grandes blocos de zeros, pois isso permite remover blocos alocados não utilizados. Muitas ferramentas de cópia converterão um arquivo esparso em um arquivo com todos os blocos alocados.
Você provavelmente terá que abrir o inode e analisar o resultado. O formato do inode depende do sistema de arquivos. Alguns sistemas de arquivos podem ter parte dos seus dados no próprio inode.
fonte
SEEK_DATA
eSEEK_HOLE
parâmetros paralseek()
, como existem no Solaris: opensolarisforum.org/man/man2/lseek.html