笔记本安装 fnOS 后,难免会有意外关机的情况,如果人在外地,就需要远程开机的功能。
常见的远程开机方法有智能插座通电开机、WOL 网络唤醒、开机卡、手指机器人等,但由于笔记本的扩展性较差,往往会遇到没网口或外接网卡不通电、开机引脚太小等问题,手指机器人也不太美观。
笔记本由于自带电池,许多厂家都会隐藏通电开机的 BIOS 选项,但因为有 Intel 和 AMD 芯片的支持,这个功能始终是存在的。
最简单实现通电开机的方法是拔掉电池和纽扣电池,由于没有了 RTC 供电,此时 AFTERG3_EN 或类似寄存器将复位,一般默认为通电开机,下次通电 BIOS 会重新设置,断 电后再次复位。此方法的缺点是没有实时时钟,也发挥不了笔记本 UPS 的优势。
本教程则使用 GRUB Shell 修改 BIOS 隐藏设置实现通电开机,目前网上的教程较少且过时,故在此分享,测试机器为联想 AMD 轻薄本。
获取镜像
首先要获取笔记本的 BIOS 镜像,推荐使用 BIOS Backup TooKit 工具(无官方,自行下载,需要 Win 环境,例如在 HotPE 等 PE 中运行)读取。

查找区段
使用 UEFITool(下载)打开镜像,寻找 LzmaCustomDecompressGuid
、TianoCustomDecompressGuid
等区段,名称取决于 BIOS 厂家使用的压缩算法。同名区段会有多个,一般选择子项最多的那个区段。
在子项中寻找 Setup
、SetupDxe
等字段,同时可以使用查找功能搜索 G3
、After
、Ac
、Power
、Loss
等关键词,通电开机一般在 Setup
中,我的测试机器在 CbsSetupDxeRN
中。
展开 Setup
,选择区段 PE32 image section
右键 Extract as is 导出。如果不确定其是否包含通电开机,就将每个候选项的 PE32 image section
都导出。

导出文本
使用 IRFExtractor(下载)再将上述导出为文本格式。

使用任意文本编辑器,再次查询关键词定位,一般为 State After G3
,我的为 Ac Loss Control
,记录其后的 VarStoreInfo
地址,我的为 0xE1
,以及 Size
,一般为 0x01
。
我这里将 BIOS 的默认配置 0x00
改为 0x01
即可实现通电开机,State After G3
则相反。
此外还要注意 VarStore
的 Name
字段,在文件开头可以找到,一般为 Setup
,我的为 AmdSetup
。
0x13E6F VarStore: VarStoreId: 0x5000 [3A997502-647A-4C82-998E-52EF9486A247], Size: 0x5A8, Name: AmdSetup {24 1F 02 75 99 3A 7A 64 82 4C 99 8E 52 EF 94 86 A2 47 00 50 A8 05 41 6D 64 53 65 74 75 70 00}
0x1861A One Of: Ac Loss Control, VarStoreInfo (VarOffset/VarName): 0xE1, VarStore: 0x5000, QuestionId: 0x122, Size: 1, Min: 0x0, Max 0xF, Step: 0x0 {05 91 84 03 85 03 22 01 00 50 E1 00 10 10 00 0F 00}
0x1862B One Of Option: Always Off, Value (8 bit): 0x0 (default) {09 07 86 03 10 00 00}
0x18632 One Of Option: Always On, Value (8 bit): 0x1 {09 07 87 03 00 00 01}
修改变量
使用添加 setup_var 命令的 GRUB Shell 整合包(下载),下载后重命名为 bootx64.efi,将 U 盘格式化为 FAT32,添加目录 EFI/BOOT/bootx64.efi,笔记本引导启动。
也可以使用 fnOS 自带的 GRUB 添加 setup_var.efi(不推荐),无需额外 U 盘。
下列步骤有风险,请确保操作变量无误!
如果 VarStore
的 Name
为 Setup
,且 Size
为 0x01
,则可以直接使用 setup_var 命令,例如将地址 0xE1
的值改为 0x00
:
setup_var 0xE1 0x00
如果 VarStore
的 Name
不为 Setup
,则可以使用 setup_var_cv 命令,例如将 AmdSetup
地址 0xE1
的值改为 0x00
:
setup_var_cv AmdSetup 0xE1 0x01 0x00
