Como copiar uma partição de uma imagem para uma partição de um disco físico?

1

Finalmente, eu tinha uma chave USB inicializável trabalhando com uma instalação do Windows 7 pronta para começar, quando percebi que, uma vez que a seleção de idioma apareceu, o teclado e o trackpad do meu Macbook Pro não funcionavam mais e eu não tinha como prosseguir com a instalação.

Decidi configurar um VirtualBox Windows 7 x64, instalar os drivers do teclado e do trackpad a partir do pacote Bootcamp Support Software e desligar a VM.

Eu costumava VBoxManage internalcommands converttoraw ...transformar o disco virtual em um .img. Para aqueles que não estão familiarizados com o virtualbox, ele cria uma imagem completa do disco rígido virtual como se fosse um disco rígido físico e funciona da mesma maneira.

Eu usei o fdisk para ver a imagem:

sh-3.2# fdisk WINDOWS7.img 
Disk: WINDOWS7.img  geometry: 2610/255/63 [41943040 sectors]
Signature: 0xAA55
     Starting       Ending
#: id  cyl  hd sec -  cyl  hd sec [     start -       size]
------------------------------------------------------------------------
*1: 07    0  32  33 -   12 223  19 [      2048 -     204800] HPFS/QNX/AUX
2: 07   12 223  20 - 1023 254  63 [    206848 -   41734144] HPFS/QNX/AUX
3: 00    0   0   0 -    0   0   0 [         0 -          0] unused      
4: 00    0   0   0 -    0   0   0 [         0 -          0] unused

Em seguida, usei o seguinte na tentativa de pular a partição reservada do sistema e apenas copiar a partição de dados do Windows para a fatia designada do meu Macintosh HD:

sh-3.2# dd if=WINDOWS7.img of=/dev/disk0s4 skip=206848 bs=65535

Deixando-me o seguinte:

sh-3.2# fdisk /dev/disk0
Disk: /dev/disk0    geometry: 60821/255/63 [977105060 sectors]
Signature: 0xAA55
         Starting       Ending
#: id  cyl  hd sec -  cyl  hd sec [     start -       size]
------------------------------------------------------------------------
1: EE 1023 254  63 - 1023 254  63 [         1 -     409639] <Unknown ID>
2: AC 1023 254  63 - 1023 254  63 [    409640 -  684395032] <Unknown ID>
3: AB 1023 254  63 - 1023 254  63 [ 684804672 -    1269536] Darwin Boot 
4: 0B 1023 254  63 - 1023 254  63 [ 686074208 -  290768672] Win95 FAT-32

O que parece correto, mas me deixa um disco com capacidade de inicializar que não consigo montar ou acessar com o utilitário de disco. Quando clico em montar, nada acontece, mesmo se eu tentar mount -t ntfs /dev/disk0s4 /Volumes/Temp-Dir-Made-With-mkdir

utilitário de Disco

Qual poderia ser o problema? Estou fazendo algo errado? Isso é impossível?

A fatia 4 do disco0 não herda o sistema de arquivos da partição que escrevi para ele?

Agradecemos antecipadamente por qualquer insight!

Editar 1:

@ David É um MacbookPro11,3que deve dizer tudo o que você precisa saber sobre isso. No que diz respeito ao bootcamp, baixei-o diretamente para o Windows a partir do seguinte documento de suporte da Apple kbDL1720

@klanomath (Comentário 1) É verdade, mas é uma boa informação para saber! Por curiosidade, por que 65535 é um tamanho de bloco ruim? Eu pensei que a especificação do tamanho do bloco tivesse apenas a ver com o número de blocos que foram processados ​​e despejados na unidade / imagem de cada vez, basicamente permitindo que você DDse mais rápido com mais RAM (com a lei de retornos decrescentes entrando em vigor em alguns é claro.) Estou completamente errado na minha compreensão do bs=parâmetro?

@ user3439894 Pensei nisso, não deveria precisar do MBR se estiver usando um gerenciador de inicialização diferente, mas negligenciei a partição Reservada pelo Sistema. O problema aqui é que eu já tenho 4 partições no disco rígido ... Eu esqueço o que é a partição 0 (não está na frente do meu mac), a partição 1 é o Mac, a partição 2 é a partição de recuperação do mac e a partição 3 é a única Eu fiz para janelas. Talvez eu esteja lidando com tudo errado ... O campo de treinamento se transformou em um pesadelo, teria sido bom se apenas capturasse minha imagem e fizesse o trabalho por mim, mas eu discordo.

DeeJayh
fonte
1
O bs está completamente errado. Deve ser 512. Usar 65535 ignora os primeiros 206848x65535 bytes da imagem! Use uma contagem de (41734144 -206848) -> dd if=WINDOWS7.img of=/dev/disk0s4 skip=206848 bs=512 count=41527296Crie também um tamanho adequado (41527296x512 bytes) e corrija a partição marcada disk0s4 com o gpt primeiro. E faça um backup primeiro!
klanomath
1
Qual é o modelo / ano do seu Mac? O "Software de suporte do Boot Camp" foi copiado corretamente para a chave USB? Quanto ao procedimento acima, você está irremediavelmente perdido. Virtualmente, cada passo que você deu tem uma falha. Além disso, você deixou de fora mais etapas do que as incluídas na sua pergunta postada.
David Anderson
Além disso: embora meu comentário possa responder à sua pergunta corretamente, não posso garantir que você obtenha o resultado desejado: uma partição inicializável "Windows 7 ready to go"!
klanomath
@DeeJayh, mesmo com o ddcomando corrigido pelo klanomath, o Windows 7 não funcionará, pois faltam as informações necessárias para inicializar na partição que você está pulando no arquivo WINDOWS7.img. Sugiro corrigir o problema original que o enviou nesse caminho complicado, para começar!
user3439894
@ALL Pergunta atualizada com uma edição
DeeJayh

Respostas:

0

O comando apropriado para dduma parte de um arquivo bruto para uma partição no seu caso é:

dd if=WINDOWS7.img of=/dev/disk0s4 skip=206848 bs=512 count=41527296

O bs no ddcomando pode ser interpretado como um tamanho de bloco artificial da entrada e do "arquivo" de saída. Por razões históricas e técnicas, o tamanho padrão do bloco ddé 512 Byte.

O motivo para usar 512 (ou um número inteiro apropriado ^ 2 múltiplo / divisor) como bs é o tamanho do bloco da sua imagem e a partição disk0s4 - que é 512 ou 4096.

O tamanho (lógico) do bloco do disco0 pode ser calculado (mesmo sem saber se o fdisk funciona com 512 ou 4096 bytes internamente): 977105060 * 512 = 500 GB ou 977105060 * 4096 = 4 TB. Um SSD de 4 TB ainda não existe para os MacBook Pro; portanto, o tamanho do bloco deve ser de 512 bytes. O mesmo é válido para o seu arquivo img.

Agora você pode levar em consideração os motivos de velocidade: quanto maior o bs , mais rápido a imagem será copiada.

Portanto, um comando dd válido no seu caso pode ser:

dd if=WINDOWS7.img of=/dev/disk0s4 skip=X bs=2 count=Y

Como bs é apenas 2 bytes, é necessário modificar pular (ignora os blocos X à bs de if) e contar (os blocos Y à bs são "gravados"). Como pular é 206848 * 512, X é 206848 * 512/2 e a contagem é 41527296 * 512, Y é 41527296 * 512/2 e o comando acima é:

dd if=WINDOWS7.img of=/dev/disk0s4 skip=52953088 bs=2 count=10630987776

Um teste rápido revela:

dd if=/dev/zero of=~/Desktop/output.file bs=1 count=1048576
1048576 bytes transferred in 1.593527 secs (658022 bytes/sec)
dd if=/dev/zero of=~/Desktop/output.file bs=2 count=524288
1048576 bytes transferred in 0.800444 secs (1309993 bytes/sec)
dd if=/dev/zero of=~/Desktop/output.file bs=4 count=262144
1048576 bytes transferred in 0.384188 secs (2729331 bytes/sec)
dd if=/dev/zero of=~/Desktop/output.file bs=1024 count=1024
1048576 bytes transferred in 0.001932 secs (542700705 bytes/sec)

Quanto maior o bs , mais rápido o ddcomando é executado.

Entre: O maior bstrabalho para você é 1048576 (o maior divisor comum) porque 105906176 (= ignorar tamanho em byte) / 1048576 = 101 (e 21261975552 (= número de contagem em bytes) / 1048576 = 20277). 101 é primo!


Até agora, todos os valores de bs são múltiplos de 2. Se bs for desigual, isso poderá colidir com os tamanhos (bloco) de se / de . Pelo menos no seu caso, se e de tamanho de Byte, mesmo porque são múltiplos de 512.

Agora deve ser óbvio por que o uso de bs = 65535 falha: os números de bloco pular e contar são determinados por bs e não pelo tamanho natural do bloco da sua imagem ou partição. Um comando apropriado pode ser

dd if=WINDOWS7.img of=/dev/disk0s4 skip=1616.024... bs=65535 count=324436.950...

Pelo menos para mim, isso falha porque 1616.024 ... é um valor numérico ilegal. Portanto, pode-se supor que todos os números devem ser valores inteiros!

Um bs de 65535 funciona apenas se o tamanho total de if / of e qualquer "limite" de pular ou procurar for múltiplo de 65535 Byte.

Se o seu ddcomando não contém nenhuma parte pular / procurar / contar, você pode usar tamanhos arbitrários de bs.


Embora o ddcomando no início da resposta funcione, você provavelmente não poderá inicializar na partição Windows To Go (ou Windows Installer Ready-To-Go?). O MBR do disco 0 não conterá a entrada de inicialização necessária.

Klanomath
fonte
Surpreendente, essa não é a solução para o meu problema, mas é a resposta para a pergunta que eu fiz tecnicamente. Esta provavelmente será minha escolha para melhor resposta. Muito obrigado por esclarecer! Eu realmente tenho um entendimento melhor agora e prevejo que me ajude no futuro!
DeeJayh
Eu já o selecionei como melhor resposta. Você poderia esclarecer o último parágrafo com uma solução? Você diz "O MBR do disco 0 não conterá a entrada de inicialização necessária". mas eu não poderia simplesmente instalar algo como o GRUB2 nesse ponto e estar em funcionamento? Mais uma vez obrigado pela resposta incrível!
DeeJayh
@DeeJayh David Anderson fornece muitas excelentes respostas para o tópico. Na minha configuração (em casa), não consigo instalar o Windows 7 (e o Bootcamp não permite a instalação do Windows em uma VM do Parallels OS X porque ela trava), por isso não posso responder a pergunta corretamente. Você pode ficar bem instalando o rEFInd.
klanomath
Quando @DeeJayh instalou o Windows no VirtualBox, ele escolheu o particionamento padrão. Por padrão, o Windows cria duas partições. (O Assistente do Boot Camp cria uma única partição que funciona, mas não é a configuração padrão.) A primeira partição é o menor volume NTFS "Reservado pelo Sistema". Esta é a partição ativa que contém todo o código necessário para inicializar o Windows. Isso inclui o Volume Boot Record (VBR) e os arquivos de inicialização ocultos do sistema, incluindo o arquivo BCD. O ddcomando está pulando todo esse software necessário. A instalação do rEFInd não solucionará esta situação.
David Anderson
@DeeJayh Provavelmente o melhor é fazer uma segunda pergunta para resolver o seu problema real.
klanomath