Introdução
Para uma unidade com partições de PC (que é o que você encontra na maioria dos pen drives), o carregador de inicialização consiste em uma pequena parte no início da unidade (o carregador de inicialização estágio 1, no setor de inicialização da unidade) e um parte maior em outro lugar (o carregador de inicialização 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 (com o que você tentou dd
), a parte do estágio 1 estará no mesmo local físico e o stick funcionará, mas o novo stick deverá ter pelo menos grande como o original. Se você recriar as partições e copiar os arquivos, estará perdendo o estágio 1, pois não é um arquivo.
Eu acho (mas não verifiquei) que o estágio 2 está na primeira partição (FAT32). Nesse caso, você pode copiar essa partição por atacado e também o setor de inicialização, editar a tabela de partições para que a segunda partição ocupe exatamente o espaço restante e copiar os arquivos na segunda partição. Você também pode 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 pode cloná-las a partir de um pendrive).
Criando um clone de tamanho diferente
Abaixo, chamarei o dispositivo que contém o stick original /dev/sdb
e o dispositivo que contém o clone /dev/sdc
; substituir nomes conforme necessário. Crie pontos de montagem, se necessário. Presumo que a partição FAT32 (no início do disco) seja numerada 1 e a partição ext3 seja numerada 2; substitua números diferentes, se necessário.
Primeira parte, se estiver clonando a partir de um graveto:
head -c 512 </dev/sdb >/dev/sdc
partprobe /dev/sdc
cat </dev/sdb1 >/dev/sdc1
Primeira parte, se a clonagem de 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 (está no setor de inicialização e o primeiro comando em qualquer cenário acima modifica o setor de inicialização). Se você o omitir, você receberá erros ou o kernel gravará lixo silenciosamente no stick.
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, você precisará editar a tabela de partições novamente para redimensionar a segunda partição. Você pode fazer isso automaticamente, alimentando a entrada correta para fdisk
. Aviso, isso é extremamente suscetível a erros e eu não testei. Se você não se sentir completamente confortável com esta parte, faça-o 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ção 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 de todo o bastão. Você poderá usar essa imagem diretamente em qualquer stick que seja pelo menos tão grande: basta copiar essa imagem no novo stick cat <whole.img >/dev/sdc
e executar partprobe /dev/sdc
(ou desconectar o stick e recolocá-lo) para reler a tabela de partição.
Então, se quiser, você pode aumentar o clone. Nesta ordem:
- Amplie a partição. Infelizmente, não sei como fazer isso de uma maneira simples.
parted
pode fazê-lo com o move
comando (not resize
, que redimensiona o sistema de arquivos), mas você precisa descobrir os argumentos corretos - alterne para setores ( unit s
) para evitar erros de arredondamento.
- Amplie o sistema de arquivos. Essa parte é fácil: basta executar
resize2fs /dev/sdc2
para fazer com que o sistema de arquivos use todo o tamanho da partição.
Se você estiver começando com um stick 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 depois a partição parted
).
Como alternativa, você pode primeiro copiar o stick para um arquivo de imagem e depois trabalhar nele. Para acessar as partições, use um dispositivo de loop , associando especificamente uma parte do arquivo a um disco . Aqui está um esboço das etapas se você quiser reduzir a imagem (aviso, não testado, continue com cuidado e verifique as contas).
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