以下是我设置配置的方法:

以下是我设置配置的方法:

我有标准的双启动系统:Ubuntu 和 Windows。Grub 配置为默认启动 Windows。

有没有办法在 Windows 中创建某种链接,可以:

  1. 重新启动 Windows
  2. 启动 Ubuntu

答案1

您不需要/boot/grub/grub.cfg像 Michal Hagara 建议的那样进行修改。如果您安装新内核但不更新,这可能会破坏 Ubuntu e:\home\user\Grubshift\ubuntudefault\grub.cfg

您需要做的就是创建/复制/boot/grub/grubenv包含以下内容的文件

# GRUB Environment Block
next_entry=2
###########################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################

下次启动时应启动的 grub 菜单项的行在哪里next_entry(从零开始)。所以next_entry=2应该是第 3 行。

Grub 将在启动后自动删除该值,以便您下次再次启动到默认操作系统。

这就是grub-reboot工作原理。

答案2

我的想法是这样的:

  • http://www.ext2fsd.com/(它应该能够写入 EXT 分区、“安装”并在启动时分配字母)
  • 然后我将准备修改后的 GRUB 文件,其中 Ubuntu 被设置为默认操作系统(这个也将存储在 Linux 分区上)
  • Windows BATCH 脚本(通过您想要的快捷方式执行)将:
    1. 备份旧 GRUB(Windows 默认)
    2. 将修改后的 GRUB(默认为 Ubuntu)复制到旧版本(默认为 Windows)上
    3. 重启电脑
  • Linux BASH 脚本将在启动(或重启)时修改并更新 GRUB,以将 Windows 重新设置为默认操作系统

这种方法可能完全是错误的,但我不明白为什么它不起作用。

编辑:

还有:http://www.paragon-drivers.com/extfs-windows/我从来没有尝试过。


进步

1.重启Windows并启动Ubuntu的快捷方式

好的,这样做的缺点是我们必须直接修改 grub.cfg (/boot/grub/grub.cfg)(建议不要这样做 -https://askubuntu.com/a/437341/402801),因为没有办法update-grub从 Windows 运行...如果您可以接受,请继续阅读。

  • 正如我之前提到的,安装Ext2Fsd,使其自动挂载并在启动时分配字母
  • /home/user/Grubshift我已经创建了包含 3 个子目录的“备份文件夹” :备份(用于备份实际的 /boot/grub/grub.cfg),ubuntu默认(用于在 Ubuntu 中默认存储 grub.cfg),windows默认(你已经明白了)

安装后,Ubuntu 被设置为默认,因此将其复制grub.cfg到您想要的目录。我通过 grub-customizer 修改 GRUB 获得了“Windows 为默认”配置(我认为这样更安全),然后将 Windows 复制grub.cfg到您想要的目录

然后,打开记事本并插入:

copy e:\boot\grub\grub.cfg /y e:\home\user\Grubshift\backup
copy e:\home\user\Grubshift\ubuntudefault\grub.cfg /y e:\boot\grub
shutdown /r /t 0

/y- 命令选项copy,取消提示确认是否要覆盖现有的目标文件

/r /t 0- 关机选项,1. 表示重启,2. 表示立即关机,不会弹出难看的消息

相应修改路径!!!

  • 保存该文件(我使用了 UTF-8)并将扩展名更改为*.bat
  • 为创建桌面快捷方式shift.bat,右键单击快捷方式-->属性-->快捷方式选项卡-->运行:最小化(这将摆脱弹出的CMD)

我已经尝试过至少 8 次,将 Windows 设置为默认设置grub-customizer...

我并不是说它是安全的,但是嘿!我们正在弄乱引导加载程序……这并不安全

当它完全正常工作时,我们可以完全摆脱 GRUB 菜单,因为它总是会启动到正确的操作系统……

答案3

以下是我设置配置的方法:

总结一下:系统重启默认为上次活动状态,使用简单的脚本从 Windows 重启到 Linux 或反之亦然。

设置 grub 始终启动最后选择的程序:

在Linux下:

  • 输入GRUB_DEFAULT=savedGRUB_SAVEDEFAULT=true进入 /etc/default/grub
  • 使用更新配置sudo update-grub

安装 Paragons extfs 驱动程序

http://www.paragon-drivers.com/extfs-windows/

创建重启脚本:

如果 /boot/grub/grubenv 不存在,请使用以下命令创建它德国人的回答

从 Windows 重启到 Linux 的批处理文件:

@echo off
"C:\Program Files (x86)\Paragon Software\ExtFS for Windows\extmounter" /mount disk1 L:

:CheckForFile
IF EXIST "L:\boot\grub\grubenv" GOTO FoundIt
GOTO CheckForFile
:FoundIt

sed -i -e '/next_entry/c\next_entry=0' L:/boot/grub/grubenv
"C:\Program Files (x86)\Paragon Software\ExtFS for Windows\extmounter" /umount disk1 L:
echo press enter to reboot
pause
shutdown -r -t 00
  • /mount disk1 L:用系统特有的内容替换。您可以使用extmounter /list命令和驱动器号查找可用磁盘。此外,L:一定不能已被占用。
  • 另存为例如reboot-linux.bat
  • 你可以右键单击bat并选择run as administrator执行它

从Linux重启到Windows的Shell脚本:

sudo sed -i -e '/next_entry/c\next_entry=2' /boot/grub/grubenv
sudo reboot
  • next_entry=2用您的 Windows 条目替换。
  • 将其保存为例如~/reboot_windows并标记为可执行文件:chmod +x ~/reboot_windows

答案4

我使用 Arch 而不是 Ubuntu,但 GRUB 配置应该相同。

我不太喜欢以前的答案,因为它们:

  • 要么grub.cfg直接编辑文件,目的是进行永久性更改
  • grubenv或者以破坏 GRUB 环境块的方式编辑,这会导致 Linux 启动时出现警告并破坏grub-editenv命令

GRUB 设置

因此首先您需要设置 GRUB 来记住上次启动的系统(这样重启时会很方便):

  1. 进入GRUB_DEFAULT=savedGRUB_SAVEDEFAULT=true/etc/default/grub
  2. 使用更新配置sudo update-grub(在 Arch 上grub-mkconfig

Linux 端

有一个方便的命令叫做 ,grub-reboot它允许您一次性启动到 Windows。非常方便。请注意,这会保留 GRUB 中最后保存的条目,因此当您从 Linux>grub-reboot 转到 Windows>Windows>reboot 时,它会将您重新启动回 Linux。要覆盖此(IMO 不想要的)行为,请在之后添加另一个命令,如下所示:

grub-reboot $name
grub-editenv /boot/grub/grubenv set saved_entry=$name

其中$name是 GRUB 中显示的 Windows 名称。我将在下面详细解释。运行这些命令后,重新启动系统。

Windows 端

所以我决定研究一下 Linux 脚本的作用。它调用grub-editenv并将值设置next_entry为所需的操作系统。我花了几个小时反复试验,grubenv试图复制结果,并设法找到了解决方案。事实证明,GRUB 环境块的长度应始终保持为 1024 字节,这就是为什么#默认情况下末尾有符号的原因。这是我的 PowerShell 脚本。它可能有点冗长,但它可以正确完成工作。

function Get-ArrLength {
    param (
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string[]]$arr
    )

    $text = [string]::Join("`n", $arr)
    ($text | Measure-Object -Character).Characters
} 

mountvol P: /S
P:
cd grub
cp grubenv grubenv.bak
$name = "Arch Linux"
$name_len = ($name | Measure-Object -Character).Characters
$arr = cat grubenv
$original_length = Get-ArrLength $arr

$arr = $arr -replace "next_entry=","next_entry=$name"
foreach ($a in $arr) {
    if ($a -match "saved_entry=") {
        $arr[$arr.IndexOf($a)] = "saved_entry=$name"
    }
}

$candidate_length = Get-ArrLength $arr

if ($candidate_length -gt $original_length) {
    $arr[$arr.Count-1] = $arr[$arr.Count-1].SubString(0,$arr[$arr.Count-1].Length-($candidate_length-$original_length))
} elseif ($candidate_length -lt $original_length) {
    $arr[$arr.Count-1] = $arr[$arr.Count-1] + "#" * ($original_length-$candidate_length)
}

$contenttext = [string]::Join("`n", $arr)
sc grubenv ([byte[]][char[]] "$contenttext") -Encoding Byte
Restart-Computer
  • 将分配替换$name为您的安装名称 就像在 GRUB 中显示的那样。如果它在 GRUB 子文件夹中,请使用字符> 作为路径分隔符,如下所示: $name="subfolder_name>OS_entry_name"。除了名称,您还可以使用数字,其中0是 GRUB 菜单中显示的第一个项目,但如果条目顺序发生变化,使用名称会更加灵活。
  • P:行中的字母mountvol P: /S和下面的字母完全是任意的,你可以将其更改为 Windows 系统上可用的任何驱动器号
  • Restart-Computer如果您只想更改 GRUB 条目并稍后手动重新启动,您也可以删除最后一个命令。
  • 该脚本会创建一个名为 的备份文件grubenv.bak,因此如果出现任何问题,您只需将其复制回 即可恢复它grubenv
  • 你应该以管理员身份运行脚本因为它需要权限才能写入 EFI 分区。
  • 如果您的 EFI 分区的文件系统不受 Windows 支持(我的是 FAT32),该脚本可能无法运行。

相关内容