Я недавно наткнулся на 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
- Хотя я не совсем уверен, сколько значит различие,
ntldr
это модуль, а не команда. Или, возможно, динамически загружаемая команда, если хотите.
После ссылки на исходный код и просмотра строк 152 (GRUB_MOD_INIT
) и 159 (GRUB_MOD_FINI
) вы можете увидеть код для загрузки и ... я предполагаю ... выгрузить модуль.
GRUB, по-видимому, реализует многие функции, которые вы можете считать « командами » как модули. Единственное различие в использовании, о котором я знаю, состоит в том, что перед использованием модуля необходимо убедиться, что он был загружен командойinsmod ntldr
.
В стороне: меня всегда интересовало, почему GRUB не поддерживаетreboot
. Оказывается, команда существует, но это модуль. Еслиreboot
вернетсяunknown command
, тоinsmod reboot
позволяет GRUB «запомнить»reboot
команду.
В сторону: когда и почему GRUB может « выгружать » модуль, я пока не знаю. Может быть это результат чего-то похожего на « сборку мусора » ?? Я заметил, что после загрузки модули сохраняются даже после выключения и перезагрузки системы. Конечно, вы не можете зависеть от этого, но похоже, что это часто работает на практике. - Интересно, что они основаны
ntldr
наchainloader
. Я не смотрел наchainloader.c
код. Я предполагаю, что это, вероятно, также перемещает нагрузку в Intel 16-битном реальном режиме?
Я буду весьма рад , что они не выполнили вntldr
качестве опцииchainloader
. Я согласен с Владимиром. Каковы бы ни были сходства под обложками, синтаксис использования сильно отличается. Нынешний подход является менее сложным. - Также интересно увидеть явное отсутствие энтузиазма по поводу добавления этой команды в 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 в такой ситуации - это использовать новый GRUBntldr
. Интересно, будет ли это интересно разработчикам? Я ожидаю, что они не ожидали этого сценария.
Интересно, какие загрузчики, кроме Windows, ntldr
и bootmgr
команда GRUB ntldr
может загружаться?
Ответы:
Исследование недокументированной особенности
Вы правы,
ntldr
команда (это команда, а не модуль) не задокументирована. Так что это отличный повод для некоторых приключений в археологии кода .Всякий раз, когда я нахожу недокументированную функцию, первое, что нужно сделать, это проверить источники.
Источник в репозитории Savannah git показывает, что он был объединен с основной линией в августе 2010 года.
Похоже, что ветка с исходным кодом больше не существует, но вы все еще можете видеть, что она появилась в начале того же года , в апреле 2010 года. Комментарий проверки от "Vladimir 'phcoder' Serbinenko" был
Он очень близко основан на
chainloader
команде, настолько, что имя файла в заголовке комментария все еще не было обновлено.Теперь, когда у нас есть точная регистрация и имя, мы можем проверить почтовые архивы. Вы можете увидеть, где разработчики обсуждали возможность добавления этой функции годом ранее в список рассылки grub-devel :
Некоторые соответствующие выдержки из этой темы:
Отвечая на ваш вопрос
Рассмотрев все это, что мы знаем о том, как его можно использовать?
Он основан на загрузчике цепей.
Требуется единственный аргумент: открыть файл.
Он избегает загрузочной записи раздела: поэтому он может обойти коррупцию там. Посмотрите этот пост подробно, как они это проверили.
Это всего около 160 строк кода , вы можете видеть, что там не так много другого.
Надеюсь, это было полезно!
источник