Linux 主机的网络唤醒

在正文前先啰嗦些背景故事,也是我个人电子设备的补全之路:

  1. 2013年6月买了树莓派;
  2. 2014年9月买了TU131笔记本,装了Linux开始东搞西搞;
  3. 2014年10月买了Netgear的个千兆无线路由,可惜不能刷OpenWRT
  4. 2015年6月买了小米平板;
  5. 2015年7月配了台itx小主机,装Gentoo出了各种各样的问题,于是只好上Arch

至此,家庭网络初见雏形。

另外,促使我买小主机的直接原因是最近的Linux桌面实在蛋疼。我日常用的是Arch,之前纯KDE 4用得感觉不错,然而自从KDE5进入Arch官方源后,KDE 4下的KonsoleDolphin简直不能看。升级到KDE 5后发现KonsoleDolphin更加不能看,于是便换到GNOME 3下等KDE5的更新。然而KDE 5这货又久久不更新,GNOME用起来又各种不爽。于是一狠心买了台主机,装纯CUIArch,笔记本上了Windows 8.1,远程连到ITX主机上开搞。

于是,目前的使用情况是这样的:

  1. 树莓派常年开着跑一些服务,比如网页、邮件什么的;
  2. ITX主机主要用来撸代码,顺便开一些“高端”一点的服务,比如dlna什么的;
  3. 笔记本用来处理日常事情,上个网银、挂个迅雷什么的都很方便;
  4. 小米平板其实就是上B站的。

这样,ITX主机只在需要的时候开一下。上周出差,想远程编译个东西,开不了主机只能用树莓派。于是立志要搞好网络唤醒WOL, Wake on LAN功能。

好了,屁话完了,开始正文——

ITX主机用的是华擎B85m-ITX主板,主板本身是支持WOL的。那么要开启WOL就需要分别从BIOS和系统中对相关的配置进行设置。

设置BIOS

华擎B85m-ITX主板用的是AMI UEFI Legal BIOS
分别启用

Advanced -> ACPI Configuration -> PCI Devices Power On
Boot -> Boot From Onboard LAN

两个选项就可以了。BIOS的配置比较简单。

Arch中设置网卡参数

首先,需要安装ethtool工具,可以选择下列命令中的一个进行安装:

pacman -S ethtool           # Arch
emerge ethtool              # Gentoo
apt-get install ethtool     # Debian, Ubuntu
yum install ethtool         # CentOS, Fedora
# Please use YaST           # OpenSUSE

安装好后,使用下面的命令查看网卡的WOL配置参数,其中eth0按需填写:

sudo ethtool eth0

若执行结果中有形如:

Supports Wake-on: pumbg

的内容,则说明目前系统使用的网卡驱动支持直接设置WOL参数,此时只需使用命令

sudo ethtool -s eth0 wol g

开启WOL功能即可。此处参数g所代表的功能,及WOL中幻数等相关概念,请自行查阅相关资料,本文不再赘述。
而如果在显示的信息中没有Wake-on的相关内容,则说明目前使用的网卡驱动不支持WOL功能,此时则需要对网卡驱动进行处理。而我正是遇到了这样的问题。
通过命令

sudo ethtool -i eth0

查知我的网卡使用了alx驱动,通过网上查阅相关内容发现新版Linux自带的alx驱动竟然移除了对WOL的支持。这是一个令人悲伤的消息。几经查找,终于找到了一个帖子,其中提到了使用新内核编译老alx驱动的方法。
Linux内核官网下载3.10.*版本的内核。解压后进入到linux-3.10.53/drivers/net/ethernet/atheros/alx目录中,执行

make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

命令编译出alx.ko文件。
在编译过程中,编译器有可能会报出

implicit declaration of function ‘SET_ETHTOOL_OPS’

的错误出来。此时只要在main.c文件中找到SET_ETHTOOL_OPS所在的那行将其换成

netdev->ethtool_ops = &alx_ethtool_ops;

后再次编译即可。
alx.ko文件编译好后使用命令

ls /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/atheros/alx

查看目录中的内容,看看内核模块是以什么样的方式存在的。如果是ko文件本身,那么只需用刚编译好的alx.ko文件将上述目录中的文件替换掉即可。(强烈建议替换前备份原来的驱动文件。)如果上述目录中存放的是gz文件,那么需要使用命令

gzip alx.ko

把文件压缩后再行替换。
对于编译内核驱动模块的过程来说,alx目录之外的所有其他文件都是没有什么卵用的,因此其实只需下载alx目录中的文件即可。对于不想下载整个内核的,可以下载GitHub中的源码备份,其中main.c文件已经修改,Makefile也添加了相关的target,因此只需执行make命令即可编译。

使用WOL

Windows下有各种工具可以远程唤醒目标机。
Linux下则可使用wol命令。
具体使用方法网上有许多教程,本文中不再赘述。

添加新评论