Où puis-je en savoir plus sur l'utilisation de la commande GRUB `ntldr` (module?)

16

Je suis récemment tombé sur le ntldrmodule GRUB .

Apparemment, l'une des choses pour lesquelles il peut être utilisé est une alternative chainloaderau démarrage des versions NT> = 6.0 de Windows, comme dans l'exemple ci-dessous. (Très pratique si l'enregistrement de démarrage de volume pour une partition Windows est, euh, corrompu.)

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
}

Où puis-je en savoir plus sur l'utilisation de cette directive de démarrage? Je ne l'ai pas vu répertorié lorsque j'ai regardé dans la version HTML du manuel GNU GRUB .


En réponse à la réponse de ckhan

Merci beaucoup! J'avais à peu près décidé que je devrais essayer de fouiller dans le code source pour en savoir plus sur la ntldrcommande / module GRUB . Mais vous avez fait un bien meilleur travail que moi.

Il ne m'était jamais venu à l'esprit de consulter les archives des e-mails pour voir quelles discussions de conception la personne qui avait écrit le code aurait pu avoir. Cette méthode semble pouvoir être très utile à l'avenir. Merci de l'avoir mentionné.

Mes réflexions sur le ntldrsupport GRUB

  1. Bien que je ne sois pas vraiment sûr de la signification de la distinction, ntldrc'est un module, pas une commande. Ou peut-être une commande chargée dynamiquement si vous le souhaitez.

    En suivant votre lien de code source et en regardant les lignes 152 ( GRUB_MOD_INIT) et 159 ( GRUB_MOD_FINI), vous pouvez voir le code à charger et ... je suppose ... décharger le module.

    GRUB implémente apparemment de nombreuses fonctions que vous pourriez penser être des " commandes " en tant que modules. La seule différence d'utilisation à ma connaissance est qu'avant d'utiliser un module, il faut s'assurer qu'il a été chargé avec la commande insmod ntldr.

    En plus: je me suis toujours demandé pourquoi GRUB ne supporte pas reboot. Il s'avère que la commande existe, mais c'est un module. Si rebootrevient unknown command, alorsinsmod rebootpermet à GRUB de "mémoriser" la rebootcommande.

    En plus: Quand et pourquoi GRUB pourrait " décharger " un module, je n'en ai pas encore la moindre idée. C'est peut-être le résultat de quelque chose de similaire à la " collecte des ordures " ?? J'ai remarqué qu'une fois chargés, les modules semblent persister, même après la mise hors tension et le redémarrage d'un système. Bien sûr, vous ne pouvez pas dépendre de cela, mais cela semble être la façon dont cela fonctionne souvent dans la pratique.
  2. Il est intéressant qu'ils se soient basés ntldrsur chainloader. Je n'ai pas regardé le chainloader.ccode. Je suppose qu'il fait probablement aussi une relocalisation de la charge en mode réel Intel 16 bits ?

    Je suis plutôt content qu'ils n'aient pas mis ntldren œuvre en option chainloader. Je suis d'accord avec Vladimir. Quelles que soient les similitudes sous les couvertures, la syntaxe d'utilisation est très différente. L'approche actuelle est moins délicate.
  3. Il est également intéressant de voir le manque apparent d'enthousiasme pour l'ajout de cette commande à GRUB. Apparemment, les développeurs de GRUB pensaient que des dommages au PBR ( Windows Partition Boot Record) étaient extrêmement improbables. Cependant, je peux esquisser comment le faire lors d'une installation assez ordinaire.

    Commencez par supposer qu'un utilisateur a installé Windows sur son système. Ils installent désormais Ubuntu (12.04 LTS) " aux côtés " de Windows. À un moment donné lors de l'installation d'Ubuntu, ils peuvent apparemment décider où ils souhaitent installer GRUB. Pour des raisons que je ne peux pas deviner, certains d'entre eux décident d'installer GRUB dans la partition dans laquelle Windows est installé.

    L'installation est terminée et ils peuvent démarrer Ubuntu avec succès. Toutefois, lorsqu'ils essaient de démarrer Windows en sélectionnant l'entrée dans le menu GRUB, Windows ne démarre pas . Au lieu de cela, essayer de démarrer Windows avec GRUB ré-affiche simplement le menu GRUB?

    Pourquoi? Eh bien, apparemment, quand ils ont choisi d'installer GRUB dans la partition Windows, ce qui s'est réellement passé, c'est que le PBR pour la partition Windows a été remplacé par le PBR de GRUB. Donc, chainloader +1ne charge pas en chaîne un chargeur de démarrage Windows, mais recharge à la place GRUB.

    IMO, le moyen rapide le plus sûr pour permettre à un utilisateur de démarrer Windows dans cette situation est d'utiliser le nouveau GRUB ntldr. Je me demande si cela pourrait intéresser les développeurs. J'espère qu'ils n'ont pas anticipé ce scénario.

Je me demande quels chargeurs de démarrage autres que ceux de Windows ntldret bootmgrla ntldrcommande GRUB pourrait être capable de charger?

irrationnel John
la source
1
Super truc! Je pense vraiment que vous devriez laisser une ligne sur la liste de diffusion grub-devel et leur demander de jeter un coup d'œil à cette question et peut-être de répondre à certaines des questions sans réponse et / ou de corriger certaines de nos hypothèses. Merci d'avoir ouvert la question en premier!
ckhan

Réponses:

14

Recherche de la fonctionnalité non documentée

Vous avez raison, la ntldrcommande (c'est la commande, pas le module) n'est pas documentée. C'est donc une excellente excuse pour certaines aventures en archéologie du code .

Chaque fois que je trouve une fonctionnalité non documentée, la première chose à faire est de vérifier les sources.

  • La source du dépôt git Savannah montre qu'il a été fusionné dans la ligne principale en août 2010.

  • La branche source ne semble plus, mais vous pouvez toujours voir qu'elle a vu le jour plus tôt cette année , en avril 2010. Le commentaire d'enregistrement, de "Vladimir 'phcoder' Serbinenko" était

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

Il est basé très étroitement sur la chainloadercommande, à tel point que le nom de fichier dans le commentaire d'en-tête n'a toujours pas été mis à jour.

Maintenant que nous avons un enregistrement exact et un nom, nous pouvons vérifier les archives de mailing. Vous pouvez voir où les développeurs ont discuté de l'ajout de cette fonctionnalité un an plus tôt sur la liste de diffusion grub-devel :

Quelques extraits pertinents de ce fil:

Robert Millan Ce correctif implémente un chargeur pour la sémantique de démarrage NTLDR (qui sont les mêmes dans BootMGR, donc les deux sont pris en charge)

Robert Millan Si nous voulons cette fonctionnalité, je pense que ce devrait être une option dans le chargeur de chaîne plutôt qu'une commande autonome. C'est presque la même chose que le chargeur de chaîne, la seule différence est que ntldr est chargé après PBR par GRUB plutôt que par PBR lui-même.

Vladimir Serbinenko Je ne pense pas que ce soit un problème puisque ntldr utilise ce PBR uniquement comme superbloc pour identifier la partition. En tant que tel, je préférerais considérer ce chargement comme un cas spécial de passage de $ root, juste la forme est un peu bizarre

Yves Blusseau A propos de la commande, je pense que ce sera plus simple pour l'utilisateur si nous n'avons qu'une seule commande: chainloader (comme dans grub4dos) qui va essayer de détecter le type du bootloader. Ce n'est que mon opinion personnelle.

Vladimir Serbinenko Je ne suis pas d'accord avec cela. chainloader et ntldr ne partagent pas la même syntaxe: chainloader attend un secteur de démarrage tandis que ntldr attend un fichier ntldr ou bootmgr. GRUB2 est fait pour rompre avec les mauvaises décisions de conception de GRUB1, l'une d'entre elles étant la commande "noyau". GRUB4DOS suit GRUB1 sur ce sujet.

Robert Millan Très bien. Faisons-en une commande distincte. Je pense qu'il devrait quand même partager du code avec chainloader.c (avec certains ifdefs).

Répondre à votre question

Après avoir réfléchi à tout cela, que savons-nous de la façon dont il peut être utilisé?

  • Il est basé sur un chargeur de chaîne.

  • Il faut un seul argument: le fichier à ouvrir.

  • Il évite l'enregistrement de démarrage de la partition: il peut donc contourner la corruption. Voir cet article détaillant comment ils ont testé cela.

  • C'est seulement environ 160 lignes de code , vous pouvez voir qu'il n'y a pas grand-chose d'autre.

J'espère que cela a été utile!

ckhan
la source