Comment puis-je dire à GRUB que je veux redémarrer sous Windows avant de redémarrer?

33

J'ai un système Linux / Windows à double démarrage, et passe souvent de l'un à l'autre. Je pensais que je pourrais ajouter un élément de menu dans l’un des menus pour redémarrer directement dans Windows, sans s’arrêter à l’invite GRUB.

J'ai vu cette question sur un forum, c'est exactement ce que je veux, mais il s'agit de lilo, ce qui n'est pas mon cas.

J'ai pensé à une solution qui modifierait l'entrée par défaut dans le menu GRUB, puis redémarrerait, mais il y a quelques inconvénients et je me demandais s'il existait une alternative plus propre.

(En outre, une solution permettant de démarrer Windows directement sous Linux pourrait m'intéresser, mais cela pourrait être plus difficile et n'a pas sa place ici. Quoi qu'il en soit, tant que je dispose le défaut.

MISE À JOUR Il semble que quelqu'un a demandé une question similaire , et si ce sont les réponses proposées, je pourrais aussi bien modifier /boot/grub/grubenvcomme grub-rebootet grub-set-defaultet grub-editenvfaire. )

Merci d'avance pour des conseils.

MISE À JOUR :

Ceci est ma version de GRUB: (GRUB) 1.99-12ubuntu5-1linuxmint1

J'ai essayé de courir grubonce, la commande n'est pas trouvée. Et chercher dans les dépôts ne me donne rien. Je suis sur Linux Mint, alors c'est peut-être ça ...

En voyant man grub-rebootça, on dirait que ça fait ce que je veux, tout comme grubonce. Il est également disponible partout (du moins pour moi, je pense que cela fait partie du paquet grub). J'ai vu deux commandes connexes: grub-editenvet grub-set-default.

J'ai découvert qu'après avoir lancé sudo grub-set-default 4, grub-editenv listvous obtenez quelque chose de similaire à:

saved_entry=4

Et en courant grub-reboot 4, vous obtenez quelque chose comme:

prev_saved_entry=0
saved_entry=4

Ce qui signifie que les deux font la même chose (un temporaire, l'autre non).

Étonnamment, quand j'ai essayé:

sudo grub-reboot 4
sudo reboot now

Cela n'a pas fonctionné, comme si je n'avais rien fait, il m'a simplement montré le menu comme d'habitude, et a sélectionné la première entrée, en disant qu'elle démarrera cette entrée dans 10 secondes.

Je l'ai réessayé, je pensais avoir mal écrit (c'est zéro, c'est ça?). Cette fois-ci, l'écran du menu était accroché et je devais réinitialiser le PC pour pouvoir démarrer.

Si quelqu'un peut essayer cela, juste pour voir si c'est juste moi, je l'apprécierais. (La menthe m'a donné du fil à retordre, et ce serait une bonne occasion de changer: P).

En lisant le code /boot/grub/grub.cfg, cela semble être la voie à suivre, mais d'après mes observations, il ne tient compte que de ces paramètres ...

jadkik94
la source
tu es sur quelle distro Je pense que cela fonctionne sur ma Debian.
jw013

Réponses:

20

Pour que la grub-rebootcommande fonctionne, plusieurs modifications de configuration requises doivent être en place:

  • L'entrée par défaut pour grub doit être définie sur saved. Un emplacement possible pour cela est la GRUB_DEFAULT=ligne dans/etc/default/grub
  • Utilisez grub-set-defaultpour définir votre entrée par défaut sur celle que vous utilisez normalement.
  • Mettez à jour votre configuration grub (par exemple update-grub).

Cela devrait prendre en charge la configuration initiale. Dans le futur, faites juste grub-reboot <entry>pour un démarrage unique de <entry>.

jw013
la source
Je vois vos mots "L'entrée par défaut pour grub doit être réglée sur saved", alors que ma conservation GRUB_DEFAULT=0suffisait également. Donc est savedinutile?
Zhangxaochen
Je ne suis pas sûr que tout le monde réalise à quel point cette fonctionnalité est vraiment cool, je prévois de démarrer win7ult64 avec rhel64, et vice-versa, tout en maintenant rhel disponible automatiquement pour une autre tâche de sauvegarde programmée des systèmes en réseau gagnant, qui est transférée sur rhel zfs raidz2. Puis, à la fin de la sauvegarde, le système arraché s’installe automatiquement dans une aire de jeux pour serveur Windows Gamer IIS pour le reste de la semaine, puis rincez et répétez. C'est une forme shifter. :-)
Brian Thomas
Il m'a fallu un bon bout de temps pour constater que le redémarrage de grub échouait silencieusement, donnant un code de retour réussi. J'espère que mon édition suggérée est ok. :-)
Personne
23
  1. Editez le fichier / etc / default / grub et remplacez-le GRUB_DEFAULT=0parGRUB_DEFAULT=saved
  2. sudo update-grub
  3. votre commande sera:

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

une jolie fonction dans votre ~ / .bashrc ressemblera à

# ******************************************************************
# 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
}

Si votre fichier grub.conf contient plusieurs lignes pour Windows, les fonctions suivantes ne s’occuperont que des lignes commençant par menuentryet ne sélectionnant que la première, en référence à 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
}
Philippe Gachoud
la source
Mon fichier /boot/grub/grub.cfgcontient plus de lignes contenant "Windows", la plupart d'entre elles indiquant quelque chose comme ...=1 i915.semaphores=1 acpi_osi='!Windows 2012' $vt...ceci, donc je suppose que votre code échouera. Cela peut être corrigé par grepping pour ^menuentry 'Windows.
Jan Vlcinsky
Cela devrait être marqué comme la bonne réponse.
Taha Rehman Siddiqui
La fonction est plus utile que je pensais.
Carson Ip
2

Un moyen très facile de le faire consiste à utiliser l’ extension de shell GNOME de GRUB Reboot (c’est-à-dire si vous utilisez GNOME).

Pour utiliser l'extension, rendez-vous sur le site lié ci-dessus, puis cliquez sur la petite bascule située dans le coin supérieur droit (il est probablement indiqué Désactivé lorsque vous accédez pour la première fois à la page). Vous serez invité à confirmer que vous souhaitez télécharger et installer l'extension.

Une fois qu'il est installé, vous pouvez ouvrir votre menu Système et cliquer sur le bouton d'alimentation comme vous le feriez normalement pour un redémarrage. La fenêtre qui s'ouvre confirmant que vous souhaitez arrêter ou redémarrer a maintenant un bouton intitulé "Redémarrer à ...". Lorsque vous cliquez sur ce bouton, les éléments de votre menu de menu apparaissent dans la liste pour vous permettre de sélectionner le système d'exploitation à lancer automatiquement après le redémarrage. Si vous sélectionnez l'un de ces éléments, votre système s'arrêtera et redémarrera à l'aide des options Grub sélectionnées.

Dylan Smith
la source
1
J'ai édité mon message pour inclure les détails d'installation et d'utilisation de l'extension.
Dylan Smith
1

J'utilise openSUSE, qui est livré avec un script appelé grubonce, qui fait exactement ce dont vous avez besoin - définissez l'entrée grub à utiliser lors du prochain redémarrage.

# 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

Je ne sais pas quelle autre distribution (le cas échéant) propose ce script. Par conséquent, si votre distribution ne l’a pas, vous pouvez consulter cette page:

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

Petr Uzel
la source
C'est en fait une partie de grub et trustedgrub (peu importe ce que c'est) et PAS grub2, donc je ne l'ai pas installé sur tumbleweed juin 2019
redanimalwar
1

grub-set-defaultsemble plus disponible ( gruboncene figure pas dans le verset Ubuntu). Cela peut également être plus utile car Windows 7 a l'habitude de redémarrer au démarrage si les mises à jour ont été appliquées lors du dernier arrêt (c'est-à-dire qu'il démarre le démarrage, traite certaines données de mise à jour, redémarre, puis affiche la page de connexion).
J'ai souvent démarré Windows 7 uniquement pour revenir et trouver Ubuntu en cours d'exécution.

Le pont Charles
la source
1
J'ai désactivé la mise à jour Windows, cela ne devrait donc pas poser de problème: D, je vais essayer. D'après ce que j'ai vu, il semble que cela fasse la même chose que grub-reboot. Je modifie ma question avec plus de détails. Merci quand même.
jadkik94
1

Dans Fedora, vous pouvez utiliser le script suivant. Notez qu'il s'agit généralement de la même chose que celle décrite dans https://askubuntu.com/a/18186/149422 , avec quelques modifications pour GRUB 2 dans 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
Roy Hyunjin Han
la source
1

J'utilise Ubuntu 16.04 et les solutions ci - dessus n'a pas fonctionné pour moi ... pour une raison quelconque sudo grub-reboot 2n'a jamais semblé mettre à jour le /boot/grub/grubenvfichier, même après avoir changé GRUB_DEFAULT=0à GRUB_DEFAULT=saveddans les deux /etc/default/grubet /boot/grub/menu.lst. L'utilisation de la savedefault --default=2 --oncecommande dans grub ne semble pas non plus fonctionner ni modifier le fichier grubenv. Il revenait toujours dans le menu original, comme si de rien n'était.

Donc, j'ai fini par le faire manuellement et cela a fonctionné (je ne sais pas comment cela fonctionnerait avec les disques RAID, cependant).

sudo grub-editenv - set next_entry=2
reboot

Où 2 est l'emplacement de l'entrée de menu de base zéro pour l'entrée Windows dans le menu de démarrage de grub.

Vous pouvez voir pourquoi cela fonctionne en examinant le /boot/grub/grub.cfgfichier, car il utilise la valeur next_entry, puis le réinitialise pour le prochain démarrage.

utilisateur4061565
la source
0

D'accord avec @ jw013. Et vous pouvez également donner la vignette de menu pour redémarrer grub (y compris le titre du menu parent). par exemple:

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

Où "Options avancées pour Ubuntu" est le menu parent, "Ubuntu, avec Linux 4.13.0-26-generic" est le sous-menu.

Changbin Du
la source
0

Redémarrez l'ordinateur sur une cible d'amorçage spécifique (entrée Grub).
La cible de démarrage est sélectionnée de manière interactive avec 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
Simon Schürg
la source