Como obter o grub1 para funcionar com o GPT

1

Estou tentando fazer com que o grub1 trabalhe com o GPT. Atualmente em uma máquina virtual, como uma etapa de teste antes de migrar uma máquina real.

Eu criei uma partição para /boot e outra diferente onde gostaria de incorporar o grub stage1.5. Isso é o que o gdisk exibe para a tabela de partições GPT:

Number  Start (sector)    End (sector) Size        Code  Name
   1             2048           104447 50.0 MiB    8300  boot
   2           104448           206847 50.0 MiB    EF00  EFI
   3           206848         16984063 8.0 GiB     8E00  
   4             1024             2047 512.0 KiB   EF02  GRUB1

Não se preocupe com a partição EFI, não é usado neste cenário. É só que pretendo atualizar mais tarde o sistema para o UEFI (eu sei, dizendo adeus ao grub1), e quero criar a partição antes.

Agora, como o grub1 não entende o GPT, criei um MBR híbrido, que consiste na 1ª e 4ª partições. Isto é o que o gdisk diz sobre o MBR híbrido:

   Number  Boot  Start Sector   End Sector   Status      Code
   1                        1         1023   primary     0xEE
   2         *           2048       104447   primary     0x83
   3                     1024         2047   primary     0xEF
   4                   104448     20971519   primary     0xEE

Minha intenção é colocar o stage1.5 na pequena partição abaixo de 1MB e ter uma partição de inicialização real (com stage2, configuração do grub e imagem do kernel) na partição boot (GPT 1 / MBR 2). No entanto, não consigo arranjar o grub para instalar o palco.

Ao executar grub , o comando find /grub/menu.lst me mostra (hd0,0) , então parece que está usando o layout da partição dos kernels em execução, onde a partição incorporada seria (hd0,3) . No entanto, dar root (hd0,3) me dá

Filesystem type unknown, partition type 0x83

O tipo de sistema de arquivos não é uma surpresa, já que a partição está vazia, mas eu configurei o tipo de partição e ela não é visível.

Quando tento incorporar o stage1.5 na partição (usando embed (hd0,0)/grub/e2fs_stage1_5 (hd0,3) , recebo um erro:

Error 17: Cannot mount selected partition

Eu tentei criar reiserfs3 nessa partição (como reiserfs3 tem 16KB de espaço para incorporar o bootloader), mas o erro é idêntico. No entanto, o FS que criei é um não padrão, com o diário em um dispositivo separado, pois 512 KB não é suficiente para criar um normal.

Eu verifiquei que (hd0,3) é a unidade correta, pois escrever algo no primeiro setor da partição e executar cat (hd0,3)+1 no grub shell me dá a saída esperada.

Alguma outra opção sobre como fazer isso funcionar? Estou pensando em incorporar manualmente o stage1.5 na partição selecionada ( cat /boot/grub/e2fs_stage1_5 > /dev/sda4 ), modificando-o corretamente (eu acho que é apenas a lista de bloqueio no primeiro setor e a localização do estágio2 no segundo setor) e de lá, mas eu gostaria de fazer isso funcionar corretamente.

A versão que estou usando é sys-boot / grub-0.97-r18 do Gentoo.

    
por Torinthiel 28.10.2018 / 13:18

1 resposta

1

Acabou sendo mais fácil e mais difícil do que o previsto.

Primeiro, o Gentoo (assim como muitas outras distros, até onde eu sei), corrigiu o Grub para poder ler o GPT, assim, todo o incômodo com o MBR híbrido não é necessário, ele funciona com o GPT puro.

É mais fácil, porque o padrão setup (hd0,0) funciona, como em 'faz um sistema inicializável'. No entanto, o sistema não é robusto o suficiente para os meus padrões - porque setup não pode incorporar o stage1.5 em nenhum lugar, ele recorre ao patch2 e inclui sua localização no disco em MBR. Então, se alguma coisa mudar o cenário2, alterando os blocos onde estava anteriormente, obtenho um sistema não inicializável. O que é pior, eu posso não notar primeiro - um upgrade move o stage2 para um local diferente, mas o antigo permanece intacto. O sistema ainda inicializa, não noto nada. Mas desde que o código usado durante a inicialização é agora o espaço livre do POV do sistema de arquivos, algo mais tarde substitui-lo aleatoriamente e boom.

Então, recorri aos passos descritos no final da minha pergunta, incorporando manualmente o estágio 1.5.

Primeiro, faça uma cópia do arquivo stage1.5 apropriado e ative um editor hexadecimal nessa cópia. Caso você não tenha um à mão, obtive sucesso com vim e xxd - edite o arquivo, digite :!xxd<enter> edite o arquivo como hexadecimal, digite :!xxd -r<enter> e salve. O arquivo recebe um avanço de linha extra no final, mas é inofensivo. Observe que, neste caso, a parte ASCII à direita é completamente ignorada, apenas os dígitos hexadecimais são usados. Você precisa editar 3 coisas neste arquivo:

  • Coloque o número de bloco do bloco segundo em que o estágio1.5 será incorporado, no deslocamento 0xf8 . Note que é little-endian e relativo ao início do disco. Como a partição de inicialização do BIOS inicia no setor 1024, isso é 1025, ou 0x0401 ou (em little-endian) bytes 0104 .
  • Insira o número de setores de 512 bytes do estágio1.5, menos um, no deslocamento 0x1fc . Como meu stage1.5 é 9908 bytes (9909 com a nova linha extra), são 20 setores (como 19 setores é 19*512=9728 e 20 setores é 10240 bytes, então eu preciso colocar 19, ou hex 13 lá. / li>
  • Altere ff no deslocamento 219 para 00 . Não toque no ff nas proximidades.

Aqui está uma comparação dos arquivos originais e modificados do hexdump:

-000001f0  00 00 00 00 00 00 00 00  02 00 00 00 00 00 20 02  |.............. .|
+000001f0  00 00 00 00 00 00 00 00  01 04 00 00 13 00 20 02  |.............. .|
 00000200  ea 70 22 00 00 00 03 02  ff ff ff 00 00 00 00 00  |.p".............|
-00000210  02 00 30 2e 39 37 00 ff  ff ff ff 2f 62 6f 6f 74  |..0.97...../boot|
+00000210  02 00 30 2e 39 37 00 ff  ff 00 ff 2f 62 6f 6f 74  |..0.97...../boot|

A maneira como isso funciona é que o primeiro setor do estágio1.5 lê os números de perto do fim e lê muitos setores, começando de um especificado a partir do início do disco. Isso carrega os demais setores do stage1.5 para a memória e depois os executa. A terceira parte é na verdade uma localização do stage2 no disco, onde o grub precisa encontrar a partição correta. O código relevante, caso esteja interessado, está em stage2/disk_io.c nas fontes do grub, apenas tenha em mente que você usa a parte em #ifdef STAGE1_5 , e o primeiro setor, que carrega o restante, está em stage2/start.S . Provavelmente é possível ter o stage1.5 em várias partes não contínuas, mas eu não tentei.

Depois de escrever o estágio modificado1.5, copie-o para a partição de destino (o quarto no meu exemplo), usando cat ou dd , de acordo com sua preferência.

Finalmente, no shell do grub, execute

install /boot/grub/stage1 (hd0) (hd0)1024+20

com (hd0) sendo o nome do grub do dispositivo que você está usando, 1024 é o início do stage1.5 incorporado (aliás, início da partição de inicialização do BIOS) e 20 é o tamanho do stage1. 5 em blocos. Isso conclui o procedimento.

    
por 20.11.2018 / 00:04