Niedawno natknąłem się na ntldr
moduł GRUB .
Najwyraźniej jedną z rzeczy, których można użyć, jest alternatywa chainloader
dla 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 ntldr
poleceniu / 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 ntldr
wsparcia GRUB
- Chociaż nie jestem pewien, ile znaczy to rozróżnienie,
ntldr
to 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 polecenieminsmod ntldr
.
Poza tym: zawsze zastanawiałem się, dlaczego GRUB nie obsługujereboot
. Okazuje się, że polecenie istnieje, ale jest to moduł. Jeślireboot
wróciunknown command
, toinsmod reboot
pozwala GRUB-owi „zapamiętać”reboot
polecenie.
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. - Interesujące jest to, że opiera się
ntldr
nachainloader
. Nie spojrzałem nachainloader.c
kod. Wydaje mi się, że prawdopodobnie przenosi obciążenie w 16-bitowym trybie rzeczywistym Intel ?
Ja jestem raczej zadowolony, że nie realizowaćntldr
jako 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. - 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ęcchainloader +1
nie ł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-antldr
. 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 ntldr
i bootmgr
GRUBntldr
polecenie może być w stanie załadować?
Odpowiedzi:
Badanie nieudokumentowanej funkcji
Masz rację,
ntldr
polecenie (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ł
Opiera się bardzo na
chainloader
poleceniu, 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:
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!
źródło