Onde posso aprender mais sobre como usar o comando GRUB 'ntldr' (module?)

16

Recentemente deparei com o módulo GRUB ntldr .

Aparentemente, uma das coisas para as quais ele pode ser usado é como uma alternativa ao chainloader para inicializar as versões NT > = 6.0 do Windows, como no exemplo abaixo. (Muito útil se o Volume Boot Record para uma partição do Windows estiver, uh, corrompido.)

menuentry "Windows 7 (bootmgr on /dev/sda1)" --class windows --class os {
    insmod part_msdos
    insmod ntfs
    insmod ntldr
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set=root 1EA0019AA0017A13
    ntldr ($root)/bootmgr
}

Onde posso aprender mais sobre como essa diretiva de inicialização pode ser usada? Não o vi listado quando procurei na versão HTML do manual do GNU GRUB .

Respondendo a resposta do ckhan

Muito obrigado! Eu tinha praticamente decidido que teria que tentar cavar o código-fonte para aprender mais sobre o comando / módulo GRUB ntldr . Mas você fez um trabalho muito melhor do que eu teria feito.

Nunca teria ocorrido a mim olhar os arquivos de e-mail para ver quais discussões de design a pessoa que escreveu o código poderia ter tido. Esse método parece ser muito útil no futuro. Obrigado por mencionar isso.

Meus pensamentos sobre o GRUB ntldr support

  1. Embora eu não saiba ao certo o quanto a distinção significa, ntldr é um módulo, não um comando. Ou talvez um comando carregado dinamicamente, se desejar.

    Seguindo seu link do código-fonte e olhando para as linhas 152 ( GRUB_MOD_INIT ) e 159 ( GRUB_MOD_FINI ) você pode ver o código para carregar e ... eu ' supondo ... descarregar o módulo.

    O GRUB aparentemente implementa muitas funções que você pode pensar que são " comandos " como módulos. A única diferença de uso que eu conheço é que antes de usar um módulo é preciso garantir que ele foi carregado com o comando insmod ntldr .

    Além de: Eu sempre me perguntei por que O GRUB não suporta reboot . Acontece que o comando existe, mas é um módulo. Se reboot retornar unknown command , insmod reboot permitirá que o GRUB "lembre" do comando reboot .

    Como: Quando e por que o GRUB pode " descarregar" "um módulo, não tenho ideia ainda. Talvez seja o resultado de algo semelhante a " coleta de lixo "? Tenho notado que, uma vez carregados, os módulos parecem persistir, mesmo depois que um sistema é desligado e reinicializado. É claro que você não pode depender disso, mas parece que isso funciona na prática.
  2. É interessante que eles basearam ntldr em chainloader . Eu não olhei para o código chainloader.c . Eu acho que provavelmente também faz uma carga de realocação no modo Intel de 16 bits real ?

    Eu estou contente que eles não implementaram ntldr como um opção de chainloader . Eu concordo com o Vladimir. Quaisquer que sejam as semelhanças nos bastidores, a sintaxe de uso é muito diferente. A abordagem atual é menos kludgy.
  3. Também é interessante ver a aparente falta de entusiasmo em adicionar esse comando ao GRUB. Aparentemente, os desenvolvedores do GRUB acharam que o dano ao Windows Partition Boot Record (PBR) era extremamente improvável. No entanto, posso esboçar como fazê-lo durante uma instalação bastante comum.

    Comece presumindo que um usuário tenha o Windows instalado em seu sistema. Eles agora instalam o Ubuntu (12.04 LTS) " ao lado do " Windows. Em um ponto durante a instalação do Ubuntu, eles aparentemente podem decidir onde querem que o GRUB seja instalado. Por razões que não posso começar a adivinhar, alguns deles decidem instalar o GRUB na partição em que o Windows está instalado.

    A instalação é concluída e eles podem iniciar com êxito o Ubuntu. No entanto, quando eles tentam iniciar o Windows selecionando a entrada no menu GRUB, o Windows não é iniciado. Em vez disso, tentar iniciar o Windows com o GRUB apenas exibe novamente o menu GRUB?

    Por que? Bem, aparentemente, quando eles optaram por instalar o GRUB na partição do Windows, parte do que realmente aconteceu foi que o PBR para a partição do Windows foi sobrescrito com o PBR do GRUB. Então, chainloader +1 não carrega em cadeia um gerenciador de inicialização do Windows, mas em vez disso carrega o GRUB.

    IMO, a maneira mais segura rápida para permitir que um usuário inicialize o Windows nessa situação é use o novo ntldr do GRUB. Gostaria de saber se isso seria de interesse para os desenvolvedores. Espero que eles não tenham antecipado esse cenário.

Gostaria de saber quais bootloaders além dos do Windows, ntldr e bootmgr , o comando GRUB ntldr pode carregar?

    
por irrational John 12.05.2012 / 02:05

1 resposta

13

Pesquisando o recurso não documentado

Você está certo, o comando ntldr (é o comando, não o módulo) não está documentado. Então é uma ótima desculpa para algumas aventuras em arqueologia de código .

Sempre que encontro um recurso não documentado, a primeira coisa a fazer é verificar as fontes.

Ele é baseado muito de perto no comando chainloader , tanto que o nome do arquivo no comentário do cabeçalho ainda não foi atualizado.

Agora que temos um check-in exato e um nome, podemos verificar a correspondência arquivos. Você pode ver onde os desenvolvedores tiveram a discussão sobre adicionando este recurso um ano antes no lista de discussão do grub-devel :

Alguns trechos relevantes desse tópico:

Robert Millan This patch implements a loader for NTLDR boot semantics (which are the same in BootMGR, hence both are supported)

Robert Millan If we want this feature at all, I think it should be an option in the chainloader rather than a standalone command. It's almost the same as the chainloader really, the only difference is that ntldr is load after PBR by GRUB instead of by PBR itself.

Vladimir Serbinenko I don't think it's of any problem since ntldr uses this PBR only as superblock to identify the partition. As such I would rather consider this loading as a special case of passing $root, just the form of it is a bit weird

Yves Blusseau About the command, i think that it will be simpler for the user if we have only one command: chainloader (like in grub4dos) that will try to detect the type of the bootloader. This is only my personal opinion.

Vladimir Serbinenko I don't agree with this. chainloader and ntldr don't share the same syntax: chainloader expects a bootsector whereas ntldr expects an ntldr ot bootmgr file. GRUB2 is done to break with bad design decisions of GRUB1 one of them being "kernel" command. GRUB4DOS follows GRUB1 on this subject.

Robert Millan Alright. Let's make it a separate command. I think it should still share code with chainloader.c though (with some ifdefs).

Respondendo sua pergunta

Depois de analisar tudo isso, o que sabemos sobre como ele pode ser usado?

  • Baseia-se no chainloader.

  • É necessário um único argumento: o arquivo a ser aberto.

  • Evita o registro de inicialização da partição: portanto, ele pode ignorar a corrupção. Veja esta postagem detalhando como eles testaram isso.

  • É apenas 160 linhas de código , você pode ver que não há muito mais lá.

Espero que isso tenha sido útil!

    
por 13.05.2012 / 07:04

Tags