我有一台双启动计算机,我给它起了个昵称“马库斯”。我编写了一个 Alexa 应用程序,可以在树莓派上调用命令。
Pi 可以启动、重新启动或关闭 Marcus 电源。
我有一个命令将发出登录到 Marcus、运行 grub-reboot 并将计算机重新启动到 Windows 的命令。这显然需要 Marcus 开机并引导至 Linux。
我希望能够设置一个在 grub 启动时读取的变量。似乎供应商密钥可能是一个选择。我可以使一个文件可供网络使用,但我不清楚如何让 grub 读取它。如果我可以让它读取网络文件,我可以用它来控制系统启动到哪个操作系统。
这里的任何想法将不胜感激。
答案1
问题是,当从网络启动时,系统固件(BIOS 或 UEFI)将提供网络驱动程序。从本地磁盘启动时,固件提供的网络驱动程序可能不会被激活,因此 GRUB 必须提供自己的网络堆栈 - 除非它知道如何激活固件(也许使用 UEFI?)。那么Marcus系统使用BIOS还是UEFI,使用什么类型的网卡?
使用 GRUB 的供应商密钥功能似乎行不通:它依赖于读取 BIOS 设置 NVRAM 中的特定字节来决定是否使用特殊按钮。因此,您需要在系统启动和进入 GRUB 之间以某种方式修改该值。这意味着运行您自己的 BIOS 扩展、自定义引导加载程序和/或某种自定义硬件。
实现此目的的最简单方法可能是将 Marcus 系统设置为尝试从网络启动,并将本地启动作为第二启动目标,以防网络启动失败。您需要拥有一个可以为 PXE 网络启动提供必要的 DHCP 选项的 DHCP 服务器,以及一个可以向 Marcus 系统提供 PXE 启动加载程序及其配置文件的 TFTP 服务器。 Pi 可以很轻松地完成这两件事。
您可以为 Marcus 上运行的 PXE 引导加载程序编写两到三个配置文件:一个用于从本地磁盘无条件引导 Linux,另一个用于以同样的方式无条件引导 Windows,第三个可能用于显示引导菜单(适用于应用程序启动的情况)未运行启动命令(以消除手动启动系统时等待网络启动尝试超时的需要)。
然后,您的 Alexa 应用程序将简单地更改 TFTP 服务器提供的配置文件,然后再将唤醒命令发送到 Marcus 系统:根据使用的语音命令,它将放置无条件 Windows 或无条件 Linux启动配置到TFTP服务器,然后触发Marcus系统的唤醒或重新启动命令。在等待足够的时间引导尝试成功或超时后(或者在看到来自 TFTP 服务器的日志消息表明配置文件已读取,如果您想更有趣的话),它会将引导菜单配置恢复为TFTP 服务器。