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:
- Aumentar a partição. Infelizmente, não sei como fazer isso de maneira simples.
parted
pode fazer isso com o comandomove
(nãoresize
, que redimensiona o sistema de arquivos), mas você precisa descobrir os argumentos certos - mude para setores (unit s
) para evitar erros de arredondamento. - 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