有没有办法启用睡眠模式并在局域网上唤醒?

有没有办法启用睡眠模式并在局域网上唤醒?

我想知道是否可以让我的服务器在一段时间后进入睡眠状态,但仍然监听局域网请求。我使用我的服务器作为媒体服务器,每天可能会使用 3 或 4 小时,让它一直运行确实很浪费电力。然而,当我们想看电影时,我不想跑到二楼打开它。我看到一些关于阻止这种情况发生的帖子,但是如何启用它呢?

答案1

LAN 唤醒是 BIOS 和 NIC 功能,而不是操作系统功能,也就是说,您需要支持 BIOS 和 NIC 才能执行此操作。

一旦您在 BIOS 中启用了它(如果可以的话),您可以通过检查 的输出来检查您的 NIC 是否启用了 WOL 支持ethtool [interface]

如果 的值Supports Wake-on包含g,则您的网卡支持 WOL 魔包。

要检查它是否确实已启用,请查看 的值Wake-on。如果它包含g,则您的 NIC 已启用魔包支持。

如果未启用,请运行以下命令:

ethtool -s [interface] wol g

每次系统启动时您都必须发出此命令,因此请将其添加到适当的位置。在 Ubuntu 中,通常最好的位置可能是up/etc/network/interfaces或者网络管理器的等效位置。

答案2

我知道这是一年前提出的问题,但我找到了一些解决方案。第一个使用powernap一个脚本来检查特定正在运行的进程,并且可以找到这里

我在网上看到的第二个是Linux问题。这使用 ping 到另一台机器。

我还用 DD-WRT 刷了一个路由器来尝试 - 在dd-wrt ​​维基。这些是非常好的优雅的解决方案,但我遇到的问题是它们不适合内部媒体服务器,因为日志仅捕获来自网络外部的已接受数据包。如果您想要一个仅限内部的媒体服务器,那么这是行不通的。

对于dd-wrt使用 VLAN 对此提供了一个非常好的解决方案。基本上将服务器放在它自己的内部子网上并监控该 VLAN 的流量,然后前面的脚本就可以工作了。这工作得很好,但根据我的经验,每当我使用 vlan 功能 DHCP 时,路由器和 dd-wrt ​​的构建都会崩溃。

我决定需要一个解决方案,在访问时自动唤醒和挂起我的媒体服务器,而不依赖于 dd-wrt。我有一个树莓派,所以我用它。我为自己找到的最终解决方案是编写一个小 bash 脚本。 raspberry-pi 依赖项是 etherwake 和 tcpdump。 rasbian 上默认不安装两者。

sudo apt-get install etherwake
sudo apt-get install tcpdump

唤醒脚本如下:

#!/bin/bash

pingInterval=60 #time interval, in seconds, between checks that the server is still awake.
target=192.168.x.x  #WOL target ip address
targetMAC=00:11:22:33:44:55  #WOL target MAC

wake () {
tcpdump -i eth0 -c 1 -p host $target
etherwake $targetMAC
#echo WOL sent to $target at $targetMAC
return
}

while sleep $pingInterval; do
varPing=`ping -s 1 -c 2 $target > /dev/null; echo $?`
if [ $varPing -eq 0 ]; then
#echo ping success
else
#echo ping fail
wake
fi
done

主要想法是它是从我的树莓派运行的,如果它注意到对服务器的单个 arp 请求,它将唤醒服务器。如果服务器处于唤醒状态,那么它不会侦听 arp 请求,而是时不时地发送一些 ping 以确保它仍然处于唤醒状态。

我将该文件命名为 wol.sh 并使其可执行。然后将其放入 sudo crontab 中以 root 身份启动 @reboot。这是针对 tcpdump 的,它需要提升访问权限才能侦听 eth0 和 etherwake。

sudo chmod +x /home/pi/wol.sh
sudo crontab -e

将其添加到底部

@reboot sh /home/pi/wol.sh > /dev/null

睡眠脚本使用相同的原理从媒体服务器运行。如果在扫描间隔期间没有到服务器的流量(不包括 icmp 或 arp),我选择 1 分钟。然后它会添加到一个计数器,我将其命名为“困倦”。当睡意达到 10 或 20 意味着二十分钟内没有流量进出时,它将睡意设置为零,然后发出pm-suspend入睡命令。它接收到数据包,sleepiness!=0然后执行休眠-1。因此,如果它从路由器捕获到杂散数据包或某些数据包,它不会将计数重置为零,而只是从计数器中执行 -1。我把它放在那里是因为它允许在数据包在一段时间内减少时缓慢进入睡眠状态的宽限期,而不是连续 20 分钟绝对为零的数据包。

这可能不是最好的,因为它必须在两台机器上调用 tcpdump,涉及不断写入磁盘(服务器端)。为了写入磁盘,我安装了一个牺牲 USB,这是保存我的捕获文件的地方,以防止磨损我的实际 HDD。

相关内容