cyilin / WOL的折腾日记

Created Tue, 06 May 2025 20:32:08 +0800 Modified Sun, 14 Dec 2025 23:57:20 +0800
2137 Words

前言

作为时不时就要出差的我,为了能够在外面的酒店也能玩到电脑,自然而然的打起远程操控电脑的注意。而纵观世界上任何一个远程串流软件,其必然的前提是——被控端设备一定是在开机状态 (废话) 。但是一直打开电脑不但费电费,而且容易被勤俭节约的同居人 “好心” 帮你关机。为了避免出现“想玩的时候折腾半天,发现是自己电脑关机”这种尴尬的情况,远程开机的需求自然就提了出来。

物理层面的通电开机

总所周知,现在的电子设备基本上都有插电自启的功能,我们的电脑也不例外。

因此我一开始的思路是买一个智能、可以联网开关的插座,对电脑实行物理层面的通断电而达到远程开关机的目的。

主板的通电自启功能一般是默认关闭的,因此我们需要提前在主板中打开。我们只需要在bios中开启即可。每个厂家的bios不同,开启方式也不一样,但是基本都大同小异,例如在华硕主板中,在bios进入到Advanced Mode,在Advanced选项卡中点开高级电源管理,将断电恢复改为电源开启即可。

接下来只要找一个好用的智能插座即可。一开始我瞄准的米家的智能开关插座(毕竟现在用的小米手机)

但!!!看着者这50元的售价,我的荷包在告诉我一定有其他更好的办法!对于家庭nas都是靠捡垃圾配出来的我,这么高端的插座显然不怎么符合我的气质(不是)。

既然已经装了nas,那为何不在nas上作文章呢?

Wake On Lan——网络唤醒

Wake-On-LAN简称WOL,是一种电源管理功能;如果存在网络活动,则允许设备将操作系统从待机或休眠模式中唤醒。许多主板厂商支持IBM提出的网络唤醒标准。该标准允许网络管理员远程打开PC机电源,以便进行文件升级、资源跟踪和设备清点等工作。

Wake On Lan(wol)其实在很早以前就已经诞生,广泛到现在基本是一张主板就搭载这种技术。

使用之前是一样要到bios中开启,跟之前通电自启一样,每个主板商的开启方式都不一样,但大同小异。还是以华硕主板举例:在bios进入到Advanced Mode, 点击APM Configuration, 并将Power On By PCI-E改为Enabled即可。

改完bios后,我们还需要在Windows中设置一下方可。

我们在设备管理器中打开网络适配器,右键你的网卡,点击属性

点击高级选项卡,选到魔术封包唤醒,并设置为开启

至此,被控端的设置便全部设置完成。接下来就要找一个合适的设备进行安装wol客户端,让这台设备发送数据包便可以远程唤醒了。而合适的设备——那自然是二十四小时不关机的设备啦。

openwrt wol

说到24小时不关机的智能设备,大多数人家里那肯定是路由器。而我正好有一台刷了openwrt的旁路由。

我们进入openwrt的后台,找到网络唤醒,然后选择进入被控设备的ip/mac地址,最后点一下唤醒主机即可。

Docker wol-go-web

唉,每次都要选择地址,好麻烦的,还有没有更方便,真正一键启动的办法呢?

有的兄弟,包有的。

在docker的神奇妙妙容器里面,有不少与wol相关的容器。个人觉得最方便的那就是chishin/wol-go-web,它可以只用一串链接就发送wol开机指令,真正做到了一键启动。

部署也非常简单,以下是docker compse文件。

services:
  wol-go-web:
    image: chishin/wol-go-web:latest
    container_name: WolGoWeb
    restart: unless-stopped
    network_mode: host # 必须要用host模式
    environment:
      - PORT=9090 # 指定端口号,可自行更改
      - KEY=false

部署完成后我们只需要在浏览器输入http://服务器IP或域名:9090/wol?mac=需要唤醒主机的MAC地址即可。在外地还可以通过ddns/内网穿透来进行唤醒主机。

Docker upsnap

upsnap也是一个wol服务,虽然提供了好看的webui,但是单论开机方便而言,其实不如是chishin/wol-go-web那种一条链接直接开机来的舒服。

But!它可以输入设置关机指令!

由于曾经试过串流软件卡死导致无法连接的主机,必须要重启的情况,显然光有wol是无法做到关机的,因此upsnap自然就被我看上了。

部署upsnap也是非常简单

services:
  upsnap:
    container_name: upsnap
    image: ghcr.io/seriousm4x/upsnap:latest # images are also available on docker hub: seriousm4x/upsnap:5
    network_mode: host
    restart: unless-stopped
    volumes:
      - ./pb_data:/app/pb_data
    # # To use a non-root user, create the mountpoint first (mkdir data) so that it has the right permission.
    # user: 1000:1000
    # environment:
    #   - TZ=Europe/Berlin # Set container timezone for cron schedules
    #   - UPSNAP_INTERVAL=*/10 * * * * * # Sets the interval in which the devices are pinged
    #   - UPSNAP_SCAN_RANGE=192.168.1.0/24 # Scan range is used for device discovery on local network
    #   - UPSNAP_SCAN_TIMEOUT=500ms # Scan timeout is nmap's --host-timeout value to wait for devices (https://nmap.org/book/man-performance.html)
    #   - UPSNAP_PING_PRIVILEGED=true # Set to false if you don't have root user permissions
    #   - UPSNAP_WEBSITE_TITLE=Custom name # Custom website title
    # # dns is used for name resolution during network scan
    # dns:
    #   - 192.18.0.1
    #   - 192.18.0.2
    # # you can change the listen ip:port inside the container like this:
    # entrypoint: /bin/sh -c "./upsnap serve --http 0.0.0.0:5000"
    # healthcheck:
    #   test: curl -fs "http://localhost:5000/api/health" || exit 1
    #   interval: 10s
    # # or install custom packages for shutdown
    # entrypoint: /bin/sh -c "apk update && apk add --no-cache <YOUR_PACKAGE> && rm -rf /var/cache/apk/* && ./upsnap serve --http 0.0.0.0:8090"

upsnap 开机

部署完成后在浏览器输入http://服务器IP或域名:8090即可进入upsnap的webui后台。

点击右上角新增, 并输入备注、ip、mac地址、子网掩码便可

当然,你也可以点击网络扫描,设定好ip网段以后便可以自动识别添加

upsnap 关机

对于关机而言,我们需要额外设置一番。Windows端最好是安装并启用openssh。

进入到设置>系统>可选功能>添加可选功能,点击查看功能,搜索并安装openssh

设置完成以后,我们回到upsnap,在关机指令中输入sshpass -p "你的电脑密码" ssh -o "StrictHostKeyChecking=no" 你的电脑账号@电脑局域网ip "shutdown /s /t 0 /f"

最后拉到最下面点击保存即可。

现在,你用其他设备登陆upsnap,就可以远程控制开关机啦。