基于树莓派编译RustDesk aarch64(arm64)

引言

前两天一直在折腾远程远程访问树莓派的事情,之前也曾了解过RustDesk这个基于Rust的明星开源项目,就想能不能在树莓派上使用。遗憾的是,目前官方或者AUR还没有提供aarch64架构的安装包,只好手动编译,中间遇到了一些坑,简单记录一下编译过程。

基本步骤

编译的基本步骤在官方文档已经说得比较清楚,大致可以分为以下几步:

graph LR;
	配置环境 --> 安装依赖 --> 手动调整 --> 编译

前提说明

由于RustDesk还在活跃开发中,代码随时可能变动。并且目前处在UI切换的阶段。所以编译的细节可能会有所不同。

我在体验过程中就遇到了代码版本、SDK版本等不同造成的困惑,因此特意说明以下使用的代码版本:

配置环境

  1. 使用rustup安装Rust工具链

    1
    2
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    source $HOME/.cargo/env
  2. 安装并配置vcpkg

    1
    2
    3
    4
    yay -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

安装依赖

  1. 使用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
  2. 使用vcpkg安装的依赖

    1
    vcpkg/vcpkg install libvpx opus
  3. 手动安装libyuv

    vcpkg安装libyuv时发生错误,可能是由于NEON支持造成的,具体参见:

    https://github.com/microsoft/vcpkg/issues/27410

    • 解决办法1——修改patch文件:

    • 解决办法2——直接手动编译:

      1
      2
      3
      4
      5
      6
      7
      git clone https://chromium.googlesource.com/libyuv/libyuv/

      cd libyuv

      make -f linux.mk

      sudo cp libyuv.a $VCPKG_ROOT/installed/arm64-linux
  4. 手动添加libsciter-gtk.so

  5. # 注意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
2
cd rustdesk
./target/build/rustdesk

运行结果如图所示

image-20230118095519134

很遗憾,虽然可以顺利编译,但是界面是一片白板。可能的原因包括:

  • UI没有正确加载,如果不是从RustDesk的项目根目录运行,则无法找到UI的资源文件夹;
  • 没有连接显示器,我使用的是远程桌面登录没有连接显示器的树莓派,而RustDesk采用的是屏幕分享的机制,要求连接显示器或者虚拟显示器
  • 其他未知原因,GitHub上有多人反映在不同系统下出现过这一问题。

由于RustDesk的后台使用的是Rust,但是UI部分并不是。我简单替换掉了UI的index.html,发现可以正常运行并显示:

image-20230118105117485

说明

  • 如果出现Segment error,可能是由于使用的libsciter-gtk.so版本不匹配造成的。

SSH使用RustDesk

假设一个场景:远程有桌面环境和SSH,但是没有人在远程计算机旁边,那么如果能使用ssh连接远程计算机后启动RustDesk并获取连接的ID和密码,就能使用远程桌面了。

为此,对RustDesk的源代码做了简单的修改,在运行日志中输出ID和密码:

image-20230118105747050

在本地计算机进行连接测试,由于RustDesk需要显示器,我们就让它使用远程的桌面环境来作为共享的显示器,具体步骤如下:

  • 首先获得xorg显示器的序号:

    1
    ps axu | grep Xorg

    image-20230118112151343

    可知,序号为:10

    此外,查看/tmp/.X11-unix/也可以看到显示的编号

  • 设置DISPLAY变量

    1
    export DISPLAY=:10
  • 运行RustDesk

    1
    2
    cd rustdesk
    ./target/build/rustdesk

结果如下图所示

image-20230118110900866

Bingo!

考虑到最终的运行结果并不完美,而且RustDesk正在开发新的UI,所以没有继续进行打包等工作。

体验总结

相对RDP而言,RustDesk的使用还是麻烦了一些,当然这是由于其底层原理造成的,并不是软件开发的问题。如果是偶尔用一下还是挺好的,但是如果是长期使用,感觉还是使用VPN+RDP来得更舒服一些。

  1. 核心功能远程桌面的效果不错;
  2. 代码还在活跃开发中,手动编译相对麻烦;
  3. 不连接远程桌面时资源占用较少,建立连接后占用的资源还是比较高的(对于树莓派,相对RDP而言);
  4. 官方的文档不是很详细,资料还相对较少;
  5. 从v2ex以及GitHub等的讨论来看,我对开发团队在开源、商业化以及招聘等问题上的一些做法持保留态度;
  6. 最后,毕竟是国人主导的Rust开源项目,希望能越做越好。

参考资料

  1. https://rustdesk.com/docs/en/dev/build/linux/
  2. https://github.com/rustdesk/rustdesk/issues/853
  3. https://github.com/rustdesk/rustdesk/issues/125
  4. https://unix.stackexchange.com/questions/543287/what-are-xorg-display-numbers