在正文前先啰嗦些背景故事,也是我个人电子设备的补全之路:
- 2013年6月买了树莓派;
- 2014年9月买了TU131笔记本,装了Linux开始东搞西搞;
- 2014年10月买了Netgear的个千兆无线路由,可惜不能刷
OpenWRT
; - 2015年6月买了小米平板;
- 2015年7月配了台itx小主机,装
Gentoo
出了各种各样的问题,于是只好上Arch
。
至此,家庭网络初见雏形。
另外,促使我买小主机的直接原因是最近的Linux桌面实在蛋疼。我日常用的是Arch
,之前纯KDE 4
用得感觉不错,然而自从KDE5
进入Arch
官方源后,KDE 4
下的Konsole
和Dolphin
简直不能看。升级到KDE 5
后发现Konsole
和Dolphin
更加不能看,于是便换到GNOME 3
下等KDE5
的更新。然而KDE 5
这货又久久不更新,GNOME
用起来又各种不爽。于是一狠心买了台主机,装纯CUI
的Arch
,笔记本上了Windows 8.1
,远程连到ITX主机上开搞。
于是,目前的使用情况是这样的:
- 树莓派常年开着跑一些服务,比如网页、邮件什么的;
- ITX主机主要用来撸代码,顺便开一些“高端”一点的服务,比如
dlna
什么的; - 笔记本用来处理日常事情,上个网银、挂个迅雷什么的都很方便;
- 小米平板其实就是上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
命令。
具体使用方法网上有许多教程,本文中不再赘述。