家里有个配置可观的台式机,但苦于噪声和耗电,基本处于关机状态。这个对于偶尔需要远程登陆该机器的需求就不太可能满足,更不谈远程控制了。 为此探究了一下电脑的远程唤醒功能,并且给家里的台式机配置了该功能,从此无论何时何地,只要有个轻终端和网络就能如同在家一样折腾这个工作站了。
介绍家里有个自己 DIY 组装的台式机,最初对它的设想是既能充当让我折腾的工作站也满足我娱乐的平台。为此给它安装了双系统,Ubuntu 是它的默认系统,也是我常用的工作环境; Win10 是另一个系统,偶尔用它来打打游戏。一开始想将它当做服务器一直开机,但后来直接放弃了。原因一方面是运行时水冷风扇还有有声的,特别是夜深人静的时候;另一方面是一天大部分时间都在公司上班,不可能比较高频的操作家庭电脑,比较浪费电。所以家里的电脑基本就是下班回来会捣鼓捣鼓,而且还是通过公司提供的 电脑Mac 电脑局域网远程登陆,毕竟台式机开机登陆也挺耗时的。最近突发奇想的搜索了远程开机的信息,想以此来达到想用就开机,不用就自动休眠或手动关机的目的。没想到还真有这骚操作,学名叫远程唤醒或网络唤醒,英文叫 Wake-on-LAN。
基本概念在实践网络唤醒之前,我们需要了解一下网络唤醒的原理以及唤醒方法。
网络唤醒电脑处在关机(或休眠)状态时,机内的网卡及主板部分仍保有微弱的供电,此微弱供电能让网卡保有最低的运作能力,使网卡能聆听来自电脑外部的网络广播信息,并对信息内容进行侦测与解读,一旦发现网络广播的内容中有特定的魔法数据包Magic Packet,就会对该数据包的内容进行研判。
魔法数据包是以广播方式发送的,广播的方式与范畴可以是整个局域网(LAN),也可以是特定的子网(Subnet),同时魔法数据包内会有某部(或一群)电脑的网络地址资料,网卡一旦解读研判出所指的地址是自身所处的电脑时,网卡就会通知机内的主板、电源供应器,开始进行引导(或唤醒)的程序。
魔法数据包魔法数据包Magic Packet 是一个广播性的帧frame,透过端口 7 或端口 9 进行发送,且可以用无连接 Connectionless protocol 的通信协议(如UDP、IPX)来传递,不过一般而言多是用 UDP,原因是 Novell 公司的 Netware 网络操作系统的IPX协议已经愈来愈少被使用。
在魔法数据包内,每次都会先有连续 6 个 FF(十六进制,换算成二进制即:11111111)的资料,即:FF FF FF FF FF FF,在连续 6 个 FF 后则开始带出 MAC 地址信息,有时还会带出 4 字节或 6 字节的密码,一旦经由网卡侦测、解读、研判(广播)魔法数据包的内容,内容中的 电脑 MAC 地址、密码若与电脑自身的地址、密码吻合,就会启动唤醒、引导的程序。
实战硬件基础要想实现电脑的网络唤醒 WOL,首先必须要有具备 WOL功能的主板和网卡(二者一般是一体的)。这是硬件基础,现在的主板一般都会支持网络唤醒的功能,但是默认情况不一定启用该功能,需要在 BIOS 中开启 PCI/PCIe 唤醒功能或网卡唤醒功能。
我的主板是微星 Z270 GAMING M7,网卡是 Killer E2500 Gigabit。该主板开启网络唤醒功能需要通过开机过程中,长按 DELETE 键进入 BIOS 进行如下设置:
?高级-整合周边设备-网卡 ROM 启动,设置为允许
rom
?高级-电源管理设置-Erp,设置为禁止
电脑erp
?高级-唤醒事件设置-PCIE 设备唤醒,设置为允许
pcie
软件基础除了硬件支持外,还需要在操作系统中设置网卡的唤醒功能。而网卡的唤醒功能是需要网卡驱动支持的,这是 Ubuntu 升级过程中通过踩坑明白的道理。 下面列举了 Win10 操作系统和 Ubuntu 系统下的设置。
windowsWindow 系统中驱动是很健全的,所以只要对应的主板和网卡硬件支持网络唤醒功能,那么对应的驱动基本没有问题。那就只剩下最后一步: 设备管理器-网络适配器-电源管理-允许这个装置唤醒电脑
setting_win10
ubuntuUbuntu 的版本是 20.04 LTS,其默认内核版本为 5.4.x。因为该版本距今两年多,所以其对应的网卡驱动 alx-driver 已经支持远程唤醒 wol 功能。 为了验证当前网卡是否开启对远程唤醒功能的支持,需要安装软件 ethtool。
# 安装软件 ethtoolsudo apt-get install ethtool -y# 验证当前网卡 enp5s0 是否开启 wol 支持sudo ethtool enp5s0
Ubuntu 系统安装的 20.04 LTS,后来升级为 22.04 LTS(升级过程中踩了默认驱动不支持 wol 的坑,查了好多资料才填了这个坑).
ubuntu_wakeon
默认情况如上图,Supports Wake-on表示当前驱动支持的远程唤醒方式,候选项有以下几种。wake-on表示当前远程唤醒的方式。
选项 | 描述 | 含义 |
d | disabled | 不支持远程唤醒 |
p | PHY activity | 物理唤醒 |
u | unicast activity | 单播唤醒 |
m | multicast activity | 多播唤醒 |
b | broadcast activity | 广播唤醒 |
g | magic packet activity | 魔法包唤醒 |
其中选项 g 是开启远程唤醒功能的标识。
# 设置 enp5s0 网卡驱动支持魔法包唤醒sudo ethtool -s enp5s0 wol g# 设置 enp5s0 网卡驱动永久支持魔法包唤醒,需要重启两次nmcli c modify enp5s0 802-3-ethernet.wake-on-lan magic
ubuntu_setting
内网通软硬件基础都搞定后,下面一步就是在内网(局域网)中通过魔法包唤醒目标机器。唤醒的方法这里提供两种:
?命令唤醒
操作机器和目标机器需要在同一个局域网中,操作机器需要安装 wakeonlan 命令。
# 安装 wakeonlan 命令sudo apt install wakeonlan# 命令唤醒 ## host_address为远程计算机的域名或ip地址## mac_address为远程计算机的mac地址,mac地址是':'间隔的形式wakeonlan -i host_address mac_address
?app唤醒 在软件市场中搜索 Wake-On-Lan 或 WOL 可以找到相关软件
外网通网上有相关教程[1],大致流程分为三步:
? DDNS绑定域名和动态公网IP 鉴于 家庭宽带在桥接模式 下路由器会获取公网 IP,但是这个公网 IP 是会变化的。所以最好通过 DDNS 将不变的域名和变化的公网 IP 绑定在一起。我这里使用的是 ddns-go。
? 设置 IP 和 MAC 绑定 网络唤醒的核心是将魔法数据包发送给目标机器,如果数据包中的 MAC 和目标机器一致则会触发唤醒引导程序。而路由器下面有多个终端机器,所以需要将路由器下终端机器和其 MAC 地址一一绑定,这样如果有魔法数据包经过路由器时,路由器知道将该包路由到哪台机器。
? 设置端口映射 注意 IP 地址与目标机器的 IP 一致,也就是刚才 MAC 绑定时的 IP 地址,端口随便开一个就行(但是不要用运营商封禁的端口,推荐使用 9 端口)。另外协议类型选择 UDP 或者ALL!!因为唤醒数据包是通过 UDP 协议发送的,所以协议类型只选择 TCP 协议的话数据包是进入不了内网的!!
上面的三步我依次操作了,但是没有成功。目前还没有定位的具体原因。不过我通过另一种方式解决了外网远程唤醒的问题:远程登陆到家庭 Nas(该机器是 24 小时不关机的),然后通过 wakeonlan 命令在局域网中唤醒目标机器。
常见问题系统升级带来的问题以及解决当时是奔着高性能买的这款微星主板 Z270 GAMING M7,网卡是 Killer E2500 Gigabit,号称可以干掉游戏延迟。不过 Ubuntu 中对这块网卡的驱动支持并没有那么通用,在系统升级(20.04 LTS 升级到 22.04 LTS)中还是碰到比较麻烦的驱动支持问题。这里特地记录了一下解决过程。
从这个帖子[2] 我们知道,网卡 Killer E2500 Gigabit 的驱动是 alx,但是该驱动默认是关闭远程唤醒功能的。如果想要开启该功能需要内核支持。看遍了该帖子发现对于最新的 Ubuntu 22.04 LTS(内核 5.15) 并没有直接的解决方案。但是发现对于内核 5.16.3 有了 alx 补丁,所以有了如下的升级内核的解决方案。
? 升级内核到 5.16.3
? mainline 方式[3] 该方式未生效,主要是 Ubuntu Mainline Kernel Installer 中只有 2 个内核版本
? deb包方式[4] 简单直接
? 安装 alx 补丁 下载仓库[5],并执行 ./setup
? 重启后验证
alx_fix
目前已经验证成功,为此还提了 request[6] 给仓库。
参考文献网络唤醒[7]archlinux中网络唤醒[8]外网唤醒 配置教程 远程开机[9]Wake-on-LAN broken in alx[10]alx_driver[11]ubuntu 22.04LTS alx补丁[12]如何在Ubuntu中安装Linux主线内核[13]内核deb包[14]alx_dkms_installer支持22.04LTS[15]References[1] 相关教程: https://blog.csdn.net/qq_19764639/article/details/82817719
[2] 帖子: https://bugzilla.kernel.org/show_bug.cgi?id=61651#c166
[3] mainline 方式: https://www.sysgeek.cn/ubuntu-install-linux-mainline-kernel
[4] deb包方式: https://kernel.ubuntu.com/~kernel-ppa/mainline
[5] 仓库: https://github.com/haojunyu/alx_dkms_installer
[6] request: https://github.com/AMV007/alx_dkms_installer/pull/5
[7] 网络唤醒: https://zh.wikipedia.org/wiki/%E7%B6%B2%E8%B7%AF%E5%96%9A%E9%86%92
[8] archlinux中网络唤醒: https://wiki.archlinux.org/title/Wake-on-LAN#Wake-up_after_shutdown
[9] 外网唤醒 配置教程 远程开机: https://blog.csdn.net/qq_19764639/article/details/82817719
[10] Wake-on-LAN broken in alx: https://bugzilla.kernel.org/show_bug.cgi?id=61651#c166
[11] alx_driver: https://wiki.linuxfoundation.org/networking/alx
[12] ubuntu 22.04LTS alx补丁: https://github.com/AMV007/alx_dkms_installer/pull/5
[13] 如何在Ubuntu中安装Linux主线内核: https://www.sysgeek.cn/ubuntu-install-linux-mainline-kernel
[14] 内核deb包: https://kernel.ubuntu.com/~kernel-ppa/mainline
[15] alx_dkms_installer支持22.04LTS: https://github.com/haojunyu/alx_dkms_installer
电脑