基于树莓派编译RustDesk aarch64(arm64)
引言
前两天一直在折腾远程远程访问树莓派的事情,之前也曾了解过RustDesk这个基于Rust的明星开源项目,就想能不能在树莓派上使用。遗憾的是,目前官方或者AUR还没有提供aarch64架构的安装包,只好手动编译,中间遇到了一些坑,简单记录一下编译过程。
基本步骤
编译的基本步骤在官方文档已经说得比较清楚,大致可以分为以下几步:
graph LR; 配置环境 --> 安装依赖 --> 手动调整 --> 编译
前提说明
由于RustDesk还在活跃开发中,代码随时可能变动。并且目前处在UI切换的阶段。所以编译的细节可能会有所不同。
我在体验过程中就遇到了代码版本、SDK版本等不同造成的困惑,因此特意说明以下使用的代码版本:
-
源代码:
https://github.com/rustdesk/rustdesk/tree/b466bb013f4e3094ad9253b348004e7d850f65e0
-
md5值:51adbf3b7558b1eae83cf86800a0b9d0
配置环境
-
使用
rustup
安装Rust工具链1
2curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env -
安装并配置
vcpkg
1
2
3
4yay -S vcpkg
针对aarch64,配置系统全局变量
https://stackoverflow.com/questions/64455340/vcpkg-force-system-binaries-errors-when-running-vcpkg-on-raspberry-pi
echo "export VCPKG_FORCE_SYSTEM_BINARIES=1" >> /etc/profile
安装依赖
-
使用
pacman
安装的依赖(部分是vcpkg安装需要的依赖)1
sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire
-
使用
vcpkg
安装的依赖1
vcpkg/vcpkg install libvpx opus
-
手动安装
libyuv
vcpkg
安装libyuv
时发生错误,可能是由于NEON支持造成的,具体参见:https://github.com/microsoft/vcpkg/issues/27410
-
解决办法1——修改patch文件:
-
使用以下内容替换
$VCPKG_ROOT/ports/libyuv/fix_cmakelists.patch
文件:https://gist.github.com/slimsag/a213374a5ef44194175aa6ae9ae55c5f
-
重新安装:
1
vcpkg install libyuv
-
-
解决办法2——直接手动编译:
1
2
3
4
5
6
7git clone https://chromium.googlesource.com/libyuv/libyuv/
cd libyuv
make -f linux.mk
sudo cp libyuv.a $VCPKG_ROOT/installed/arm64-linux
-
-
手动添加
libsciter-gtk.so
-
注意libsciter-gtk.so的版本 wget -c https://gitlab.com/sciter-engine/sciter-js-sdk/-/raw/5caf429a1578d541f6dadc787f8014d1c2ebe71a/bin/linux/arm64/libsciter-gtk.so?inline=false -O libsciter-gtk.so 根据是Release还是Debug,移动到rustdesk源码编译的相应文件夹 mv $RUSTDESK_SOURCE_ROOT/target/debug
1
2
3
4
5
6
7
8
9
10
# 编译运行
## 基本测试
编译命令:
```shell
cd rustdesk
cargo build
先通过远程桌面进入到树莓派的桌面环境,然后运行:
1 | cd rustdesk |
运行结果如图所示
很遗憾,虽然可以顺利编译,但是界面是一片白板。可能的原因包括:
- UI没有正确加载,如果不是从
RustDesk
的项目根目录运行,则无法找到UI的资源文件夹; - 没有连接显示器,我使用的是远程桌面登录没有连接显示器的树莓派,而RustDesk采用的是屏幕分享的机制,要求连接显示器或者虚拟显示器
- 其他未知原因,GitHub上有多人反映在不同系统下出现过这一问题。
由于RustDesk的后台使用的是Rust,但是UI部分并不是。我简单替换掉了UI的index.html
,发现可以正常运行并显示:
说明:
- 如果出现Segment error,可能是由于使用的
libsciter-gtk.so
版本不匹配造成的。
SSH使用RustDesk
假设一个场景:远程有桌面环境和SSH,但是没有人在远程计算机旁边,那么如果能使用ssh连接远程计算机后启动RustDesk并获取连接的ID和密码,就能使用远程桌面了。
为此,对RustDesk的源代码做了简单的修改,在运行日志中输出ID和密码:
在本地计算机进行连接测试,由于RustDesk需要显示器,我们就让它使用远程的桌面环境来作为共享的显示器,具体步骤如下:
-
首先获得xorg显示器的序号:
1
ps axu | grep Xorg
可知,序号为
:10
此外,查看
/tmp/.X11-unix/
也可以看到显示的编号 -
设置DISPLAY变量
1
export DISPLAY=:10
-
运行RustDesk
1
2cd rustdesk
./target/build/rustdesk
结果如下图所示
Bingo!
考虑到最终的运行结果并不完美,而且RustDesk正在开发新的UI,所以没有继续进行打包等工作。
体验总结
相对RDP而言,RustDesk的使用还是麻烦了一些,当然这是由于其底层原理造成的,并不是软件开发的问题。如果是偶尔用一下还是挺好的,但是如果是长期使用,感觉还是使用VPN+RDP来得更舒服一些。
- 核心功能远程桌面的效果不错;
- 代码还在活跃开发中,手动编译相对麻烦;
- 不连接远程桌面时资源占用较少,建立连接后占用的资源还是比较高的(对于树莓派,相对RDP而言);
- 官方的文档不是很详细,资料还相对较少;
- 从v2ex以及GitHub等的讨论来看,我对开发团队在开源、商业化以及招聘等问题上的一些做法持保留态度;
- 最后,毕竟是国人主导的Rust开源项目,希望能越做越好。