Clonando um stick USB inicializável em um stick de tamanho diferente

10

HARDWARE: 2 unidades flash USB de 8 GB
DISTRO: Mint 9 Xfce persistente Live Cd

Uma unidade flash USB tem duas partições:
1) FAT32 700MB Mint 9 partição
2) ext3 7.3GB casper-rw partition

GOAL:
Eu quero fazer uma cópia dessa unidade flash USB porque eu não quero passar pelo tempo de instalar e configurar novamente do zero.

EXPERIENCE:
1) Descobri que dd não funciona para este trabalho porque, se um dos meus drives tiver até 1 MB de tamanho diferente, o que às vezes acontece, a cópia fica corrompida.

2) Descobri que usar gparted e pré-formatar a segunda unidade como a primeira e depois rsync 'em cada partição individualmente não funciona porque, por algum motivo, alguns arquivos não são copiados e a unidade permanece não inicializável.

Eu quero manter meu bastão de trabalho e apenas fazer cópias dele e configurar os bastões para meus amigos. Dessa forma, se eu pegar outro graveto, sempre terei meu bastão de base esperando por você.

    
por Joshua Robison 05.06.2011 / 05:30

2 respostas

5

Introdução

Para uma unidade com partições de PC (que é o que você encontrará na maioria dos pen drives), o bootloader consiste em uma pequena parte no início da unidade (o bootloader de estágio 1, no setor de inicialização da unidade ) e uma parte maior em outro lugar (o bootloader do estágio 2, em um arquivo). Os dados do estágio 1 contêm a localização física do estágio 2. Se você copiar todo o dispositivo (o que tentou com dd ), a parte do estágio 1 estará no mesmo local físico e o bastão funcionará, mas o novo bastão deve ser pelo menos tão grande quanto o original. Se você recriar as partições e copiar os arquivos, perderá o estágio 1, já que não é um arquivo.

Eu acho (mas não verifiquei) que o estágio 2 está na primeira partição (FAT32). Em caso afirmativo, você pode copiar essa partição por atacado e copiar o setor de inicialização, editar a tabela de partição para que a segunda partição ocupe exatamente o espaço restante e copiar os arquivos na segunda partição. Você também deve manter uma imagem bruta do setor de inicialização e da primeira partição em um arquivo em um disco rígido (mas também é possível cloná-los a partir de um pendrive).

Criando um clone de tamanho diferente

Abaixo, chamarei o dispositivo que contém o caractere original /dev/sdb e o dispositivo que contém o clone /dev/sdc ; substitua nomes conforme necessário. Crie pontos de montagem, se necessário. Eu assumo que a partição FAT32 (no início do disco) é numerada como 1 e a partição ext3 é numerada como 2; substitua números diferentes, se necessário.

Primeira parte, se clonar de uma só vez:

head -c 512 </dev/sdb >/dev/sdc
partprobe /dev/sdc
cat </dev/sdb1 >/dev/sdc1

Primeira parte, se clonar arquivos de imagem:

cat boot_sector.img >/dev/sdc
partprobe /dev/sdc
cat first_partition.img >/dev/sdc1

A chamada para partprobe é necessária para que o kernel recarregue a tabela de partição do disco (ela está no setor de inicialização e o primeiro comando em qualquer cenário acima modifica o setor de inicialização). Se você omiti-lo, ou você receberá erros ou o kernel silenciosamente escreverá lixo no bastão.

Para criar os arquivos de imagem:

head -c 512 </dev/sdb >boot_sector.img 
cat /dev/sdb1 >first_partition.img

Agora, depois de obter o setor de inicialização e a primeira partição, edite a tabela de partições novamente para redimensionar a segunda partição. Você pode fazer isso automaticamente, alimentando a entrada correta em fdisk . Atenção, isso é extremamente propenso a erros, e eu não testei isso. Se você não se sentir completamente confortável com essa parte, faça isso manualmente.

sed -e 's/ *#.*//' <<EOF | tr -s ' ' '\n' | tr -d _ | fdisk /dev/sdc
d 2         # delete partition 2
n p 2       # new primary partition 2...
_ _         # ... using all available space
w q         # write and quit
EOF

Finalmente recarregue a tabela de partições novamente, crie um sistema de arquivos ext3 e copie os arquivos lá.

partprobe /dev/sdc
mke2fs -j /dev/sdc2
mount /dev/sdc2 /media/sdc2
cp -a /media/sdb2/ /media/sdc2/
umount /media/sdc2

Método simplificado para criar um clone maior

Se preferir, você pode armazenar uma imagem do bastão inteiro. Você poderá usar essa imagem diretamente em qualquer bastão que seja pelo menos tão grande: apenas copie essa imagem para o novo bastão com cat <whole.img >/dev/sdc , depois execute partprobe /dev/sdc (ou desconecte o bastão e coloque-o de volta) para - leia a tabela de partições.

Então, se quiser, você pode ampliar o clone. Nesta ordem:

  1. Aumentar a partição. Infelizmente, não sei como fazer isso de maneira simples. parted pode fazer isso com o comando move (não resize , que redimensiona o sistema de arquivos), mas você precisa descobrir os argumentos certos - mude para setores ( unit s ) para evitar erros de arredondamento.
  2. Amplia o sistema de arquivos. Essa parte é fácil: basta executar resize2fs /dev/sdc2 para fazer o sistema de arquivos usar todo o tamanho da partição.

Se você estiver começando a partir de um bastão maior do que o necessário, poderá reduzi-lo seguindo as etapas acima na ordem inversa (primeiro reduza o sistema de arquivos com resize2fs e encolha a partição com parted ).

Como alternativa, você pode primeiro copiar o stick para um arquivo de imagem e, em seguida, trabalhar nesse arquivo de imagem. Para acessar as partições, use um dispositivo de loop , especificamente < href="https://unix.stackexchange.com/questions/9099/i-am-getting-an-error-trying-to-transfer-a-virtualbox-ose-vm-to-its-its-partition/9119# 9119 "> associando uma parte do arquivo a um disco . Aqui está um esboço dos passos, se você quiser reduzir a imagem (aviso, não testado, proceda com cuidado e verifique novamente a matemática).

fdisk -lu whole.img  # note starting sector of partition 2: $S
losetup -fs -o $(($S * 512)) whole.img
# Let $D be the desired size of partition 2, in kB
resize2fs /dev/loop0 $  # replace /dev/loop0 by whatever losetup prints
losetup -d /dev/loop0
parted whole.img
# Use parted to resize the second partition
dd if=/dev/null of=/file/to/truncate seek=1 bs=$(($S/2+$D+1))k
    
por 06.06.2011 / 01:07
2

~$: sudo apt-get install gddrescue ddrescue

~$: ddrescue /dev/sda /dev/sdb -v

;

Sintaxe: utilitário / origem / unidade / destino / unidade --verbose

Comentário: mostra o progresso e a verificação de erros para que você saiba se é aceitável ou está desconectado. Você também pode adicionar b = qualquer bloco de tamanho desejado. "gddrescue" é uma versão baseada em gui do "ddrescue", mas eu só uso o ddrescue como descrito acima, pois funciona sem nenhum problema.

    
por 05.05.2016 / 08:16