我经常在网上看到这样的照片:有人坐在遥远城市的咖啡馆里,对着笔记本电脑工作。 桌上通常有一杯咖啡,背景里也总有足够的景物,证明这杯咖啡是在离家很远的 地方买的。照片传递着一种承诺:你可以带着工作走,可以自己选择在哪里生活。

我理解这种吸引力。我还想在咖啡馆消失之后继续往前走。我想在自由世界的 任何地方工作,包括没有手机信号、没有电源插座,也拿不到别人家 Wi-Fi 密码 的地方。我的大部分工作需要文字,以及一台能处理这些文字的计算机。承担 繁重计算的那台机器,并不一定要装在我的包里。

这也是我一直在开发 Inkline 的原因之一。 它是运行在 reMarkable 2 上的终端,让电子纸平板成为一个可以写作、编辑代码、 使用 Git,以及通过 SSH 连接其他机器的工作环境。新加入的调制解调器支持, 让这个终端可以走出附近路由器的覆盖范围。

我的装备是运行 Inkline 的 reMarkable 2、一部使用不限量套餐的 Globalstar GSP-1700 卫星电话、电话的 USB 数据线、移动电源,以及一个外接供电的 USB 集线器。集线器是必需的:reMarkable 2 的 USB-C 接口在主机模式下可以传输 数据,却不能向外接设备提供所需的 5 V 总线电源。这部分电力由集线器提供。 接口能插进去,不代表事情就办成了。

草地上摆着配有键盘、运行 Inkline 的 reMarkable 2,旁边是 GSP-1700 卫星电话、移动电源、外接供电的 USB 集线器和连接线。
摆在草地上的整套装备:运行 Inkline 的 reMarkable 2、GSP-1700、移动电源和外接供电的 USB 集线器。

为了让调制解调器工作,我把 PPP 和相应的网络协议栈放进了用户空间,不需要 给平板换内核。Inkline 界面上对应的是一个调制解调器面板,提供 Off、On 和 Auto 三种模式。On 立即拨号;Auto 在终端应用请求连接时拨号,并在最后一个 连接关闭后挂断,也可以设置延迟。打开设置面板不会让卫星电话开始拨号。 不过,即使我停止打字,只要 SSH 会话还开着,通话就会继续。

GSP-1700 的未压缩数据速率是 每秒 9,600 比特, 还没扣除协议开销时,大约是每秒 1,200 字节。这个通道很窄,但命令行也不用 先完成一场广告竞价,才能给我显示提示符。编辑可以在本地进行,也可以在 远程机器上进行。Git 可以只传输一小部分改动,而不必搬走整个工作目录。 克隆大型仓库仍然需要耐心,SSH 建立连接也可能很慢,但这点带宽足以完成 有用的工作。

关键在于决定谁能使用它。Inkline 的终端应用通过代理使用调制解调器连接。 调制解调器不会成为整个平板的系统默认路由,因此,无关的系统更新和书籍 同步不会被送上卫星链路。我可以把连接留给自己打开终端时真正想做的事。 协议开销和应用的保活通信仍然存在;我要排除的是与工作无关的流量。

我的 Mosh 分支 Goblin Skiff 也是这套 装备的一部分,命令叫 goblin-skiff。它支持代理,可以把最初的 SSH 连接和 之后的加密 UDP 会话都送进 Inkline 的终端代理。针对本地无线电网状网络, 它还有小数据包的发送节奏控制,以及适应较长无线电往返时间的重试机制。 这些区别很重要:带宽、延迟和丢包是三个不同的问题。把数据包变小,并不 会让响应瞬间到达。

Inkline 还支持通过 goTenna Mesh 无线电设备传输 IP。它能加入与 Mac 和 Linux 客户端相同的公共 IPv6 网状网络,发现附近的计算机,并从平板连接它们。 有互联网连接的计算机可以为其他设备提供网关。网内通信本身不需要网关。 这样,只要机器之间处于无线电通信范围内,即使没有手机网络或 Wi-Fi 接入点, 我也有另一条连接它们的路。

这里的做法也一样:Inkline 把应用流量送进终端代理,而不是把整个平板都路由 到无线电链路上。网状网络仍然会发送发现消息,也有传输开销,但平板上无关 的后台流量不会进入这条链路。这就为我的终端留出了更多本来就有限的带宽。

Globalstar 的 覆盖范围是区域性的。 我还带着一台 Iridium GO! exec,在超出这个范围的地方使用。Iridium 标注的 速率为最高下行 88 kbit/s、上行 22 kbit/s, 卫星网络覆盖全球。两套系统都仍然需要能够与卫星通信的天空视野。树和山 都不会因为广告里写了“全球”就主动让路。

有时我也想把 Mac 带上。我开发了 Goblin Modem,把调制解调器控制带回 macOS, 再给连接加上一道防火墙。逐个应用列出的控制界面,很容易让人忽略操作系统 自身的流量。我想控制的是承载这条昂贵而缓慢连接的网络接口,包括系统服务 从这里发出的流量。

Goblin Modem 使用 macOS 的 pf 数据包过滤器。我可以先在选定接口上采用 默认拒绝的策略,再放行所需的目标地址、协议,以及本地用户或用户组。 这样,我的工作会话可以通过,后台服务却不能把 GSP-1700 的连接挤满。 Mac 通过 Iridium GO! exec 联网时,同样需要这种控制。88 kbit/s 的下行链路 仍然很窄,无用流量很容易占去其中相当一部分。

这里考虑的不只是带宽,还有电池。发送不需要的数据会耗电,即使通话费用 没有变化。工作结束后继续保持连接,也会耗电。不限量套餐并不能消除这两种 成本。我希望软件能让我有意识地使用连接,并在工作结束后方便地断开它。

我仍然可以选择咖啡馆,也可以因为与 Wi-Fi 毫无关系的理由选择一个地方。 一块看得清的屏幕、一副键盘、少量连接能力,以及知道该怎样使用它们的软件, 已经足以支撑我相当一部分工作。把这些装进一个包,是我在意的一种自由。

套餐可以不限量,电池不行。

goTenna 和 goTenna Mesh 是 goTenna, Inc. 的商标。Inkline、Goblin Modem 和 Goblin Skiff 都是独立项目,与 goTenna, Inc. 无关联,也未获得其认可。 Goblin Skiff 是 Mosh 的独立分支。