Informações detalhadas sobre arquivos esparsos no Linux

11

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 chamada de sistema ou interface de kernel que possa ser usada para obter uma lista das alocações ou dos buracos do arquivo?

A simples verificação de uma seqüência de zeros longa o suficiente (a abordagem usada pelo cp do GNU, rsync etc.) não funciona corretamente:

~% cp example example1  
~% du -h example1 
32K     example1

Detectou outras seqüências de zeros que foram realmente alocadas.

    
por Juliano 06.02.2011 / 15:59

3 respostas

7

Existe uma pergunta semelhante em SO . A resposta atualmente aceita por @ephemient sugere o uso de um ioctl chamado fiemap , documentado em linux/Documentation/filesystems/fiemap.txt . Citando esse arquivo:

The fiemap ioctl is an efficient method for userspace to get file extent mappings. Instead of block-by-block mapping (such as bmap), fiemap returns a list of extents.

Parece que esse é o tipo de informação que você está procurando. O suporte por sistemas de arquivos é novamente opcional:

File systems wishing to support fiemap must implement a ->fiemap callback on their inode_operations structure.

Suporte para os argumentos SEEK_DATA e SEEK_HOLE para lseek you mencionado do Solaris foi adicionado no Linux 3.1 de acordo com a página man , então você pode usar isso também. O fiemap ioctl parece ser mais antigo, por isso pode ser mais portátil em diferentes versões do Linux, enquanto o lseek pode ser mais portátil em sistemas operacionais se o Solaris tiver o mesmo.

    
por 07.09.2012 / 10:53
1

Depende do sistema de arquivos. Não acredito que seja uma chamada, o que pode ser o motivo pelo qual muitas ferramentas não lidam bem com a cópia de arquivos esparsos. A cadeia de ferramentas GNU usa a pesquisa de grandes blocos de zeros, o que permite remover blocos alocados não utilizados. Muitas ferramentas de cópia convertem 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 de seus dados no próprio inode.

    
por 06.02.2011 / 16:47
1

Há uma coleção de programas em python chamados sparseutils que usam SEEK_HOLE e SEEK_DATA para determinar quais seções do arquivo são representados como furos e quais são dados. O uso é bastante simples. mksparse pode ser usado para gerar um arquivo esparso de acordo com um determinado layout.

 $ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
 $ du -sh example
 4.0K   example

O programa sparsemap pode ser usado para imprimir o layout para stdout:

 $ sparsemap example
 HOLE 4096
 DATA 4096
 HOLE 4096
    
por 28.09.2017 / 21:29