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


11

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

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

META:
Quero duplicar a unidade flash USB porque não quero passar pelo tempo de instalação e configuração do zero novamente.

EXPERIÊNCIA:
1) Descobri que ddisso não funciona para este trabalho, porque se uma das minhas unidades flash tiver até 1 MB de tamanho diferente, o que às vezes é, a cópia será corrompida.

2) Descobri que usar gpartede pré-formatar a segunda unidade como a primeira e depois rsynccada 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.

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


qual gerenciador de inicialização você usa (syslinux?). Por favor, considere remover esse discurso retórico de sua postagem, pois não agrega valor à sua pergunta.
Mat

Eu usei o instalador do mint live usb, por isso era tudo automático. Eu estou esperando que o processo de clonagem vai evitar trabalhar com bootloaders e copiar o meu atual conf bootloader
Joshua Robison

Respostas:


5

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/sdbe 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/sdce 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:

  1. Amplie a partição. Infelizmente, não sei como fazer isso de uma maneira simples. partedpode fazê-lo com o movecomando (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.
  2. Amplie o sistema de arquivos. Essa parte é fácil: basta executar resize2fs /dev/sdc2para 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 resize2fse 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

Hmm. Não posso usar o head apenas para copiar os primeiros 300mb da segunda partição para um arquivo img? Isso não cortará todo o espaço vazio / blocos vazios no final do arquivo?
Joshua Robison

1
@ Josué: Não, porque não há razão para que todos os dados do arquivo estejam nos primeiros 300 MB, e mesmo que fosse, você não pode simplesmente participar de um sistema de arquivos como esse. Você precisa criar um sistema de arquivos válido do tamanho certo. Você também precisa ter uma partição do tamanho correto; o tamanho da partição é armazenado no setor de inicialização. Se você preferir começar com uma imagem de tamanho mínimo e aumentá-la, se desejar, adicionamos uma maneira de fazer isso na minha resposta.
Gilles 'SO- stop be evil'

Hmm. Eu tentei copiar os arquivos antes, mas por algum motivo tudo não foi copiado. Eu tentei o rsync também com o sudo. e acho que tentei o su root e o fiz também ... Simplesmente não está funcionando para mim. Tenho certeza de que as unidades não foram montadas ... de qualquer maneira. Decidi encolher a unidade no gparted, criar arquivos img a partir disso e restaurá-los em um disco menor. Pré-encolher no gparted foi a única solução simples que eu pude encontrar. Obrigado pela sua ajuda.
Joshua Robison

Sua resposta provavelmente está correta e provavelmente fará o que estou pedindo. É muito complicado para mim. Então eu fui com o método pré-psiquiatra gparted.
Joshua Robison

existe um erro de digitação nesta linha head -c 512 </dev/sdb >/bev/sdc?
antonio

3

~ $: sudo apt-get install gddrescue ddrescue

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

;

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

Comentário: mostra a verificação de progresso e erro para que você saiba se é aceitável ou se está desligando em algum lugar. Você também pode adicionar b = qualquer tamanho de bloco que desejar. "gddrescue" é uma versão gui do "ddrescue", mas eu só uso o ddrescue conforme escrito acima, pois funciona sem problemas.


2
Observe que o formato correto é ddrescue -v /dev/sda /dev/sdb(as opções vêm primeiro antes dos nomes dos dispositivos / arquivos). Obrigado por apontar esta ferramenta! Muito mais fácil do que usar dd!
Xmnboy 5/10

0

Recentemente, eu tinha clonado minha persistência criptografada ao vivo do Kali de um USB de 16 GB para um USB 3.0 de 64 GB, meu SO host é o Windows 10 Pro. Eu não tinha tentado clonar usando nenhuma distribuição Linux, tenho certeza que as respostas acima são o que você precisa, mas para qualquer usuário do Windows; Eu tinha usado o assistente de partição de disco AOMEI. Super simples de usar, usei para particionar meu SSD para se ajustar ao Ubuntu, mas discordo.

Eu tinha que ter certeza de que o USB para o qual eu estava clonando já havia sido formatado para inicialização ao vivo. Conecte os dois USBs e clique com o botão direito do mouse na unidade de 8GB; clicou e copydepois selecionou a unidade de 64 GB, perguntará um monte de coisas como "você tem certeza de que esta é a unidade certa, tudo será apagado" todo esse jazz? Basta ler e certificar-se de que tudo está em ordem, você realmente não precisa fazer muito.

Apenas espere o processo terminar e está tudo pronto. Testado disse USB e tudo funcionou!

Achei que essa era a maneira mais fácil, pelo menos para mim, clonando distros ao vivo de USB para USB.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.