GRUB

GRUB

У меня есть приложение, в котором мне нужно загрузить Linux, выполнить автоматизированные скрипты и затем автоматически загрузить Windows. Могу ли я использовать Kexec для запуска grub?

Другим вариантом использования может быть загрузка ядра Linux для обновления микрокода процессора, а затем kexecGRUB или Syslinux для загрузки Windows, поскольку микрокод не переживет полную перезагрузку.

Я слышал о grub4dos(ссылка (недоступна),архивная версия), но, похоже, его поддержка прекращена. Есть ли способ сделать это с помощью GRUB2?

Мне в принципе нужен загружаемый образ GRUB для kexec. Я попытался загрузить образы, найденные в этомобъяснение, но они, похоже, не работают. Спасибо за любые подсказки.


Примечание: Найденоэта почтаиз 2014 года, где говорилось, что это еще не реализовано в kexec.

решение1

Похоже, что это возможно и в kexecWindows, но, похоже, это в лучшем случае экспериментальная возможность (и недостаточно протестированная).

GRUB

Это невозможно сделать с помощью kexecgrub core.img(так как, похоже, у него нет совместимого двоичного формата), также см.этот отчет об ошибке на launchpad. Упомянутая ошибка все еще воспроизводится:

kexec -l /boot/grub2/i386-pc/core.img

По данным kexec --helpна данный момент поддерживаются следующие типы:

elf-x86_64
multiboot-x86
multiboot2-x86
elf-x86
bzImage64
bzImage
beoboot-x86
nbi-x86

Если вы хотите загрузить другой загрузчик, он должен быть в одном из этих форматов или должна быть добавлена ​​совместимость. Я не уверен, какой формат использует GRUB — простая fileкоманда выдает только это:

/boot/grub2/i386-pc/core.img: data

Создание загрузочного образа GRUB

В настоящее время, по-видимому, существуют следующие возможности:

lnxboot

lnxboot.imgбудет Linux kernel x86 boot executeable bzImage. Кажется, он предназначен для загрузки в качестве ядра:

Затем вы можете загрузить grub2.bin из syslinux/isolinux/pxelinux/lilo или любого другого загрузчика, поддерживающего ядро ​​Linux.

Kexec загружает его, но при выполнении происходит сбой:

kexec -l /usr/lib/grub/i386-pc/lnxboot.img --initrd=/boot/grub2/i386-pc/core.img --debug

Также, похоже, возникла проблема при загрузке (первые несколько строк отладочного вывода):

Try gzip decompression.
Try LZMA decompression.
lzma_decompress_file: read on /usr/lib/grub/i386-pc/lnxboot.img of 65536 bytes failed
[...]

Grub4Dos

Краткий обзор Grub4Dos:

# file grub.exe
grub.exe: Linux kernel x86 boot executable bzImage, version \353kHdrS\003\002, RO-rootFS, Normal VGA

Это должно означать, что он совместим. Для меня это не вариант, так как это устаревшее программное обеспечение.

Однако мне удалось загрузить, grub4dosскачав 0.4.4сsourceforgeи затем запускаем:

kexec -l grub.exe
kexec -e

Ненастроенный, он возвращается к оболочке grub через некоторое время. Если вы хотите использовать gru4dos, вам нужно только настроить его cmdlineв соответствии с вашими потребностями.Эта темадолжны по-прежнему применяться.

Окна

Kexec'ing Windows, похоже, не однострочный, но онбыло сделано раньше.

Большая часть работы в этом направлении, по-видимому, связана сLinuxBootпроект.Гитхаб

Я нашел этослайдыа также эторепозиторий github. Кажется, это тот проект, который упоминался в статье и который заставил все это работать.

Кажется, это возможно, но требует много работы (и нет готового к использованию решения — по крайней мере, я его пока не нашел). К сожалению, похоже, что для LinuxBoot не так много документации, поэтому вам, возможно, придется спросить разработчиков. Возможно, уже есть более простой способ сделать это.

решение2

Причина, по которой kexec-ing в Windows так сложен и запутан, заключается в том, что внутренний механизм разработки kexec имеет несовершенство, которое предполагает, что все загрузчики ОС загружают образ ядра ОС одинаковым образом, что явно не так. Например, некоторые образы ядра ОС должны загружаться, начиная с некоторого специального смещения адреса памяти, некоторые ОС могут потребовать загрузки дополнительных файлов (содержащих информацию о драйвере) вместе с образом ядра ОС и т. д. Поскольку мы не контролируем, как операционная система загружает свой образ ядра или загрузит свой образ ядра в будущем выпуске, текущий способ kexec-ing в другую ОС/ядро не будет работать очень хорошо в долгосрочной перспективе.

Более универсальный/совместимый способ (как я предлагаю) kexec-а в другой ОС — этозагрузить загрузочный код сектора загрузки реального режима, выйти из защищенного режима, а затем перейти непосредственно к точке входа загрузочного кода реального режима. Это наиболее универсальный способ, поскольку загрузочный код реального режима любой операционной системы всегда может быть загружен, начиная с любого адреса памяти, то есть так, как BIOS (разные производители компьютеров делают разные BIOS) загружается в операционную систему (если только ОС не хочет, чтобы другой BIOS устанавливал или загружал ее, например, Apple, они могут наложить собственные ограничения на то, как загружать загрузочные коды загрузочного сектора). Таким образом, мы всегда можем загрузить любую операционную систему независимо от того, как ее загрузочный код загружает образ ядра ОС, просто потому, что мы напрямую запускаем ее собственный загрузочный код загрузочного сектора. Более того, этот режим не вносит никакого замедления, поскольку загрузочный код загрузочного сектора мал и, следовательно, быстро загружается, а разница между загрузкой большого файла образа ядра в реальном режиме и в защищенном режиме не очень велика.

Однако добиться этого очень сложно, потому что:

  1. Для всех современных ОС, как только они входят в защищенный режим из реального режима, память реального режима перезаписывается некоторыми таблицами дескрипторов или записями таблиц страниц. Таким образом, резервного копирования нет. Однако загрузочные коды реального режима используют прерывания BIOS для доступа к аппаратному вводу-выводу, поэтому без восстановления исходной карты памяти реального режима они не смогут загрузить файл образа ядра с жесткого диска. Эта проблема сложная, но решаемая. Мы можем установить специальный загрузчик Linux, который делает снимок памяти перед входом в защищенный режим, и это нужно сделать только один раз для всех на одной машине.

  2. Не все процессоры хорошо поддерживают возврат в реальный режим из защищенного режима. Современные процессоры разработаны для загрузки в ОС (входа в защищенный режим из реального режима), а не для выхода из ОС (возврата в реальный режим из защищенного режима) по причинам себестоимости и эффективности производства. Таким образом, поведение возврата в реальный режим из защищенного режима не было хорошо протестировано и, таким образом, во многом не определено. Поскольку это поведение различается в каждой модели, нет никакого контроля, а значит, нет гарантии, на процессорах какой марки/модели оно будет работать правильно.

  3. Только процессоры Intel X86 имеют реальный режим и защищенный режим (потому что он прошел через очень раннюю стадию устаревшей технологии). Таким образом, механизм перезагрузки из загрузочного сектора будет отличаться для разных архитектур процессора, не обязательно включая возврат в реальный режим из защищенного режима, но может включать некоторые другие переключатели в рабочих состояниях процессора.

Тем не менее, в принципе это должно работать, если все правильно сделать. В будущем Linux должен иметь возможность kexec-ить в любой смонтированный загрузочный раздел (но не обязательно помеченный как загрузочный, потому что каждый жесткий диск может иметь только один раздел, помеченный как загрузочный, или BIOS сообщит об ошибке и откажется загружаться) с любого жесткого диска напрямую без полной аппаратной перезагрузки, которая намного медленнее. Это проливает больше света и надежды на Linux ^_^

решение3

Вам необходимо установить grub и систему Linux в качестве загрузки по умолчанию.

В системе Linux создайте запись в crontab следующего вида:

@reboot /do/some/stuff

Где /do/some/stuff — это скрипт для выполнения любых задач, которые вам нужно сделать. В конце скрипта добавьте следующее:

#!/bin/bash
#
# Do something here

sudo grub2-once "Windows"
sudo reboot

Затем он должен перезагрузиться в Windows, при условии, что пункт меню Grub для Windows — «Windows».

При следующей перезагрузке он вернется в Linux и сделает то же самое.

решение4

kexecможет сработать, если объединить эти два образа grub: lnxboot.imgи core.img, например...

cat lnxboot.img core.img > your-kexec-able.img

Стоит попробовать.

РЕДАКТИРОВАТЬ:

Теперь, когда я посмотрел на изображения, то lnxboot.imageпонял, что больше похоже на «ЭЛЬФА», чем на lnxboot.img, так что попробуйте и его.

РЕДАКТИРОВАТЬ:

Очевидно, образы /boot/grub2/i386-pc/xxx.img не по вкусу kexec. Тогда почему бы не попробовать использовать grub-mkimageдля генерации некоторых других форматов и посмотреть, что сработает? Согласно странице руководства, -O, --format=FORMATподдерживает целую кучу других форматов. Может быть, попробовать формат x86_64-xen.

Связанный контент