如果使用 GRUB 通过 LAN 唤醒启动,则启动不同的操作系统

如果使用 GRUB 通过 LAN 唤醒启动,则启动不同的操作系统

我有一台运行 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_dnsGRUB 文档包含所有命令的列表。但是,描述非常简短,因此如果遇到困难,您可能需要参考源代码。

  • 然后,您可以通过运行来测试是否能够从 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.40192.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)

相关内容