我有一台运行 Windows 和 Linux 的 PC。我想将 Windows 系统设为默认系统,因为这台 PC 主要用于游戏。
不过,我偶尔会用它作为远程开发箱。我已为它启用了 WOL,因此只要我在路上尝试访问它,它就会立即启动。
当计算机通过 WOL 启动时,是否可以以某种方式告诉 GRUB2 启动到 Linux,如果没有,则启动到 Windows?
答案1
我最近找到了一个适合我用例的解决方案。虽然这个问题相当老了,但我还是要在这里发布以供参考:
该方法需要(root)访问目标 PC 以外的某个设备,这些设备应该可以从 PC 的网络内访问 - 例如 raspberry pi 或 rooted android 手机。它还需要使用 UEFI 启动。这个想法是让该设备唤醒 PC,同时充当 TFTP 服务器(请参阅这里(作为指南)提供了一个配置文件,通过设置变量来告诉 GRUB 要引导什么default
。因此,您需要:
在 TFTP 服务器上,格式为
#!/bin/bash # replace <boot-target> with the number of the option you want to choose echo 'default <boot-target>' > /srv/tftp/grub_conf wol <PC MAC> sleep 15 # wait for GRUB to boot echo > /srv/tftp/grub_conf
(当然,只休眠 15 秒有点不合时宜,如果同时启动多个脚本实例,尤其是当脚本包含多个启动目标选项时,可能会中断。一个更干净的解决方案是,如果文件在 15 秒内没有更改,则只清除该文件。最好的解决方案可能是使用服务器钩子FTP,这样就可以注意到 grub 何时访问该文件并在之后立即清除它。不过,我还没有时间测试这一点。)
这是启动 PC 的脚本。它可以轻松扩展以允许多个启动选项,然后可以通过命令行参数进行选择。
配置您的 UEFI BIOS 以在启动期间初始化网络堆栈(请注意,这可能需要多个不同的 BIOS 选项才能可靠地工作)
了解如何告诉 GRUB 如何与你的服务器通信。这对我来说需要使用 GRUB 命令行,但对其他人来说可能更容易。你需要先运行
insmod net insmod efinet insmod tftp
然后,如果您的 UEFI 配置正确,运行
net_ls_cards
应该会给出一个网卡(对我来说,它被称为efinet0
)。然后需要配置此卡以便能够与您的服务器通信。理论上,只需运行net_bootp
(发送 DHCP 请求并相应地配置网络)就可以了。但我却不行,所以我通过使用net_add_addr efinet0:link efinet0 <localIP>
为网卡提供一些本地 IP 地址(可能是192.168.0/1.something
)来解决这个问题。显然,即使您的路由器实际上希望您使用 DHCP(PC 无论如何都不会与路由器通信,所以没关系),只要您设置的 IP 地址尚未被占用,这也能起作用。就我而言,我可以为我的 PC 设置一个固定的本地 IP 地址,这样就解决了这个问题。如果您的服务器没有固定的 IP 地址,您需要通过其主机名来引用它,因此您还需要使用 添加 DNS 服务器
net_add_dns
。GRUB 文档包含所有命令的列表。但是,描述非常简短,因此如果遇到困难,您可能需要参考源代码。然后,您可以通过运行来测试是否能够从 GRUB 命令行读取服务器中的文件
cat (tftp,<server>)/grub_conf
。如果你已经知道如何使用 grub 配置网络,你可以将其添加到 grub 配置中
/etc/grub.d/40-custom.conf
。在我的例子中,它看起来像这样:insmod net insmod efinet insmod tftp net_add_addr efinet0:link efinet0 192.168.1.40 source (tftp,192.168.1.41)/grub_conf
(我的 PC 和服务器分别绑定到
192.168.1.40
和192.168.1.41
)。然后使用sudo update-grub
更新您的grub.cfg
。幸运的是,
source
如果文件访问失败则不会执行任何操作,因此您不需要任何错误处理来检查您的服务器是否可用。
配置到此结束,这两个文件应该是您让服务器告诉 PC 何时启动以及启动什么所需的全部内容。您可能需要一些额外的配置才能从任何地方唤醒 PC - 为了提供一些灵感,我将分享我的个人配置:
- 我的 TFTP 服务器是 Raspberry Pi,它也配置为 Web 服务器,可通过 ssh 访问,全部通过端口进行
443
(使用安全组)。 我用诺伊普为服务器提供一个普遍可访问的 URL。 - Web 服务器上的一个页面提供了一个 Web 界面,用于通过 http 请求唤醒 PC(即,Web 服务器上的 PHP 脚本监听请求并相应地启动上述 bash 脚本)。
- 我使用 Android 应用程序自动化获取发送 HTTP 请求的主屏幕快捷方式(这就是我使用 HTTP 的全部原因 - 据我所知,Automate 不知道 ssh)。
- 最终结果是,我在手机主屏幕上有两个快捷方式,分别用于启动 Linux 和 Windows。如果我想远程关闭 PC,我可以通过 ssh 进入我的树莓派(例如使用特尔姆克斯并从那里访问 PC。通过一些配置,您还可以远程关闭运行 Windows 的 PC)