自组服务:让老机器“物尽其用”
自组服务:让老机器“物尽其用”
今年的 618 读者们都有过什么盘算呢?换机还是装新机?我嘛……显然是没有条件(米)去换代的,所以如何利用好现有的条件首先就是个问题。之前偶然借助 Hyper-V 得知了 RemoteApps 这项功能,但跑虚拟机[1]始终是我个人比较抵触的事情(问就是配置不够分),于是我将目光盯向了 17 年买的老华硕笔记本。这就是咱“自组服务”最初的尝试了。
基础设施
首先除非你想要亲自呆在老机器旁边操作,否则肯定需要远程连接到那台老机器上的,也就需要保证别的设备能和老机器互通。
如果两台机同在一个内网(比如以 WiFi、有线等方式,设备间连接同一个路由器),那么通常来说需要固定老机器的 IP,否则刚搭的“自组服务”可能没几天就飘不知道哪去,得登进路由器里查咯。固定 IP 可以在老机器的系统里操作,等会具体到系统上再分别讨论;一些路由器也支持用户登录进去固定主机的 IP,但我家网关莫得这个功能。
若并非同一内网,则更麻烦亿些。我个人折腾过可行的最简方案是 Zerotier 虚拟组网,毕竟当时对寄网了解有限,搜内网穿透也只能搜出来“喂我花生”之类的东西(我家网关也只支持某某壳子)。
配置 Zerotier One
首先当然得有那么个内网。在 Zerotier 上注册/登录账号(可能比较卡,毕竟国外平台),Create A Network
创建虚拟内网。免费版(截至目前)至多允许同一网络 25 个设备,但对于我来说足够了。
接下来图省事的朋友点进新建的网络,记一下Network ID
就可以直接安装 Zerotier 客户端了。
Windows 有挂在任务栏里的 GUI 客户端,右键图标直接Join Network
,粘贴刚刚的Network ID
回车,进账号里同意加入、给它分配固定 IP 即可;
Linux 可以通过 Docker、官网提供的命令行、部分包管理器等方式安装 Zerotier One。
或者,进一步配置虚拟内网
主要关注以下项:
Basics
网络基础设置
然后在设备加入虚拟内网之后,可以在Members
里找到这个设备,手工给它分配个静态 IP。
安装之后记得确认一下 Zerotier 服务是否开启,若是 Docker 容器还请额外注意端口映射。
sudo systemctl status zerotier-one.service
如systemctl
显示该服务disabled
、inactive (dead)
,说明没有启动,启用并立即启动它:
sudo systemctl enable --now zerotier-one.service
于是就可以使用 Zerotier CLI 了。我的场景比较简单,不考虑自建 moon 的情况下直接sudo zerotier-cli join Network_ID
,然后也是在账号上给它放行、分配固定 IP 就可以了。
注意
在配置基础设施、远程连接的时候,还请不要断开老机器的屏幕——至少等能连上了再拔线。
Windows——性能分摊
相信大多数人玩电脑接触最多的还是 Windows 系统,那么对于如何使用它,想必都是很有经验的罢。根据老机器配置的不同,它承担负载的多寡也自然各有参差。
固定 IP
- Win11 参考电脑屋的教程;
- Win8.1 及以下通常还是从控制面板固定,也参考电脑屋。
- Win10 除了控制面板法,也可以直接在“设置—网络和 Internet—状态”中找到上网的网络(通常标以太网或者 WiFi),点进底下的属性,往下划拉到 IP 设置那边手动分配 IP。
远程连接
白嫖国产软件的免费服务也可以,最常见的当属向日葵了吧。但我是受不了手机端向日葵广告满天飞,所以还是折腾 Windows 自带的 RDP 吧。
欲使用 RDP 连接,需要启用 Windows 的远程控制功能。据微软称家庭版只能它控别人,不能别人控它。但我都 LTSC 2021 起手了,又有何惧。 远程控制选项可在以下两个入口找到(以 Win10、11 为准,不推荐“开发人员设置”):
- 设置—系统—远程桌面,启用之(顺便根据指引把“睡眠”禁用掉、把“网络发现”打开);
- 打开“系统属性”[2]的“远程”选项卡,允许远程连接、勾上“仅允许……”选项(恕我懒得打全称)。
然后就可以使用 RDP 连接了。控制端可以用mstsc
(Windows)、Windows App(Android,原“RD 桌面”)、FreeRDP 以及 Remmina(Linux),等等。
注意
微软账号现在推行免密登录,取而代之的是用 2FA 工具验证登录码,这种方式不适用于 RDP 连接。
此外,实测发现,微软文档所述的“应用密码”也无法作为凭据。推荐用本地、带密码的账户托管老机器,密码留空进行远控需要额外做组策略配置,恕不展开。
然后该干嘛干嘛。顺带一提,远控的鼠标一般是不记录位移、只改变坐标的,也就是说《原神》这类游戏远程玩效果并不佳;但《剑网三》重制版则更建议远程玩,因为接下来讲的 Moonlight 串流没法向它传递键盘输入。
串流
这里的串流主要是指类似“云原神”那样的——老机器跑游戏,其他设备接收画面、回传操作的——类似看别人直播的模式。顺带一提,自己直播也是一种串流,只不过方向相反:是你这边把音画上传[3]到直播平台。
串流自建云游戏的主要方式是 Moonlight+Sunshine 和 Parsec,其中前者结合 Zerotier 虚拟组网,甚至可以异地云玩。有关的配置方式可以参考知乎专栏或者 B 站搜索“自建云原神”之类的关键词(也可以看看“阿西西”这个 UP 主的魔改 Moonlight 客户端)。咱已经很久没搞了,讲出来也不一定对,就略过吧。
文件共享
最简单的就是 Windows 自带的 Samba(SMB)文件共享,也就是右键文件/文件夹属性里边的“共享”选项卡。
此外还有其他参考:
- 网络文件系统 NFS:参见微软文档
- WebDav 服务器(需要 IIS):参见微软文档,或参考《Windows 开启 WebDAV》(少数派)
其他服务
- 推流机(挂着直播平台的直播软件,开第三方推流接收内网 OBS 推过来的 rtmp 串流)
- 挂下载(主要是各种限速客户端的下载,或者数据量大的下载)
- 自动化脚本
- RemoteApps(迫真“家庭”版 Office,当然还有 Adobe 全家桶,等等)
- ……
Linux——Web 接口
Linux 通常还是作为服务器而非日用的系统使用,所以相比费劲折腾 VNC 等远程桌面,不妨就让它挂一些长线运行的服务好了。而既然莫得远程桌面,这些长线服务很显然只剩 WebUI 这一种可视化的选择。当然如果你更偏好 CLI(命令行界面),那也不是不行。
固定 IP
不同的发行版主要用到的网络管理工具都不太一样。
- 像 Arch Linux 安装阶段会用
systemd-networkd
分配固定 IP; - 而 Ubuntu 虽然也有上述服务,但更多在用
Netplan
(参见 FreeCodeCamp); - 还可以用
ifconfig
做临时配置:
ifconfig # 查看所有网卡的配置信息
ifconfig eth0 # 查看某网卡的配置信息,如 eth0
ifconfig eth0 172.16.129.108 netmask 255.255.255.0 # 配置网卡的临时生效的IP地址
route add default gw 172.16.129.254 # 配置网关
总之,具体问题(发行版)具体分析,像/etc/sysconfig/network-scripts
这种上古教程还是不要无脑跟了。我的 Ubuntu Server 24.04.2 LTS 连sysconfig
都莫得。
SSH 远程连接
安装openssh
包,并启用sshd
服务。多数软件包管理器应该都支持 SSH。以咱的 Ubuntu Server 为例:
sudo apt update
sudo apt install openssh
sudo systemctl enable --now sshd
sudo systemctl status sshd
部署服务(分层讨论)
首先说一下分层怎么回事。有些服务可能是通过容器分发的,那么 Docker 就是这些服务的下层,为这些服务提供支持(有点绕口?);而 Docker、npm 之类通常又依赖国外的源(像 DockerHub、npmjs),于是代理又是容器的下层。当然正经分类起来这些都属于应用层。只是细化一下粒度便于讨论。
代理层(以 Mihomo 为例)
Mihomo 可以理解为 Clash 的后继,所幸 Clash 的许多配置还是能兼容的(至少我的机场订阅可以直接覆盖使用)。但更好的办法还是编写配置文件了。
geox-url:
geoip: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
geosite: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
mmdb: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.metadb"
asn: "https://github.com/xishang0128/geoip/releases/download/latest/GeoLite2-ASN.mmdb"
但遗憾的是在代理尚未配置好的情况下,似乎哪怕是jsdelivr
镜像都很难获取到 Geo 信息。那么还是手动下载吧。
实际上只需下载geoip.dat
并更名GeoIP.dat
、geosite.dat
更名GeoSite.dat
(Linux 对文件名大小写敏感),丢进 mihomo 配置目录即可(也就是config.yaml
所在位置)。
应用支持层
主要就是 Docker。Docker 的安装参见官方文档。出于一些原因,现行很多镜像源并不可靠也并不完整,不如直接配置代理(参见《如何配置 docker 通过代理服务器拉取镜像》(博客园))。
pnpm
或者说node
直接上官网复制 Linux 安装脚本就彳亍,但不建议去装 Docker 镜像[5]!
应用层
这块不是重点,各种服务有各种服务的参考文档。
webmin
:提供 WebUI 对服务器做些运维。aria2
与AriaNg
:提供直链、BT、PT 下载支持。参见《手把手教你使用 Docker 搭建 aria2+AriaNg,打造自己的离线下载服务器》(博客园) [6]。jellyfin
emby
:影音服务器。有关 Jellyfin 的媒体聚合和刮削会专门另开一篇讨论。vscode-server
:控制端可利用 VSCode 配合 Remote-SSH 插件连上服务器,做些跨平台开发……或者 Linux Native 开发。真有人在 Linux 编译 MSVC x86-64 吗?有的话浇我。ssh
:Xshell 做些命令行活计,Xftp 做些文件交换活计。nfs
:和前面 Windows 一样,可以挂共享文件系统。- ……
后记
通篇看下来,我的服务场景都挺简单的,不是吗?说实话……我并不熟悉寄网(哪怕为了跨考自学过 408),平时也没有太多 Web 编程的实践和需求。能简单搭这么一个自用的服务便已经方便我不少了。若是真正的大佬,或许还会利用反代、软路由等种种轮子实现更加 NB 的东西吧。
不过反正我这人也没什么水平,笔记也不过抛砖引玉。菜逼有菜逼的天马行空,简单点写,懂的都懂。
这里仅指传统意义的虚拟机,也就是 VMWare、VirtualBox 之类“模拟一套硬件”的硬件抽象层虚拟化。广义的虚拟机实际上就是虚拟化:Java 语言也有我们熟悉的 JVM 虚拟机,这是编程语言层的虚拟。此外还有 QEMU、Wine、Linux Docker 等在别的层级实现的虚拟化。 ↩︎
通常是在“控制面板—系统”(早期 Windows)或“设置—系统—关于”(Win10、11)里跳转。也可
Win+R
直接执行%windir%\system32\sysdm.cpl
。 ↩︎目前国内的 ISP(又或者运营商)对上传带宽限制得很死,个人通常不会允许大规模的上传(尤其 BT、PT、PCDN,其中以 PCDN 为甚——很多软件都会在运行时偷偷跑上传),否则容易吃传单(据说可以投诉,但我这人懒得扯皮);企业商宽、专线通常会给多一点,但就极客湾的遭遇来看似乎也仅仅是“一点”,而且价格比较高昂。可能云游戏亏损就是亏损在这吧。 ↩︎
文档简介就是这么写的:“‘虚空终端’是一个基于开源项目‘原神’的二次开发版本”。或许是起名灵感,又或者是避嫌。 ↩︎
个人理解吧……Docker 镜像通常是部署用的,比如 CI/CD runner 跑工作流,需要拉
node
容器生成我这博客的dist
成品。直接拿来开发个人觉得不太妥。 ↩︎自从 Pandownload 被赐似之后,这种套取直链的油猴插件就多半是骗钱引流的“浑水”了,不建议尝试!但当年这玩意能火,或许也说明有些慢速下载获取到合适的直链、搭配代理,确实能提速吧。 ↩︎