imagem de disco sem espaço livre

1

Tenho uma imagem de um cartão SD inicializável de 16 GB. Eu criei a imagem com:

cat /dev/sdd | gzip >sdcard.img.gz

E eu estava feliz porque

$ du -h sdcard.img.gz
482M    sdcard.img.gz

482MB em vez de 16GB, yay!

Aqui estão os detalhes da imagem (não compactada):

$ du -h sdcard.img
15G     sdcard.img
$ partx -s sdcard.img
NR START     END SECTORS SIZE NAME UUID
 1 16384   81919   65536  32M      6e1be81b-01
 2 81920 3588095 3506176 1.7G      6e1be81b-02

No entanto, agora eu preciso escrever esta imagem de volta para o cartão SD, mas eu não quero escrever 14GB de zeros / junk! Isso demoraria séculos.

  1. Como posso criar uma imagem sem copiar o que vem depois da última partição?
  2. Quando eu já criei uma imagem de todo o cartão SD, como posso truncá-lo para não incluir lixo inútil?
O ponto é, eu não me importo com o tamanho que a imagem está tomando no backup, mas eu me importo com o tamanho que é transferido de volta para o cartão SD, porque copiar para o cartão SD é lento e copiar 14GB de dados inúteis sem sentido. Portanto, compactar a imagem do disco ou copiar para um sistema de arquivos esparsos , como sugerem outras respostas na Internet, não é o que estou procurando.

    
por woky 20.06.2018 / 13:55

2 respostas

1

Respondendo sua primeira pergunta: dado que você tem um MBR lá, sugiro que você faça algo como dd do primeiro megabyte da unidade original (que contém o registro de inicialização e possivelmente o gerenciador de inicialização) e, em seguida, iterar partições contidas nele: %código% E depois de gravar o primeiro megabyte na unidade de destino, peça ao kernel para ler a tabela de partições com dev=/dev/sda fdisk -l "$dev" | sed -ne '/^\//s,\(^[^ ]*\) .*,,p' | while read part do dd "if=$part" "of=$(basename "$part")" done ou partprobe . Depois disso, você deve conseguir kpartx do conteúdo das imagens correspondentes às novas partições.

    
por 20.07.2018 / 14:41
1

Escreva no final da última partição (e um pouco mais, por exemplo, um total de 2G (gibibytes) neste caso).

Você pode usar dd para essa finalidade. Verifique e confirme duplamente que você irá escrever no cartão SD correto (e não em outra unidade) antes de pressionar a tecla Enter, porque dd faz o que você diz sem nenhuma dúvida.

Esta linha de comando funciona a partir de um arquivo de imagem descompactado

$ sudo dd if=sdcard.img of=/dev/sdx bs=1M count=2K

em que x é a letra da unidade.

Mas, neste caso, há um arquivo de imagem compactado. Executar como root (por exemplo, via sudo -s e uma linha de comando correspondente pode ter esta aparência, onde zcat extrai de um arquivo gzip compactado.

# < sdcard.img.gz zcat | dd of=/dev/sdx bs=4096 count=524288
524288+0 records in
524288+0 records out
2147483648 bytes (2,1 GB, 2,0 GiB) copied, 56,6886 s, 37,9 MB/s
    
por 20.06.2018 / 14:47