隐藏GRUB2菜单,除非您按住Shift键:如何做到这一点?


32

我有一个Ubuntu-Windows 7双启动设置,我希望笔记本电脑能够启动Windows 7,除非我在启动后立即按下Shift键并调出Grub2菜单,然后从中进行选择Ubuntu的。

我研究了Grub2和选项,etc/default/grub并尝试使用GRUB_TIMEOUTGRUB_HIDDEN_TIMEOUT值的组合,但无济于事。我尝试将数字设置为GRUB_HIDDEN_TIMEOUT高于GRUB_TIMEOUT两个倒数计时同时开始的想法,但是没有- GRUB_TIMEOUT仅在另一个倒数完成之后才开始。

这种行为可以实现吗?

如果是这样,怎么办?


1
我这样做的方法是将超时设置为0(使用Grub Customizer设置)。除非我在BIOS之后立即按住shift键,然后显示菜单,否则无法显示GRUB2菜单。sudo add-apt-repository ppa:danielrichter2007 / grub-customizer sudo apt-get更新sudo apt-get安装grub-customizer
Ryan McClure 2012年

据我了解,这是某些安装的默认行为
RobotHumans 2012年

@RyanMcClure我尝试将超时手动设置为0,但按住right-Shift根本不会打开Grub2菜单。
贝斯·埃莫索

Answers:


15

我认为我找到了一个更简单的解决方案。修改文件/ etc / default / grub中的以下行:

GRUB_HIDDEN_TIMEOUT = 0.0

GRUB_TIMEOUT = 0.0

当然,我们最终运行了update-grub。它可以在我的PC上运行。


6
刮一下。这不会给我grub菜单,但我也无法通过按shift来获取它。
zorkerz '16

9

这适用于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

和更新的grub;

sudo update-grub

干杯。


不为我工作。
Menasheh '16

我仅在16.04中对此进行了测试。您使用的是其他版本吗?
tux1c

可能是16.10。您是对的,绝对应该提到。
Menasheh '17

也可以在Debian上进行压缩
Jocelyn delalande

7

在Kubuntu 14.04中,此设置不起作用,如果您设置GRUB_TIMEOUT= 0,奇怪的是,在应用此设置并重新启动后,grub菜单在10秒钟内仍然可见。

原因是在另一个grub脚本中,有一段代码将grub_timeout的值设置为10(如果它值为0)。

所以这就是我如何使其工作:

同时复制grub30_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超时设置为10s(如果将int设置为零)/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引导序列。

我在https://sites.google.com/site/marcshomesite/Home/linux-tuning上记录了我所有的Linux修复程序/ mods。


我希望你没有把空间后=GRUB_TIMEOUT= 0
大师

4

要自动启动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")中显示的名称完全相同的名称,而不是输入编号。


重要说明:在某些机器上,按住Shift开机不放不可以显示GRUB菜单(请参见Bug#425979)。因此,最好先启动设置为默认操作系统的Ubuntu(不是Windows)来进行测试。这样一来,您就可以轻松撤消GRUB设置,以防受到影响。


这是否会使Ubuntu无法人工启动,或者是否有足够的时间拦截启动并在需要时选择Ubuntu?
贝斯·埃莫索

1
@Shasteriskt,您应该将超时设置为刚好足以按一个键来选择另一个引导OS的值。
塔卡特2012年

我将超时设置为0并按住Shift键,但菜单仍然不显示。(好东西我将其设置为引导至Ubuntu,可以在其中按原样编辑设置。)
Bez Hermoso 2012年

简而言之,我需要的行为无法实现吗?
贝斯·埃莫索

@Shasteriskt:不幸的是,在某些计算机上,引导启动GRUB菜单时按住SHIFT的键已损坏(例如,此bug)。如果ESC或SHIFT + ESC起作用,您可能很幸运。
塔卡特2012年

4

我试图做同样的事情,并且在Ubuntu论坛中找到了很大的帮助,特别是在主题中。

假设您使用/etc/default/grub,正确设置了GRUB_TIMEOUTGRUB_HIDDEN_TIMEOUT(我分别说是0和5),甚至GRUB_DEFAULT指定了要启动的默认映像,都做了正确的事情,以下是使它正确运行的过程。

  1. 添加这些行

    GRUB_FORCE_HIDDEN_MENU="true"
    export 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

1
我尝试了您的方法,但失败了。Ubuntu 14.04 LTS
Mayukh Nair 2014年

1
我应该更改文件的哪一部分?我的14.04文件与此文件有很多差异,所以我想我应该只进行有针对性的更改。
MakisH 2014年

@ MayukhNair:我有Ubuntu 14.04,并且此方法有效。我做了以下工作-1.在/ etc / default / grub中设置GRUB_DEFAULT = 0。2.设置GRUB_HIDDEN_TIMEOUT = 0(与Dariopnc所说的不同)3.备份/etc/grub.d/30_os-prober并复制粘贴上面提到的内容30-os_prober文件4. sudo update-grub2
Pushpak Dagade 2014年

注意grub需要sudo update-grub在更改/etc/default/grub文件后进行更新
Wilf

3

在Ubuntu 16.04上,我做了以下更改。当然,您需要成为特权用户才能这样做。

  1. 第一个更改是在/etc/grub.d/30_os-prober文件中:

    • 用打开 sudo gedit /etc/grub.d/30_os-prober
    • 更改quick_boot="1"quick_boot="0"
    • 保存文件
  2. 之后,您可以将超/etc/default/grub时值设置为零或其他某个值:

    • 用打开 sudo gedit /etc/default/grub
    • GRUB_HIDDEN_TIMEOUT=0GRUB_TIMEOUT=0
    • 保存文件
  3. 最后一步是更新grub

    • sudo update-grub

对第一个文件的更改是因为默认设置是,如果找到其他操作系统(例如Windows 10),则超时值始终设置为10秒,因此无法更改/etc/default/grub。这可以通过名为的功能来完成,该功能adjust_timeout询问是否quick_boot设置了其他功能以及是否存在其他操作系统。


终于将zat vorks wiz 16.04解救了!
JLTD

2

安装grub优化器

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

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

Grub Customizer现在将显示在“应用程序”>“系统工具”菜单中。

或者,您可以从命令行打开它。

gksudo grub-customizer

内图为grub选项

在此处输入图片说明


3
无法通过编辑完成此操作etc/default/grub
贝斯·埃莫索

3
@Shasteriskt:它对于说非英语的人,不熟悉命令行的人或只想使用计算机而不喜欢配置文件的人很有用。
Flimm

为什么对此表示反对?它似乎无法解决任何问题;我已经尝试过grub-customizer(不是“优化程序”),并且在工作时,除非按Shift键,否则它无法帮助我隐藏GRUB菜单。
Nickolai Leschov 2015年

1

我在单个引导系统上遇到相同的问题。如果GRUB_TIMEOUT不为零,则无论GRUB_HIDDEN_TIMEOUT如何,菜单始终会弹出。如果GRUB_TIMEOUT为零,它将休眠GRUB_HIDDEN_TIMEOUT秒,但是SHIFT和ESC都不会显示菜单。

我通过在30_os-prober的adjust_time()末尾在睡眠语句中添加else子句来解决此问题。现在,如果不中断,则超时为零,并且它不带菜单启动,但是如果中断,则将超时设置为10。

这实际上似乎是倒退的,因为如果不中断睡眠,则应返回0(假),如果不中断则应返回1(真),但它似乎对我有用。


0

自动显示GRUB2 BOOT菜单

由于某些原因,GRUB_GFXMODE=640x480在Grub Customizer中编辑设置通常会使引导菜单可见:

  1. 如上所述安装grub-customizer并更新
  2. 在GUI中找到Grub Customizer(对我来说,位于System> Administration> ...,但是对于某些应用,则位于Applications> System Tools>下。
  3. 打开Grub定制程序,然后选择首选项>高级
  4. 选择GRUB_gfxmode(640X480)-如果已选择它,请取消选择它,重新启动,然后再次选择它。
  5. 交叉手指并重新启动!

我不知道为什么这对我有用,但是它在我的两台计算机上都能工作,所以希望它也对您有用!


0

Shasteriskt是“ SHIFT”解决方案的一种替代方法,只是创建一个脚本来为您执行一些移动操作。我的意思是创建一个名为grub.bakgrub.cfg文件,该文件与您的文件完全相同,唯一的不同是例如将set timeout=0行更改set timeout=10为。创建一个执行切换的Shell脚本,使您可以根据需要重新启动。我创建了一个满足这些要求的等效python脚本,但是当然必须使用来调用它sudo。我只是将其/usr/bin作为指向实际脚本本身的符号链接放在安装程序中。注意:我在Arch上运行fluxbox,所以我不确定此脚本和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

因此,即使您将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中的最后一行,从而覆盖默认配置中的所有其他愚蠢的错误行为。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.