web-dev-qa-db-ja.com

Shiftキーを押さない限り、GRUB2メニューを非表示にします。これを実現する方法は?

Ubuntu-Windows 7のデュアルブートセットアップがあり、起動直後にShiftキーを押して選択可能なGrub2メニューを表示しない限り、ラップトップでWindows 7が起動するようにしたいUbuntu。

Grub2とetc/default/grubのオプションについて調査し、GRUB_TIMEOUTGRUB_HIDDEN_TIMEOUTの値を組み合わせて試してみましたが、役に立ちませんでした。 GRUB_HIDDEN_TIMEOUTGRUB_TIMEOUTよりも高く設定しようとしましたが、両方のカウントダウンが同時に開始すると思いますが、いいえ-GRUB_TIMEOUTはもう一方の終了後にのみ開始します。

この動作は達成可能ですか?

もしそうなら、どのように?

31
Bez Hermoso

もっと簡単な解決策を見つけたと思います。ファイル/ etc/default/grubの次の行を変更します。

GRUB_HIDDEN_TIMEOUT = .

GRUB_TIMEOUT = .

もちろん、最終的にupdate-grubを実行します。それは私のPCで動作します。

15
sivitri

これは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

乾杯。

9
tux1c

Kubuntu 14.04では、これは機能しません。GRUB_TIMEOUT= 0を設定すると、奇妙なことに、これを適用して再起動した後、grubメニューが10秒間表示されたままになります。

その理由は、別のgrubスクリプトには、grub_timeoutの値が0の場合にgrub_timeoutを10に設定するコードの一部があるためです。

だから、これは私がそれを動作させる方法です:

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には、/etc/default/grubでゼロに設定されている場合、grubタイムアウトを10秒に設定するコードがあります。なぜ開発者がそれをそこに置きますが、それは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の修正/修正を文書化します。

7
user310707

GRUBメニューから選択せずにWindowsを自動的に起動するには、次のような値で/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 起動時( bug#425979 を参照)。したがって、最初にデフォルトのOSとして設定されたUbuntu(Windowsではない)を起動してこれをテストすることをお勧めします。その後、影響を受けた場合にGRUB設定を簡単に取り消すことができます。

4
Takkat

私も同じことをしようとしていましたが、特に this スレッドで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キーを押します

この問題はマルチOSセットアップに関連しており、スクリプトを編集することはそれを修正する方法の1つです。

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
Dariopnc

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=0およびGRUB_TIMEOUT=0
    • ファイルを保存する
  3. 最後のステップはgrubを更新することです

    • Sudo update-grub

最初のファイルへの変更は、デフォルト設定では、他のOS(Windows 10など)が見つかった場合、タイムアウト値は常に10秒に設定され、/etc/default/grubによって変更できないためです。これは、adjust_timeoutという名前の関数によって実現されます。この関数は、quick_bootが設定されているかどうかを確認します-および他のOSが存在する場合。

3
AtoA

gRUBオプティマイザーをインストールする

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

Sudo apt-get update
Sudo apt-get install grub-customizer

これで、Grub Customizerが[アプリケーション]> [システムツール]メニューに表示されます。

または、コマンドラインから開くことができます。

gksudo grub-customizer

image inside for grub options

enter image description here

2
pankaj sharma

「SHIFT」ソリューションの代替案の1つであるShasterisktは、移動操作を行うスクリプトを作成するだけです。つまり、grub.bakファイルの正確なコピーであるgrub.cfgというファイルを作成しますが、唯一の違いはset timeout=0行がset timeout=10に変更されることです。必要に応じて再起動できるスイッチを実行するシェルスクリプトを作成します。これらの要件を満たす同等の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で)動作させ、LinuxでファイルにアクセスするようにWindowsを設定している場合は、必要に応じてその環境でも同じスクリプトを実行できます。お役に立てば幸いです。

0
eazar001

GRUB2ブートメニューを自動的に表示する

何らかの理由で、Grub CustomizerでGRUB_GFXMODE=640x480設定を編集すると、通常、ブートメニューが表示されます。

  1. 上記のようにgrub-customizerをインストールして更新します
  2. gUIでGrub Customizerを見つけます(私にとってはSystem> Administration> ...にありますが、一部のアプリケーションではApplication> System Tools>の下にあります。)
  3. Grub Customizerを開き、Preferences> Advancedを選択します
  4. GRUB_gfxmode(640X480)を選択します-既に選択されている場合は、選択を解除し、再起動して、再度選択します。
  5. 指をクロスして再起動してください!

なぜこれが私のために働いたのか分かりませんが、それは私のコンピューターの両方で働いたので、うまくいけばそれもあなたのために働くでしょう!

0
Canadonia

したがって、GRUB_TIMEOUTを0に設定しても、GRUB_HIDDEN_TIMEOUTがある場合は、30_os-proberはそれが好きかどうかに関係なくタイムアウトを10に設定します。ここでの他のソリューションはそのスクリプトを編集しますが、GRUBが更新されるとマージする必要がある更新の問題を引き起こす可能性があります。

より良い解決策:/etc/grub.d/50_goddamnit(新しいファイル)に以下を記述します。

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

基本的に、これはlastを実行し、/ boot/grub/grub.confの最後の行になるため、デフォルト設定のその他すべての愚かなmishigusが上書きされます。

0
Fordi

単一のブートシステムでも同じ問題が発生していました。 GRUB_TIMEOUTがゼロ以外の場合、メニューはGRUB_HIDDEN_TIMEOUTに関係なく常にポップアップ表示されます。 GRUB_TIMEOUTがゼロの場合、GRUB_HIDDEN_TIMEOUT秒間スリープしますが、SHIFTもESCもメニューを表示しません。

30_os-proberのadjust_time()の最後にsleep文にelse節を追加することで修正しました。中断されない場合、タイムアウトはゼロであり、メニューなしで起動しますが、中断される場合、タイムアウトを10に設定します。

スリープは、中断されていない場合は0(false)を返し、中断されている場合は1(true)を返す必要があるため、実際には逆方向に見えますが、私にとってはうまくいくようです。

0
Mark Thueson