![是否可以使用 SMB 数据包唤醒 ACPI S3 挂起的 Linux 系统?](https://linux22.com/image/1384822/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%20SMB%20%E6%95%B0%E6%8D%AE%E5%8C%85%E5%94%A4%E9%86%92%20ACPI%20S3%20%E6%8C%82%E8%B5%B7%E7%9A%84%20Linux%20%E7%B3%BB%E7%BB%9F%EF%BC%9F.png)
我想在闲置一段时间后将 Debian NAS 系统置于 RAM 模式 (ACPI S3),以节省一些电量。我考虑将 NIC 置于等待单播 SMB 数据包的模式,然后唤醒。这将非常有用,例如当电视想要从 NAS 流式传输某些内容时。也许可以使用类似ethtool -s eth0 wol p
phy 等于某些 SMB 单播数据包的方式。
这可能吗?我想这应该不难实现,但也许我错了。
答案1
是的,这是可能的,必须执行以下操作:
aptitude install pm-utils
cd /usr/lib/pm-utils/sleep.d/
touch 70wol
将以下内容放入70wol
#!/bin/bash
ethtool -s eth0 wol pug
回到你的 shell,并使脚本可执行:
chmod +x 70wol
现在执行 ACPI S3 暂停:
pm-suspend
您现在应该能够使用 ICMP、SSH、SMB 等数据包唤醒系统。
不要忘记,Windows 和 Linux 的 ARP 缓存超时均为 30 秒。因此
pm-suspend
网络上的其他机器只有大约 30 秒的时间来唤醒系统,因为在此期限之后,它们不再具有 MAC 地址,因此无法向目标系统发送数据包。
您可以使用静态 ARP 地址解决这个问题。在每个系统上,如果您希望能够唤醒 NAS 系统,请在 Windows 上执行以下操作
arp -s 10.0.0.200 00-10-54-CA-E1-40
在 Linux 上
arp -s 10.0.0.200 00:10:54:CA:E1:40
如果您有一台 NAS 家庭服务器,那么这个设置就相当不错了,它不需要 24/7 全天候运行。现在,您可以编写一个 shell 脚本作为 cronjob,并在 5 分钟不活动后暂停 NAS 服务器。
我在 Debian Testing 上使用 Kernel 3.12 和适用于我的 Intel I217-V NIC 的最新 Intel e1000e 驱动程序执行了此操作。
答案2
这是可能的,Windows 实际上默认使用网卡的唤醒模式功能:
一种特殊的数据包包含唤醒模式。默认情况下,启用 WOL 时,Windows 7 和 Windows Vista 会监听以下数据包:
- 指向网络适配器 MAC 地址的定向数据包
- 针对本地计算机名称的 NetBIOS 名称解析广播
- 网络适配器 IPv4 地址的地址解析协议 (ARP) 数据包
- 网络适配器的请求节点多播地址的 IPv6 邻居发现数据包
但是,请注意,其列表不包含单播 SMB 数据包。为什么?因为在建立 TCP 连接之前不会发送 SMB 数据包,而在此之前,客户端必须找出服务器的硬件地址 - 对于 IPv4 使用 ARP,对于 IPv6 使用邻居发现。(使用 NetBIOS 的名称解析也在列表中,但出于某种原因,LLMNR 不在列表中。)因此,您需要创建一个非常相似的过滤器列表 - 至少包含 ARP 和邻居发现。