Ubuntu-Windows 7のデュアルブートセットアップがあり、起動直後にShiftキーを押して選択可能なGrub2メニューを表示しない限り、ラップトップでWindows 7が起動するようにしたいUbuntu。
Grub2とetc/default/grub
のオプションについて調査し、GRUB_TIMEOUT
とGRUB_HIDDEN_TIMEOUT
の値を組み合わせて試してみましたが、役に立ちませんでした。 GRUB_HIDDEN_TIMEOUT
をGRUB_TIMEOUT
よりも高く設定しようとしましたが、両方のカウントダウンが同時に開始すると思いますが、いいえ-GRUB_TIMEOUT
はもう一方の終了後にのみ開始します。
この動作は達成可能ですか?
もしそうなら、どのように?
もっと簡単な解決策を見つけたと思います。ファイル/ etc/default/grubの次の行を変更します。
GRUB_HIDDEN_TIMEOUT = .
GRUB_TIMEOUT = .
もちろん、最終的にupdate-grubを実行します。それは私のPCで動作します。
これは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
乾杯。
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の修正/修正を文書化します。
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設定を簡単に取り消すことができます。
私も同じことをしようとしていましたが、特に this スレッドでUbuntuフォーラムに大きな助けを見つけました。
/etc/default/grub
で正しいことをしたと仮定して、GRUB_TIMEOUT
とGRUB_HIDDEN_TIMEOUT
(それぞれ0と5と言います)およびGRUB_DEFAULT
を正しく設定して、デフォルトのイメージを指定します。ブート、これは正しい方法で動作させるための手順です。
それらの行を追加
GRUB_FORCE_HIDDEN_MENU="true"
export GRUB_FORCE_HIDDEN_MENU
/etc/default/grub
の最後まで
/etc/grub.d/30_os-prober
をバックアップし、ここにあるバージョンで上書きします
試して!メニューを表示するには、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
Ubuntu 16.04では、次の変更を行いました。もちろん、そのためには特権ユーザーである必要があります。
最初の変更は/etc/grub.d/30_os-prober
ファイルにあります:
Sudo gedit /etc/grub.d/30_os-prober
で開きますquick_boot="1"
をquick_boot="0"
に変更しますその後、/etc/default/grub
のタイムアウト値をゼロまたは他の値に設定できます。
Sudo gedit /etc/default/grub
で開きますGRUB_HIDDEN_TIMEOUT=0
およびGRUB_TIMEOUT=0
。最後のステップはgrubを更新することです
Sudo update-grub
最初のファイルへの変更は、デフォルト設定では、他のOS(Windows 10など)が見つかった場合、タイムアウト値は常に10秒に設定され、/etc/default/grub
によって変更できないためです。これは、adjust_timeout
という名前の関数によって実現されます。この関数は、quick_boot
が設定されているかどうかを確認します-および他のOSが存在する場合。
gRUBオプティマイザーをインストールする
Sudo add-apt-repository ppa:danielrichter2007/grub-customizer
Sudo apt-get update Sudo apt-get install grub-customizer
これで、Grub Customizerが[アプリケーション]> [システムツール]メニューに表示されます。
または、コマンドラインから開くことができます。
gksudo grub-customizer
「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を設定している場合は、必要に応じてその環境でも同じスクリプトを実行できます。お役に立てば幸いです。
GRUB2ブートメニューを自動的に表示する
何らかの理由で、Grub CustomizerでGRUB_GFXMODE=640x480
設定を編集すると、通常、ブートメニューが表示されます。
なぜこれが私のために働いたのか分かりませんが、それは私のコンピューターの両方で働いたので、うまくいけばそれもあなたのために働くでしょう!
したがって、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が上書きされます。
単一のブートシステムでも同じ問題が発生していました。 GRUB_TIMEOUTがゼロ以外の場合、メニューはGRUB_HIDDEN_TIMEOUTに関係なく常にポップアップ表示されます。 GRUB_TIMEOUTがゼロの場合、GRUB_HIDDEN_TIMEOUT秒間スリープしますが、SHIFTもESCもメニューを表示しません。
30_os-proberのadjust_time()の最後にsleep文にelse節を追加することで修正しました。中断されない場合、タイムアウトはゼロであり、メニューなしで起動しますが、中断される場合、タイムアウトを10に設定します。
スリープは、中断されていない場合は0(false)を返し、中断されている場合は1(true)を返す必要があるため、実際には逆方向に見えますが、私にとってはうまくいくようです。