debian分支Atheros网卡WoL失效解决办法

Wake-on-Lan,局域网络唤醒,WoL或WOL两种缩写在英语技术说明中都出现过。是以网络数据报文开启远程计算机的办法。

这里说一句题外话,在局域网环境,绑定ARP和IP地址,对于魔术包WoL毫无用处,只能在一定程度上,局限于冲突域范围内,起到防止ARP冲突的作用。请不要天真地认为WoL失败与未绑定ARP有任何关联;或者认为魔术包WoL成功时,绑定ARP起到了帮助作用。只有单播唤醒时,报文的目的IP地址变化,会引发唤醒失败,但那应该绑定DHCP分配,而不是ARP,而且单播唤醒目前来说只有苹果系统应用相对多一点点。普遍而言,单播唤醒相对能耗比较高,没多少人实际配置使用。目前WoL使用最广泛的魔术包与OSI模型网络层广播地址192.168.0.255/24,10.0.1.255/24之类,一丢丢关系都没有。魔术包的二层帧头,目的地址是FF:FF:FF:FF:FF:FF,三层IP报头目的地址是255.255.255.255,换句话说,只要在冲突域内,所有的电脑都会接收到Wol魔术包,哪怕IP地址配置超出了地址段,比方说路由器地址192.168.0.1,这个路由器LAN口接了一台电脑,配置IP地址是10.255.255.254,那么这台电脑照样可以接收到魔术包,具体能不能唤醒是要看相关配置的。

因为魔术包这个报头,它不能跨越冲突域,就是说不能从家用路由器的wan口去往lan口,从lan口也不能去往wan口,也不能跨越管理型交换机的两个vlan。更不要说跨越公网,从家到办公室。也不能从虚拟专用网络进入物理网络。这几种情况无论设置什么NAT转发,魔术包WoL都不可能成功。想要实现这种情况的WoL,需要设置成单播WoL。组播型WoL和广播型WoL应用范围更小,需要结合网络设备配置,具体配置与CCIE、HCIE认证考试内容有关系。

WoL魔术包唤醒是通过执行程序关机,进入S5状态时,主板保持网卡电源供电,等待唤醒实现,但此时网卡会进入10M握手状态,仅处于勉强能够收发报文的状态,此时的CPU和内存是断电的。单播唤醒需要进入其他ACPI状态,需要计算机能够响应发送给自己的IP报文。而网卡芯片处理能力有限,魔术包应用最广泛的原因就是这个,它不需要其他芯片辅助,不需要深度处理报文就可以唤醒计算机。

而有些主板不能从G3状态,也就是工作电源掉电,恢复成S5状态,换句话说,交流断电再恢复以后,不能仅给网卡供电而不开机执行操作系统引导,这就是有些计算机在交流断电以后,唤醒会失效。

本文涉及的网卡型号:Qualcomm Atheros Killer E2400 Gigabit Ethernet Controller (rev 10)

本文涉及的操作系统为 PVE 版本 8.2.4,内核版本 6.8.12-1-pve。

描述的是WoL被唤醒的设置,是目前关机状态,等待开机的;不是目前开着机,去唤醒其他电脑。

本文引用的alx-wol项目是针对Linux debian分支,包括但不限于debian、ubuntu、Proxmox VE系统,以及Arch Linux,对于Atheros系列网卡,包括但不限于killer、AR8171,的WoL功能的启用。

alx-wol 支持最低内核版本是 5.15.50。内核版本 6.4.13,Ubuntu 使用了与不向下兼容的新版本的 libc,不会触发 alx-wol 的 dkms 机制,会导致补丁失败。但采取 6.5 或更新版本内核的 Ubuntu 22.04 22.10 23.04 在 alx-wol 的支持范围。

前提条件,主板上BIOS设置中,WoL项是enabled状态,就是开机按Del键或者F2键进入的,在操作系统之前的界面,也有人叫CMOS设置。具体设置方法,请参考主板说明书,或联系品牌方。USB网卡不支持唤醒,只有板载,或者插接在PCI-E接口上的网卡可以支持。

这篇解决的问题:安装PVE以后,发现不能网络唤醒,用以下步骤检查:

1、运行 ip a 或 ip address 指令,前面是缩略写法:

root@pve:~# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr0 state UP group default qlen 1000
    link/ether f4:4d:30:xx:xx:xx brd ff:ff:ff:ff:ff:ff
4: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000

        我这台机器安装的是Proxmox Virtual Environment ver 8.2,会显示出多个网卡,1是本地回环口,含义自行搜索,2是主板上的物理网卡,下一步要用到的就是“2:”后面跟着的名称,3在我这里不存在,是因为没有无线网卡,比3大的都是虚拟网卡。其他分支在刚刚安装好的情况下应该只显示1和2。多网口服务器会显示多个物理网卡。以上输出中,网卡MAC地址,以X代替了实际值。

2、ethtool指令需要root权限,PVE随安装iso带这个指令,其他分支版本需要手动安装。

        #sudo apt-get install ethtool

root@pve:~# ethtool enp1s0
Settings for enp1s0:
	Supported ports: [ TP ]
	Supported link modes:   10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Full
	Supported pause frame use: Symmetric Receive-only
	Supports auto-negotiation: Yes
	Supported FEC modes: Not reported
	Advertised link modes:  10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Full
	Advertised pause frame use: Symmetric
	Advertised auto-negotiation: Yes
	Advertised FEC modes: Not reported
	Speed: 1000Mb/s
	Duplex: Full
	Auto-negotiation: on
	Port: Twisted Pair
	PHYAD: 0
	Transceiver: internal
	MDI-X: Unknown
        Current message level: 0x000060e4 (24804)
                               link ifup rx_err tx_err hw wol
	Link detected: yes

如果网卡支持WOL,则会在最后面几行显示:

	Supports Wake-on: pumbg
	Wake-on: g
        Current message level: 0x00000007 (7)
                               drv probe link
	Link detected: yes

Supports Wake-on: pumbg        # 显示当前网卡是不是支持WoL,以及系统所支持的唤醒方式,这里p指物理接口,u指单播,m指多播,b指广播,a指ARP报文,g指魔术包,s指魔术加密包,我这里s没出现,不支持。

Wake-on: g                # 显示目前启用的唤醒方式,如果是d则为禁用状态

如果输出里结果没有Supports Wake-on,Wake-on这两项,则是不支持WoL,或者是主板上设置没启用,或者比如笔记本电脑主板,硬件就不支持。

也可以使用 ethtool <接口名称> | grep "Wake-on" 语句检查,只要关键两行,没有输出则就是不支持。

那么在这个例子里,也没有这两行,但它有一个 wol 显示,那么转机就来了。检查一下网卡型号:

root@pve:~# lspci | grep -i ethernet
01:00.0 Ethernet controller: Qualcomm Atheros Killer E2400 Gigabit Ethernet Controller (rev 10)

查了好几天,换了好几次关键词,发现是驱动程序禁用了wol,这个网卡使用的驱动程序名称是alx.ko。github有一个专门针对这种情况的项目alx-wol,当前版本2.1.1,我联系了项目作者,帮助我在驱动上打了补丁,根据项目作者说的步骤,以下是应对 PVE 8 的补丁办法:

先确保proxmox subscription在source内,没有添加这个源的话执行以下语句:

sudo echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" >> /etc/apt/sources.list

安装项目所需软件包:

sudo apt install dkms build-essential proxmox-default-headers

我第一次打补丁失败了,是在 /home 目录下进行的项目克隆,第二次尝试在 /usr/src 目录下进行,成功了,所以如果没有脚本调试经验,记得执行 #cd /usr/src

克隆alx-wol项目:

git clone https://github.com/AndiWeiss/alx-wol.git

我这里执行得很快,如果失败,需要使用github镜像,具体办法网上有很多。

然后进入项目目录,执行剩下所需的指令:

cd alx-wol
git checkout proxmox
sudo ./install.sh

当然PVE刚安装好,是只有root用户,而没有其他普通用户的,最后一句install.sh可以把前面的sudo去掉。

按照项目作者的说法,安装完成前,网络会中断一会儿,然后会自行恢复,但我执行完以后发现网卡状态显示速率双工都是unknown状态,网络中断以后并没有恢复,如果远程执行补丁脚本,有可能造成远程计算机脱管,目前最好还是本地操作。项目作者说是要增加一个不切换补丁的参数,以便远程执行。

	Speed: Unknown
	Duplex: Unknown
	Auto-negotiation: on
	Port: Twisted Pair
	PHYAD: 0
	Transceiver: internal
	MDI-X: Unknown
	Supports Wake-on: pg
	Wake-on: pg
        Current message level: 0x000060e4 (24804)
                               link ifup rx_err tx_err hw wol
	Link detected: yes

这时虽然 Current message level 一项的显示,跟没打补丁之前一样,但已出现 Supports Wake-on,Wake-on 两项显示为pg,我测试了一下,不需要每次开机都执行

sudo ethtool -s <网卡名称> wol g

就可以用魔术包实现开机。按项目作者的说法,内核升级不会对已经打上的补丁造成影响。

alx-wol项目地址:

 https://github.com/AndiWeiss/alx-wol

本文项目作者描述的操作流程:

https://github.com/AndiWeiss/alx-wol/issues/17

------

本文与alx-wol项目相关的描述,经过alx-wol项目作者同意转载。

项目作者建议在新装系统上尝试补丁驱动。

alx-wol项目声明,实际操作带来的风险由操作人自行承担。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值