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

16

Я недавно наткнулся на ntldrмодуль GRUB .

Очевидно, одна из вещей, которую он может использовать, - это альтернатива chainloaderзагрузке версий Windows NT> = 6.0, как в примере ниже. (Очень удобно, если Volume Boot Record для раздела 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 .


Отвечая на ответ чхана

Большое спасибо! Я решил, что мне нужно будет попытаться покопаться в исходном коде, чтобы узнать больше о 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код. Я предполагаю, что это, вероятно, также перемещает нагрузку в Intel 16-битном реальном режиме?

    Я буду весьма рад , что они не выполнили в 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 был переписан с помощью GRUB PBR. Таким chainloader +1образом, не загружается по цепочке загрузчик Windows, а перезагружается GRUB.

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

Интересно, какие загрузчики, кроме Windows, ntldrи bootmgrкоманда GRUB ntldrможет загружаться?

иррациональный Джон
источник
1
Отличный материал! Я действительно думаю, что вы должны оставить строку в списке рассылки grub-devel и попросить их взглянуть на этот вопрос и, возможно, присоединиться к некоторым оставшимся без ответа вопросам и / или исправить некоторые из наших предположений. Спасибо за открытие вопроса в первую очередь!
чхан

Ответы:

14

Исследование недокументированной особенности

Вы правы, ntldrкоманда (это команда, а не модуль) не задокументирована. Так что это отличный повод для некоторых приключений в археологии кода .

Всякий раз, когда я нахожу недокументированную функцию, первое, что нужно сделать, это проверить источники.

  • Источник в репозитории Savannah git показывает, что он был объединен с основной линией в августе 2010 года.

  • Похоже, что ветка с исходным кодом больше не существует, но вы все еще можете видеть, что она появилась в начале того же года , в апреле 2010 года. Комментарий проверки от "Vladimir 'phcoder' Serbinenko" был

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

Он очень близко основан на chainloaderкоманде, настолько, что имя файла в заголовке комментария все еще не было обновлено.

Теперь, когда у нас есть точная регистрация и имя, мы можем проверить почтовые архивы. Вы можете увидеть, где разработчики обсуждали возможность добавления этой функции годом ранее в список рассылки grub-devel :

Некоторые соответствующие выдержки из этой темы:

Robert Millan Этот патч реализует загрузчик для семантики загрузки NTLDR (которая одинакова в BootMGR, следовательно, оба поддерживаются)

Роберт Миллан: Если нам вообще нужна эта функция, я думаю, что она должна быть опцией в загрузчике цепочек, а не отдельной командой. Это почти то же самое, что и загрузчик цепей, единственное отличие в том, что ntldr - это загрузка после PBR GRUB, а не самой PBR.

Владимир Сербиненко Я не думаю, что это какая-то проблема, поскольку ntldr использует этот PBR только как суперблок для идентификации раздела. Поэтому я предпочел бы рассматривать эту загрузку как особый случай передачи $ root, просто ее форма немного странная.

Ив Блюссо: О команде, я думаю, что для пользователя будет проще, если у нас будет только одна команда: chainloader (как в grub4dos), которая будет пытаться определить тип загрузчика. Это только мое личное мнение.

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

Роберт Миллан: Хорошо. Давайте сделаем это отдельной командой. Я думаю, что он все еще должен делиться кодом с chainloader.c, хотя (с некоторыми ifdefs).

Отвечая на ваш вопрос

Рассмотрев все это, что мы знаем о том, как его можно использовать?

  • Он основан на загрузчике цепей.

  • Требуется единственный аргумент: открыть файл.

  • Он избегает загрузочной записи раздела: поэтому он может обойти коррупцию там. Посмотрите этот пост подробно, как они это проверили.

  • Это всего около 160 строк кода , вы можете видеть, что там не так много другого.

Надеюсь, это было полезно!

ckhan
источник