Posso usar o dd para clonar um cartão SD maior em um cartão SD menor se as partições reais couberem?

9

Eu tenho um cartão SD de 16GB que tem algumas partições nele (na verdade é o cartão para um Raspberry Pi). Eu tenho vários outros cartões de 4GB que eu quero clonar o cartão principal para. As 3 partições no cartão principal são:

  • partição de boot Rasp, FAT, 60MB
  • partição Linux, ext2, 1 GB
  • partição "armazenamento" adicional, FAT, 1 GB

Se eu usar dd para criar uma imagem do cartão via:

dd if=/dev/sdb of=~/sd-card.bin

, o .bin resultante tem 16 GB de tamanho. Existe uma maneira de usar dd para copiar exatamente o que está sendo usado, ou seja, < 4GB para que eu possa então dd em um novo cartão de 4GB? Ou há uma solução melhor que eu deveria estar usando?

    
por Charlie Schliesser 18.03.2013 / 16:42

2 respostas

8

Eu suponho que você esteja usando um computador PC linux ou mac para executar a cópia, não o próprio pi do framboesa. Você provavelmente precisará adicionar um tamanho de bloco.

Eu vi um e quatro megas usados para discos pi de framboesa especificando bs = 1M ou bs = 4M. Eu acho que o tamanho do bloco é mais importante quando se escreve o disco, já que grandes transferências são mais rápidas do que as menores. Isso não define o tamanho do bloco para o disco, apenas afeta o tamanho das transferências que o dd usa. Um motivo para definir um tamanho de bloco grande é a necessidade de apagar o flash antes de escrevê-lo. Isso é feito automaticamente, mas mais rápido para transferências maiores que o tamanho mínimo de exclusão.

Você pode limitar a quantidade total de dados copiados pelo dd usando "count". "count" está em unidades de blocos. Se o final da última partição no disco de origem estiver antes do tamanho do destino, você poderá fazer o que quiser.

Algo como dd if=/dev/sdb of=~/sd-card.bin bs=1M count=4000 criará uma imagem com 4000MB de tamanho.

Veja link e link para mais informações. Não sei como encontrar o final da última partição ou o tamanho total da placa. No entanto, se você tiver formatado os discos, provavelmente saberá como fazer isso.

    
por 19.03.2013 / 00:46
2

Expandindo a resposta de William , pode-se calcular o final da última partição usando fdisk e uma calculadora:

$ fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00057540

Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1        2048  186367  184320   90M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      186368 3667967 3481600  1.7G  5 Extended
/dev/mmcblk0p5      188416 3667967 3479552  1.7G 83 Linux

Espaço total usado em bytes = setor final do tamanho do setor X da última partição (aqui é 3667967 x 512).

Total de espaço usado em GB = total de espaço usado em bytes / 1024 3 (aqui é 1,749023 GB).

Normalmente, não é vital criar uma imagem que seja reduzida ao último bit útil de dados, de modo que no exemplo acima eu criaria uma imagem de 2 GB usando o método descrito por William em que mesma resposta anterior :

dd if=/dev/mmcblk0 of=/path/to/pi_updated.img bs=1M count=2048

Incluídos no final da imagem haverá uma pequena porção do inútil inútil após seus últimos dados úteis, mas isso não é diferente em princípio do que o inútil guff que será sobrescrito quando você escreve a imagem de volta para sua mídia.

Este método tem funcionado para mim em cerca de uma dúzia de clones. Se houver falhas fatais nesse método, elas ainda não apareceram.

    
por 13.11.2014 / 15:10