¿Cómo puedo decirle a GRUB que quiero reiniciar en Windows antes de reiniciar?


33

Tengo un sistema de arranque dual Linux / Windows configurado, y con frecuencia cambio de uno a otro. Estaba pensando si podría agregar un elemento de menú en uno de los menús para reiniciar directamente en Windows, sin detenerme en el mensaje de GRUB.

Vi esta pregunta en un foro, eso es exactamente lo que quiero pero se trata de lilo, que no es mi caso.

Pensé en una solución que modificara la entrada predeterminada en el menú de GRUB y luego reiniciara, pero hay algunos inconvenientes, y me preguntaba si había una alternativa más limpia.

(Además, me interesaría una solución para arrancar desde Windows directamente en Linux, pero eso podría ser más difícil y no pertenece aquí. De todos modos, siempre que lo tenga de una manera, la otra forma podría configurarse como el valor por defecto.

ACTUALIZACIÓN Parece que alguien le preguntó una pregunta similar , y si esas son las respuestas sugeridas, que bien podría editar /boot/grub/grubenvcomo grub-rebooty grub-set-defaulty grub-editenvhacer. )

Gracias de antemano por cualquier consejo.

ACTUALIZACIÓN :

Esta es mi versión de GRUB: (GRUB) 1.99-12ubuntu5-1linuxmint1

Intenté ejecutar grubonce, el comando no se encuentra. Y buscarlo en los repositorios no me da nada. Estoy en Linux Mint, así que eso podría ser ...

Al ver man grub-reboot, parece que hace lo que quiero, como lo gruboncehace. También está disponible en todas partes (al menos es para mí, creo que es parte del paquete grub). Vi dos comandos relacionados: grub-editenvy grub-set-default.

Descubrí que después de correr sudo grub-set-default 4, cuando corres grub-editenv listobtienes algo similar a:

saved_entry=4

Y cuando corres grub-reboot 4, obtienes algo como:

prev_saved_entry=0
saved_entry=4

Lo que significa que ambos hacen lo mismo (uno es temporal y el otro no).

Sorprendentemente, cuando intenté:

sudo grub-reboot 4
sudo reboot now

No funcionó, como si no hubiera hecho nada, solo me mostró el menú como de costumbre y seleccionó la primera entrada, diciendo que arrancará esta entrada en 10 segundos.

Lo intenté de nuevo, pensé que podría haber escrito una entrada incorrecta (está basada en cero, ¿verdad?). Esa vez, simplemente se colgó en la pantalla del menú, y tuve que reiniciar la PC para poder arrancar.

Si alguien puede probar esto, solo para ver si soy solo yo, lo agradecería. (mint me ha estado haciendo pasar un mal momento, y esa sería una buena ocasión para cambiar: P).

Al leer el código /boot/grub/grub.cfg, parece que este es el camino a seguir, pero según mis observaciones, solo se ignora esta configuración ...


en que distro estas Creo que lo tengo funcionando en mi Debian.
jw013

Respuestas:


20

Para que el grub-rebootcomando funcione, deben realizarse varios cambios de configuración necesarios:

  • La entrada predeterminada para grub debe establecerse en saved. Una posible ubicación para esto es la GRUB_DEFAULT=línea en/etc/default/grub
  • Use grub-set-defaultpara configurar su entrada predeterminada a la que usa normalmente.
  • Actualice su configuración de grub (por ejemplo update-grub).

Esto debería ocuparse de la configuración inicial. En el futuro, solo hazlo grub-reboot <entry>por un arranque de una sola vez <entry>.


Veo sus palabras "la entrada predeterminada para grub debe establecerse en saved", mientras que mi mantenimiento GRUB_DEFAULT=0también fue suficiente. Entonces, ¿es savedinnecesario?
zhangxaochen

No estoy seguro de si todos se dan cuenta de lo genial que es esta característica, planeo arrancar win7ult64 con rhel64, y viceversa, mientras que el rhel esté disponible automáticamente para otra tarea de copia de seguridad programada de sistemas en red win, que empuja al rhel zfs raidz2. Luego, cuando se completa la copia de seguridad, el sistema arrancado se reinicia automáticamente en un patio de juegos de Windows Gamer iis durante el resto de la semana, enjuague y repita. Es un cambiaformas. :-)
Brian Thomas

Me tomó años notar que grub-reinicio falla en silencio, dando un código de retorno exitoso. Espero que mi edición sugerida esté bien. :-)
Nadie

23
  1. Edite / etc / default / grub y reemplace GRUB_DEFAULT=0conGRUB_DEFAULT=saved
  2. sudo update-grub
  3. su comando será:

    sudo grub-reboot "$(grep -i 'windows' /boot/grub/grub.cfg|cut -d"'" -f2)" && sudo reboot
    

se verá una bonita función en su ~ / .bashrc

# ******************************************************************
# reboot directly to windows 
#   Inspired by http://askubuntu.com/questions/18170/how-to-reboot-into-windows-from-ubuntu
# ******************************************************************
function my_reboot_to_windows {
    WINDOWS_TITLE=`grep -i 'windows' /boot/grub/grub.cfg|cut -d"'" -f2`
    sudo grub-reboot "$WINDOWS_TITLE"
    sudo reboot
}

En caso de que su grub.conf contenga varias líneas para Windows, las siguientes funciones se ocuparán solo de las líneas que comienzan menuentryy seleccionan solo la primera, en referencia a Windows:

function my_reboot_to_windows {
    WINDOWS_TITLE=`grep -i "^menuentry 'Windows" /boot/grub/grub.cfg|head -n 1|cut -d"'" -f2`
    sudo grub-reboot "$WINDOWS_TITLE"
    sudo reboot
}

Mi archivo /boot/grub/grub.cfgcontiene más líneas con "Windows", muchas de las cuales indican algo así ...=1 i915.semaphores=1 acpi_osi='!Windows 2012' $vt..., así que supongo que su código fallará. Esto se puede solucionar haciendo grepping para ^menuentry 'Windows.
Jan Vlcinsky

Esto debe marcarse como la respuesta correcta.
Taha Rehman Siddiqui

La función es más útil de lo que pensaba.
Carson Ip

2

Una manera súper fácil de hacerlo es con GRUB Reboot GNOME Shell Extension (es decir, si está usando GNOME).

Para usar la extensión, vaya al sitio vinculado anteriormente y haga clic en la pequeña palanca en la esquina superior derecha (probablemente dice Desactivado cuando navega por primera vez a la página). Se le pedirá que confirme que desea descargar e instalar la extensión.

Una vez que está instalado, puede abrir el menú del sistema y hacer clic en el botón de encendido como lo haría normalmente para reiniciar. La ventana que aparece confirmando que desea cerrar o reiniciar ahora tiene un botón con la etiqueta "Reiniciar a ...". Cuando hace clic en ese botón, los elementos del menú de grub aparecen en la lista para que pueda seleccionar qué sistema operativo se iniciará automáticamente después de reiniciar. Si selecciona uno de esos elementos, su sistema se apagará y reiniciará utilizando las opciones de grub seleccionadas.


1
Edité mi publicación para incluir detalles de instalación y uso de la extensión.
Dylan Smith

1

Uso openSUSE, que viene con un script llamado grubonce, que hace exactamente lo que necesita: configurar la entrada de grub para usarla en el próximo reinicio.

# grubonce
0: Trace -- openSUSE 12.1 - 3.1.10-1.16
1: Debug -- openSUSE 12.1 - 3.1.10-1.16
2: Desktop -- openSUSE 12.1 - 3.1.10-1.16
3: Failsafe -- openSUSE 12.1 - 3.1.10-1.16

# grubonce 0
Using entry #0: Trace -- openSUSE 12.1 - 3.1.10-1.16

# grubonce 2
Using entry #2: Desktop -- openSUSE 12.1 - 3.1.10-1.16

No sé qué (si alguna) otras distribuciones envían este script, por lo que en caso de que su distribución no lo tenga, puede consultar esta página:

http://sidvind.com/wiki/GRUB:_Boot_another_OS_once


En realidad es parte de grub y Trustedgrub (lo que sea que sea) y NO grub2, así que no lo tengo instalado en tumbleweed junio de 2019
redanimalwar

1

grub-set-defaultparece más disponible ( grubonceno aparece en el verso de Ubuntu). También puede ser más útil ya que Windows 7 tiene la costumbre de reiniciar durante el inicio si las actualizaciones se aplicaron en el último apagado (es decir, comienza el inicio, procesa algunos datos de actualización, se reinicia y luego muestra la página de inicio de sesión).
A menudo he iniciado Windows 7 solo para volver y encontrar Ubuntu ejecutándose.


1
Desactivé la actualización de Windows, así que eso no debería ser un problema: D, lo intentaré. Por lo que vi, parece que esto hace lo mismo que grub-reboot. Estoy editando mi pregunta con más detalle. Gracias de cualquier manera.
jadkik94

1

En Fedora, puede usar el siguiente script. Tenga en cuenta que esto es casi lo mismo que se describe en https://askubuntu.com/a/18186/149422 , con algunas modificaciones para GRUB 2 en Fedora .

#!/bin/bash
if [ `readlink /boot/grub2/grubenv` == "/boot/efi/EFI/fedora/grubenv" ]; then
    sudo mv /boot/grub2/grubenv /boot/grub2/grubenv-original
    sudo ln -s ../efi/EFI/fedora/grubenv /boot/grub2/grubenv
fi
MENU_ENTRY=`grep ^menuentry /boot/grub2/grub.cfg  | grep --line-number Windows`
MENU_NUMBER=$(( `echo $MENU_ENTRY | sed -e "s/:.*//"` - 1 ))
sudo grub2-reboot $MENU_NUMBER
sudo reboot

1

Estoy usando Ubuntu 16.04 y las soluciones anteriores no funcionaron para mí ... por alguna razón, sudo grub-reboot 2nunca pareció actualizar el /boot/grub/grubenvarchivo, incluso después de cambiar GRUB_DEFAULT=0a GRUB_DEFAULT=savedambos /etc/default/gruby /boot/grub/menu.lst. El uso del savedefault --default=2 --oncecomando en grub tampoco parecía funcionar ni cambiar el archivo grubenv. Simplemente seguía volviendo al menú original de grub como si no se hubiera hecho nada.

Así que terminé haciéndolo manualmente y ha estado funcionando (sin embargo, no estoy seguro de cómo funcionaría con las unidades RAID).

sudo grub-editenv - set next_entry=2
reboot

Donde el 2 es la ubicación de entrada de menú basada en cero para la entrada de Windows en el menú de inicio de grub.

Puede ver por qué esto funciona mirando el /boot/grub/grub.cfgarchivo, ya que usa el valor next_entry y luego lo restablece para el próximo arranque.


0

De acuerdo con @ jw013. Y también puede asignar el mosaico de menú para reiniciar grub (incluido el título del menú principal). p.ej:

$ sudo grub-reboot "Advanced options for Ubuntu>Ubuntu, with Linux 4.13.0-26-generic"
$ sudo reboot

Donde "Opciones avanzadas para Ubuntu" es el menú principal, "Ubuntu, con Linux 4.13.0-26-generic" es el submenú.


0

Reinicie la máquina a un objetivo de arranque específico (entrada de Grub).
El objetivo de arranque se selecciona interactivamente con fzf.

# Search for grub.cfg
GRUB_CFG=$(find /boot -name grub.cfg 2> /dev/null)

if [[ -z ${GRUB_CFG} ]]; then
  echo "No grub.cfg found under /boot. Try as root."
  exit 1
elif [[ ! -r ${GRUB_CFG} ]]; then
  echo "${GRUB_CFG} is not readable. Try as root."
  exit 1
fi

GRUB_MENUENTRY=$(awk -F\' '/menuentry / {print $2}' ${GRUB_CFG} | fzf)

# Set boot target for next boot
grub2-reboot "${GRUB_MENUENTRY}"

reboot
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.