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 com algumas partições (na verdade, é o cartão para um Raspberry Pi). Eu tenho vários outros cartões de 4 GB nos quais desejo clonar o cartão principal. As 3 partições no cartão principal são:

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

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

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

o .bin resultante terá 16 GB de tamanho. Existe uma maneira de ddcopiar apenas o que realmente está sendo usado, ou seja, <4 GB, para que eu possa fazer ddisso em um novo cartão de 4 GB? Ou existe uma solução melhor que eu deveria estar usando?

Charlie Schliesser
fonte
Acabei criando o conteúdo exato em um novo cartão de 4 GB e clonando-o com dduma quantidade de outros cartões. Ainda assim, gostaria de saber se é possível resolver o problema inicial.

Respostas:

9

Suponho que você esteja usando um computador Linux ou Mac para executar a cópia, não o próprio raspberry pi. Você provavelmente precisará adicionar um tamanho de bloco.

Eu vi um e quatro megas usados ​​para discos Raspberry pi especificando bs = 1M ou bs = 4M. Eu acho que o tamanho do bloco é mais importante ao gravar o disco, pois as transferências grandes são mais rápidas 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. Uma razão para definir um tamanho de bloco grande é a necessidade de apagar o flash antes de escrevê-lo. Isso é feito automaticamente, mas com mais rapidez, para transferências maiores que o tamanho mínimo de apagamento.

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

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

Veja http://en.wikipedia.org/wiki/Dd_(Unix) e http://elinux.org/RPi_Easy_SD_Card_Setup para obter mais informações. Não sabe como encontrar o final da última partição ou o tamanho total dos cartões. No entanto, se você tiver formatado os discos, provavelmente saberá como fazer isso.

William J Bagshaw
fonte
Obrigado pela informação. Eu não estava ciente da opção de contagem. Vou tentar.
@ charlie, seria fascinante se você pudesse experimentá-lo com e sem a opção de contagem e relatar de volta. verifique se o tamanho do disco está sendo relatado e se você pode adicionar arquivos a ele e se o tamanho muda. Porque quando o dd falha relacionado a discos de tamanhos diferentes, você obtém esse tipo de problema. Aqui está um exemplo em que eu errei com o dd com duas unidades de tamanhos diferentes. superuser.com/questions/538583/diffitivity-resizing-a-partition No final, não usei o dd para fazer o clone.
21313 barlop
3

Expandindo a resposta de William , é possível calcular o final da última partição usando fdiske 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 da última partição X setor (aqui são 3667967 x 512).

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

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

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

No final da imagem, será incluída uma pequena parte do lixo inútil após seus últimos dados úteis, mas isso não difere em princípio do que o lixo inútil que será substituído quando você gravar a imagem novamente na mídia.

Esse método está funcionando para mim em uma dúzia de clones. Se houver falhas fatais nesse método, elas ainda não foram encontradas.

Crumeniferus
fonte