
У меня есть приложение, в котором мне нужно загрузить Linux, выполнить автоматизированные скрипты и затем автоматически загрузить Windows. Могу ли я использовать Kexec для запуска grub?
Другим вариантом использования может быть загрузка ядра Linux для обновления микрокода процессора, а затем kexec
GRUB или Syslinux для загрузки Windows, поскольку микрокод не переживет полную перезагрузку.
Я слышал о grub4dos
(ссылка (недоступна),архивная версия), но, похоже, его поддержка прекращена. Есть ли способ сделать это с помощью GRUB2?
Мне в принципе нужен загружаемый образ GRUB для kexec
. Я попытался загрузить образы, найденные в этомобъяснение, но они, похоже, не работают. Спасибо за любые подсказки.
Примечание: Найденоэта почтаиз 2014 года, где говорилось, что это еще не реализовано в kexec.
решение1
Похоже, что это возможно и в kexec
Windows, но, похоже, это в лучшем случае экспериментальная возможность (и недостаточно протестированная).
GRUB
Это невозможно сделать с помощью kexec
grub 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
В настоящее время, по-видимому, существуют следующие возможности:
grub2-mkimage
- часть
core.img
(kernel.img
) - собирая
lnxboot.img
воединоcore.img
. Смотрите ответ @Ardwena. lnxboot.img
как ядро иcore.img
какinitrd
. Подсказка найдена наАрка Викиистарая ветка в списке рассылки grub devel.
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, они могут наложить собственные ограничения на то, как загружать загрузочные коды загрузочного сектора). Таким образом, мы всегда можем загрузить любую операционную систему независимо от того, как ее загрузочный код загружает образ ядра ОС, просто потому, что мы напрямую запускаем ее собственный загрузочный код загрузочного сектора. Более того, этот режим не вносит никакого замедления, поскольку загрузочный код загрузочного сектора мал и, следовательно, быстро загружается, а разница между загрузкой большого файла образа ядра в реальном режиме и в защищенном режиме не очень велика.
Однако добиться этого очень сложно, потому что:
Для всех современных ОС, как только они входят в защищенный режим из реального режима, память реального режима перезаписывается некоторыми таблицами дескрипторов или записями таблиц страниц. Таким образом, резервного копирования нет. Однако загрузочные коды реального режима используют прерывания BIOS для доступа к аппаратному вводу-выводу, поэтому без восстановления исходной карты памяти реального режима они не смогут загрузить файл образа ядра с жесткого диска. Эта проблема сложная, но решаемая. Мы можем установить специальный загрузчик Linux, который делает снимок памяти перед входом в защищенный режим, и это нужно сделать только один раз для всех на одной машине.
Не все процессоры хорошо поддерживают возврат в реальный режим из защищенного режима. Современные процессоры разработаны для загрузки в ОС (входа в защищенный режим из реального режима), а не для выхода из ОС (возврата в реальный режим из защищенного режима) по причинам себестоимости и эффективности производства. Таким образом, поведение возврата в реальный режим из защищенного режима не было хорошо протестировано и, таким образом, во многом не определено. Поскольку это поведение различается в каждой модели, нет никакого контроля, а значит, нет гарантии, на процессорах какой марки/модели оно будет работать правильно.
Только процессоры 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
.