Tamanho aparente de arquivos esparsos

Tamanho aparente de arquivos esparsos

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

Vejo que du -sh sparse-filedá 16K e du -sh --apparent-size sparse-filemostra 8.1G.

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

O que exatamente “contar” faz aqui?

Responder1

Arquivos "esparsos" são arquivos com espaços vazios que se presume serem 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, não precisamos escrever zeros no valor de 8 GB. Basta 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 são apenas zeros). Mas se vocêacrescentarao arquivo, você não está sobrescrevendo nada. Você está apenas adicionando mais ao final. Então, ao anexar, você aloca blocos no disco, mas esses blocos nãotome o lugardos seus blocos "imaginários" existentes; em vez disso, os que você cria são adicionados ao final, depois dos imaginários.

Você pode até adicionarmaisblocos imaginários usando uma dd -skipoperação semelhante à usada para criar o arquivo. Os blocos “imaginários” não precisam estar todos juntos. E, na verdade, à medida que você sobrescreve os blocos existentes no arquivo,apenas os blocos que você sobrescrever serão alocados, não importa onde eles apareçam no arquivo. Ou seja, escrever um bloco na posição 101 não alocará e preencherá automaticamente os blocos de 1 a 99.

Responder2

Primeiro de tudo, count=0você copiou apenas zero blocos do arquivo /dev/zero. Então nada. seek=8Gpulou 8 GB de blocos. Eu preferiria fazer isso com count=1, mas acho que você pode deixá-lo totalmente de fora.

De resto, basta lercara, você. A apparent-sizeopção imprime o tamanho aparente em vez do uso real do disco. Portanto, embora o primeiro comando tenha relatado que seu arquivo requer 16K no disco, o tamanho aparente é de 8,1 GB.

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

Por exemplo, um arquivo contendo a palavra 'zoo' sem nova linha teria, é claro, um tamanho aparente de 3. Um arquivo tão pequeno pode exigir de 0 a 16 KiB ou mais de espaço em disco, dependendo do tipo e da configuração. do sistema de arquivos no qual o arquivo reside. No entanto, um arquivo esparso criado com este comando:

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

tem um tamanho aparente de 2 GiB, mas na maioria dos sistemas modernos ele quase não usa espaço em disco.

informação relacionada