Де я можу дізнатися більше про те, як використовувати команду (модуль GRUB `ntldr`)?


16

Нещодавно я натрапив на ntldrмодуль GRUB .

Очевидно, одна з речей, для якої він може бути використаний, є альтернативою chainloaderдля завантаження версій Windows NT> = 6.0, як у наведеному нижче прикладі. (Дуже зручно, якщо запис завантаження гучності для розділу Windows пошкоджено.)

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
}

Де я можу дізнатися більше про те, як можна використовувати цю директиву завантаження? Я не бачив його в списку , коли я подивився в HTML версії цього керівництва GNU GRUB .


Відповідаючи на відповідь ckhan

Велике спасибі! Я майже вирішив, що мені доведеться спробувати перекопати вихідний код, щоб дізнатися більше про ntldrкоманду / модуль GRUB . Але ви зробили набагато кращу роботу, ніж я.

Мені ніколи б не прийшло в голову подивитися архіви електронної пошти, щоб побачити, які дизайнерські дискусії може мати людина, яка написала код. Цей метод здається, що може бути дуже корисним у майбутньому. Дякуємо, що згадали про це.

Мої думки щодо ntldrпідтримки GRUB

  1. Хоча я не дуже впевнений, скільки означає розрізнення, ntldrце модуль, а не команда. Або, можливо, динамічно завантажена команда, якщо бажаєте.

    Перейшовши за посиланням на вихідний код і переглянувши рядки 152 ( GRUB_MOD_INIT) та 159 ( GRUB_MOD_FINI), ви можете побачити код для завантаження і ... я здогадуюсь ... вивантажте модуль.

    GRUB, мабуть, реалізує багато функцій, які, на вашу думку, можуть бути « командами » як модулі. Єдине, що мені відомо про використання, полягає в тому, що перед використанням модуля необхідно переконатися, що він завантажений командою insmod ntldr.

    Убік: Я завжди цікавився, чому GRUB не підтримує reboot. Виявляється, команда існує, але це модуль. Якщо rebootповернеться unknown command, значитьinsmod rebootдозволяє GRUB "запам'ятати" rebootкоманду.

    Убік: Коли і чому GRUB може " розвантажити " модуль, я ще не маю уявлення. Може, це результат чогось подібного до " вивезення сміття " ?? Я помітив, що завантажені модулі, здається, зберігаються, навіть після вимкнення та перезавантаження системи. Звичайно, ви не можете від цього залежати , але, схоже, це часто працює на практиці.
  2. Цікаво , що вони засновані ntldrна chainloader. Я не переглянув chainloader.cкод. Я думаю, це, ймовірно, також робить перевантаження переміщення в 16-бітному реальному режимі Intel ?

    Я буду дуже радий , що вони не виконали в ntldrякості опції chainloader. Я згоден з Володимиром. Незалежно від подібності під обкладинками, синтаксис використання сильно відрізняється. Нинішній підхід менш невдалий.
  3. Цікаво також побачити очевидну відсутність ентузіазму щодо додавання цієї команди до GRUB. Очевидно, розробники GRUB вважали, що пошкодження запису завантаження розділів Windows (PBR) вкрай малоймовірне. Однак я можу накреслити, як це зробити під час досить звичайної установки.

    Почніть з припущення, що користувач має встановлену Windows у своїй системі. Зараз вони встановлюють Ubuntu (12,04 LTS) " поряд " з Windows. В один момент під час встановлення Ubuntu вони, мабуть, можуть вирішити, де вони хочуть встановити GRUB. З причин, про які я не можу починати здогадуватися, деякі з них вирішують встановити GRUB у розділ, в який встановлено Windows.

    Установка завершується, і вони можуть успішно запустити Ubuntu. Однак, коли вони намагаються запустити Windows, вибравши запис у меню GRUB, Windows не запускається. Замість того, щоб намагатися запустити Windows із GRUB, просто повторно відобразиться меню GRUB?

    Чому? Ну, мабуть, коли вони вирішили встановити GRUB в розділ Windows, частина того, що насправді сталося, PBR для розділу Windows було переписано з PBR GRUB. Таким chainloader +1чином, не завантажуйте ланцюг завантажувача Windows, а натомість повторно завантажує GRUB.

    IMO, найбезпечніший швидкий спосіб дозволити користувачеві завантажувати Windows у цій ситуації - це використання нового GRUB ntldr. Цікаво, чи це зацікавило б розробників. Я думаю, що вони не передбачали цього сценарію.

Цікаво, які завантажувачі, крім Windows, ntldrі команда bootmgrGRUB ntldrмогли б завантажувати?


1
Чудові речі! Я дійсно думаю, що ви повинні залишити рядок у списку розсилки, що розробився, і попросити їх заглянути до цього питання і, можливо, зазирнути на деякі питання без відповіді та / або виправити деякі наші припущення. Дякуємо, що відкрили питання в першу чергу!
ckhan

Відповіді:


14

Дослідження незадокументованої особливості

Ви праві, що ntldrкоманда (це команда, а не модуль) не задокументована. Тож це чудовий привід для деяких пригод в археології коду .

Щоразу, коли я знаходжу незадокументовану функцію, перше, що потрібно зробити, це перевірити джерела.

  • Джерело в Savannah git repo показує, що воно було об'єднано в основну лінію в серпні 2010 року.

  • Гілка джерела, здається, більше не існує, але ви все ще можете бачити, що вона почала існувати раніше того року , у квітні 2010 року.

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

Він заснований дуже близько на chainloaderкоманді, настільки, що ім'я файлу в коментарі до заголовка все ще не було оновлено.

Тепер, коли у нас є точна реєстрація та ім’я, ми можемо перевірити архіви розсилки. Ви можете побачити, де розробники обговорювали питання про додавання цієї функції роком раніше у списку розсилки grub-devel :

Деякі відповідні уривки з цієї теми:

Роберт Міллан Цей патч реалізує завантажувач для семантики завантаження NTLDR (які однакові у BootMGR, тому обидва підтримуються)

Роберт Міллан Якщо нам взагалі потрібна ця функція, я думаю, що це повинна бути опція в ланцюговому завантажувачі, а не окрема команда. Це майже те саме, що навантажувач ланцюга насправді, лише різниця полягає в тому, що ntldr - це завантаження після PBR від GRUB замість самого PBR.

Володимир Сербіненко. Я не думаю, що це жодна проблема, оскільки ntldr використовує цей PBR лише як суперблок для ідентифікації розділу. Як таке, я вважаю, що це завантаження вважається особливим випадком передачі $ root, просто форма його трохи дивна

Ів Блуссо Про команду, я думаю, що користувачеві буде простіше, якщо у нас буде лише одна команда: ланцюговий завантажувач (як у grub4dos), який спробує виявити тип завантажувача. Це лише моя особиста думка.

Володимир Сербіненко Я з цим не згоден. chainloader та ntldr не мають однакового синтаксису: chainloader очікує завантажувач, тоді як ntldr очікує файл ntldr від bootmgr. GRUB2 робиться для розриву з неправильними проектними рішеннями GRUB1, одним з яких є команда "kernel". GRUB4DOS слідує за GRUB1 з цього приводу.

Роберт Міллан Гаразд. Давайте зробимо це окремою командою. Я думаю, що він все-таки повинен ділитися кодом з ланцюгом chainloader.c, хоча (з деякими ifdefs).

Відповідаючи на ваше запитання

Після ознайомлення з усім цим, що ми знаємо про те, як це можна використовувати?

  • Він заснований на ланцюговому навантажувачі.

  • Потрібен єдиний аргумент: файл, який потрібно відкрити.

  • Це дозволяє уникнути завантаження запису розділу: так що він може обійти корупцію там. Дивіться цю публікацію з детальним описом того, як вони це перевірили.

  • Це лише 160 рядків коду , ви можете побачити, що там ще не багато.

Сподіваюся, це було корисно!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.