Gdzie mogę dowiedzieć się więcej na temat korzystania z polecenia GRUB `ntldr` (moduł?)

16

Niedawno natknąłem się na ntldrmoduł GRUB .

Najwyraźniej jedną z rzeczy, których można użyć, jest alternatywa chainloaderdla rozruchu wersji Windows NT> = 6.0, jak w poniższym przykładzie. (Bardzo przydatny, jeśli rekord rozruchowy woluminu dla partycji Windows jest uszkodzony.)

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
}

Gdzie mogę dowiedzieć się więcej o tym, jak korzystać z tej dyrektywy rozruchowej? Nie widziałem go na liście, kiedy spojrzał w wersji HTML z podręcznika GNU GRUB .


Odpowiadanie na odpowiedź ckhan

Dziękuję Ci bardzo! W zasadzie zdecydowałem, że będę musiał przekopać się przez kod źródłowy, aby dowiedzieć się więcej o ntldrpoleceniu / module GRUB . Ale wykonałeś dużo lepszą robotę niż ja.

Nigdy nie przyszło mi do głowy, aby przejrzeć archiwa e-mail, aby zobaczyć, jakie dyskusje na temat projektu mogła mieć osoba, która napisała kod. Ta metoda wydaje się być bardzo pomocna w przyszłości. Dzięki, że o tym wspomniałeś.

Moje przemyślenia na temat ntldrwsparcia GRUB

  1. Chociaż nie jestem pewien, ile znaczy to rozróżnienie, ntldrto moduł, a nie polecenie. A może dynamicznie ładowane polecenie, jeśli chcesz.

    Podążając za linkiem do kodu źródłowego i patrząc na linie 152 ( GRUB_MOD_INIT) i 159 ( GRUB_MOD_FINI) możesz zobaczyć kod do załadowania i ... Zgaduję ... rozładuj moduł.

    GRUB najwyraźniej implementuje wiele funkcji, które możesz uważać za „ komendy ” jako moduły. Jedyną różnicą w użyciu, o której wiem, jest to, że przed użyciem modułu należy upewnić się, że został załadowany poleceniem insmod ntldr.

    Poza tym: zawsze zastanawiałem się, dlaczego GRUB nie obsługuje reboot. Okazuje się, że polecenie istnieje, ale jest to moduł. Jeśli rebootwróci unknown command, toinsmod rebootpozwala GRUB-owi „zapamiętać” rebootpolecenie.

    Poza tym: kiedy i dlaczego GRUB może „ rozładować ” moduł, nie mam jeszcze pojęcia. Może to wynik czegoś podobnego do „ wywozu śmieci ”? Zauważyłem, że po załadowaniu moduły wydają się utrzymywać, nawet po wyłączeniu i ponownym uruchomieniu systemu. Oczywiście nie możesz na tym polegać , ale wydaje się, że tak często działa w praktyce.
  2. Interesujące jest to, że opiera się ntldrna chainloader. Nie spojrzałem na chainloader.ckod. Wydaje mi się, że prawdopodobnie przenosi obciążenie w 16-bitowym trybie rzeczywistym Intel ?

    Ja jestem raczej zadowolony, że nie realizować ntldrjako opcją chainloader. Zgadzam się z Vladimirem. Niezależnie od podobieństw pod okładkami, składnia użycia jest zupełnie inna. Obecne podejście jest mniej nieprzyzwoite.
  3. Interesujący jest również widoczny brak entuzjazmu do dodawania tego polecenia do GRUB-a. Najwyraźniej programiści GRUB uznali, że uszkodzenie rekordu rozruchowego partycji systemu Windows (PBR) jest niezwykle mało prawdopodobne. Mogę jednak naszkicować, jak to zrobić podczas zwykłej instalacji.

    Zacznij od założenia, że ​​użytkownik ma zainstalowany system Windows w swoim systemie. Teraz instalują Ubuntu (12.04 LTS) „ obok ” systemu Windows. W pewnym momencie instalacji Ubuntu mogą najwyraźniej zdecydować, gdzie chcą zainstalować GRUB. Z powodów, których nie mogę się domyślić, niektórzy z nich decydują się zainstalować GRUB na partycji, na której jest zainstalowany system Windows.

    Instalacja jest zakończona i mogą z powodzeniem uruchomić Ubuntu. Jednak gdy próbują uruchomić system Windows, wybierając pozycję w menu GRUB, system Windows nie uruchamia się. Czy zamiast próby uruchomienia systemu Windows za pomocą GRUB, po prostu ponownie wyświetla menu GRUB?

    Dlaczego? Cóż, najwyraźniej kiedy zdecydowali się zainstalować GRUB na partycji Windows część tego, co faktycznie się wydarzyło, PBR dla partycji Windows został nadpisany przez PBR GRUB. Więc chainloader +1nie ładuje łańcucha bootloadera Windows, ale zamiast tego ładuje GRUB.

    IMO, najbezpieczniejszym szybkim sposobem, aby pozwolić użytkownikowi na uruchomienie systemu Windows w takiej sytuacji, jest użycie nowego GRUB-a ntldr. Zastanawiam się, czy byłoby to interesujące dla programistów. Oczekuję, że nie przewidzieli tego scenariusza.

Zastanawiam się, jakie programy ładujące inne niż Windows ntldri bootmgrGRUBntldr polecenie może być w stanie załadować?

irracjonalny John
źródło
1
Świetna sprawa! Naprawdę uważam, że powinieneś napisać wiersz na liście mailingowej grub-devel i poprosić ich, aby rzucić okiem na to pytanie i być może zagłosowali na niektóre pytania bez odpowiedzi i / lub poprawili niektóre z naszych założeń. Dziękujemy za otwarcie pytania w pierwszej kolejności!
ckhan

Odpowiedzi:

14

Badanie nieudokumentowanej funkcji

Masz rację, ntldrpolecenie (to polecenie, a nie moduł) nie jest udokumentowane. Jest to więc doskonała wymówka dla przygód w archeologii kodu .

Ilekroć znajdę nieudokumentowaną funkcję, pierwszą rzeczą do zrobienia jest sprawdzenie źródeł.

  • Źródło w repozytorium git Savannah pokazuje, że zostało połączone z linią główną w sierpniu 2010 roku.

  • Wydaje się, że gałąź źródłowa już nie istnieje, ale wciąż można zobaczyć, że powstała ona w tym samym roku , w kwietniu 2010 r. Komentarz do odprawy z „Włodzimierza” phcodera „Serbinenko” brzmiał

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

Opiera się bardzo na chainloaderpoleceniu, tak bardzo, że nazwa pliku w komentarzu nagłówka wciąż nie została zaktualizowana.

Teraz, gdy mamy dokładne zgłoszenie i nazwę, możemy sprawdzić archiwa wysyłkowe. Możesz zobaczyć, gdzie programiści dyskutowali o dodaniu tej funkcji rok wcześniej na liście mailingowej grub-devel :

Niektóre istotne fragmenty z tego wątku:

Robert Millan Ta poprawka implementuje moduł ładujący dla semantyki rozruchu NTLDR (które są takie same w BootMGR, dlatego oba są obsługiwane)

Robert Millan Jeśli w ogóle chcemy tej funkcji, myślę, że powinna to być opcja w module ładującym, a nie samodzielne polecenie. Jest prawie taki sam, jak naprawdę moduł ładujący, jedyną różnicą jest to, że ntldr jest ładowany po PBR przez GRUB zamiast przez sam PBR.

Vladimir Serbinenko Nie sądzę, że to żaden problem, ponieważ ntldr używa tego PBR tylko jako superbloku do identyfikacji partycji. Jako taki wolałbym raczej uważać to ładowanie za specjalny przypadek przekazania $ roota, tylko jego forma jest nieco dziwna

Yves Blusseau Jeśli chodzi o polecenie, myślę, że dla użytkownika będzie to prostsze, jeśli mamy tylko jedno polecenie: program ładujący (jak w grub4dos), który spróbuje wykryć typ programu ładującego. To tylko moja osobista opinia.

Vladimir Serbinenko Nie zgadzam się z tym. chainloader i ntldr nie współużytkują tej samej składni: chainloader oczekuje bootsectora, podczas gdy ntldr oczekuje pliku ntldr ot bootmgr. GRUB2 ma na celu zerwanie ze złymi decyzjami projektowymi GRUB1, jednym z nich jest polecenie „jądra”. GRUB4DOS śledzi GRUB1 na ten temat.

Robert Millan W porządku. Niech to będzie osobne polecenie. Myślę, że powinien on nadal dzielić kod z chainloader.c (z niektórymi ifdefs).

Odpowiadając na twoje pytanie

Po zastanowieniu się, co wiemy o tym, jak można go wykorzystać?

  • Opiera się na ładowarce łańcuchowej.

  • Wymaga jednego argumentu: otwarcie pliku.

  • Unika rekordu rozruchowego partycji: dzięki temu może ominąć uszkodzenie. Zobacz ten post szczegółowo opisujący, jak to przetestowali.

  • To tylko około 160 linii kodu , widać, że nie ma tam wiele więcej.

Mam nadzieję, że to było przydatne!

ckhan
źródło