Jetson Nano平台编译安装Xpra

我采用 X持久化远程应用Xpra 来实现远程运行X window程序,可以非常平滑融合到本地操作系统平台。Jetson Nano平台是ARM平台,我也尝试采用该方案来运行图形程序。

备注

Xpra官方只支持i686和x86_64,不过已知Xpra也可以工作在ARM和其他CPU架构。Xpra官方文档引用了 XPRA - installation on Orange PI Plus 2E ,提供了在ARM平台编译Xpra的指南。

编译

  • 安装基本依赖:

    apt-get install libx11-dev libxtst-dev libxcomposite-dev libxdamage-dev \
        libxkbfile-dev python-all-dev
    
  • 对于GTK3的服务器和GUI客户端:

    apt-get install libgtk-3-dev python3-dev python3-cairo-dev python-gi-dev cython3
    
  • 并且需要安装一些X11工具:

    apt-get install xauth x11-xkb-utils
    

解码器

  • 要支持视频(x264和vpx)需要安装:

    apt-get install libx264-dev libvpx-dev yasm
    
  • 这个在ARM版本Ubuntu中没有找到:要使用nvenc(NVIDIA的SDK)需要安装:

    apt-get install libnvidia-encode1
    
  • 基于ffmpeg视频编码:

    apt-get install libavformat-dev libavcodec-dev libswscale-dev
    
  • jpeg支持:

    apt-get install libturbojpeg-dev
    
  • webp支持:

    apt-get install libwebp-dev
    

可选安装

  • 对html5客户端支持:

    apt-get install uglifyjs brotli libjs-jquery libjs-jquery-ui gnome-backgrounds
    
  • opengl and rendering:

    apt-get install python3-opengl python3-numpy python3-pil
    
  • network bits(没有找到python3-lzo):

    apt-get install python3-rencode python3-lz4 python3-dbus python3-cryptography \
        python3-netifaces python3-yaml python3-lzo
    
  • 杂项支持(没有找到python3-pycuda):

    apt-get install python3-setproctitle python3-xdg python3-pyinotify python3-opencv python3-pycuda
    

报错:

Package python3-pycuda is not available, but is referred to by another package

pycuda 是 Python wrapper for Nvidia CUDA ,可以通过 pip install pycuda 安装。这个软件包 python3-pycudapycuda 安装源( contrib archive area )中提供,我查看了Jetson Nano的Ubuntu 18.04安装源 sources.list没有找到contrib,所以是按照 Jetson Nano安装pycuda 方法通过 pip 安装 pycuda

备注

参考 Setting up PyCUDA on Ubuntu 18.04 for GPU programming with Python

但我感觉后续需要解决通过发行版软件包安装 pyton3-pycuda ,以便保持随发行版持续更新。待后续实践。

  • 安装X11杂项支持:

    apt-get install libpam-dev quilt xserver-xorg-dev xutils-dev xserver-xorg-video-dummy xvfb keyboard-configuration
    
  • 认证模块:

    apt-get install python-kerberos python-gssapi
    
  • avahi发现支持(我在运行时发现最好能够提供avahi支持,等下次实践再尝试):

    apt-get install python-avahi
    
  • 声音支持:

    apt-get install gstreamer1.0-pulseaudio gstreamer1.0-alsa \
        gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
        gstreamer1.0-plugins-ugly python-gst-1.0
    
  • 打印支持:

    apt-get install cups-filters cups-common cups-pdf python3-cups
    
  • ssh支持:

    apt-get install openssh-client sshpass python3-paramiko
    

补充安装

  • 编译手册中没有提到,但是Jetson Nano使用的L4T操作系统需要安装:

    apt-get install dh-systemd libsystemd-dev
    

打包

  • 安装deb打包工具:

    apt-get install devscripts build-essential lintian debhelper
    
  • https://www.xpra.org/src/ 下载最新源代码:

    wget https://www.xpra.org/src/xpra-4.0.4.tar.xz
    

也可以从svn源代码获取:

svn co https://xpra.org/svn/Xpra/
  • 从svc源代码编译可以制作deb包:

    cd trunk/src/
    ln -sf ../debian .
    debuild -us -uc -b
    

备注

我采用trunk代码编译安装deb软件包,遇到报错和解决方法见下文。完成后在源代码 trunk 目录下有两个deb包:

xpra_4.1-1_arm64.deb
xpra-html5_4.1-1_arm64.deb

安装:

# 需要依赖 python3-brotli ,补充安装
sudo apt install python3-brotli
# 然后安装软件包
sudo dpkg -i xpra_4.1-1_arm64.deb

如果要提供html5访问,再安装一个html5包:

sudo dpkg -i xpra-html5_4.1-1_arm64.deb
  • 从release编译:

    ./setup.py install
    

上述安装到全局,如果本地安装则使用命令:

./setup.py install --home=install

svn代码编译报错处理

  • 执行 debuild -us -uc -b 报错:

    dpkg-checkbuilddeps: error: Unmet build dependencies: brotli libjs-jquery libjs-jquery-ui gnome-backgrounds dh-systemd libsystemd-dev
    

原因是需要 html5 client支持和systemd支持:

apt-get install uglifyjs brotli libjs-jquery libjs-jquery-ui gnome-backgrounds
apt-get install dh-systemd libsystemd-dev
  • 出现有关cuda报错:

    dh_install: Cannot find (any matches for) "usr/share/xpra/cuda/*" (tried in ., debian/tmp)
    
    dh_install: xpra missing files: usr/share/xpra/cuda/*
    dh_install: missing files, aborting
    debian/rules:14: recipe for target 'binary' failed
    make: *** [binary] Error 25
    dpkg-buildpackage: error: fakeroot debian/rules binary subprocess returned exit status 2
    debuild: fatal error at line 1152:
    dpkg-buildpackage -rfakeroot -us -uc -ui -b failed
    

我是采用 JetPack SDK 完成CUDA安装。按照编译手册,我也采用 Jetson Nano安装pycuda 方式通过 pip 安装 pycuda (没有找到 python3-pycuda ) ,但是依然存在上述报错。

这个问题在 Package patched xpra to support WM_CLASS #296 提到一种ugly的解决方法,是将 debian/xpra.install 中的 usr/share/xpra/cuda/* 删除掉。这显然是削弱了软件包的功能。

备注

由于我暂时没有时间详细排查cuda报错,暂时采用上述方式完成编译安装。后续使用CUDA开发时再排查进一步解决。

备注

世界之大,科技之广,实在超乎想象。无意中因为编译Xpra,发现了一个集成了Xpra实现安全网络操作系统的 Subgraph OS ,这是在 xrdp远程桌面 之外,可以比拟微软终端服务的Linux解决方案,而且产品化且开源。

在Jetson Nano中使用Xpra

使用方法借鉴 X持久化远程应用Xpra 主要步骤如下:

  • 在Jetson Nano服务器端执行以下命令启动Xpra服务:

    systemctl start xpra
    

如果没有安装html5组件,则启动日志中会提示:

'/usr/share/xpra/www' does not exist

但对常规客户端不影响使用。此外,如果服务器端没有安装 avahi (Apple公司主推的网络资源发现服务,方便找到服务器),则提示:

Warning: failed to load the mdns publisher
 No module named 'avahi'
 either install the 'python-avahi' module
 or use the 'mdns=no' option

所以,我还补充安装:

sudo apt install python-avahi

然后重新启动xpra,但是我发现上述报错还是存在。我感觉应该在下次编译软件包之前先安装,以提供编译支持。

  • Jetson Nano服务器上启动应用程序:

    xpra start --start=/usr/bin/chromium-browser --bind-tcp=127.0.0.1:1100
    
  • 客户端配置 ~/.ssh/config 添加:

    Host jetson-chrome
        HostName 192.168.6.10
        User huatai
        LocalForward 1100 127.0.0.1:1100
    
  • 客户端执行ssh端口转发命令:

    ssh -C jetson-chrome
    
  • 之后就可以使用xpra客户端访问本地tcp端口1100,连接后就是访问服务器上chromium浏览器了

依次类推,可以在Jetson上运行开发程序,无论何时何地,只要有网络连接,就可以访问应用开发系统,进行开发。

参考