Onde posso aprender mais sobre como usar o comando GRUB `ntldr` (módulo?)


16

Eu tropecei recentemente no ntldrmódulo GRUB .

Aparentemente, uma das coisas para as quais ele pode ser usado é uma alternativa chainloaderpara inicializar as versões NT> = 6.0 do Windows, como no exemplo abaixo. (Muito útil se o registro de inicialização por volume de uma partição do Windows estiver 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? Eu não o vi listado quando procurei na versão HTML do manual GNU GRUB .


Respondendo à resposta de ckhan

Muito obrigado! Eu tinha decidido que precisaria tentar pesquisar o código-fonte para aprender mais sobre o ntldrcomando / módulo do GRUB . Mas você fez um trabalho muito melhor do que eu faria.

Nunca me ocorreu 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 que pode ser muito útil no futuro. Obrigado por mencionar.

Minha opinião sobre o ntldrsuporte ao GRUB

  1. Embora não tenha muita certeza do quanto a distinção significa, ntldré um módulo, não um comando. Ou talvez um comando carregado dinamicamente, se desejar.

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

    Aparentemente, o GRUB implementa muitas funções que você pode pensar serem " comandos " como módulos. A única diferença de uso que eu tenho conhecimento é que, antes de usar um módulo, é necessário garantir que ele tenha sido carregado com o comando insmod ntldr.

    Além: Sempre me perguntei por que o GRUB não suporta reboot. Acontece que o comando existe, mas é um módulo. Se rebootretornar unknown command, entãoinsmod rebootpermite ao GRUB "lembrar" o rebootcomando.

    Além: Quando e por que o GRUB pode " descarregar " um módulo, ainda não tenho idéia. Talvez seja o resultado de algo semelhante à " coleta de lixo "? Percebi que, uma vez carregados, os módulos parecem persistir, mesmo depois que um sistema é desligado e reiniciado. Obviamente, você não pode depender disso, mas parece que é assim que geralmente funciona na prática.
  2. É interessante que eles baseados ntldrem chainloader. Eu não olhei para o chainloader.ccódigo. Eu acho que provavelmente também faz uma realocação de carga no modo real de 16 bits da Intel ?

    Eu estou bastante feliz que eles não implementou ntldrcomo uma opção de chainloader. Eu concordo com o Vladimir. Quaisquer que sejam as semelhanças ocultas, a sintaxe de uso é muito diferente. A abordagem atual é menos exigente.
  3. Também é interessante ver a aparente falta de entusiasmo em adicionar este comando ao GRUB. Aparentemente, os desenvolvedores do GRUB acharam que o dano ao Registro de Inicialização da Partição do Windows (PBR) era extremamente improvável. No entanto, posso esboçar como fazê-lo durante uma instalação comum o suficiente.

    Comece assumindo 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 desejam instalar o GRUB. Por razões que não consigo adivinhar, algumas delas 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 inicia. Em vez de tentar iniciar o Windows com o GRUB, apenas exibe novamente o menu do GRUB?

    Por quê? Bem, aparentemente quando eles decidiram 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 pelo PBR do GRUB. Portanto chainloader +1, não carrega em cadeia um carregador de inicialização do Windows, mas recarrega o GRUB.

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

Gostaria de saber quais gerenciadores de inicialização, exceto os do Windows, ntldre bootmgro ntldrcomando GRUB pode ser capaz de carregar?


11
Coisas boas! Eu realmente acho que você deve deixar uma linha na lista de discussão do grub-devel e pedir que eles dêem uma olhada nessa pergunta e talvez participem de algumas das perguntas não respondidas e / ou corrijam algumas de nossas suposições. Obrigado por abrir a pergunta em primeiro lugar!
Ckhan 14/05

Respostas:


14

Pesquisando o recurso não documentado

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

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

  • A fonte no Savannah git repo mostra que foi incorporada pela linha principal em agosto de 2010.

  • O ramo fonte parece não existir mais, mas você ainda pode vê-lo existir no início daquele ano , em abril de 2010. O comentário do check-in, de "Vladimir 'phcoder' Serbinenko", foi

    ntldr support. (based on information from nyu but no code from him)
    

É baseado muito de perto no chainloadercomando, 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 os arquivos de correspondência. Você pode ver onde os desenvolvedores discutiram sobre a adição desse recurso um ano antes na lista de discussão do grub-devel :

Alguns trechos relevantes desse segmento:

Robert Millan Este patch implementa um carregador para a semântica de inicialização NTLDR (que são iguais no BootMGR, portanto, ambos são suportados)

Robert Millan Se queremos esse recurso, acho que deve ser uma opção no carregador de cadeias e não um comando independente. É quase o mesmo que o carregador de cadeias, na verdade, a única diferença é que o ntldr é carregado após o PBR pelo GRUB, e não pelo próprio PBR.

Vladimir Serbinenko Eu não acho que tenha problema, já que o ntldr usa esse PBR apenas como superbloco para identificar a partição. Como tal, prefiro considerar esse carregamento como um caso especial de passar $ root, apenas a forma é um pouco estranha

Yves Blusseau Sobre o comando, acho que será mais simples para o usuário se tivermos apenas um comando: chainloader (como no grub4dos) que tentará detectar o tipo do carregador de inicialização. Esta é apenas a minha opinião pessoal.

Vladimir Serbinenko Não concordo com isso. chainloader e ntldr não compartilham a mesma sintaxe: o chainloader espera um setor de inicialização, enquanto o ntldr espera um arquivo ntldr ou bootmgr. O GRUB2 é feito para romper com más decisões de design do GRUB1, sendo uma delas o comando "kernel". O GRUB4DOS segue o GRUB1 sobre esse assunto.

Robert Millan Tudo bem. Vamos torná-lo um comando separado. Eu acho que ainda deve compartilhar código com o chainloader.c (com alguns ifdefs).

Respondendo sua pergunta

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

  • É baseado no carregador de corrente.

  • É preciso um único argumento: o arquivo a ser aberto.

  • Evita o registro de inicialização da partição: para evitar a corrupção lá. Veja este post detalhando como eles testaram isso.

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

Espero que isso tenha sido útil!

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.