
Tengo una aplicación en la que necesito iniciar Linux, ejecutar scripts automatizados y luego iniciar automáticamente Windows. ¿Puedo usar Kexec para ejecutar grub?
Otro caso de uso sería iniciar un kernel de Linux para actualizar el microcódigo del procesador y luego kexec
GRUB o Syslinux para iniciar Windows, porque el microcódigo no sobrevivirá a un reinicio completo.
He oído hablar de grub4dos
(enlace (no disponible),versión archivada), pero parece estar descontinuado, entonces, ¿hay alguna manera de hacerlo con GRUB2?
Básicamente necesitaría una imagen cargable de GRUB para kexec
. Intenté cargar las imágenes que se encuentran en esteexplicación, pero no parecen funcionar. Gracias por cualquier pista.
Nota: Encontradoesta publicaciónde 2014, que decía que esto aún no estaba implementado en kexec.
Respuesta1
Parece que es posible para kexec
Windows, pero parece, en el mejor de los casos, experimental (y no bien probado).
COMIDA
No es posible utilizar kexec
el grub core.img
por sí solo (ya que no parece tener un formato binario compatible), consulte tambiéneste informe de error en la plataforma de lanzamiento. El error mencionado aún es reproducible:
kexec -l /boot/grub2/i386-pc/core.img
Según kexec --help
, actualmente se admiten los siguientes tipos:
elf-x86_64
multiboot-x86
multiboot2-x86
elf-x86
bzImage64
bzImage
beoboot-x86
nbi-x86
Si desea cargar un cargador diferente, deberá estar en uno de estos formatos o deberá agregarse la compatibilidad. No estoy seguro de qué formato utiliza GRUB; un file
comando simple solo produce esto:
/boot/grub2/i386-pc/core.img: data
Crear una imagen GRUB de arranque
Actualmente parecen existir estas posibilidades:
grub2-mkimage
- una parte de
core.img
(kernel.img
) - empalmar
lnxboot.img
ycore.img
unir. Vea la respuesta de @Ardwena. lnxboot.img
como núcleo ycore.img
comoinitrd
. Pista encontrada enWiki Arcoyun hilo antiguo en la lista de correo de desarrollo de grub.
lnxboot
lnxboot.img
seria un Linux kernel x86 boot executeable bzImage
. Parece estar pensado para cargarse como un kernel:
Luego puede cargar grub2.bin desde syslinux/isolinux/pxelinux/lilo o cualquier otro cargador de arranque que admita el kernel de Linux.
Kexec lo carga, pero falla al ejecutar:
kexec -l /usr/lib/grub/i386-pc/lnxboot.img --initrd=/boot/grub2/i386-pc/core.img --debug
También parece haber un problema durante la carga (primeras líneas del resultado de depuración):
Try gzip decompression.
Try LZMA decompression.
lzma_decompress_file: read on /usr/lib/grub/i386-pc/lnxboot.img of 65536 bytes failed
[...]
Grub4Dos
Un vistazo rápido a Grub4Dos:
# file grub.exe
grub.exe: Linux kernel x86 boot executable bzImage, version \353kHdrS\003\002, RO-rootFS, Normal VGA
Esto debería significar que es compatible. No era una opción para mí ya que es un software heredado.
Sin embargo, logré cargar grub4dos
descargándolo 0.4.4
desdefuenteforjay luego ejecutando:
kexec -l grub.exe
kexec -e
Sin configurar, vuelve al shell de grub después de un tiempo. Si desea utilizar gru4dos
, solo deberá modificarlo cmdline
para adaptarlo a sus necesidades.este hiloaún debería aplicarse.
ventanas
Kexec
Usar Windows no parece ser una frase sencilla, perose ha hecho antes.
La mayor parte del trabajo en esta dirección parece estar asociado con laArranque de Linuxproyecto.GitHub
encontré estosdiapositivastan bien como estorepositorio de github. Este parece ser el proyecto mencionado en el artículo que lo hacía funcionar.
Parece posible, pero requiere mucho trabajo (y no hay una solución "lista para producción" disponible; al menos no la he encontrado todavía). Lamentablemente no parece haber mucha documentación para LinuxBoot, por lo que es posible que tengas que preguntar a los desarrolladores. Es posible que ya exista una forma más sencilla de hacerlo.
Respuesta2
La razón por la cual kexec-ing en Windows es tan difícil y complicado es porque el mecanismo de diseño interno de kexec tiene una imperfección que supone que todos los cargadores de arranque del sistema operativo cargan la imagen del kernel del sistema operativo de una manera similar, lo que claramente no es el caso. Por ejemplo, alguna imagen del kernel del sistema operativo debe cargarse a partir de algún desplazamiento de dirección de memoria especial, algunos sistemas operativos pueden requerir cargar archivos adicionales (que contienen información del controlador) junto con la imagen del kernel del sistema operativo, etc. Dado que no tenemos control sobre cómo un sistema operativo carga su imagen del kernel, o cargará su imagen del kernel en una versión futura, la forma actual de realizar kexec en otro sistema operativo/kernel no funcionará muy bien a largo plazo.
La forma más universal/compatible (como propongo) de realizar kexec en otro sistema operativo escargue el código de inicio del sector de inicio en modo real, salga del modo protegido y luego salte directamente al punto de entrada del código de inicio en modo real. Esta es la forma más universal porque el código de arranque del sector de arranque en modo real de cualquier sistema operativo siempre se puede cargar comenzando en cualquier dirección de memoria, así es como el BIOS (diferentes fabricantes de computadoras crean BIOS diferentes) arranca en un sistema operativo (a menos que un sistema operativo lo haga). no quieren que otro BIOS lo instale o arranque (por ejemplo, Apple, pueden imponer restricciones de propiedad sobre cómo cargar códigos de arranque del sector de arranque). De esta manera, siempre podemos iniciar cualquier sistema operativo independientemente de cómo su código de inicio cargue su imagen del kernel del sistema operativo simplemente porque estamos ejecutando su propio código de inicio del sector de inicio directamente. Además, este modo no introduce ninguna desaceleración porque el código de arranque del sector de arranque es pequeño y, por lo tanto, se carga rápidamente, y la diferencia entre cargar un archivo de imagen del kernel grande en modo real versus en modo protegido no es muy grande.
Sin embargo, lograr esto es un gran desafío porque:
Para todos los sistemas operativos modernos, una vez que ingresan al modo protegido desde el modo real, algunas tablas de descriptores o entradas de tablas de páginas sobrescriben la memoria en modo real. Por lo tanto, no hay respaldo. Sin embargo, los códigos de arranque en modo real utilizan interrupciones del BIOS para acceder a las E/S del hardware, por lo que sin restaurar el mapa de memoria original en modo real, no podrán cargar el archivo de imagen del kernel desde el disco duro. Este problema es complicado pero tiene solución. Podemos instalar algún cargador de arranque especial de Linux que toma una instantánea de la memoria antes de ingresar al modo protegido y solo debe hacerse una vez por todas en una máquina.
No todos los procesadores admiten volver al modo real desde el modo protegido. Los procesadores modernos están diseñados para arrancar en un sistema operativo (entrar en modo protegido desde el modo real), en lugar de desconectarse de un sistema operativo (volver al modo real desde el modo protegido), por razones de costo de producción y eficiencia. Por lo tanto, el comportamiento de volver al modo real desde el modo protegido no está bien probado y, por lo tanto, está muy indefinido. Dado que este comportamiento varía en cada modelo, no hay control y por lo tanto no se garantiza en qué marca/modelo de procesadores funcionará correctamente.
Sólo los procesadores Intel X86 tienen modo real y modo protegido (porque pasaron por una tecnología heredada en una etapa muy temprana). Por lo tanto, el mecanismo de reinicio desde el sector de arranque será diferente para diferentes arquitecturas de procesador, y no implica necesariamente regresar al modo real desde el modo protegido, pero puede involucrar algunos otros interruptores en los estados operativos del procesador.
Sin embargo, en principio debería funcionar si todo se cuida correctamente. En el futuro, Linux debería tener la capacidad de ejecutar kexec en cualquier partición con capacidad de arranque montada (pero no necesariamente marcada como con capacidad de arranque porque cada disco duro solo puede tener una partición marcada como con capacidad de arranque, o el BIOS lo hará). informar un error y negarse a arrancar) desde cualquier disco duro directamente sin un reinicio completo del hardware, lo cual es mucho más lento. Esto arrojó más luz y esperanza a Linux ^_^
Respuesta3
Debe tener instalado grub y el sistema Linux como arranque predeterminado.
En el sistema Linux, cree una entrada crontab como esta:
@reboot /do/some/stuff
Donde /do/some/stuff es un script para realizar cualquier tarea que necesite realizar. Al final del script agregue lo siguiente:
#!/bin/bash
#
# Do something here
sudo grub2-once "Windows"
sudo reboot
Luego debería reiniciarse en Windows, siempre que el elemento del menú de Grub para Windows sea "Windows".
En el próximo reinicio, volverá a Linux y hará lo mismo.
Respuesta4
kexec
podría funcionar si combinas estas dos imágenes de grub: lnxboot.img
y core.img
, como...
cat lnxboot.img core.img > your-kexec-able.img
Vale la pena intentarlo.
EDITAR:
Ahora que miré dentro de las imágenes, lnxboot.image
se parece más a un "ELF" lnxboot.img
, así que prueba con ese también.
EDITAR:
Aparentemente, las imágenes /boot/grub2/i386-pc/xxx.img no son del agrado de kexec
. Entonces, ¿por qué no intentar usarlo grub-mkimage
para generar algunos formatos diferentes y ver qué funciona? Desde la página de manual, -O, --format=FORMAT
admite muchos otros formatos. Quizás pruebe el x86_64-xen
formato.