Criando imagens de disco cru: a melhor maneira de excluir arquivos para compactação?

3

Estou criando imagens de disco bruto (ou seja, dd, chroot para instalar o linux). Durante o processo de personalização, posso excluir arquivos, usar arquivos temporários, etc.

Qual é a melhor maneira de excluir esses arquivos para garantir que a imagem seja mais compressível?

Estou assumindo que, se eu simplesmente rm o arquivo, é apenas excluir registros do FAT para marcar os blocos como disponíveis. Isso deixa os dados no lugar, então quando eu gzip ou bzip2 a imagem ainda tem que empacotar os dados. Eu presumo que as coisas ficariam bem mais firmes se eu pudesse dizer ao FS para escrever zeros nos blocos.

Um pouco de detalhe: estas são as instalações do CentOS 6.4 no ext4, mas eu esperaria que a resposta se aplicasse à maioria das distribuições Linux usando a maioria dos sistemas de arquivos. O sistema de arquivos base que eu gero é através de um comando como dd if=/dev/zero of=filesystem.image bs=1M count=10240 . Uma típica imagem de disco de 10 GB de uma instalação simplificada será comprimida em aproximadamente 500 MB. Eu aposto que se eu fizesse uma limpeza mais agressiva dos arquivos temporários e tal, eu poderia ficar bem mais apertado.

Obrigado!

    
por Gary Richardson 18.04.2013 / 20:24

2 respostas

1

O comentário de Zoredache me pegou no caminho certo (veja Como preencher o espaço livre de um disco virtual no Windows para melhor compactação? ).

Tanto quanto eu posso dizer, a página inicial do zerofree é link . Há duas coisas hospedadas aqui: a ferramenta zerofree e um patch do kernel. O patch do kernel não funciona com o ext4, mas adiciona a capacidade de definir um sinalizador de montagem para zerar os arquivos na exclusão. O programa zerofree funciona no ext4.

Não há nenhum zerofree do CentOS 6 RPM disponível, mas eu consegui compilá-lo no CentOS6 usando o CentOS5 srpm.

    
por 18.04.2013 / 21:33
0

Você pode criar um arquivo / arquivos contendo apenas zeros, para preencher o espaço livre do sistema de arquivos. Os blocos marcados como livres serão sobrescritos com zeros. Depois, exclua esses arquivos.

Atualização: Desde que esta resposta foi downvoted, decidi testar se isso é realmente verdade ou meu conhecimento está errado. Até agora parece que isso está funcionando como eu esperava.

Eu criei duas imagens com o mesmo comando que o OP, exceto que eu fiz 1G de tamanho, já que isso é para testes:

dd if=/dev/zero of=img1.im bs=1M count=1024
dd if=/dev/zero of=img2.im bs=1M count=1024

Eu então comecei a formatar os arquivos de imagem como ext4, montá-los em diretórios separados e copiar dois diretórios contendo imagens em ambas as imagens. Um diretório era 71M e o outro - 461M. Depois, apaguei o diretório 461M dos dois pontos de montagem. Até agora todas as ações eram idênticas. Então, deixei a primeira imagem sozinha e criei um zerofile ocupando todo o espaço livre no segundo, excluindo-o depois:

dd if=/dev/zero of=img2/zerofile bs=1K count=884644
rm img2/zerofile

df mais uma vez mostrou que os sistemas de arquivos foram preenchidos de forma idêntica (partições do sistema removidas para maior clareza):

$ df
Filesystem                 1K-blocks      Used Available Use% Mounted on
/dev/loop0                    999320     62248    884644   7% /home/black/temp/img/img1
/dev/loop1                    999320     62248    884644   7% /home/black/temp/img/img2

Após desmontar e compactar ambas as imagens com o bzip2, a saída de ls fala por si:

$ ls -lh
total 604M
-rw-r--r-- 1 black users 523M apr 19 11:56 fs1.im.bz2
-rw-r--r-- 1 black users  81M apr 19 11:56 fs2.im.bz2

Embora isso possa levar mais tempo para imagens maiores do que apenas zerar o espaço realmente usado para arquivos, esse método é simples, eficaz e usa apenas dd , portanto, não são necessárias ferramentas adicionais.

    
por 18.04.2013 / 22:15