Tamanho aparente de arquivos esparsos

3

Eu criei um arquivo esparso de 8 GB usando

dd if=/dev/zero of=/sparse-file bs=1 count=0 seek=8G

Então eu fiz

echo "test" >> /sparse-file

Eu vejo que du -sh sparse-file dá 16K e du -sh --apparent-size sparse-file mostra 8.1G.

Pensei que, se eu gravasse dados no arquivo, ele sobrescreveria os zeros no arquivo esparso, mas na verdade aumentaria. Por que é assim? Se eu começar a preencher 8 GB de dados reais, o tamanho aparente será 16 GB?

O que exatamente "contar" faz aqui?

    
por Manny 08.05.2012 / 08:10

2 respostas

3

Arquivos "Dispersos" são arquivos com intervalos vazios, presumivelmente preenchidos com zeros, mas para os quais essa suposição é suficiente para continuar. Ou seja, se você ler o arquivo, obterá zeros, mas como sabemos que são zeros, na verdade não precisamos escrever 8 GB de zeros. É o suficiente para dizer: "vamos apenas concordar que há um arquivo grande aqui sem realmente alocar espaço para ele".

À medida que você sobrescreve o conteúdo em branco do arquivo, os blocos são alocados no disco para acomodar o que você está armazenando (já que você não pode mais assumir que é apenas zero). Mas se você anexar ao arquivo, não estará sobrescrevendo nada. Você está apenas adicionando mais ao final. Então, adicionando você aloca blocos no disco, mas esses blocos não tomam o lugar dos seus blocos "imaginários" existentes; em vez disso, os que você cria são adicionados ao final, depois dos imaginários.

Você pode até adicionar mais blocos imaginários usando uma operação dd -skip semelhante à usada para criar o arquivo. Os blocos "imaginários" não precisam estar todos juntos. E, na verdade, à medida que você sobrescreve blocos existentes no arquivo, apenas os blocos sobrescritos serão alocados , não importando onde eles apareçam no arquivo. Ou seja, escrever um bloco na posição 101 não aloca automaticamente e preenche os blocos de 1 a 99.

    
por 08.05.2012 / 09:16
0

Primeiro, com count=0 você copiou apenas blocos zero de /dev/zero . Então nada. seek=8G ignorou 8 GB de blocos. Eu prefiro fazer isso com count=1 , mas eu acho que você pode deixar isso de lado.

Para o resto, apenas leia man du . A opção apparent-size imprime o tamanho aparente em vez do uso real do disco. Então, enquanto o primeiro comando relatou que seu arquivo requer 16K no disco, o tamanho aparente é 8,1 GB.

Um arquivo com menos de 16K de conteúdo ainda pode exigir 16K no disco, dependendo do sistema de arquivos subjacente usado. Veja a descrição do GNU Coreutils :

For example, a file containing the word ‘zoo’ with no newline would, of course, have an apparent size of 3. Such a small file may require anywhere from 0 to 16 KiB or more of disk space, depending on the type and configuration of the file system on which the file resides. However, a sparse file created with this command:

dd bs=1 seek=2GiB if=/dev/null of=big

has an apparent size of 2 GiB, yet on most modern systems, it actually uses almost no disk space.

    
por 08.05.2012 / 09:10

Tags