我有标准的双启动系统:Ubuntu 和 Windows。Grub 配置为默认启动 Windows。
有没有办法在 Windows 中创建某种链接,可以:
- 重新启动 Windows
- 启动 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 脚本(通过您想要的快捷方式执行)将:
- 备份旧 GRUB(Windows 默认)
- 将修改后的 GRUB(默认为 Ubuntu)复制到旧版本(默认为 Windows)上
- 重启电脑
- 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=saved
并GRUB_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 来记住上次启动的系统(这样重启时会很方便):
- 进入
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
/etc/default/grub
- 使用更新配置
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),该脚本可能无法运行。