Substituindo uma partição dentro de um .img por outro

1

Eu tenho 2 arquivos .img (imagens embutidas do Linux, cada uma com 2 partições - uma partição de inicialização e um rootfs). Eu preciso substituir a partição rootfs em um com o outro.

Como posso fazer isso

  1. No .imgs diretamente
  2. Com o .imgs escrito em cartões SD.

Gostaria que as respostas incluíssem comandos.

    
por user3490458 30.12.2014 / 18:01

1 resposta

1

Primeiro, certifique-se de que a partição que você precisa substituir seja pelo menos do mesmo tamanho que a que você copiará. Se os arquivos de imagem não estiverem compactados, eles podem ser montados como sistemas de arquivos de loopback usando kpartx .

Copiando sistemas de arquivos em imagens de disco

Você precisará do LVM2 para que isso funcione. Deixe disk1.img e disk2.img , supondo que ambas as imagens tenham o mesmo tamanho exato no exemplo a seguir:

# Let device mapper detect partitions on disk images
kpartx -a disk1.img
kpartx -a disk2.img

# Unmount source and destination file systems
umount /dev/mapper/loop?p?

# Copy source file system to destination
dd if=/dev/loop1p2 of=/dev/loop0p2 bs=512
# or:
# cat dev/loop1p2 > /dev/loop0p2

# Remove device nodes
kpartx -d disk1.img
kpartx -d disk2.img

Se o sistema de arquivos de origem for menor, você precisará estender esse em /dev/mapper/loop0p2 usando resize2fs . Se o sistema de arquivos destination for menor, você terá que reduzir o sistema de arquivos de origem para o tamanho exato do destino usando a ferramenta de particionamento escolhida. Eu recomendo fdisk .

EDITAR : Com o cartão SD detectado como /dev/mmcblk0 (assumindo que o destino é a segunda partição do cartão SD, por exemplo), tudo o que você precisa fazer é copiar o sistema de arquivos de /dev/mapper/loop0p2 , por exemplo, na segunda partição do cartão SD, digamos /dev/mmcblk0p2 .

EDIT : Se o sistema de arquivos de destino for menor, o sistema de arquivos de origem deve ser reduzido para se ajustar à partição de destino.

Reduzindo o sistema de arquivos de origem

Supondo que dispositivos de loop foram adicionados com kpartx -a e nenhum está montado :

# Check file systems block count and size
tune2fs -l /dev/mapper/loop0p2 | grep -E 'Block (count|size)'
tune2fs -l /dev/mapper/loop1p2 | grep -E 'Block (count|size)'

# Shrink source file system to fit the destination
# (FS check is mandatory before shrinking)
fsck -f /dev/mapper/loop1p2
resize2fs /dev/mapper/loop1p2 <loop0p2 block count>

# Proceed with file system copy...

resize2fs falhará se não houver blocos suficientes para ajustar ao tamanho solicitado (embora eu nunca tenha estado em tal situação). Se os tamanhos dos blocos forem diferentes, você poderá multiplicar <block count> por <block size> e acrescentar B ao resultado ao passar o novo tamanho do sistema de arquivos:

# Example: 123456 blocks, 4096 bytes per block
resize2fs /dev/mapper/loop1p2 $((123456*4096))B

Opcionalmente, você pode reduzir o sistema de arquivos de origem a seu tamanho mínimo e, em seguida, expandir o sistema de arquivos de destino para ajustar-se à sua partição, sem nenhum cálculo envolvido:

resize2fs -M /dev/mapper/loop1p2
# Do the copy ...
resize2fs /dev/mapper/loop0p2

O erro falhará somente se a operação não for possível.

Você provavelmente obterá um erro no final da operação de cópia porque a partição de origem não foi redimensionada. Normalmente, isso não deve causar danos, pois o kernel não permitirá a gravação após o final da partição de destino alocada.

Você pode ser extremamente cuidadoso e usar dd para limitar a quantidade de dados a serem copiados para o tamanho da partição de destino (tamanho do bloco mental bs e 'contagem'). Deixarei o comando e argumentos até você, pois você tem tudo o que precisa para um palpite educado; -).

    
por 30.12.2014 / 19:22