只有一个工具不合适——远程控制(三)

目前基于 moonlight 的一套工具感觉也差不多成型了,分享一下

相关主题

  1. zerotier + mstsc
  2. parsec
  3. moonlight 四件套

涉及的工具

  • moonlight:串流的客户端
  • sunshine:串流的服务端
  • zerotier:内网穿透
  • Idd:虚拟显示器,应对显示器关机的问题

四个工具组合使用,基本上补足了与 parsec 的主要劣势, 那么接下来介绍下这四个工具的作用,以及如何确定的。

串流客户端 - moonlight

串流客户端是最早确定的,因为整套串流的起源是 nvidia 的 shield, 只要有 geforce 显卡,就可以串流到 shield 设备,因为我只有前者, 但是又需要在 mac、安卓上串流 windows 游戏, 所以自然而然地选择了 shield 的跨平台开源替代,moonlight。

串流服务端 - sunshine

我最早是直接用 geforce experience 自带的串流服务, 但由于之前 nvidia 宣布会终止支援,我也就早早换到了 sunshine。 gfe 可能现在也还能用,不过我已经没再用了,相对于 gfe,sunshine 有两个优势:

  • 不局限于显卡品牌
  • 登陆页面(Logon UI)依然有效

前一个对于 a 卡用户很重要,后一个也补足了 gfe 的一个重要不足:没办法远程登录系统。 这一点其实很重要,因为一般远程唤醒的机器是需要登录一下才能进入系统,如果不能登录, 那我们就还要用到别的工具,先登上去,然后把控制权交回本地,再用 moonlight 连接主机, 这个就有些麻烦了,sunshine 这点就强于 gfe,不过依然有不足,登陆后, 我们当前的连接会中断,这时需要重连一下才能继续使用,而 parsec 就没有这个问题。

相较于 gfe 内嵌的服务,sunshine 在使用上我还真没有感觉到有什么不足, 而且增加了一些功能,可以说是一个没什么争议的替换。

内网穿透

熟悉的朋友可能知道,大部分时间我都在使用 zerotier 作为内网穿透工具, 我最早使用 zerotier 的时候,zerotier 对免费用户的同网段设备数限制还是 200, 现在已经降到了 25,还好还没有对我造成影响。

选择 zerotier 的理由也很简单:配置简单,连接相对稳定, 偶尔我也会试用一下 tailscale 之类的工具,得到的体验基本也是和 zerotier 差不多, zerotier 不能直连的,tailscale 基本也不能直连,速度也没有感觉有显著的提升, 虽说没有 25 台设备,但是一个一个全装一遍也挺麻烦的, 所以多数时间我还是依赖 zerotier 进行内网穿透。

另外,tailscale 还有一个小问题,他的 100 段的 ip,在一些程序中会被视为公网, 而不是内网,所以跟一些应用的配合度就差一些, 比如 parsec 可以使用 zerotier 辅助穿透,但是 tailscale 就没办法用到。

不过总体说来,有一个内网穿透工具这套方案就可以行得通, 我们完全可以自主选一个用着顺手的,没有什么强制的要求。

IddSampleDriver

其实上述三件套配好,基本上我们也已经具备了远程控制的条件了。 加入 IddSampleDriver 是为了帮我们添加一个虚拟显示器,为什么需要一个虚拟显示器, 其实之前我们也聊过。

由于 sunshine / gfe,甚至之前我们介绍的 parsec,核心的逻辑都是捕捉系统输出到显示器的内容, 串流出来,显示到客户端设备。注意这里的重点是「输出到显示器」, 因为如果我们使用 dport 连接显示器,正常情况下只有显示器电源打开的情况下, 系统才能识别到显示器,而显示器电源关闭时,系统检测不到显示器, 这种情况下,sunshine / gfe / parsec 采集到的信号都是黑屏。

这是一个很有争议的话题,有些朋友认为这是一个 bug,显示器关机也应该保留显示器, 有些朋友认为这是一个 feature,显示器关机就不应该检测到显示器, 但是对于远程串流的应用来说,没有显示器,就捕获不到画面,也就有了黑屏。 多数应用也都认为这是一个合理情况。其实如果我们在使用 rdp 来连接主机, 也能看到一个虚拟显示器「Microsoft Remote Display Adapter」:

所以 windows 系统的设计可能就是这个样子:一定要有一个显示器,才会输出图像。 对于这个情况,物理的解法我们之前讲过了,可以用显卡欺骗器,也可以用 hdmi。 软件的解法,不同的应用有不同的对策,比如 rdp 会启动一个虚拟显示器, 而 parsec 会让你在安装时选择要不要装一个虚拟显示器,但是 sunshine 就没有这个选项了, 而且令人遗憾的是,parsec 这个虚拟显示器似乎也只有 parsec 可以使用,其他应用无法使用。

所以这时就有了我们上面的应对方案:IddSampleDriver,这是一个虚拟现实器的驱动, 安装完成以后,我们电脑上就多了一个显示器:

虽然是虚拟的,但是对于系统来说,它就是一个显示器,所以我们要修改一下显示器的布局, 不然鼠标移到虚拟显示器上,就难找了,我一般是把虚拟显示器设为与某块屏幕复制, 或者更简单一点,只有在 moonlight 连上之前,才打开 IddSampleDriver。 sunshine 也有专门的配置,可以在用户连接时执行相应的操作,我也有配过,前期很顺利, 但是后面一直会报错,这次我们也就不展开了。

总结

这个 moonlight 四件套,基本可以作为 parsec 的一个替代,这么看来, 其实 parsec 提供的功能已经非常完整了,不过我还是觉得作为一个备用方案还是有必要的, 毕竟远程控制这个回事,有太多的不可控因素,只有一个工具不合适。