
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-file
dá 16K e du -sh --apparent-size sparse-file
mostra 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 -skip
operaçã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=0
você copiou apenas zero blocos do arquivo /dev/zero
. Então nada. seek=8G
pulou 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-size
opçã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.