OpenUUYC Linux
即将停止更新,死因这里
这是用 Rust 编写的 UU 远程第三方 Linux 客户端,支持主控、被控和远程协助。
这是https://github.com/DoyoDia/openuuyc-linux的独立分支,只支持Linux。
为什么只支持Linux,因为UU远程已经支持了windows和macOS,但是我跟他们反应要支持Linux,他们懒得理我。
下载与使用
或从下方构建与安装自己编译。
功能矩阵
以下沿用本分支已有的功能记录,实际能力取决于桌面、显卡、驱动、权限和远端。
| 功能 | Linux 主控 | Linux 被控(Xorg) | Linux 被控(Wayland) |
|---|---|---|---|
| 登录方式 | ✅ 扫码 / 短信 | ✅ 未登录可游客协助 | ✅ 未登录可游客协助 |
| 同账号连接 | ✅ 可同时连多台 | ✅ 需开“允许被控” | ✅ 需开“允许被控” |
| 设备 ID / 验证码协助 | ✅ 含最近与收藏 | ✅ 账号及游客 | ✅ 账号及游客 |
协助邀请链接 uuremote:// |
✅ 经 .desktop 登记 | — | — |
| 画面采集 | — | ✅ NvFBC → MIT-SHM → 门户 | ⚠️ wlr-screencopy → 门户,需 XWayland;缩放桌面需 XWayland ≥ 23.1 |
| 硬件编码 | — | ✅ NVENC / VA-API H.264 | ✅ NVENC / VA-API H.264 |
| 软件编码 | — | ✅ H.264 4:2:0 | ✅ H.264 4:2:0 |
| 硬件解码 | ⚠️ 仅 VA-API H.264 | — | — |
| 软件解码 | ⚠️ H.264;AV1 仅 8 位 4:2:0 | — | — |
| 指定显卡 / GPU 调度 | ⚠️ 自动(桌面所在显卡) | ⚠️ 自动,无 GPU 调度 | ⚠️ 自动,无 GPU 调度 |
| H.265 | ❌ | ⚠️ 仅 NVENC | ⚠️ 仅 NVENC |
| AV1 | ⚠️ 软解 8 位 4:2:0 | ⚠️ NVENC 4:2:0,需 RTX 40 系及以上 | ⚠️ NVENC 4:2:0,需 RTX 40 系及以上 |
| 10 位 / HDR | ❌ | ❌ | ❌ |
| 4:4:4 真彩 | ⚠️ H.264 软解,≤1080p | ⚠️ 仅 NVENC | ⚠️ 仅 NVENC |
| 键盘鼠标 | ✅ | ✅ XTest,免设置 | ⚠️ uinput 需权限,否则仅 XWayland |
| 手柄与震动 | ✅ 最多四个标准手柄,连接支持手柄的官方被控端 | ❌ | ❌ |
| 绝对 / 相对鼠标 | ✅ 游戏锁定、可选节流 | ✅ | ⚠️ 绝对定位需 xdg-output |
| 触摸(多点) | ❌ 只发键鼠 | ⚠️ 单指模拟 | ⚠️ 单屏未旋转时多点 |
| 文字输入(移动端输入法) | — | ✅ XTest | ⚠️ 虚拟键盘协议,GNOME 退回 XTest |
| 拦截本机快捷键 | ⚠️ Xorg 抓键盘 / Wayland 需合成器协议 | — | — |
| 多显示器切屏 | ✅ 顶栏屏标签,跟随远端拓扑 | ✅ | ✅ 门户需共享多屏 |
| 播放中切换设备 | ⚠️ 顶栏与全屏浮动栏,未实测 | — | — |
| 多屏独立窗口 | ⚠️ 标签拖出,独立窗口各一块屏;仅硬解,Wayland 摆位由合成器决定 | — | — |
| 分辨率 / DPI 调整 | ✅ 远端设置、本地拉伸 | ⚠️ RandR 分辨率,无 DPI | ⚠️ 物理屏保持原分辨率(XWayland 不能改,按拒绝处理),虚拟屏经 niri;无 DPI |
| 虚拟屏 / 超级屏 / 无屏兜底 | ✅ 操作远端 | ❌ | ⚠️ 仅 niri:虚拟屏与无屏兜底,内核 ≥ 6.19,安装包自动启用 VKMS socket |
| 桌面声音 | ✅ Pulse / PipeWire / ALSA | ✅ 录监听源 | ✅ 录监听源 |
| 仅音频连接 | ✅ | ✅ | ✅ |
| 麦克风 / 虚拟声卡 | ✅ 发送麦克风 | ❌ 无虚拟声卡 | ❌ 无虚拟声卡 |
| 剪贴板文字 / 图片 / 文件 | ⚠️ 无富文本,文件经 FUSE | ⚠️ 无富文本,文件经 FUSE | ⚠️ 同左,图片可能到不了 XWayland |
| 剪贴板同步开关(标题栏) | ✅ | — | — |
| 文件拖放(拖入 / 拖出 / 拖回) | ⚠️ 拖入/拖出,无拖回 | ⚠️ 拖入/拖出,无拖回 | ⚠️ 仅拖出(需 layer-shell) |
| 向官方主控发文件(队列浮窗) | — | ✅ | ❌ |
| 独立文件传输 | ✅ | ✅ 根为 \,路径对外用反斜杠 |
✅ 同左 |
| 端口转发 | ✅ TCP / UDP | ✅ 需开许可 | ✅ 需开许可 |
| 被控终端(UU 手机端的「终端」) | ❌ 不提供 | ✅ 需开许可,以桌面用户身份运行;「远程终端」页可本机新建、用系统终端接上;本机开的会话另需「允许主控接入本机终端会话」才对主控可见 | ✅ 同左 |
| 批注 / 白板 | ❌ | ❌ 拒绝请求 | ❌ 拒绝请求 |
| 远程关机 / 重启 | ✅ | ✅ logind,受 polkit 约束 | ✅ logind,受 polkit 约束 |
| 远程开机(WoL) | ✅ | ⚠️ 网卡需手动 ethtool | ⚠️ 网卡需手动 ethtool |
| 息屏点亮与防休眠 | ✅ 观看时防休眠 | ✅ DPMS 点亮 | ⚠️ 视桌面,Hyprland 等不能点亮 |
| 锁屏 / 登录界面被控 | — | ❌ 无常驻服务 | ❌ 无常驻服务 |
| 开机自启 | ✅ 登录后进托盘 | ⚠️ 登录桌面后才能被控 | ⚠️ 登录桌面后才能被控 |
| 托盘与被控红角标 | ✅ SNI,GNOME 需扩展 | ✅ | ✅ |
| 访问通知 | — | ✅ 浮窗 / 桌面通知 | ✅ 浮窗位置由合成器定 |
| 性能监控 / 异常图标 / 全屏操作栏 | ✅ | — | — |
| 设备资料与壁纸 | — | ⚠️ 壁纸仅部分桌面 | ⚠️ 壁纸仅部分桌面 |
| 诊断包(本机导出 / 远端获取) | ⚠️ 无解码检查页 | ✅ | ✅ |
| 插件与节点图 | ⚠️ 可管理插件,播放器无节点图 | — | — |
| 1:1 实际像素 | ❌ 按钮置灰 | — | — |
| 自定义 / 全局快捷键 | ⚠️ 仅播放窗口有焦点时 | — | — |
| 凭据存储 | ✅ Secret Service,无明文回退 | ✅ 同左 | ✅ 同左 |
| 安装服务 / 驱动 | ❌ 用 deb / AUR 包 | ❌ | ❌ |
| 更新 | ⚠️ 仅提醒,指向上游 Release | ⚠️ 同左 | ⚠️ 同左 |
✅ 支持,⚠️ 部分支持或有前提,❌ 不支持,— 该角色不涉及。
构建与安装
需要 Rust stable(edition 2024)与 C/C++ 工具链。
Arch / Omarchy
package/arch/PKGBUILD 提供 openuuyc 的 Arch Linux 打包配方,可在本地构建:
version=$(python3 -c 'import tomllib; print(tomllib.load(open("Cargo.toml", "rb"))["package"]["version"])')
cd package/arch
sed "s|@PKGVER@|$version|g" PKGBUILD > PKGBUILD.local
makepkg -p PKGBUILD.local -si
Omarchy 用户同样使用 Arch 安装包,通过 sudo pacman -U <文件名>.pkg.tar.zst 安装。不再提供额外的通用 tar.zst 压缩包。
自建:
sudo pacman -S --needed base-devel cmake clang nasm pkg-config rust \
libva libx11 libxcb libxrandr libxi libxcursor libxfixes \
libxkbcommon libxkbcommon-x11 wayland libglvnd vulkan-icd-loader \
dbus alsa-lib openssl fuse3 noto-fonts-cjk
cargo build --release --bin openuuyc
Debian / Ubuntu
Ubuntu 22.04 / Debian 12 及以上:
sudo apt install build-essential cmake clang nasm pkg-config libva-dev \
libasound2-dev libdbus-1-dev libxkbcommon-dev libxkbcommon-x11-dev \
libwayland-dev libx11-dev libxcb1-dev libxrandr-dev libxi-dev libxcursor-dev \
libgl1-mesa-dev libvulkan-dev libudev-dev libssl-dev fonts-noto-cjk fuse3
git clone https://github.com/djkcyl/openuuyc.git
cd openuuyc
cargo build --release
./target/release/openuuyc gui
被控端虚拟显示器(可选)
主控可以要求被控端凭空多出一块显示器。写内核的 configfs 只有 root 能做,所以主程序内建 openuuyc vkms 特权子命令,配合套接字激活的系统服务:平时不跑,第一次用到时由套接字拉起。不再单独编译或安装 openuuyc-vkms 可执行文件;GUI 仍以普通用户运行,只有系统服务调用的 vkms 子命令以 root 运行。条件:
- Linux 6.19 或更新的内核,且编译了
CONFIG_DRM_VKMS。更老的内核上 VKMS 没有 configfs 接口(modinfo -F parm vkms里没有create_default_dev就是),程序不会去碰它,诊断页会写「内核不支持」; - systemd(套接字激活);
- 当前合成器能把新输出接进桌面布局,目前只有 niri。其他桌面(GNOME、KDE、sway、Xorg……)上主控不会出现「添加虚拟屏」这个入口。
无屏兜底:被控机一块启用的输出都没有时(显示器没接或没启用),连接时会自动接一块兜底屏,条件同上(niri、内核 ≥ 6.19、已启用 openuuyc-vkms.socket);不满足时照旧连不上,并报「本机没有可用的显示器,也无法自动添加兜底屏」和具体原因。兜底屏断线保留:有连接在时,别的屏接入并出帧后由连接回收;没有连接时,别的屏启用满 2 秒就收掉。进程退出时随辅助程序收回,退出过程中不会再新建。它和主控添加的虚拟屏一样占用辅助程序给每个用户的 4 条连接中的 1 条。
deb 与 Arch 安装包会在安装和升级时自动启用并启动 openuuyc-vkms.socket,无需手动启动服务。只让 systemd 监听请求,不会提前启动特权进程或创建虚拟屏;首次连接时才拉起 openuuyc vkms,空闲后退出。离线安装时先启用,待系统启动后监听。内核和合成器的支持条件仍然适用。
如果安装后诊断页仍提示 socket 未监听,可检查日志,并用以下命令修复:
sudo systemctl daemon-reload
sudo systemctl enable --now openuuyc-vkms.socket
从源码构建或手动安装时,只需把主程序 openuuyc 装到 /usr/bin/、两份系统单元装到 /usr/lib/systemd/system/,再手动启用 socket(仅手动安装需要):
cargo build --release --locked --bin openuuyc
sudo install -Dm755 target/release/openuuyc /usr/bin/openuuyc
sudo install -Dm644 package/linux/openuuyc-vkms.socket \
package/linux/openuuyc-vkms.service /usr/lib/systemd/system/
sudo systemctl daemon-reload && sudo systemctl enable --now openuuyc-vkms.socket
被控端输入权限(Wayland 必需)
Wayland 会话下键鼠经 /dev/uinput 注入。安装包会带上 udev 规则,重载后当前登录用户即可使用:
sudo udevadm control --reload-rules && sudo modprobe uinput
echo uinput | sudo tee /etc/modules-load.d/uinput.conf
规则使用 TAG+="uaccess",由 systemd-logind 给本机活动会话授权,不需要把用户加进 input 组,也不需要重新登录。从源码构建或手动安装时,把
package/linux/60-openuuyc-uinput.rules
放到 /etc/udev/rules.d/ 即可。没有权限时程序会记录一条警告并回退到 XTest(只影响 XWayland 客户端)。Xorg 会话不使用 uinput,无需这一步。
Wayland 下被控先用合成器自己的 wlroots screencopy(Sway、Hyprland、niri 等都提供),不需要门户,也不弹授权。合成器不提供或无法复制画面时(GNOME、KDE 等)改用 XDG 屏幕共享门户:
# GNOME / KDE
sudo pacman -S --needed xdg-desktop-portal-gnome # KDE 为 xdg-desktop-portal-kde
# wlroots 系合成器也走门户时(如 OPENUUYC_CAPTURE=portal):Hyprland 为 xdg-desktop-portal-hyprland,Sway 等为 xdg-desktop-portal-wlr
经门户采集时,首次被控会弹出一次共享授权,之后记在 ~/.local/openuuyc/screencast-restore-token。
本地数据与启动检查
用户配置、日志和缓存统一保存在 ~/.local/openuuyc/。启动时自动合并旧的
~/.local/share/OpenUUYC/、~/.local/share/openuuyc/、~/.local/OpenUUYC/
以及自定义 XDG_DATA_HOME 下的同名目录;新目录中的同名文件优先,冲突的旧文件保留原位,不覆盖或删除。
本机媒体能力在首次允许静默采集的启动中检查一次,结果保存为 ~/.local/openuuyc/check.toml,
其中 succeeded 表示是否成功,checked_at 记录检查时间,失败时 error 保存具体原因。
旧的 host-media-check.json 会自动转换为 TOML,转换成功后清理旧文件,不重复执行检查。
后续启动直接读取记录,不因重启或桌面会话变化重复预检,也不再显示媒体检查进度。
记录为失败时只写入日志,不在每次开机时弹窗;真正被控连接时仍会检查当前媒体能力。
需要门户授权的采集仍等实际连接时才请求授权。正常开机后台启动保持隐藏,包括 Wayland;
当次检测、显示器探测、登录恢复或后台服务启动失败时仍会弹窗,启动页面会显示原因。
需要重新执行启动预检时,退出程序并删除 check.toml 即可。
硬件编解码
- 解码:H.264 走 VA-API。AMD 用
mesa,Intel 用intel-media-driver,NVIDIA 用libva-nvidia-driver(Ubuntu 为nvidia-vaapi-driver;并设NVD_BACKEND=direct);libva 2.15 以前认不出 NVIDIA 显卡对应的驱动,程序会自行指定,无需设置LIBVA_DRIVER_NAME。 - 编码(被控):NVIDIA 用 NVENC;AMD 与 Intel 经 VA-API 编码 H.264(Intel 需
intel-media-driver或libva-intel-driver,AMD 用mesa),都不可用时回退软件编码。 - 老 Intel GPU / 虚拟机:Haswell/Broadwell 的 Vulkan 驱动未通过一致性认证,程序仍会使用它(设
WGPU_ALLOW_UNDERLYING_NONCOMPLIANT_ADAPTER=0恢复 wgpu 默认的隐藏行为);驱动无法向 Wayland surface 呈现时,可安装vulkan-swrast(lavapipe)并用OPENUUYC_BACKEND=gl或OPENUUYC_BACKEND=vulkan指定界面后端。
运行前提与开关
- 运行环境:登录态存在系统密钥环(Secret Service,由 KWallet、gnome-keyring 等提供,没有明文回退;启动时自动请求激活系统默认钱包,缺少默认集合时请求创建,锁定时由钱包弹出解锁提示;KDE 可使用 KWallet,无需额外安装 gnome-keyring 或手动启动钱包服务)。托盘用 StatusNotifierItem,GNOME 需要 AppIndicator 扩展(Ubuntu 默认启用),桌面没有托盘时关闭窗口即退出;面板比程序晚起来时每 2 秒重试,托盘一出现就改回关闭收进托盘。粘贴远端文件要
fuse3。Wayland 会话被控也要有 XWayland(显示器列表与输入注入器都先连 X 服务器);缩放(含分数缩放)的桌面上,门户共享的屏幕按合成器xdg-output布局里的输出名与所选显示器配对,需要 XWayland 23.1 及以上(输出以连接器命名)且程序能拿到WAYLAND_DISPLAY,配不上时报错,不会采错屏。拖出文件的预览图要gio与rsvg-convert。 - 开机自启:桌面接进
graphical-session.target时是 systemd 用户单元openuuyc.service(journalctl --user -u openuuyc看日志)。只维护这一份服务文件;旧版本app-openuuyc.service的自启状态会在程序启动时迁移到新名称。否则写~/.config/autostart/openuuyc.desktop。两者都不处理的合成器(无 uwsm 的 sway、Hyprland 等)请自行启动openuuyc gui --background。再次启动程序会经$XDG_RUNTIME_DIR/openuuyc/control.sock唤起已运行的控制中心。- 若
systemctl --user status openuuyc.service显示inactive (dead),日志却提示“已在运行”,说明这次后台启动没有取得实例锁,不能据此判断已有进程是否正常。先运行pgrep -a -x openuuyc、lslocks查看已有进程和锁持有者,再运行openuuyc尝试打开已有窗口。若要交给 systemd 管理,先从托盘退出已有实例,再执行systemctl --user start openuuyc.service;需要登录自启时另执行systemctl --user enable openuuyc.service。不要删除运行时目录里的.lock文件:文件存在不表示锁仍被占用,删除一个被持有的锁文件反而可能让两个实例同时运行。
- 若
- 协助邀请链接:安装包的
openuuyc.desktop登记了x-scheme-handler/uuremote,没有 Windows 那样的接管开关,可用xdg-mime default <程序>.desktop x-scheme-handler/uuremote改。便携运行时把链接作为唯一参数传给程序。 - 被控终端:默认关闭,在被控设置的访问权限里打开,打开时会确认一次;以 root 运行时不提供,本机也不能新建。shell 跑在 pty 上,断线后保留、重连可接回(重开同一会话即接管,旧连接不再收输出),接回时重画当前屏幕,不带回已滚出屏幕的输出;主控开的会话在退出或切换账号、关闭终端开关、禁止被控或在本机断开连接时结束,两端都没有附着 30 分钟后也会结束。设置页显示运行中的会话数,可一键结束全部。
- 远程终端页:侧边栏常驻,列出全部会话,可结束;也能在本机新建会话,或用系统终端接上任一会话(
$TERMINAL优先,再找常见的终端模拟器)。命令行是openuuyc terminal [编号或名字]、--list、--new [名字],控制中心没在跑时新建和接入会以gui --background把它拉起来。本机经$XDG_RUNTIME_DIR/openuuyc/terminal.sock接入,只有同一用户能连。本机与主控同时附着时输入输出同步,终端按两边较小的尺寸显示;关掉本地终端只断开这一端。本机开的会话不会因空闲被结束,shell 退出后从列表消失。 - 本机会话对主控的可见性:本机开的会话默认不对主控可见,主控看不到、也接不上。要让主控接入,在「终端」下再打开「允许主控接入本机终端会话」,打开时会再确认一次,关闭终端开关时它一并关闭。主控接入本机会话时访问通知会写明;关掉这一项后主控立即断开这些会话,shell 留给本机。
- 远程终端页:侧边栏常驻,列出全部会话,可结束;也能在本机新建会话,或用系统终端接上任一会话(
- 远程开机:配置网卡需要 root,程序内不提供,请用
sudo ethtool -s <网卡> wol g。远程关机与重启经 systemd-logind,受 polkit 约束。 - 更新:「关于」页的更新提醒指向上游的 Windows Release;Linux 版请从本 fork 的 Release 或 deb / AUR 包更新。下面的「命令行更新」只适用于 Windows。
- Gamescope:在 SteamOS 游戏模式中,将原生程序添加为非 Steam 游戏即可,无需指定兼容性工具。启动时处理显示连接与缩放,控制中心匹配当前屏幕尺寸;保留手动设置的缩放比例。登录凭据使用系统配置的 Secret Service,锁定时先请求解锁;KWallet 解锁窗口会关联到当前 Steam 应用。
- 手柄:Linux 主控通过系统 SDL2 2.0.6 及以上读取标准手柄(Arch 安装
sdl2-compat,Debian / Ubuntu 安装libsdl2-2.0-0),支持双摇杆、十字键、按钮和双扳机,震动回传还需要 SDL2 2.0.9 及以上版本和兼容手柄。SteamDeck 的 Steam Input 选择手柄布局(例如「支持视角控制的手柄」)。开启远控输入、将焦点留在播放窗口并松开已有按键后开始转发;失焦、操作本地菜单、拔出或断开连接时释放远端状态并停止震动。 - 环境变量:
OPENUUYC_CAPTURE指定采集后端顺序(如nvfbc、wlr、x11,portal);OPENUUYC_ZEROCOPY=1让 VA-API 解码画面以 dmabuf 直接交给渲染器(只在 Intel 上验证过);OPENUUYC_CAPTURE_DMABUF=1与OPENUUYC_GPU_CONVERT=1是门户采集的试验开关;OPENUUYC_BACKEND=gl|vulkan指定界面后端。
devtools/probes/ 里是验证 Linux 零拷贝与 GPU 颜色转换可行性的开发用探测程序(C 与一个独立的 Rust 小工程),不参与构建,用于在新驱动或新显卡上先确认 dmabuf 导出、Vulkan 导入和 VA-API 编码是否可用。
Arch / EndeavourOS 的构建依赖:
sudo pacman -S --needed base-devel rust cmake nasm clang pkgconf libva alsa-lib dbus \
libxkbcommon libxkbcommon-x11 wayland libx11 libxcb libxrandr libxi \
libxcursor libglvnd vulkan-icd-loader openssl fuse3 noto-fonts-cjk
打包为 deb(GitHub Actions 的 “Release for Linux” 工作流构建 x86_64 的 deb、Arch 安装包和单文件程序,并发布到本仓库 Release。版本统一使用 Cargo.toml 中的稳定版 主版本.次版本.修订号,例如 1.0.3、1.1.0;不再拆分 beta 版本号):
cargo install cargo-deb
cargo build --release --locked --bin openuuyc
cargo deb --no-build
sudo apt install ./target/debian/openuuyc_*.deb
安装后从应用菜单启动,或运行 openuuyc。
鸣谢
感谢以下团队、项目和贡献者为 OpenUUYC 提供的参考、技术基础与开发支持:
- 网易 UU 远程:本项目的协议兼容目标,也是远程连接功能与交互行为的参考。
- FFmpeg:视频编解码基础算法及硬件解码适配的重要来源。
- rav1d / dav1d:AV1 软件解码核心及 SIMD 实现。
- Cisco OpenH264:软件编码器的码率控制、屏幕变化检测与运动搜索等算法参考。
- WebRTC、WebRTC-rs 与 goog_cc:实时传输、音频接收处理与拥塞控制基础。
- Opus / SpeexDSP:音频编解码与重采样算法。
- egui / egui-wgpu / wgpu:图形界面与渲染基础。
- OpenAI:Codex 为本项目的开发提供 AI 编程辅助。
- sisi0318:提供两个 Codex x20 账号,支持本项目开发。
也感谢项目贡献者及提供测试反馈和改进建议的用户。
许可
OpenUUYC 非网易官方项目。源码公开,但项目整体未采用开源许可证,使用与分发条件见 LICENSE。
第三方及派生代码保留各自的许可,详见 NOTICES。