在重启之前,如何告诉GRUB我想重启进入Windows?


33

我设置了双引导Linux / windows系统,并经常从一个系统切换到另一个系统。我在想是否可以在其中一个菜单中添加菜单项以直接重新启动进入Windows,而无需在GRUB提示符下停止。

我在论坛上看到了这个问题,这正是我想要的,但它正在处理lilo,这不是我的情况。

我想到了一种解决方案,该方案将修改GRUB菜单中的默认条目,然后重新启动,但是有一些缺点,我想知道是否有更清洁的替代方法。

(此外,我会对直接从Windows引导到Linux的解决方案感兴趣,但这可能更难,并且不属于这里。无论如何,只要我以一种方式拥有它,就可以将另一种方式设置为默认值。

UPDATE似乎有人问过类似的问题,如果这些是建议的答复,我还不如编辑/boot/grub/grubenv作为grub-rebootgrub-set-defaultgrub-editenv做。)

在此先感谢您提供任何提示。

更新

这是我的GRUB版本: (GRUB) 1.99-12ubuntu5-1linuxmint1

我尝试运行grubonce,找不到命令。在存储库中搜索它不会给我任何帮助。我在Linux Mint上,可能就是这样...

看到man grub-reboot,它似乎可以满足我的要求grubonce。它也随处可用(至少对我来说,我认为它是grub软件包的一部分)。我看到了两个相关的命令:grub-editenvgrub-set-default

我发现运行后sudo grub-set-default 4grub-editenv list您会得到类似于以下内容的信息:

saved_entry=4

而在运行时grub-reboot 4,您会得到类似以下内容的信息:

prev_saved_entry=0
saved_entry=4

这意味着两者都做相同的事情(一个是临时的,而不是临时的)。

令人惊讶的是,当我尝试:

sudo grub-reboot 4
sudo reboot now

它没有用,好像我什么都没做,只是像往常一样向我显示菜单,然后选择了第一个条目,说它将在10秒钟内启动该条目。

我再试一次,以为我可能输入了错误的条目(它是从零开始的,对吗?)。那时,它只是挂在菜单屏幕上,我不得不硬重置PC才能启动。

如果有人可以尝试一下,只是看看它是否只是我,我将不胜感激。(薄荷一直给我带来困难,那是改变:P的好时机)。

阅读中的代码/boot/grub/grub.cfg似乎是这样,但从我的观察来看,它只是忽略了这些设置...


你在发行什么?我想我已经在Debian上工作了。
jw013

Answers:


20

为了使该grub-reboot命令起作用,必须进行一些必需的配置更改:

  • grub的默认条目必须设置为saved。一个可能的位置是GRUB_DEFAULT=在线路/etc/default/grub
  • 使用grub-set-default设置默认进入到一个你正常使用。
  • 更新您的grub配置(例如update-grub)。

这应该照顾到初始设置。将来,只需grub-reboot <entry>一次性启动即可<entry>


我看到您的单词“ grub的默认条目必须设置为saved”,同时我的保存GRUB_DEFAULT=0也足够了。那么是saved不必要的吗?
zhangxaochen

我不确定是否每个人都意识到此功能的实用性,我计划用rhel64引导win7ult64,反之亦然,同时让rhel可以自动用于另一个win网络系统预定的备份任务,该任务将推到rhel zfs raidz2。然后,在备份完成后,在一周的剩余时间里,陷入困境的系统会自动引导回Windows游戏玩家iis服务器游乐场,然后冲洗并重复。它是一个变形器。:-)
Brian Thomas

我花了很长时间才注意到grub-reboot静默失败,给出了成功的返回码。希望我建议的编辑没问题。:-)
没人

23
  1. 编辑/ etc / default / grub并替换GRUB_DEFAULT=0GRUB_DEFAULT=saved
  2. sudo update-grub
  3. 您的命令将是:

    sudo grub-reboot "$(grep -i 'windows' /boot/grub/grub.cfg|cut -d"'" -f2)" && sudo reboot
    

〜/ .bashrc中的一个漂亮函数看起来像

# ******************************************************************
# reboot directly to windows 
#   Inspired by http://askubuntu.com/questions/18170/how-to-reboot-into-windows-from-ubuntu
# ******************************************************************
function my_reboot_to_windows {
    WINDOWS_TITLE=`grep -i 'windows' /boot/grub/grub.cfg|cut -d"'" -f2`
    sudo grub-reboot "$WINDOWS_TITLE"
    sudo reboot
}

如果您的grub.conf包含适用于Windows的多行,则以下功能仅需注意以Windows为开头menuentry并仅选择第一个的行:

function my_reboot_to_windows {
    WINDOWS_TITLE=`grep -i "^menuentry 'Windows" /boot/grub/grub.cfg|head -n 1|cut -d"'" -f2`
    sudo grub-reboot "$WINDOWS_TITLE"
    sudo reboot
}

我的文件中/boot/grub/grub.cfg包含更多带有“ Windows”的行,其中许多行表示类似的内容...=1 i915.semaphores=1 acpi_osi='!Windows 2012' $vt...,因此我认为您的代码将失败。可以通过grepping解决此问题^menuentry 'Windows
Jan Vlcinsky 2015年

应该将其标记为正确答案。
塔哈·雷曼·西迪基

该功能比我想象的要有用。
卡森·叶

2

一种超级简单的方法是使用 GRUB Reboot GNOME Shell扩展 (即,如果您使用的是GNOME)。

要使用该扩展程序,请转到上面链接的站点,然后单击右上角的小切换(首次导航到该页面时,它可能显示为Off)。系统将要求您确认要下载并安装扩展。

安装完成后,您可以像通常重新启动一样打开“系统”菜单并单击电源按钮。弹出的确认您现在要关闭或重新启动的窗口带有一个标记为“重新启动...”的按钮。单击该按钮时,grub菜单中的项目将显示在列表中,以便您选择重启后自动启动的操作系统。如果选择其中一项,则系统将关闭并使用所选的grub选项重新启动。


1
我编辑了帖子,以包括安装和使用扩展的详细信息。
迪伦·史密斯

1

我使用openSUSE,该脚本带有一个名为的脚本grubonce,该脚本完全满足您的需要-设置grub条目以在下次重启时使用。

# grubonce
0: Trace -- openSUSE 12.1 - 3.1.10-1.16
1: Debug -- openSUSE 12.1 - 3.1.10-1.16
2: Desktop -- openSUSE 12.1 - 3.1.10-1.16
3: Failsafe -- openSUSE 12.1 - 3.1.10-1.16

# grubonce 0
Using entry #0: Trace -- openSUSE 12.1 - 3.1.10-1.16

# grubonce 2
Using entry #2: Desktop -- openSUSE 12.1 - 3.1.10-1.16

我不知道该脚本有哪些其他发行版,因此如果您的发行版没有此脚本,则可以查看以下页面:

http://sidvind.com/wiki/GRUB:_Boot_another_OS_once


它实际上是grub和Trustedgrub的一部分(无论是什么),而不是grub2,所以我没有在风滚草2019
redanimalwar

1

grub-set-default似乎更可用(grubonce未在Ubuntu'verse中列出)。如果Windows 7习惯于在上一次关闭时应用更新,则Windows 7习惯于在启动过程中执行重新引导(即,它开始启动,处理一些更新数据,重新引导,然后显示登录页面),因此它也可能更有用。
我经常启动Windows 7只是为了回来并发现Ubuntu正在运行。


1
我关闭了Windows更新,所以那应该不是问题:D,我会尝试的。从我看到的结果来看,这似乎与做相同的事情grub-reboot。我正在更详细地编辑我的问题。不管怎么说,还是要谢谢你。
jadkik94 2012年

1

在Fedora中,您可以使用以下脚本。请注意,这与https://askubuntu.com/a/18186/149422中的描述基本相同,但对Fedora中的GRUB 2进行了一些修改。

#!/bin/bash
if [ `readlink /boot/grub2/grubenv` == "/boot/efi/EFI/fedora/grubenv" ]; then
    sudo mv /boot/grub2/grubenv /boot/grub2/grubenv-original
    sudo ln -s ../efi/EFI/fedora/grubenv /boot/grub2/grubenv
fi
MENU_ENTRY=`grep ^menuentry /boot/grub2/grub.cfg  | grep --line-number Windows`
MENU_NUMBER=$(( `echo $MENU_ENTRY | sed -e "s/:.*//"` - 1 ))
sudo grub2-reboot $MENU_NUMBER
sudo reboot

1

我使用Ubuntu 16.04和上述解决方案并没有为我工作...出于某种原因sudo grub-reboot 2,似乎从来没有更新的/boot/grub/grubenv文件,甚至改变后GRUB_DEFAULT=0,以GRUB_DEFAULT=saved/etc/default/grub/boot/grub/menu.lstsavedefault --default=2 --once在grub中使用该命令似乎也无效,也没有更改grubenv文件。它只是一直返回到原始的grub菜单,好像什么也没做。

因此,我最终手动完成了它,并且一直在工作(尽管不确定它如何与RAID驱动器一起工作)。

sudo grub-editenv - set next_entry=2
reboot

其中2是grub启动菜单中Windows条目的从零开始的菜单条目位置​​。

您可以通过查看/boot/grub/grub.cfg文件来了解其工作原理,因为该文件使用next_entry值,然后将其重置以进行下一次引导。


0

同意@ jw013。您还可以将菜单磁贴设置为grub-reboot(包括父菜单的标题)。例如:

$ sudo grub-reboot "Advanced options for Ubuntu>Ubuntu, with Linux 4.13.0-26-generic"
$ sudo reboot

其中“ Ubuntu的高级选项”是父菜单,而“ Ubuntu,带有Linux 4.13.0-26-generic”是子菜单。


0

将计算机重新引导到特定的引导目标(Grub条目)。
引导目标是使用fzf交互选择的。

# Search for grub.cfg
GRUB_CFG=$(find /boot -name grub.cfg 2> /dev/null)

if [[ -z ${GRUB_CFG} ]]; then
  echo "No grub.cfg found under /boot. Try as root."
  exit 1
elif [[ ! -r ${GRUB_CFG} ]]; then
  echo "${GRUB_CFG} is not readable. Try as root."
  exit 1
fi

GRUB_MENUENTRY=$(awk -F\' '/menuentry / {print $2}' ${GRUB_CFG} | fzf)

# Set boot target for next boot
grub2-reboot "${GRUB_MENUENTRY}"

reboot
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.