Cacher le menu GRUB2 SAUF si vous maintenez la touche Maj enfoncée: comment y arriver?

30

J'ai une configuration Ubuntu - Windows 7 à double démarrage, et je voudrais que mon portable démarre Windows 7 à moins d’appuyer sur la touche Maj après le démarrage et d’afficher le menu Grub2 à partir duquel Je peux choisir Ubuntu.

J'ai fait des recherches sur Grub2 et les options pour etc/default/grub et j'ai essayé de jouer avec des combinaisons avec les valeurs GRUB_TIMEOUT et GRUB_HIDDEN_TIMEOUT , mais en vain. J'ai essayé de régler le GRUB_HIDDEN_TIMEOUT plus haut que le GRUB_TIMEOUT pensant que les deux comptes à rebours commencent simultanément, mais no - GRUB_TIMEOUT ne commence qu'après que l'autre soit terminé.

Ce comportement est-il réalisable?

Si oui, comment?

    
posée Bez Hermoso 31.03.2012 - 06:12
la source

11 réponses

14

Je pense que j'ai trouvé une résolution plus simple. Modifiez les lignes suivantes dans le fichier / etc / default / grub:

GRUB_HIDDEN_TIMEOUT = 0.0

GRUB_TIMEOUT = 0.0

Bien sûr, nous exécutons enfin un update-grub. Cela fonctionne sur mon PC.

    
réponse donnée sivitri 09.07.2013 - 10:06
la source
9

Ceci est pour Ubuntu 16.04.

J'ai résolu ceci avec une petite combinaison de certaines des réponses trouvées ci-dessus, il n'est donc pas nécessaire de modifier 30_os-prober, en évitant les futures fusions lorsque le paquet grub est mis à jour ...

J'espère que ça aide.

Modification de certaines variables dans / etc / default / grub pour refléter ce que je veux;

GRUB_DEFAULT=4
GRUB_HIDDEN_TIMEOUT=5
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR='lsb_release -i -s 2> /dev/null || echo Debian'
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

GRUB_FORCE_HIDDEN_MENU="true"
export GRUB_FORCE_HIDDEN_MENU

Puis créé un nouveau fichier;

sudo touch /etc/grub.d/50_hidemenu
sudo chmod +x /etc/grub.d/50_hidemenu

l'a rempli avec ce contenu;

#!/bin/sh
cat <<EOF
if [ "x${timeout}" != "x-1" ]; then
  if keystatus; then
    if keystatus --shift; then
      set timeout=-1
    else
      set timeout=0
    fi
  else
    if sleep --interruptible ${GRUB_HIDDEN_TIMEOUT} ; then
      set timeout=0
    fi
  fi
fi
EOF

et mis à jour grub;

sudo update-grub

Cheers.

    
réponse donnée tux1c 07.05.2016 - 17:15
la source
8

Dans Kubuntu 14.04, cela ne fonctionne pas si vous définissez GRUB_TIMEOUT= 0 , étrangement, après l'application et le redémarrage, le menu grub reste visible pendant 10s.

La raison en est que dans un autre script grub, il y a un morceau de code qui définit grub_timeout à 10 s'il a la valeur 0.

Voilà comment ça marche:

faites une copie des fichiers grub et 30_osprober !!! Si quelque chose ne va pas, vous pouvez remettre les fichiers originaux

Dans /etc/default/grub

GRUB_DEFAULT=4    #set this value to the OS you want to boot
GRUB_HIDDEN_TIMEOUT=0

GRUB_TIMEOUT=0

dans /etc/grub.d/30_os-prober , il y a un morceau de code qui définit le timeout grub à 10s s'il est mis à zéro dans /etc/default/grub , je ne sais pas pourquoi les développeurs l'ont mis là, mais cela empêche de cacher le menu grub.

set timeout_style=menu

if [ "${timeout}" = 0 ]; then    
  set timeout=10  # I changed this from 10 to 0

Après ces modifications, exécutez sudo update-grub pour générer la nouvelle séquence de démarrage grub.

Je documente tous mes correctifs / mods Linux sur lien

    
réponse donnée user310707 30.07.2014 - 19:29
la source
4

Pour démarrer automatiquement Windows sans avoir à sélectionner dans le menu GRUB, nous devons modifier le fichier /etc/default/grub avec des valeurs similaires à celles-ci:

GRUB_DEFAULT= <number of default entry starting from 0>
GRUB_TIMEOUT= 0 # time in seconds to boot default
# GRUB_HIDDEN_TIMEOUT=0 # warning: activating this may lock you out from GRUB menu

C'est toujours une bonne idée de faire des sauvegardes de ces fichiers avant de les éditer. Après avoir apporté des modifications, il faut les activer avec

sudo update-grub

Les valeurs de GRUB_DEFAULT dépendent de notre système individuel. Pour toujours démarrer Windows, nous pouvons également placer le nom de l'entrée exactement comme il était affiché dans le menu Grub (par exemple, "Microsoft Windows XP Professional" ) au lieu du numéro de l'entrée.

Remarque importante: dans certaines machines, le menu GRUB ne peut pas être affiché en maintenant la touche gauche Shift au démarrage (voir bug # 425979 ). Par conséquent, il peut être judicieux de commencer par tester ceci avec le démarrage d'Ubuntu (pas Windows) défini comme système d'exploitation par défaut. Vous pourrez alors annuler facilement vos paramètres GRUB au cas où vous seriez affecté.

    
réponse donnée Takkat 31.03.2012 - 12:10
la source
4

J'essayais de faire la même chose et j'ai trouvé une aide précieuse dans les forums Ubuntu, en particulier dans ce sujet . .

En supposant que vous avez bien fait avec /etc/default/grub , en définissant correctement GRUB_TIMEOUT et GRUB_HIDDEN_TIMEOUT (je dirais respectivement 0 et 5) et même GRUB_DEFAULT pour spécifier l'image par défaut à démarrer, voici la procédure pour que cela fonctionne correctement.

  1. Ajoutez ces lignes

    GRUB_FORCE_HIDDEN_MENU="true"
    export GRUB_FORCE_HIDDEN_MENU
    

    à la fin de /etc/default/grub

  2. Sauvegardez votre /etc/grub.d/30_os-prober et remplacez-le par la version trouvée ici

  3. Testez-le! Pour afficher le menu, appuyez sur la touche SHIFT

Ce problème est lié à la configuration multi-OS et la modification du script est l’un des moyens de le corriger.

30_os-prober :

#! /bin/sh
set -e

# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009  Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.

prefix="/usr"
exec_prefix="${prefix}"
datarootdir="${prefix}/share"

. "${datarootdir}/grub/grub-mkconfig_lib"

found_other_os=

make_timeout () {

  if [ "x${found_other_os}" = "x" ] || [ "x${GRUB_FORCE_HIDDEN_MENU}" = "xtrue" ] ; then 
    if [ "x" != "x" ] ; then
      if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then
    verbose=
      else
    verbose=" --verbose"
      fi

      if [ "x" = "x0" ] ; then
    cat <<EOF
if [ "x${timeout}" != "x-1" ]; then
  if keystatus; then
    if keystatus --shift; then
      set timeout=-1
    else
      set timeout=0
    fi
  else
    if sleep$verbose --interruptible 3 ; then
      set timeout=0
    fi
  fi
fi
EOF
      else
    cat << EOF
if [ "x${timeout}" != "x-1" ]; then
  if sleep$verbose --interruptible ${GRUB_HIDDEN_TIMEOUT} ; then
    set timeout=0
  fi
fi
EOF
      fi
    fi
  fi
}

adjust_timeout () {
  if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
    cat <<EOF
if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
EOF
    make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}"
    echo else
    make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"
    echo fi
  else
    make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"
  fi
}

if [ "x${GRUB_DISABLE_OS_PROBER}" = "xtrue" ]; then
  adjust_timeout
  exit 0
fi

if [ -z "'which os-prober 2> /dev/null'" -o -z "'which linux-boot-prober 2> /dev/null'" ] ; then
  # missing os-prober and/or linux-boot-prober
  adjust_timeout
  exit 0
fi

OSPROBED="'os-prober | tr ' ' '^' | paste -s -d ' ''"
if [ -z "${OSPROBED}" ] ; then
  # empty os-prober output, nothing doing
  adjust_timeout
  exit 0
fi

osx_entry() {
    found_other_os=1
        cat << EOF
menuentry "${LONGNAME} (-bit) (on ${DEVICE})" --class osx --class darwin --class os {
EOF
    save_default_entry | sed -e "s/^/\t/"
    prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
    cat << EOF
        load_video
        set do_resume=0
        if [ /var/vm/sleepimage -nt10 / ]; then
           if xnu_resume /var/vm/sleepimage; then
             set do_resume=1
           fi
        fi
        if [ $do_resume = 0 ]; then
           xnu_uuid ${OSXUUID} uuid
           if [ -f /Extra/DSDT.aml ]; then
              acpi -e /Extra/DSDT.aml
           fi
            /mach_kernel boot-uuid=${uuid} rd=*uuid
           if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then
              xnu_mkext /System/Library/Extensions.mkext
           else
              xnu_kextdir /System/Library/Extensions
           fi
           if [ -f /Extra/Extensions.mkext ]; then
              xnu_mkext /Extra/Extensions.mkext
           fi
           if [ -d /Extra/Extensions ]; then
              xnu_kextdir /Extra/Extensions
           fi
           if [ -f /Extra/devprop.bin ]; then
              xnu_devprop_load /Extra/devprop.bin
           fi
           if [ -f /Extra/splash.jpg ]; then
              insmod jpeg
              xnu_splash /Extra/splash.jpg
           fi
           if [ -f /Extra/splash.png ]; then
              insmod png
              xnu_splash /Extra/splash.png
           fi
           if [ -f /Extra/splash.tga ]; then
              insmod tga
              xnu_splash /Extra/splash.tga
           fi
        fi
}
EOF
}

wubi=

for OS in ${OSPROBED} ; do
  DEVICE="'echo ${OS} | cut -d ':' -f 1'"
  LONGNAME="'echo ${OS} | cut -d ':' -f 2 | tr '^' ' ''"
  LABEL="'echo ${OS} | cut -d ':' -f 3 | tr '^' ' ''"
  BOOT="'echo ${OS} | cut -d ':' -f 4'"

  if [ -z "${LONGNAME}" ] ; then
    LONGNAME="${LABEL}"
  fi

  echo "Found ${LONGNAME} on ${DEVICE}" >&2

  case ${BOOT} in
    chain)

      case ${LONGNAME} in
    Windows*)
      if [ -z "$wubi" ]; then
        if [ -x /usr/share/lupin-support/grub-mkimage ] && \
           /usr/share/lupin-support/grub-mkimage --test; then
          wubi=yes
        else
          wubi=no
        fi
      fi
      if [ "$wubi" = yes ]; then
        echo "Skipping ${LONGNAME} on Wubi system" >&2
        continue
      fi
      ;;
      esac

      found_other_os=1
      cat << EOF
menuentry "${LONGNAME} (on ${DEVICE})" --class windows --class os {
EOF
      save_default_entry | sed -e "s/^/\t/"
      prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"

      case ${LONGNAME} in
    Windows\ Vista*|Windows\ 7*|Windows\ Server\ 2008*)
    ;;
    *)
      cat << EOF
    drivemap -s (hd0) ${root}
EOF
    ;;
      esac

      cat <<EOF
    chainloader +1
}
EOF
    ;;
    linux)
      LINUXPROBED="'linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' ''"
      prepare_boot_cache=

      for LINUX in ${LINUXPROBED} ; do
        LROOT="'echo ${LINUX} | cut -d ':' -f 1'"
        LBOOT="'echo ${LINUX} | cut -d ':' -f 2'"
        LLABEL="'echo ${LINUX} | cut -d ':' -f 3 | tr '^' ' ''"
        LKERNEL="'echo ${LINUX} | cut -d ':' -f 4'"
        LINITRD="'echo ${LINUX} | cut -d ':' -f 5'"
        LPARAMS="'echo ${LINUX} | cut -d ':' -f 6- | tr '^' ' ''"

        if [ -z "${LLABEL}" ] ; then
          LLABEL="${LONGNAME}"
        fi

    if [ "${LROOT}" != "${LBOOT}" ]; then
      LKERNEL="${LKERNEL#/boot}"
      LINITRD="${LINITRD#/boot}"
    fi

    if [ -z "${prepare_boot_cache}" ]; then
      prepare_boot_cache="$(prepare_grub_to_access_device ${LBOOT} | sed -e "s/^/\t/")"
      [ "${prepare_boot_cache}" ] || continue
    fi
    found_other_os=1
        cat << EOF
menuentry "${LLABEL} (on ${DEVICE})" --class gnu-linux --class gnu --class os {
EOF
    save_default_entry | sed -e "s/^/\t/"
    printf '%s\n' "${prepare_boot_cache}"
    cat <<  EOF
    linux ${LKERNEL} ${LPARAMS}
EOF
        if [ -n "${LINITRD}" ] ; then
          cat << EOF
    initrd ${LINITRD}
EOF
        fi
        cat << EOF
}
EOF
      done
    ;;
    macosx)
      OSXUUID="'grub-probe --target=fs_uuid --device ${DEVICE} 2> /dev/null'"
      osx_entry xnu_kernel 32
      osx_entry xnu_kernel64 64
    ;;
    hurd)
      found_other_os=1
      cat << EOF
menuentry "${LONGNAME} (on ${DEVICE})" --class hurd --class gnu --class os {
EOF
      save_default_entry | sed -e "s/^/\t/"
      prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
      grub_device="'${grub_probe} --device ${DEVICE} --target=drive'"
      mach_device="'echo "${grub_device}" | sed -e 's/(\(hd.*\),msdos\(.*\))/s/''"
      grub_fs="'${grub_probe} --device ${DEVICE} --target=fs'"
      case "${grub_fs}" in
    *fs)    hurd_fs="${grub_fs}" ;;
    *)  hurd_fs="${grub_fs}fs" ;;
      esac
      cat << EOF
    multiboot /boot/gnumach.gz root=device:${mach_device}
    module /hurd/${hurd_fs}.static ${hurd_fs} --readonly \
            --multiboot-command-line='${kernel-command-line}' \
            --host-priv-port='${host-port}' \
            --device-master-port='${device-port}' \
            --exec-server-task='${exec-task}' -T typed '${root}' \
            '$(task-create)' '$(task-resume)'
    module /lib/ld.so.1 exec /hurd/exec '$(exec-task=task-create)'
}
EOF
    ;;
    *)
      echo "  ${LONGNAME} is not yet supported by grub-mkconfig." >&2
    ;;
  esac
done

adjust_timeout


    cat <<EOF
if [ "x${timeout}" != "x-1" ]; then
  if keystatus; then
    if keystatus --shift; then
      set timeout=-1
    else
      set timeout=0
    fi
  else
    if sleep$verbose --interruptible 3 ; then
      set timeout=0
    fi
  fi
fi
EOF
    
réponse donnée Dariopnc 09.07.2012 - 21:08
la source
3

Sur Ubuntu 16.04, j'ai apporté les modifications suivantes. Bien sûr, vous devez être un utilisateur privilégié pour le faire.

  1. La première modification concerne le fichier /etc/grub.d/30_os-prober :

    • Ouvrez-le avec sudo gedit /etc/grub.d/30_os-prober
    • Remplacez quick_boot="1" par quick_boot="0"
    • enregistrer le fichier
  2. Par la suite, vous pouvez définir les valeurs de délai d'attente en /etc/default/grub sur zéro ou une autre valeur:

    • Ouvrez-le avec sudo gedit /etc/default/grub
    • GRUB_HIDDEN_TIMEOUT=0 et GRUB_TIMEOUT=0 .
    • enregistrer le fichier
  3. La dernière étape consiste à mettre à jour grub

    • sudo update-grub

Les modifications apportées au premier fichier sont dues au fait que si un autre système d’exploitation (par exemple, Windows 10) est détecté, la valeur du délai d’expiration est toujours fixée à 10 secondes et ne peut donc pas être modifiée par /etc/default/grub . Ceci est accompli par une fonction nommée adjust_timeout qui demande si quick_boot est défini sur et si d'autres systèmes d'exploitation sont présents.

    
réponse donnée AtoA 06.02.2017 - 19:49
la source
2

installer l'optimiseur grub

  

sudo add-apt-repository ppa: danielrichter2007 / grub-customizer

sudo apt-get update
sudo apt-get install grub-customizer

Grub Customizer apparaîtra désormais dans Applications & gt; Menu Outils système.

Ou vous pouvez l’ouvrir depuis la ligne de commande.

  

gksudo grub-customizer

    
réponse donnée pankaj sharma 31.03.2012 - 07:38
la source
0

FAIRE AUTOMATIQUE DU MENU GRUB2 BOOT VISIBLE

Pour une raison quelconque, la modification des paramètres GRUB_GFXMODE=640x480 dans le Customizer Grub rend généralement le menu de démarrage visible:

  1. Installez grub-customizer comme ci-dessus et mettez à jour
  2. trouver Grub Customizer dans l’interface graphique (pour moi, c’est dans System & gt; Administration & gt; ..., mais pour certains, c’est sous Applications & gt; System Tools & gt; ..)
  3. Ouvrez Grub Customizer et sélectionnez Préférences & gt; Avancé
  4. Sélectionnez GRUB_gfxmode (640X480) - s'il est déjà sélectionné, désélectionnez-le, redémarrez-le et sélectionnez-le à nouveau.
  5. croise les doigts et redémarre!

Je n'ai aucune idée de la raison pour laquelle cela a fonctionné pour moi, mais cela a fonctionné sur mes deux ordinateurs, alors j'espère que cela fonctionnera pour vous aussi!

    
réponse donnée Canadonia 22.04.2012 - 18:15
la source
0

Shasteriskt, une alternative à la solution 'SHIFT' consiste simplement à créer un script qui effectue des opérations de déplacement pour vous. Ce que je veux dire, c'est créer un fichier appelé grub.bak qui est une copie exacte de votre fichier grub.cfg , la seule différence étant que la ligne set timeout=0 est remplacée par exemple par set timeout=10 . Créez un script shell qui fait un commutateur vous permettant de redémarrer en fonction de vos besoins. J'ai créé un script python équivalent qui répond à ces exigences, mais bien sûr il doit être appelé avec sudo . Je le mets simplement dans /usr/bin sur mon installation en tant que lien symbolique vers le script proprement dit. Note: J'utilise fluxbox sur Arch donc je ne suis pas sûr qu'il y ait des divergences entre ce script et Ubuntu, mais je pense qu'il devrait y avoir peu ou pas de modifications. Le script ressemble à:

#! /usr/bin/python
from shlex import split
from subprocess import call
from os import rename, chdir

chdir('/boot/grub/')
try:
    with open('grub.bak','r') as alternate:
        pass
    if raw_input('Auto-boot is set. Un-set?> ') == 'y':
        rename('grub.cfg','grub.back')
        rename('grub.bak','grub.cfg')

    if raw_input('Reboot system?> ') == 'y':
        call(split('shutdown -r now'))

except:
    if raw_input('Auto-boot is not set. Set?> ') == 'y':
        rename('grub.cfg','grub.bak')
        rename('grub.back','grub.cfg')

    if raw_input('Reboot system?> ') == 'y':
        call(split('shutdown -r now'))

Le script détermine simplement si vous avez ou non le menu à charger (démarrage automatique ou non). Sur la base de ses résultats, il vous demande si vous souhaitez l'activer ou non, puis vous demande si vous souhaitez redémarrer. À l'inverse, si vous souhaitez qu'il fonctionne différemment (c'est-à-dire sous Windows) et que Windows soit configuré pour accéder aux fichiers sous Linux, vous pouvez également exécuter le même script dans cet environnement, si vous le souhaitez. J'espère que ça aide.

    
réponse donnée eazar001 25.05.2013 - 07:31
la source
0

J'avais le même problème sur un seul système de démarrage. Si GRUB_TIMEOUT était différent de zéro, le menu serait toujours affiché, indépendamment de GRUB_HIDDEN_TIMEOUT. Si GRUB_TIMEOUT était à zéro, il serait en veille pour les secondes GRUB_HIDDEN_TIMEOUT, mais ni SHIFT ni ESC ne montreraient le menu.

Je l’ai corrigé en ajoutant une clause else à l’état de veille à la fin de adjust_time () dans 30_os-prober. Maintenant, s'il n'est pas interrompu, le délai d'attente est égal à zéro et il démarre sans menu, mais s'il est interrompu, définissez le délai d'attente sur 10.

Cela semble effectivement en arrière puisque sleep doit retourner 0 (false) s'il n'est pas interrompu et 1 (true) si c'est le cas, mais cela a semblé fonctionner pour moi.

    
réponse donnée Mark Thueson 10.07.2013 - 20:08
la source
0

Donc, même si vous définissez GRUB_TIMEOUT à 0, si vous avez un GRUB_HIDDEN_TIMEOUT, 30_os-prober définira timeout sur 10, que cela vous plaise ou non. D'autres solutions ici modifient ce script, mais cela pourrait entraîner des problèmes de mise à jour que vous devrez fusionner si GRUB est mis à jour.

Meilleure solution: écrivez ce qui suit dans /etc/grub.d/50_goddamnit (nouveau fichier):

#!/bin/sh
echo "set timeout=0"

Fondamentalement, cela lancera last et sera la dernière ligne dans /boot/grub/grub.conf, remplaçant ainsi tous les autres mishigus idiots dans la configuration par défaut.

    
réponse donnée Fordi 06.01.2016 - 15:12
la source

Lire d'autres questions sur les étiquettes