记从 Windows 启动 Linux 的心得

坑,都是坑

0x00 前言

最近主要是装了一台新的测试机器,在测试工作用东西的同时想把这台机器拿来当串流游戏的体验机,故孪生了 Windows 和 Linux 双系统启动的想法,没想到这却是几个小时的坑。我的想法其实很简单:

因为这台电脑没有 PiKVM 这种设备(我 12 月买的 JetKVM 到现在都没发货,垃圾),也没有 IPMI 管理界面,并且因为是 headless 没有显示器和键盘接入。 已经在测试主板好坏的时候关闭了 Secure Boot。 我想在电脑上安装 Windows 和某为的 Linux 发行版,Windows 先 Linux 后。 我希望默认每次开机冷启动都自动进入 Windows。 如果需要进入 Linux 发行版,需要在别的电脑上 RDP 到 Windows 环境内,然后通过做某些操作,可以让重启之后临时进入 Linux 发行版。但下一次冷启动或者在 Linux 内 reboot 又会进入 Windows。

那我该怎么做呢?

0x01 失败的解决方法

假设两个系统都已经安装好了。那么可以先在 Windows 下使用 bcdedit /enum firmware 查看所有 UEFI 的启动项,然后记下 Linux 启动项的那个 identifier,随后执行 bcdedit /bootsequence "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}",这样就可以在下次开机的时候进入 Linux,而在 Linux 内重启之后就生效。

...你以为这么简单就错了。我在执行之后重启发现了这个错误:

File: \EFI\openEuler\shimx64.efi
Status: 0xc000007b
Info: The application or operation system couldn't be loaded because a required file is missing or contains errors.

一开始我以为是 efi 文件可能有问题,需要使用 grubx64.efi,所以我进入了 Linux 发行版后用 efibootmgr 来新增了一个启动项:

# 可以先用 fdisk -l 看一下哪个是 EFI 的盘
sudo efibootmgr -c -d /dev/nvme0n1 -p 1 -L "openEuler-win" -l '\EFI\openEuler\grubx64.efi'
# 然后查看是否有新增了引导项
sudo efibootmgr
# 如果要删除的话,假设新增到第二个引导项了,那么删除的话使用下面这个命令
sudo efibootmgr -b 2 -B

随后,我重新进入 Windows 用这个新的引导项去引导,未果。Google 了半天,也没有任何一个 guide。

当时满头雾水的我大概在 EasyBCD 的 Wiki 里面找到了原因

...It abides by the restrictions Microsoft has placed on the bootloader that will block any attempts to load non-Microsoft-signed kernels (including chainloaders) from the top-level BCD menu...

原来是这样的吗?(剧透:并不是)

0x02 换个方法

那这样的话,换个方法总行了吧!我们每次开机冷启动进入 Linux,然后进入 Linux 后再通过某种方法来进入 Windows 吧!

这种解决方法倒是很简单,只需要运行这个就可以了:

# 这里的 2 代表是开机的 grub 启动项内第二个,最上面那个为第零个。
# 部分发行版可能程序名为 grub-reboot
sudo grub2-reboot 2

随后重启就能进入 Windows 了,而再次重启或冷启动依然会进入 Windows。

不过我不死心!

0x03 意外发现

继续偶然搜索发现了一个叫做 efinextboot 的妙妙小工具,号称能在 Windows 下启动 Linux。我试了一下还真的可以(虽然自动重启不工作),但我看了 README 感觉跟我的解决思路一样,我错在哪里了呢?


如果喜欢本文,欢迎点击下方的「鼓掌」按钮!

如果上面没有加载出任何东西,可以点击这里