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

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

По-видимому, одна из вещей, для которых это может использоваться, как альтернатива chainloader загружать NT> = 6,0 версий Windows как в примере ниже. (Очень удобный, если Загрузочная запись тома для раздела 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 руководства GRUB GNU.


Ответ на ответ ckhan

Большое спасибо! Я в значительной степени решил, что должен буду попытаться рыть через исходный код для получения дополнительной информации о GRUB ntldr команда/модуль. Но Вы сделали намного лучшее задание, чем я имел бы.

Мне никогда не приходило бы в голову смотреть на почтовые архивы для наблюдения, какие обсуждения дизайна человек, который написал код, возможно, имел. Тот метод кажется, что это могло быть очень полезно в будущем. Спасибо за упоминание его.

Мои мысли о GRUB ntldr поддержка

  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. Я соглашаюсь с Vladimir. Безотносительно общих черт под покрытиями синтаксис использования очень отличается. Текущий подход менее топорен.
  3. Также интересно видеть очевидное отсутствие энтузиазма по поводу добавления этой команды к GRUB. По-видимому, разработчики GRUB думали, что повреждение Windows Partition Boot Record (PBR) было крайне маловероятно. Однако я могу изобразить схематически, как сделать это во время достаточно обычной установки.

    Запустите путем предположения, что пользователю установили Windows в их системе. Они теперь устанавливают Ubuntu (12.04 LTS) "вместе с" Windows. Однажды во время установки Ubuntu они могут, по-видимому, решить, где они хотят, чтобы GRUB был установлен. По причинам я не могу начать предполагать, некоторые из них решают установить GRUB в Windows раздела, установлен в.

    Установка завершается, и они могут успешно запустить Ubuntu. Однако, когда они пытаются запустить Windows путем выбора записи в меню GRUB, Windows не запускается. Вместо этого попытка запустить Windows с GRUB просто вновь отображает меню GRUB?

    Почему? Ну, по-видимому, когда они выбрали устанавливать GRUB в часть раздела окон того, что на самом деле произошло, был PBR для раздела Windows, был перезаписан с PBR GRUB. Так chainloader +1 не объединяет в цепочку загружают загрузчик Windows, но вместо этого перезагружает GRUB.

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

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

16
28.12.2019, 10:45
1 ответ

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

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

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

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

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

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

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

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

Некоторые соответствующие выборки от того потока:

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

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

Vladimir Serbinenko я не думаю, что это имеет любую проблему с тех пор ntldr, использует этот PBR только в качестве суперблока для идентификации раздела. Как таковой я рассмотрел бы эту загрузку как особый случай передающего $root, просто форма его является немного странной

Yves Blusseau О команде, я думаю, что это будет более просто для пользователя, если у нас будет только одна команда: chainloader (как в grub4dos), который попытается обнаружить тип загрузчика. Это - только мое личное мнение.

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

Robert Millan Alright. Давайте сделаем это отдельной командой. Я думаю, что это должно все еще совместно использовать код с chainloader.c хотя (с некоторым ifdefs).

Ответ на Ваш вопрос

После детально изучения всего этого, что мы знаем о том, как оно может использоваться?

  • Это основано на chainloader.

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

  • Это избегает загрузочной записи раздела: таким образом, это может обойти повреждение там. См., что это сообщение детализирует, как они протестировали это.

  • Это - только приблизительно 160 строк кода, Вы видите, что очень еще нет там.

Надежда это было полезно!

14
27.01.2020, 19:49

Теги

Похожие вопросы