Wo kann ich mehr über die Verwendung des GRUB-Befehls "ntldr" (Modul) erfahren?

16

Ich bin kürzlich über das GRUB- ntldrModul gestolpert .

Anscheinend kann es als Alternative zum chainloaderBooten der NT> = 6.0-Versionen von Windows wie im folgenden Beispiel verwendet werden. (Sehr praktisch, wenn der Volume Boot Record für eine Windows-Partition beschädigt ist.)

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
}

Wo kann ich mehr darüber erfahren, wie diese Boot-Direktive verwendet werden kann? Ich sah es nicht aufgelistet, als ich in der HTML-Version des GNU GRUB-Handbuchs nachgesehen habe .


Antwort auf die Antwort von ckhan

Vielen Dank! Ich hatte so ziemlich beschlossen, dass ich versuchen müsste, den Quellcode zu durchsuchen, um mehr über den GRUB- ntldrBefehl / das GRUB- Modul zu erfahren . Aber Sie haben einen viel besseren Job gemacht als ich.

Es wäre mir nie in den Sinn gekommen, in den E-Mail-Archiven nachzuschauen, welche Designdiskussionen die Person, die den Code geschrieben hat, möglicherweise geführt hat. Diese Methode scheint in Zukunft sehr hilfreich zu sein. Danke, dass du es erwähnt hast.

Meine Gedanken zur GRUB- ntldrUnterstützung

  1. Ich bin mir zwar nicht sicher, wie viel die Unterscheidung bedeutet, ntldrist aber ein Modul, kein Befehl. Oder vielleicht ein dynamisch geladener Befehl, wenn Sie möchten.

    Wenn Sie Ihrem Quellcode-Link folgen und die Zeilen 152 ( GRUB_MOD_INIT) und 159 ( GRUB_MOD_FINI) betrachten, können Sie den zu ladenden Code sehen und ... Ich vermute ... das Modul entladen.

    GRUB implementiert anscheinend viele Funktionen, die Sie für " Befehle " halten, als Module. Der einzige mir bekannte Unterschied in der Verwendung besteht darin, dass vor der Verwendung eines Moduls sichergestellt werden muss, dass es mit dem Befehl geladen wurde insmod ntldr.

    Nebenbei: Ich habe mich immer gefragt, warum GRUB nicht unterstützt reboot. Es stellt sich heraus, dass der Befehl existiert, aber es ist ein Modul. Wenn rebootzurückkommt unknown command, danninsmod rebootErmöglicht GRUB, sich den rebootBefehl zu "merken" .

    Nebenbei: Wann und warum GRUB ein Modul " entladen " könnte, weiß ich noch nicht. Vielleicht ist es das Ergebnis von etwas ähnlichem wie " Müllabfuhr "? Ich habe festgestellt, dass die Module nach dem Laden scheinbar bestehen bleiben, auch nachdem ein System heruntergefahren und neu gestartet wurde. Natürlich können Sie nicht hängen auf das, aber das zu sein scheint , wie es funktioniert in der Praxis häufig.
  2. Es ist interessant , dass sie basierend ntldrauf chainloader. Ich habe den chainloader.cCode nicht angeschaut . Ich vermute, es macht wahrscheinlich auch eine Verlagerung der Last im Intel 16-Bit Real- Modus?

    Ich bin eher froh, dass sie nicht ntldrals Option implementiert wurden chainloader. Ich stimme Vladimir zu. Unabhängig von den Ähnlichkeiten unter den Deckungen ist die Verwendungssyntax sehr unterschiedlich. Der derzeitige Ansatz ist weniger klug.
  3. Es ist auch interessant zu sehen, dass GRUB anscheinend nicht begeistert ist, diesen Befehl hinzuzufügen. Anscheinend hielten die GRUB-Entwickler eine Beschädigung des Windows Partition Boot Record (PBR) für äußerst unwahrscheinlich. Ich kann jedoch skizzieren, wie dies bei einer normalen Installation zu tun ist.

    Beginnen Sie damit, dass ein Benutzer Windows auf seinem System installiert hat. Sie installieren nun Ubuntu (12.04 LTS) " neben " Windows. An einem Punkt während der Ubuntu-Installation können sie offenbar entscheiden, wo GRUB installiert werden soll. Aus Gründen, die ich nicht erraten kann, entscheiden sich einige von ihnen, GRUB auf der Partition zu installieren, auf der Windows installiert ist.

    Die Installation ist abgeschlossen und sie können Ubuntu erfolgreich starten. Wenn sie jedoch versuchen, Windows durch Auswahl des Eintrags im GRUB-Menü zu starten, wird Windows nicht gestartet. Wenn Sie stattdessen versuchen, Windows mit GRUB zu starten, wird das GRUB-Menü erneut angezeigt?

    Warum? Nun, anscheinend, als sie sich entschieden, GRUB in die Windows-Partition zu installieren, war ein Teil dessen, was tatsächlich passierte, die PBR für die Windows-Partition, die mit der PBR von GRUB überschrieben wurde. Lädt chainloader +1also keinen Windows-Bootloader in einer Kette, sondern lädt stattdessen GRUB neu.

    IMO, der sicherste schnelle Weg , um einen Benutzer zu starten Sie Windows in dieser Situation zu ermöglichen , ist den GRUBs neu zu verwenden ntldr. Ich frage mich, ob dies für die Entwickler von Interesse wäre. Ich gehe davon aus, dass sie dieses Szenario nicht antizipiert haben.

Ich frage mich, welche anderen Bootloader als die Windows-Bootloader ntldrund bootmgrder GRUB- ntldrBefehl möglicherweise geladen werden können.

irrational John
quelle
1
Tolles Zeug! Ich denke wirklich, du solltest eine Zeile in die Grub-Devel-Mailingliste schreiben und sie bitten, einen Blick auf diese Frage zu werfen und vielleicht einige der unbeantworteten Fragen zu beantworten und / oder einige unserer Annahmen zu korrigieren. Vielen Dank, dass Sie die Frage überhaupt erst geöffnet haben!
Ckhan

Antworten:

14

Erforschung der undokumentierten Funktion

Sie haben Recht, der ntldrBefehl (es ist Befehl, nicht Modul) ist nicht dokumentiert. Es ist also eine gute Entschuldigung für einige Abenteuer in der Code-Archäologie .

Wann immer ich ein undokumentiertes Feature finde, überprüfe ich zuerst die Quellen.

  • Aus der Quelle des Savannah Bazaar Repo geht hervor , dass es im August 2010 in die Hauptlinie eingegliedert wurde.

  • Wenn Sie zurück zum Quell-Zweig gehen, können Sie sehen, dass er Anfang des Jahres , im April 2010, entstanden ist. Der Check-in-Kommentar von "Vladimir 'phcoder' Serbinenko" lautete

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

Es basiert sehr stark auf dem chainloaderBefehl, sodass der Dateiname im Kopfkommentar noch nicht aktualisiert wurde.

Nachdem wir einen genauen Check-In und einen Namen haben, können wir die Mailing-Archive überprüfen. Sie können sehen, wo die Entwickler ein Jahr zuvor über das Hinzufügen dieser Funktion auf der Grub-Entwickler-Mailingliste diskutiert hatten :

Einige relevante Auszüge aus diesem Thread:

Robert Millan Dieser Patch implementiert einen Loader für die NTLDR-Boot-Semantik (die in BootMGR identisch sind, daher werden beide unterstützt).

Robert Millan Wenn wir dieses Feature überhaupt wollen, sollte es meiner Meinung nach eher eine Option im Chainloader als ein eigenständiger Befehl sein. Es ist fast das gleiche wie beim Kettenlader, der einzige Unterschied ist, dass ntldr nach PBR von GRUB anstatt von PBR selbst geladen wird.

Vladimir Serbinenko Ich denke, es ist kein Problem, da ntldr diesen PBR nur als Superblock verwendet, um die Partition zu identifizieren. Als solches würde ich dieses Laden eher als einen speziellen Fall des Übergebens von $ root betrachten, nur die Form davon ist ein bisschen seltsam

Yves Blusseau Über den Befehl denke ich, dass es für den Benutzer einfacher sein wird, wenn wir nur einen Befehl haben: chainloader (wie in grub4dos), der versucht, den Typ des Bootloaders zu erkennen. Dies ist nur meine persönliche Meinung.

Vladimir Serbinenko Dem stimme ich nicht zu. chainloader und ntldr haben nicht dieselbe Syntax: chainloader erwartet einen Bootsektor, während ntldr eine Datei ntldr ot bootmgr erwartet. GRUB2 wird ausgeführt, um mit schlechten Entwurfsentscheidungen von GRUB1 zu brechen, von denen einer der "Kernel" -Befehle ist. GRUB4DOS folgt GRUB1 zu diesem Thema.

Robert Millan In Ordnung. Machen wir einen separaten Befehl. Ich denke, es sollte trotzdem Code mit chainloader.c teilen (mit einigen ifdefs).

Beantwortung Ihrer Frage

Was wissen wir nach all dem Nachdenken darüber, wie es verwendet werden kann?

  • Es basiert auf Chainloader.

  • Es braucht ein einziges Argument: die zu öffnende Datei.

  • Der Partitionsstartdatensatz wird vermieden, sodass die Beschädigung dort umgangen werden kann. In diesem Beitrag erfahren Sie, wie sie das getestet haben.

  • Es sind nur etwa 160 Codezeilen , da ist nicht viel anderes zu sehen.

Hoffe das war nützlich!

ckhan
quelle