Скрыть меню GRUB2, если вы не удерживаете клавишу Shift: как это сделать?

У меня установлена ​​двойная загрузка Ubuntu - Windows 7, и я хотел бы, чтобы мой ноутбук загружал Windows 7, если только я не нажму клавишу Shift сразу после загрузки и выведу меню Grub2, из которого Я могу выбрать Ubuntu.

Я исследовал Grub2 и варианты для etc/default/grub, и я попытался поиграть с комбинациями со значениями GRUB_TIMEOUT и GRUB_HIDDEN_TIMEOUT, но безрезультатно. Я попытался установить GRUB_HIDDEN_TIMEOUT выше, чем GRUB_TIMEOUT, думая, что оба обратного отсчета начинаются одновременно, но нет - GRUB_TIMEOUT запускается только после того, как другой будет сделан.

Это поведение достижимо?

Если да, то как?

34
задан 31 March 2012 в 08:12

13 ответов

Думаю, что нашел более простое разрешение. Измените следующие строки в файле / etc / default / grub:

GRUB_HIDDEN_TIMEOUT = 0.0

GRUB_TIMEOUT = 0.0

Конечно, мы, наконец, запускаем update-grub. Он работает на моем компьютере.

16
ответ дан 31 March 2012 в 08:12

Это для Ubuntu 16.04.

Я решил это с помощью небольшой комбинации некоторых из ответов, найденных выше, поэтому нет необходимости изменять 30_os-prober, чтобы избежать будущего сливается при обновлении пакета grub ...

Надеюсь, это поможет.

Изменены некоторые переменные в / etc / default / grub, чтобы отразить то, что я хочу;

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

Затем создал новый файл;

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

заполнил его с этим контентом;

#!/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

и обновленная личинка;

sudo update-grub

Ура.

10
ответ дан 31 March 2012 в 08:12

ግሩብ ቡት ሜኑ በራስ-ሰር እንዲታይ ማድረግ

በሆነ ምክንያት በግሩብ ብጁጅ ውስጥ የ GRUB_GFXMODE = 640x480 ቅንብሮችን በማስተካከል አብዛኛውን ጊዜ የማስነሻ ምናሌው እንዲታይ ያደርገዋል

  1. ከላይ እንደተጠቀሰው ግሩብ-ማበጀሪያን ይጫኑ እና ያዘምኑ
  2. በ ‹GUI› ውስጥ ‹Grub Customizer› ን ያግኙ (ለእኔ በሲስተም> አስተዳደር> ውስጥ ነው ... ማበጀት እና ምርጫዎችን ይምረጡ> የላቀ
  3. ን ይምረጡ GRUB_gfxmode (640X480) - አስቀድሞ ከተመረጠ አይምረጡ ፣ ዳግም ያስነሱ ፣እና እንደገና ምረጥ።
  4. ጣቶችህን አሻግረህ እንደገና አስነሳ!

ይህ ለምን ለእኔ እንደሰራ አላውቅም ፣ ግን በሁለቱም ኮምፒውተሮቼ ላይ ሰርቷል ፣ ስለዚህ ለእናንተም እንደሚሰራ ተስፋ አደርጋለሁ!

0
ответ дан 31 March 2012 в 08:12

Для автоматической загрузки Windows без необходимости выбора из меню GRUB нам нужно отредактировать файл / etc / default / grub со значениями, подобными на эти:

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

Всегда рекомендуется создавать резервные копии этих файлов перед их редактированием. После внесения изменений нам необходимо активировать их с помощью

sudo update-grub

. Значения GRUB_DEFAULT зависят от нашей индивидуальной системы. Чтобы всегда загружать Windows, мы можем в качестве альтернативы ввести имя записи точно так, как оно было показано в меню Grub (например, «Microsoft Windows XP Professional» ) вместо номера записи.


Важное примечание: на некоторых машинах меню GRUB не может отображаться при нажатии и удерживании левой Shift при загрузке (см. ошибка № 425979 ). Поэтому может быть хорошей идеей сначала проверить это с загрузкой Ubuntu (не Windows), установленной в качестве ОС по умолчанию. Тогда вы сможете легко отменить настройки GRUB, если вас это коснется.

4
ответ дан 31 March 2012 в 08:12

установить оптимизатор grub

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

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

Grub Customizer теперь отображается в меню Applications> System Tools.

Или вы можете открыть его из командной строки.

gksudo grub-customizer

image inside for grub options

enter image description here

2
ответ дан 31 March 2012 в 08:12

В Kubuntu 14.04 это не работает, если вы установите GRUB_TIMEOUT = 0 , как ни странно, после применения этого и перезагрузки, меню grub остается видимым в течение 10 секунд.

Причина в том, что в другом скрипте grub есть фрагмент кода, который устанавливает grub_timeout равным 10, если он имеет значение 0.

Вот как я его получил для работы:

сделайте копию файлов grub и 30_osprober !!! Если что-то пойдет не так, вы можете вернуть исходные файлы

В / etc / default / grub

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

GRUB_TIMEOUT=0

в /etc/grub.d/30_os-prober , есть фрагмент кода, который устанавливает тайм-аут grub на 10 секунд, если он установлен на ноль в / etc / default / grub , я не знаю, почему разработчики поместили его туда, но он предотвращает скрытие grub меню.

set timeout_style=menu

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

После этих изменений запустите sudo update-grub , чтобы сгенерировать новую последовательность загрузки grub.

Я документирую все свои исправления / модификации Linux на https://sites.google.com/site/marcshomesite/Home/linux-tuning

7
ответ дан 31 March 2012 в 08:12

Shasteriskt, альтернативой решению «SHIFT» является создание сценария, который выполняет некоторые операции перемещения за вас. Я имею в виду создание файла с именем ​​grub.bak , который является точной копией вашего файла grub.cfg , с той лишь разницей, что для параметра установлено значение timeout = 0 строка изменена на установить тайм-аут = 10 например. Создайте сценарий оболочки, который выполняет переключение, позволяющее перезагрузить компьютер в соответствии с вашими потребностями. Я создал эквивалентный сценарий python, который удовлетворяет этим требованиям, но, конечно, он должен вызываться с помощью sudo . Я просто помещаю его в / usr / bin в своей настройке как символическую ссылку на сам скрипт. Примечание: я запускаю fluxbox на Arch, поэтому я не уверен, есть ли какие-либо расхождения между этим скриптом и Ubuntu, но я думаю, что никаких модификаций не должно быть. Скрипт выглядит так:

#! /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'))

Сценарий в основном просто определяет, есть ли у вас меню для загрузки или нет (автозагрузка или нет). Основываясь на своих выводах, он спрашивает вас, хотите ли вы включить или выключить его, а затем спрашивает, хотите ли вы перезагрузиться. И наоборот, если вы хотите, чтобы это работало наоборот (например, в Windows), и у вас есть Windows, настроенная для доступа к файлам в Linux, вы можете запустить тот же сценарий в этой среде, если хотите. Надеюсь, это поможет.

0
ответ дан 31 March 2012 в 08:12

У меня была такая же проблема в системе с одной загрузкой. Если GRUB_TIMEOUT был ненулевым, меню всегда выскакивало бы независимо от GRUB_HIDDEN_TIMEOUT.Если GRUB_TIMEOUT был равен нулю, он бы спал в течение GRUB_HIDDEN_TIMEOUT секунд, но ни SHIFT, ни ESC не отображали бы меню.

Я исправил это, добавив предложение else в состояние сна в конце adjust_time () в 30_os-prober. Теперь, если он не прерывается, тайм-аут равен нулю, и он загружается без меню, но если он прерывается, я устанавливаю тайм-аут на 10.

На самом деле это кажется обратным, поскольку сон должен возвращать 0 (ложь), если он не прерывается и 1 (верно), если это так, но, похоже, у меня это сработало.

1
ответ дан 31 March 2012 в 08:12

Так что даже если вы установите GRUB_TIMEOUT в 0, если вы есть GRUB_HIDDEN_TIMEOUT, 30_os-prober установит таймаут равным 10, нравится вам это или нет. Другие решения здесь редактируют этот сценарий, но это может вызвать проблемы с обновлением, которые вам придется объединить, если обновится GRUB.

Лучшее решение: напишите следующее в /etc/grub.d/50_goddamnit (новый файл):

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

Обычно это будет выполняться последней и будет последней строкой в /boot/grub/grub.conf,тем самым перекрывая все остальные глупые ошибки в конфигурации по умолчанию.

0
ответ дан 31 March 2012 в 08:12

В Ubuntu 16.04 я внес следующие изменения. Конечно, для этого вам нужно быть привилегированным пользователем.

  1. Первое изменение находится в файле /etc/grub.d/30_os-prober :

    • Откройте его с помощью sudo gedit /etc/grub.d/30_os-prober[12196 visibleChange quick_boot = "1" to quick_boot = "0"
    • сохранить файл
  2. После этого вы можете установить значения тайм-аута в / etc / default / grub до нуля или другого значения:

    • Откройте его с помощью sudo gedit / etc / default / grub
    • GRUB_HIDDEN_TIMEOUT = 0 и GRUB_TIMEOUT = 0 .
    • сохранить файл
  3. Последний шаг - обновить grub

    • sudo update-grub

Изменения в первом файле вызваны тем, что по умолчанию установлено, что если другая ОС ( например, Windows 10), значение тайм-аута всегда установлено на 10 секунд и, следовательно, не может быть изменено с помощью / etc / default / grub . Это выполняется функцией с именем adjust_timeout , которая спрашивает, установлен ли quick_boot и , если присутствуют другие ОС.

3
ответ дан 31 March 2012 в 08:12

Я пытался сделать то же самое и нашел большую помощь на форумах Ubuntu, особенно в этой ветке.

Предполагая, что вы поступили правильно с / etc / default / grub , правильно установив GRUB_TIMEOUT и GRUB_HIDDEN_TIMEOUT (я бы сказал соответственно на 0 и 5) и даже GRUB_DEFAULT , чтобы указать образ по умолчанию для загрузки, вот процедура чтобы он работал правильно.

  1. Добавьте эти строки

     GRUB_FORCE_HIDDEN_MENU = "true"
    экспорт GRUB_FORCE_HIDDEN_MENU
     

    до конца / etc / default / grub

  2. Сделайте резервную копию вашего /etc/grub.d/30_os-prober и перезапишите его версией, найденной здесь

  3. Протестируйте ! Чтобы открыть меню, нажмите клавишу SHIFT

Эта проблема связана с настройкой нескольких ОС, и редактирование сценария является одним из способов исправить это.

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${1}" != "x" ] ; then
      if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then
    verbose=
      else
    verbose=" --verbose"
      fi

      if [ "x${1}" = "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} (${2}-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
           $1 /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\(.*\))/\1s\2/'`"
      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
4
ответ дан 31 March 2012 в 08:12

Если у вас одна операционная система, например только Ubuntu 18.04, отредактируйте / etc / default / grub :

$ sudo vim /etc/default/grub

Измените следующие строки, как показано:

GRUB_TIMEOUT_STYLE=hidden  
GRUB_TIMEOUT=1

Если вы используете двойную загрузку, например Ubuntu 18.04 + Windows 10, отредактируйте /etc/grub.d / 30_os-prober :

$ sudo vim /etc/grub.d/30_os-prober

Измените следующие строки, как показано:

adjust_timeout () {  
  if [ "$quick_boot" = 1 ] && [ "x${found_other_os}" != "x" ]; then  
    cat << EOF  
set timeout_style=hidden
if [ "\${timeout}" = 0 ]; then  
  set timeout=1
fi  
EOF  
  fi  
}

Наконец обновите GRUB:

$ sudo update-grub  

ОК! Теперь у вас есть 1 секунда, чтобы нажать ESC для отображения меню GRUB2.

0
ответ дан 5 January 2021 в 23:44

Просто завершаю обсуждение:

Я НЕ рекомендую никому редактировать файл "30_os-prober"! (код здесь не зря!)

Правильный способ решить проблему - отключить быструю загрузку в вашей установке Windows, как описано здесь (для Win8) и здесь (для Win10).

После этого вам нужно ВЫКЛЮЧИТЬ (а не перезагружать) компьютер, чтобы Windows не создавала файлы, которые загружаются при запуске для более быстрой загрузки.

Теперь, если grub настроен правильно, он должен работать должным образом без редактирования файла "30_os-prober", потому что проверка "[" $ quick_boot "= 1]" в указанном выше условии if возвращает 0.

1
ответ дан 5 January 2021 в 23:44