Eu tenho um monte de imagens de disco, feitas com ddrescue, em uma partição EXT, e quero reduzir o tamanho delas sem perder dados, enquanto ainda é montável.
Como posso preencher o espaço vazio no sistema de arquivos da imagem com zeros e depois converter o arquivo em um arquivo esparso para que esse espaço vazio não seja realmente armazenado no disco?
Por exemplo:
> du -s --si --apparent-size Jimage.image
120G Jimage.image
> du -s --si Jimage.image
121G Jimage.image
No entanto, na verdade, ele tem apenas 50 G de dados reais; portanto, a segunda medição deve ser muito menor.
Isso supostamente preencherá o espaço vazio com zeros:
cat /dev/zero > zero.file
rm zero.file
Mas se os arquivos esparsos forem manipulados de forma transparente , ele poderá realmente criar um arquivo esparso sem gravar nada no disco virtual, ironicamente, impedindo-me de transformar a imagem do disco virtual em um arquivo esparso. :) faz?
Nota: Por algum motivo, sudo dd if=/dev/zero of=./zero.file
funciona quando cat
não está em uma imagem de disco montada.
fonte
sudo cat /dev/zero > zero.file
não funciona porque o seu bash (executando como você, não como root) faz o redirecionamento antes de executar osudo
comando. Veja unix.stackexchange.com/questions/1416/…Respostas:
Primeiro, os arquivos esparsos são manipulados de forma transparente apenas se você procurar, e não se você escrever zeros.
Para deixar mais claro, o exemplo da Wikipedia
se não escrever qualquer zeros, ele vai abrir o arquivo de saída, procure (pular) 5MB e, em seguida, escrever de zero zero (ou seja, nada). Este comando ( não da Wikipedia)
irá gravar 5MB de zeros e não criará um arquivo esparso!
Como conseqüência, um arquivo que já não é esparso não será magicamente esparso mais tarde.
Segundo, para criar um arquivo com muitos zeros esparsos, é necessário cp- lo
ou você também pode usar a opção tar 's ou rsync ' s --sparse.
fonte
cat /dev/zero > zero.file
esteja perfeitamente correto preencher espaço em branco com zeros?dd
para escrever zeros ou procurar.cat
comando preencherá todo o seu disco (ou pelo menos a quantidade não reservada para raiz ou por cotas) com zeros "reais" e não criará arquivos esparsos.Talvez a maneira mais fácil de sparsify um arquivo no local seria usar o
fallocate
utilitário da seguinte maneira:O fallocate (1) é fornecido pelo pacote util-linux no Debian .
fonte
fallocate --dig-holes
resultou no arquivo 103GiB do original 299GiB, enquantocp --sparse=always
me deu 93GiB - todos com a mesma soma SHA1 (tamanhos verificados viadu -B1G
vsdu --apparent-size -B1G
). Então,fallocate
parece dar resultados inferiores.Editando minha resposta para completude:
losetup --partscan --find --show disk.img
Suponha que ele fornece / dev / loop1 como disco e existe apenas uma partição; caso contrário, precisamos repetir isso para todas as partições com FS montável (ignore a partição de troca etc.).
mkdir -p /mnt/tmp mount /dev/loop1p1 /mnt/tmp dd if=/dev/zero of=/mnt/tmp/tempfile
Deixe terminar com falha com o ENOSPC.
/bin/rm -f /mnt/tmp/tempfile umount /mnt/tmp losetup -d /dev/loop1
'dd' tem uma opção para converter um arquivo com zeros em um arquivo esparso:
dd if=disk.img of=disk-sparse.img conv=sparse
fonte
zerofree
pode ser mais rápido do que montar e gravar zeros no sistema de arquivos e diminuir a imagem do disco se já contiver muitos zeros.Você quer dizer que sua imagem criada pelo ddrescue tem, digamos, 50 GB e, na realidade, algo muito menos seria suficiente?
Se for esse o caso, você não pode simplesmente criar uma nova imagem com o dd:
e crie um sistema de arquivos nele:
basta montar a imagem e copiar tudo, desde a imagem antiga para a nova? Isso funcionaria para você?
fonte
O PartImage pode criar imagens de disco que armazenam apenas os blocos usados de um sistema de arquivos, reduzindo drasticamente o espaço necessário ignorando os blocos não utilizados. Eu não acho que você pode montar diretamente as imagens resultantes, mas indo:
Deve produzir o que você deseja (pode até ser possível manter o último passo, ainda não tentei).
fonte
Agora existe uma ferramenta chamada virt-sparsify que fará isso. Ele preenche o espaço vazio com zeros e copia a imagem em um arquivo esparso. No entanto, é necessário instalar muitas dependências.
fonte
Eu suspeito que você precisará de um programa personalizado escrito para essa especificação, se é REALMENTE o que você deseja fazer. Mas é ...?
Se você realmente tem muitas áreas totalmente zero, qualquer boa ferramenta de compactação reduzirá significativamente. E tentar gravar arquivos esparsos não funcionará em todos os casos. Se bem me lembro, até arquivos esparsos ocupam pelo menos 1 bloco de armazenamento de saída, onde o bloco de entrada contém QUALQUER bit que não seja zero. Por exemplo - digamos que você tenha um arquivo com uma média de até 1 bit diferente de zero por bloco de 512 bytes - ele não pode ser gravado "escassamente". A propósito, você não perderá dados se compactar o arquivo com zip, bzip, bzip2 ou p7zip. Eles não são como compactação mpeg ou jpeg com perdas.
Por outro lado, se você precisar fazer leituras aleatórias de busca no arquivo, a compactação poderá ser mais problemática do que vale a pena e você voltará à gravação esparsa. Um programador C ou C ++ competente deve ser capaz de escrever algo assim em uma hora ou menos.
fonte
cp --sparse=always
faz o trabalho bem