最近一直在折腾 Windows 主机和 Linux 从机之间的协同。最开始的需求其实非常简单:

能不能只用一套键盘和鼠标,同时操作 Windows 和 Linux?

进一步一点:

能不能在两台机器之间直接复制、粘贴文本,甚至是复制粘贴文件?

再进一步:

如果只是两台电脑互相通信,为什么一定要经过家里的路由器,要是路由器性能不好会不会直接影响局域网设备转发,能不能直接将他们网线直连?

于是这次折腾最终变成了一个比较有意思的小方案:Windows 主机和 Linux 从机直接插一根网线,建立点对点局域网,然后使用 Deskflow 共享键鼠,再使用 CrossPaste 同步剪贴板与文件。

最终结构非常简单:

        wifi/网线              一根网线
路由器-------------Windows ───────────────── Linux
                     │                         │
                     │ Deskflow                │ Deskflow
                     │ 键盘 / 鼠标              │ 键盘 / 鼠标
                     │                         │
                     │ CrossPaste              │ CrossPaste
                     │ 剪贴板                   │ 剪贴板
                     │                         │
                     └────────── LAN ─────────

没有路由器,没有交换机,甚至不需要 Wi-Fi。PS:连接外网的那段不算。

两台机器自己就可以组成一个小型局域网。当然也是必须要连接外部网络的,可以使windows主机连接家庭的路由器,用wifi连接或是直插网线(这里必须要求的是windows上有两个网口,我是一个本机自带的网口+绿联的USB C 拓展坞)。

一、为什么要直接网线连接?

正常情况下,如果想让两台电脑互相通信,最简单的办法当然是:

Windows
   │
   ├──── Wi-Fi / 网线 ────┐
   │                      │
   │                    路由器
   │                      │
   └──── Wi-Fi / 网线 ────┘
                          │
                        Linux

这样当然没有问题。但是对于我这个场景来说,两台电脑本身就放在一起,而且主要需求只是:

  • Deskflow 键鼠控制
  • CrossPaste 剪贴板同步
  • 两台机器之间的小规模数据通信

为了这个目的再绕一圈路由器,其实有点多余。于是我想到:

两台电脑直接用网线连接不就行了?

现在大多数电脑的以太网卡都支持 Auto MDI-X,因此通常不需要传统意义上的交叉网线。

直接:

Windows 网口
     │
     │ Ethernet
     │
Linux 网口

即可建立物理链路。

二、直连之后,还需要解决一个问题:IP 地址

网线插上以后,并不意味着两台机器马上就能通信。因为没有路由器提供 DHCP,所以两台电脑可能没有自动获得合适的 IPv4 地址。

我们这里使用windows的网络连接共享功能,将连接路由器的那个网口的数据共享到连接linux副机上的网口。

具体操作如下:

这样设置之后windows主机就像充当了一个路由器一样,一般来说,它的子网ip为:192.168.137.1,linux副机在设置ipv4自动获取后,它的ip会被设置为192.168.137.~表示这两个机器在一个局域网下,我这里是192.168.137.253.

到这里其实就可以建立两个机器之间的通信了。

先测试网络。

Windows:

ping 192.168.137.253

Linux:

ping 192.168.137.1

如果能够正常收到回复:

64 bytes from 192.168.137.1

那么说明最基本的链路已经打通。

此时整个网络已经是:

Windows
192.168.137.1
    │
    │ Ethernet
    │
192.168.137.253
Linux

这时候再继续折腾 Deskflow。

三、Deskflow:让一套键鼠控制两台电脑

网络打通之后,Deskflow 就非常简单了。

Windows 作为 Server:

直接开启运行即可,注意这里我们不用它进行剪切板同步,官方实现剪切板同步总有一些bug,因此我们在配置的时候把它的剪切板同步关闭,并在服务端这里配置好两台计算器之间的实际物理位置关系。

Windows
   │
Deskflow Server

 

Linux 作为 Client:

Linux
   │
Deskflow Client

配置客户端,输入服务端的ip:192.168.137.1就可以连接上了

于是:

一套键盘
     +
一只鼠标
     ↓
Windows + Linux

不再需要在两套输入设备之间切换。

四、Deskflow 的剪贴板同步的一些bug

到这里本来应该已经结束了。但真正让我继续折腾的,反而是剪贴板。Deskflow 本身提供剪贴板同步功能,所以一开始我的想法是:

键鼠和剪贴板全部交给 Deskflow。

但实际使用过程中发现:Deskflow 的剪贴板同步并不总是稳定。

比较典型的情况就是:

Windows
Ctrl + C
   ↓
Deskflow
   ↓
日志显示 Clipboard Updated
   ↓
Linux
Ctrl + V
   ↓
没有得到预期内容

这就比较奇怪了。因为从 Deskflow 日志来看,Windows 的剪贴板变化已经被检测到了。还有一个就是开启了剪切板同步后只要是借用了wl-paste和wl-copy这个包来实现剪切板底层同步就会出现状态栏一直闪烁的问题。

问题可能发生在:

Windows Clipboard
       ↓
Deskflow Server
       ↓
网络
       ↓
Deskflow Client
       ↓
Linux Clipboard

中的某一环。

继续排查当然可以,但我后来换了一种思路:

既然 Deskflow 的强项是键鼠共享,那就让它只负责键鼠。

五、CrossPaste:把剪贴板单独拆出来

最终我加入了 CrossPaste。于是现在整个方案变成:

┌────────────────────────────────────┐
│            Windows                 │
│                                    │
│  Deskflow ─────── 键盘 / 鼠标       │
│                                    │
│  CrossPaste ───── 剪贴板            │
└──────────────────┬─────────────────┘
                   │
                网线直连
                   │
┌──────────────────▼─────────────────┐
│              Linux                 │
│                                    │
│  Deskflow ─────── 键盘 / 鼠标       │
│                                    │
│  CrossPaste ───── 剪贴板            │
└────────────────────────────────────┘

这样两个软件各司其职:

Deskflow:

负责“控制另一台电脑”。

CrossPaste:

负责“把复制的内容带到另一台电脑”。

六、最终形成两条独立的数据通道

现在整个系统可以非常清晰地分成两条链路。

输入链路

键盘 / 鼠标
      ↓
Windows Deskflow
      ↓
    Ethernet
      ↓
Linux Deskflow
      ↓
Linux

剪贴板链路

Windows Clipboard
      ↓
CrossPaste
      ↓
    Ethernet
      ↓
CrossPaste
      ↓
Linux Clipboard

两条链路互相独立。

因此即使 Deskflow 的剪贴板同步出现问题,也不会影响 Deskflow 的键鼠共享

剪贴板交给 CrossPaste 单独解决。

七、这里还有一个 CrossPaste 的小坑

直连网络和普通家庭网络最大的区别之一,就是:Windows 很可能把这个网络识别成“未识别的网络”。例如可以看到类似:

NetProfile.Name : 未识别的网络
IPv4Address     : 192.168.137.1

这并不意味着网线没有连接。

它只是说明 Windows 无法通过常规方式判断这个网络属于哪个已知网络环境,这都是正常的现象,但是对于crosspaste来说这个未识别的网络确实是很难搞的问题,它不能以常规方式来分析这个网络,这里我发现了一个小技巧

八、CrossPaste在网线自连的情况下如何实现正常通信。

首先我们来复盘一下

  • 服务端:windows ---  ip:192.168.137.1
  • 客户端:linux --- ip:192.168.137.253

遇到的诡异现象是,在服务端输入客户端ip是可以显示连接上的,同步是正常的,也就是windows上复制的文件和剪切板可以传输到客户端

但是在客户端输入服务端 ip,怎么都是连接不上的,会显示离线状态,然后检查网络是否连接正常,都是没有问题的,那么会是哪里出了问题呢,其实就是windows作为这个子网路由器,网络是被共享的,我们在客户端不要输入192.168.137.1这个ip,我们输入服务端被家庭路由器分配的ip,也就是可以连接外部网络的ip地址,

 

 

如果你不知道服务端连接外网的ip,可以打开网络设置里可以看到。

九、总结

这里诡异的就是deskflow可以直接使用子网ip,而crosspaste就不行,我猜测应该是底层对网络类型的判别有所区别吧,希望这个经验能够对局域网内有多台设备且没有路由器中转的人有所帮助。

十、为什么我觉得这种方案挺适合折腾?

因为它实际上是一个非常小而完整的网络实验。一根网线,就把两台电脑变成了一个最简单的局域网。

                Point-to-Point LAN

       192.168.137.1
Windows ───────────────── Linux
                           192.168.137.253

然后在这个局域网上运行:

Deskflow
    ↓
输入共享

CrossPaste
    ↓
剪贴板同步

如果以后需要,还可以继续往这个网络里加入:

  • SSH
  • SCP
  • SFTP
  • SMB
  • HTTP 文件服务器
  • 自建 API
  • 远程开发
  • 局域网音频
  • 其他 TCP/UDP 服务

这时候你会发现:这根网线实际上就是两台电脑之间的一条专用高速数据通道。