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; -).