Barrier:Rocky Linux + Windows 双机 KVM 部署

概述

使用 Barrier 实现 Rocky Linux(服务端)与 Windows(客户端)之间共享键盘鼠标。最终采用 USB 网卡 + 直连网线 + 静态 IP,不再依赖热点。鼠标移动到屏幕边缘时自动切换到另一台电脑。

本次最终落地总结

本次已经完成的实际变更如下:

  1. 放弃热点方案,改为 Rocky Linux 上的 USB 网卡 enp0s20f0u7u4c2 直连 Windows 有线网卡。
  2. Rocky Linux 直连口固定为 192.168.77.1/24,Windows 直连口固定为 192.168.77.2/24
  3. Rocky Linux 侧由 NetworkManager 持久管理直连口,连接名为 barrier-direct-link,并启用 autoconnect=yes
  4. Rocky Linux 侧 Barrier 服务端继续由 systemd --user 托管。
  5. Windows 侧保留 BarrierClient 登录自启任务,并新增 BarrierEthernetBoot 开机任务,用于自动启用有线网卡。
  6. Windows 侧 Barrier 客户端连接地址已从旧热点地址 10.42.0.1 切换为 192.168.77.1
  7. Barrier 屏幕边界配置已调整为显式百分比映射,降低多显示器高度不一致导致的边界命中问题。

环境信息

项目 服务端 (Rocky Linux) 客户端 (Windows)
系统 Rocky Linux 9.7 Windows 11
主机名 RockyM G
直连 IP 地址 192.168.77.1 (enp0s20f0u7u4c2) 192.168.77.2
Barrier 版本 2.4.0 2.4.0
角色 Server Client
端口 24800 -

屏幕布局

1
2
3
+---+   +--------+
| G | ← | RockyM |
+---+ +--------+
  • G(Windows)在左侧
  • RockyM(Rocky Linux)在右侧
  • 从 RockyM 向左移动鼠标切换到 G,反之亦然

服务端部署(Rocky Linux)

1. 安装 Barrier

1
sudo dnf install barrier

2. 创建配置文件

1
mkdir -p ~/.config/barrier

编辑 ~/.config/barrier/barrier.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
section: screens
G:
halfDuplexCapsLock = false
halfDuplexNumLock = false
halfDuplexScrollLock = false
xtestIsXineramaUnaware = false
preserveFocus = false
switchCorners = none
switchCornerSize = 0
RockyM:
halfDuplexCapsLock = false
halfDuplexNumLock = false
halfDuplexScrollLock = false
xtestIsXineramaUnaware = false
preserveFocus = false
switchCorners = none
switchCornerSize = 0
end

section: aliases
end

section: links
G:
right(0,100) = RockyM(0,100)
RockyM:
left(0,100) = G(0,100)
end

section: options
relativeMouseMoves = false
screenSaverSync = true
win32KeepForeground = false
clipboardSharing = true
switchCorners = none
switchCornerSize = 0
end

当前实际布局是 Windows(G) 在左,RockyM 在右
使用 right(0,100) / left(0,100) 是为了在双机多显示器高度不完全一致时,仍按整条边界切换。

3. 让 USB 直连口持久化

实际环境中,Rocky Linux 不再依赖热点或 Wi-Fi 侧地址,而是通过 NetworkManager 管理 USB 网卡静态地址:

1
2
3
4
5
6
7
8
9
10
nmcli connection add type ethernet \
ifname enp0s20f0u7u4c2 \
con-name barrier-direct-link \
ipv4.method manual \
ipv4.addresses 192.168.77.1/24 \
ipv4.never-default yes \
connection.autoconnect yes \
ipv6.method ignore

nmcli connection up barrier-direct-link

检查状态:

1
nmcli -g GENERAL.NAME,GENERAL.DEVICES,GENERAL.STATE,connection.autoconnect,ipv4.addresses connection show barrier-direct-link

4. 创建 systemd 用户服务

编辑 ~/.config/systemd/user/barrier-server.service

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Barrier KVM Server
After=graphical-session.target

[Service]
Type=simple
ExecStart=/usr/bin/barriers -f --no-tray --name RockyM --disable-crypto --disable-client-cert-checking -c %h/.config/barrier/barrier.conf --address [0.0.0.0]:24800
Restart=on-failure
RestartSec=5

[Install]
WantedBy=graphical-session.target

5. 启用服务

1
2
3
4
5
6
7
8
# 重载 systemd 配置
systemctl --user daemon-reload

# 启用开机自启
systemctl --user enable barrier-server.service

# 立即启动
systemctl --user start barrier-server.service

当前实际验证使用的是 graphical-session.target 下的用户服务。
Barrier 需要依附图形会话,不建议在没有桌面会话的情况下强行改成系统级服务。

6. 管理命令

1
2
3
4
5
6
7
8
9
10
11
# 查看状态
systemctl --user status barrier-server.service

# 重启服务
systemctl --user restart barrier-server.service

# 停止服务
systemctl --user stop barrier-server.service

# 查看日志
journalctl --user -u barrier-server.service -f

7. 辅助脚本

本机还保留了一个辅助脚本,用于手工恢复直连链路和输出 Windows 参数:

1
2
3
~/barrier-direct-link.sh start
~/barrier-direct-link.sh status
~/barrier-direct-link.sh print

客户端部署(Windows)

1. 安装 Barrier

下载并安装 Barrier:https://github.com/debauchee/barrier/releases

安装路径:C:\Program Files\Barrier\

2. 创建隐藏启动脚本

创建 C:\Program Files\Barrier\start-barrier.vbs

1
Set ws = CreateObject("WScript.Shell") : ws.Run """C:\Program Files\Barrier\barrierc.exe"" --name G --disable-crypto --enable-drag-drop [192.168.77.1]:24800", 0, False

使用 VBS 包装是因为 barrierc.exe 是控制台程序,直接运行会显示 CMD 黑窗口。ws.Run 的第二个参数 0 表示隐藏窗口。

3. 配置 Windows 直连网口

Windows 有线直连口固定为 192.168.77.2/24,默认网关和 DNS 留空。

管理员 CMD:

1
netsh interface ip set address name="以太网" static 192.168.77.2 255.255.255.0

如果网卡名称不是“以太网”,先执行:

1
netsh interface show interface

4. 创建登录自启计划任务

以管理员身份打开 CMD,执行:

1
schtasks /create /tn "BarrierClient" /tr "wscript.exe \"C:\Program Files\Barrier\start-barrier.vbs\"" /sc onlogon /rl highest /ru Administrator /rp "<密码>" /f /it

参数说明:

  • /tn "BarrierClient": 任务名称
  • /sc onlogon: 触发器,用户登录时
  • /rl highest: 最高权限运行,确保能注入键鼠事件到所有窗口
  • /it: 仅在用户交互式登录时运行

5. 创建开机有线网卡自愈任务

为避免 Windows 重启后有线网卡被禁用,额外创建一个开机任务:

1
schtasks /create /tn "BarrierEthernetBoot" /tr "powershell.exe -NoProfile -WindowStyle Hidden -Command \"Enable-NetAdapter -InterfaceDescription 'Realtek PCIe GbE Family Controller' -Confirm:$false\"" /sc onstart /ru SYSTEM /rl HIGHEST /f

6. 管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
:: 手动运行
schtasks /run /tn "BarrierClient"

:: 查看任务状态
schtasks /query /tn "BarrierClient" /v

:: 停止客户端
taskkill /F /IM barrierc.exe

:: 删除计划任务
schtasks /delete /tn "BarrierClient" /f

:: 查看开机网卡任务
schtasks /query /tn "BarrierEthernetBoot" /v

关键配置说明

配置项 说明
--disable-crypto 两端均设置 禁用 SSL 加密,两端必须一致
--disable-client-cert-checking 服务端 不验证客户端证书
--enable-drag-drop 客户端 启用跨机器拖拽文件
--name 对应主机名 必须与配置文件中 screens 段的名称完全一致,区分大小写
clipboardSharing true 启用剪贴板共享

故障排查

鼠标键盘无法切换

  1. 检查连接状态

服务端:

1
ss -tnp | grep 24800

应看到 ESTAB 状态的连接。如果看到 FIN-WAIT 或无连接,说明连接已断。

客户端:

1
netstat -an | findstr 24800

应看到 ESTABLISHED。如果是 CLOSE_WAIT,说明连接已死。

  1. 重启两端

服务端:

1
systemctl --user restart barrier-server

客户端:

1
2
taskkill /F /IM barrierc.exe
schtasks /run /tn "BarrierClient"

Screen Name 不匹配

客户端的 --name 参数必须与服务端配置文件中 section: screens 里定义的名称完全一致,区分大小写。可通过 hostname 命令确认主机名。

Windows 端 UAC 弹窗导致键鼠失效

如果 Windows 弹出 UAC 窗口,Barrier 客户端需要以管理员权限运行才能注入键鼠事件。计划任务已配置 /rl highest

网络不通

确认两端在同一子网(192.168.77.0/24),且服务端 24800 端口未被防火墙拦截:

1
2
3
4
5
# 服务端检查端口监听
ss -tlnp | grep 24800

# 客户端测试连通性
ping 192.168.77.1

只能单向切换

如果出现“Rocky 到 Windows 正常,但 Windows 只能往左不能往右”,优先检查以下几项:

  1. Rocky 直连网卡是否仍有地址:
1
2
ip addr show dev enp0s20f0u7u4c2
nmcli -g GENERAL.STATE,ipv4.addresses connection show barrier-direct-link
  1. Windows 侧是否存在多个 barrierc.exe 进程:
1
2
3
tasklist | findstr /I barrierc.exe
taskkill /F /IM barrierc.exe
schtasks /run /tn "BarrierClient"
  1. Barrier 配置是否仍为全边界映射:
1
2
3
4
G:
right(0,100) = RockyM(0,100)
RockyM:
left(0,100) = G(0,100)
  1. Rocky 服务端是否正常运行:
1
2
systemctl --user restart barrier-server.service
ss -tnp | grep 24800

文件清单

路径 所在机器 说明
~/.config/barrier/barrier.conf Rocky Linux Barrier 服务端配置,定义屏幕和布局
~/.config/systemd/user/barrier-server.service Rocky Linux systemd 用户服务单元
NetworkManager 连接 barrier-direct-link Rocky Linux USB 直连网卡静态地址与自启动
~/barrier-direct-link.sh Rocky Linux 直连链路辅助恢复脚本
C:\Program Files\Barrier\start-barrier.vbs Windows 隐藏窗口启动脚本
计划任务 BarrierClient Windows 登录自启计划任务
计划任务 BarrierEthernetBoot Windows 开机自动启用有线网卡