Come posso dire a GRUB che voglio riavviare in Windows prima di riavviare?


33

Ho installato un sistema Linux / Windows a doppio avvio e spesso passo dall'uno all'altro. Stavo pensando di poter aggiungere una voce di menu in uno dei menu per riavviare direttamente in Windows, senza fermarmi al prompt di GRUB.

Ho visto questa domanda su un forum, è esattamente quello che voglio ma si tratta di Lilo, che non è il mio caso.

Ho pensato a una soluzione che avrebbe modificato la voce predefinita nel menu di GRUB e quindi riavviata, ma ci sono alcuni svantaggi e mi chiedevo se ci fosse un'alternativa più pulita.

(Inoltre, sarei interessato a una soluzione per l'avvio da Windows direttamente su Linux, ma potrebbe essere più difficile, e non appartiene a questo. Comunque, fintanto che l'ho in un modo, l'altro potrebbe essere impostato come il predefinito.

AGGIORNAMENTO Sembra che qualcuno abbia posto una domanda simile , e se quelle sono le risposte suggerite, potrei anche modificare /boot/grub/grubenvcome grub-reboote grub-set-defaulte grub-editenvfare. )

Grazie in anticipo per eventuali suggerimenti.

AGGIORNAMENTO :

Questa è la mia versione di GRUB: (GRUB) 1.99-12ubuntu5-1linuxmint1

Ho provato a correre grubonce, il comando non è stato trovato. E cercarlo nei repository non mi dà niente. Sono su Linux Mint, quindi potrebbe essere così ...

Vedendo man grub-reboot, sembra che faccia quello che voglio, così come gruboncefa. È anche disponibile ovunque (almeno per me, penso che faccia parte del pacchetto grub). Ho visto due comandi correlati: grub-editenve grub-set-default.

Ho scoperto che dopo l'esecuzione sudo grub-set-default 4, quando corri grub-editenv listottieni qualcosa di simile a:

saved_entry=4

E quando corri grub-reboot 4, ottieni qualcosa del tipo:

prev_saved_entry=0
saved_entry=4

Ciò significa che entrambi fanno la stessa cosa (uno è temporaneo, non lo è).

Sorprendentemente, quando ho provato:

sudo grub-reboot 4
sudo reboot now

Non ha funzionato, come se non avessi fatto nulla, mi ha mostrato il menu come al solito e ha selezionato la prima voce, dicendo che avvierà questa voce in 10 secondi.

L'ho provato di nuovo, ho pensato che avrei potuto scrivere la voce sbagliata (è a base zero, giusto?). Quella volta, è appena appeso alla schermata del menu e ho dovuto ripristinare il PC per poter avviare.

Se qualcuno può provarlo, solo per vedere se sono solo io, lo apprezzerei. (La zecca mi ha dato problemi, e sarebbe una buona occasione per cambiare: P).

Leggendo il codice /boot/grub/grub.cfg, sembra che sia la strada da percorrere, ma dalle mie osservazioni, sta semplicemente ignorando queste impostazioni ...


su quale distro sei? Penso di averlo funzionato sul mio Debian.
jw013,

Risposte:


20

Affinché il grub-rebootcomando funzioni, sono necessarie diverse modifiche alla configurazione:

  • La voce predefinita per grub deve essere impostata su saved. Una possibile posizione per questo è la GRUB_DEFAULT=linea in/etc/default/grub
  • Utilizzare grub-set-defaultper impostare la voce predefinita su quella normalmente utilizzata.
  • Aggiorna la tua configurazione di grub (ad esempio update-grub).

Questo dovrebbe occuparsi della configurazione iniziale. In futuro, basta fare grub-reboot <entry>per l'avvio una tantum di <entry>.


Vedo le tue parole "la voce predefinita per grub deve essere impostata su saved", anche se il mio mantenimento è GRUB_DEFAULT=0stato sufficiente. Quindi savednon è necessario?
Zhangxaochen,

Non sono sicuro che tutti si rendano conto di quanto sia davvero interessante questa funzione, ho intenzione di avviare win7ult64 con rhel64 e viceversa, mentre il rhel diventa auto disponibile per un'altra attività di backup pianificata dei sistemi in rete win, che spinge al rhel zfs raidz2. Quindi, al termine del backup, il sistema estirpato si riavvia automaticamente in un parco giochi Windows Server per il resto della settimana, sciacquare e ripetere. È un cambio di forma. :-)
Brian Thomas,

Mi ci sono voluti anni per notare che grub-reboot fallisce silenziosamente, dando un codice di ritorno di successo. Spero che la mia modifica suggerita sia ok. :-)
Nessuno

23
  1. Modifica / etc / default / grub e sostituiscilo GRUB_DEFAULT=0conGRUB_DEFAULT=saved
  2. sudo update-grub
  3. il tuo comando sarà:

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

apparirà una bella funzione nel tuo ~ / .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
}

Nel caso in cui grub.conf contenga più righe per Windows, le seguenti funzioni si occuperanno solo delle righe che iniziano menuentrye selezionano solo la prima, facendo riferimento 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
}

Il mio file /boot/grub/grub.cfgcontiene più righe con "Windows", molte delle quali affermano qualcosa del genere ...=1 i915.semaphores=1 acpi_osi='!Windows 2012' $vt..., quindi suppongo che il tuo codice non ci riuscirà. Questo può essere risolto da grepping per ^menuentry 'Windows.
Jan Vlcinsky,

Questo dovrebbe essere contrassegnato come la risposta corretta.
Taha Rehman Siddiqui,

La funzione è più utile di quanto pensassi.
Carson Ip

2

Un modo semplicissimo per farlo è con GRUB Reboot GNOME Shell Extension (ovvero, se stai usando GNOME).

Per utilizzare l'estensione, vai al sito collegato sopra e fai clic sul piccolo interruttore nell'angolo in alto a destra (probabilmente dice Off quando accedi alla pagina per la prima volta). Ti verrà chiesto di confermare che desideri scaricare e installare l'estensione.

Una volta installato, puoi aprire il menu di sistema e fare clic sul pulsante di accensione come faresti normalmente per un riavvio. La finestra che si apre per confermare che desideri arrestare o riavviare ora ha un pulsante con l'etichetta "Riavvia a ...". Quando si fa clic su quel pulsante, le voci nel menu di grub vengono visualizzate nell'elenco in modo da poter selezionare il sistema operativo da avviare automaticamente dopo il riavvio. Se si seleziona uno di questi elementi, il sistema si spegne e si riavvia utilizzando le opzioni grub selezionate.


1
Ho modificato il mio post per includere dettagli sull'installazione e l'utilizzo dell'estensione.
Dylan Smith,

1

Uso openSUSE che viene fornito con uno script chiamato grubonce, che fa esattamente ciò di cui hai bisogno - imposta la voce grub da usare al prossimo riavvio.

# 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

Non so quali (se presenti) altre distribuzioni spediscono questo script, quindi nel caso in cui la tua distribuzione non lo abbia, puoi dare un'occhiata a questa pagina:

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


Fa effettivamente parte di grub e trustedgrub (qualunque cosa sia) e NON grub2, quindi non l'ho installato su tumbleweed giugno 2019
redanimalwar il

1

grub-set-defaultsembra più disponibile ( gruboncenon è elencato nel verso di Ubuntu). Potrebbe anche essere più utile poiché Windows 7 ha l'abitudine di eseguire un riavvio durante l'avvio se gli aggiornamenti sono stati applicati all'ultimo arresto (ovvero avvia l'avvio, elabora alcuni dati di aggiornamento, riavvia e quindi visualizza la pagina di accesso).
Ho spesso avviato Windows 7 solo per tornare e trovare Ubuntu in esecuzione.


1
Ho disattivato l'aggiornamento di Windows, quindi non dovrebbe essere un problema: D, ci proverò. Da quello che ho visto, sembra che questo faccia la stessa cosa grub-reboot. Sto modificando la mia domanda con maggiori dettagli. Grazie comunque.
jadkik94,

1

In Fedora, puoi usare il seguente script. Si noti che questo è principalmente lo stesso descritto in https://askubuntu.com/a/18186/149422 , con alcune modifiche per GRUB 2 in 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

Sto usando Ubuntu 16.04 e le soluzioni di cui sopra non ha funzionato per me ... per qualche motivo sudo grub-reboot 2non sembrava per aggiornare il /boot/grub/grubenvfile, anche dopo aver cambiato GRUB_DEFAULT=0a GRUB_DEFAULT=savedin entrambi /etc/default/grube /boot/grub/menu.lst. Anche l'utilizzo del savedefault --default=2 --oncecomando in grub non sembra funzionare né modificare il file grubenv. Continuava a tornare al menu originale di grub come se nulla fosse stato fatto.

Così ho finito per farlo manualmente e ha funzionato (non sono sicuro di come funzionerebbe con le unità RAID, però).

sudo grub-editenv - set next_entry=2
reboot

Dove 2 è la posizione della voce di menu a base zero per la voce di Windows nel menu di avvio di grub.

Puoi capire perché funziona guardando il /boot/grub/grub.cfgfile, poiché utilizza il valore next_entry e quindi lo reimposta per l'avvio successivo.


0

Accetto con @ jw013. E puoi anche dare il riquadro del menu a grub-reboot (incluso il titolo del menu principale). per esempio:

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

Dove "Opzioni avanzate per Ubuntu" è il menu principale, "Ubuntu, con Linux 4.13.0-26-generico" è il sottomenu.


0

Riavviare la macchina su una destinazione di avvio specifica (voce Grub).
La destinazione di avvio è selezionata in modo interattivo 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.