By Toradex秦海
1). 简介
在PC平台经远程桌面连接已经是非常方便了,而现在在嵌入式ARM平台,由于远程控制或者远程调试的需要,配置远程桌面的需求也越来越多,本文就着重演示基于嵌入式ARM平台实现远程桌面服务器端和客户端应用示例。
本文演示所使用的ARM平台来自Toradex基于NXP iMX6Q SoC平台的Apalis iMX6 ARM核心板。
2). 准备
a). Apalis iMX6Q ARM核心版配合Apalis Evaluation Board载板,连接调试串口UART1(载板X29)到开发主机方便调试。更多关于Apalis iMX6配合Apalis Evaluation Board载板的说明请参考Datasheet和开发上手指南。
b). Apalis iMX6Q 安装基于Toradex Linux BSP V2.8 并集成Qt opensource 5.9基本库的Embedded Linux,系统基于Ycoto Project/OpenEmbedded 编译环境进行编译,编译方法请参考这里,编译好的Linux Image安装方法请参考这里。
3). Apalis iMX6 WinCE 系统下远程桌面配置
a). Apalis iMX6 除了本文下面要演示的Embedded Linux系统,也支持WinCE系统,因此这里也将WinCE系统下远程桌面配置做简单罗列,但并不做相关测试演示。
b). Apalis iMX6 WinCE 作为远程桌面Client配置,通过CETSC 工具,使用RDP协议来登录基于Windows(RDP支持)的远程桌面服务器,详细请参考如下:
https://developer.toradex.cn/knowledge-base/remote-desktop-protocol-rdp-on-windows-ce
c). Apalis iMX6 WinCE 作为远程桌面Server配置,通过VNC Server 工具,使用VNC协议来供支持VNC协议的Client登录,详细请参考如下:
https://developer.toradex.cn/knowledge-base/VNC-Server-(WinCE)
4). Apalis iMX6 Embedded Linux 系统下远程桌面配置之Client端
a). 通过 FreeRDP 工具,使用RDP协议连接 RDP 远程桌面Server端(Windows 主机为主)
./ 安装 FreeRDP 软件,可以通过下面两种方法:
// 通过OE环境直接编译到Embedded Linux Image里面去
-----------------------
# add freerdp to build/conf/local.conf
IMAGE_INSTALL_append = " freerdp"
-----------------------
// 或者通过OE环境编译出对应的ipk安装包,然后在Apalis iMX6模块系统上面通过opkg命令来安装
-----------------------
# compile freerdp related ipk package in OE envirionment
$ bitbake freerdp
# cp below ipks to Apalis iMX6 and install
$ cd deploy/ipk/armv7at2hf-neon-mx6qdl
$ scp freerdp_1.0.0-7677-g62da9d2-r0_armv7at2hf-neon-mx6qdl.ipk libfreerdp1.2_1.0.0-7677-g62da9d2-r0_armv7at2hf-neon-mx6qdl.ipk root@ipaddress_aplis_imx6:/home/root/
$ opkg install libfreerdp1.2_1.0.0-7677-g62da9d2-r0_armv7at2hf-neon-mx6qdl.ipk
$ opkg install freerdp_1.0.0-7677-g62da9d2-r0_armv7at2hf-neon-mx6qdl.ipk
-----------------------
./ 通过下面示例命令连接RDP 远程桌面Server,更多配置选项可以通过执行 “xfreerdp --help” 来查看
-----------------------
$ xfreerdp /u:username /p:password /v:server ipadress or domain name
-----------------------
b). 通过 Tightvnc viewer工具,使用VNC协议连接 VNC 远程桌面Server端(Linux 主机为主)
./ 安装 Tightvnc软件,可以通过下面两种方法:
// 通过OE环境直接编译到Embedded Linux Image里面去
-----------------------
# add tightvnc to build/conf/local.conf
IMAGE_INSTALL_append = " tightvnc"
-----------------------
// 或者通过OE环境编译出对应的ipk安装包,然后在Apalis iMX6模块系统上面通过opkg命令来安装
-----------------------
# compile tightvnc related ipk package in OE envirionment
$ bitbake tightvnc
# cp below ipks to Apalis iMX6 and install
$ cd deploy/ipk/armv7at2hf-neon
$ scp libxaw6-6_1.0.13-r2_armv7at2hf-neon.ipk tightvnc-viewer_1.3.10-r2_armv7at2hf-neon.ipk root@ipaddress_aplis_imx6:/home/root/
$opkg install libxaw6-6_1.0.13-r2_armv7at2hf-neon.ipk
$ opkg install tightvnc-viewer_1.3.10-r2_armv7at2hf-neon.ipk
-----------------------
./ 通过下面示例命令连接VNC 远程桌面Server,更多配置选项可以通过执行 “vncviewer --help” 来查看
-----------------------
$ vncviewer vncserver_ipadress:
-----------------------
5). Apalis iMX6 Embedded Linux 系统下远程桌面配置之Server端
a). 通过 X11vnc工具,使用VNC协议提供基于X11桌面服务器的远程桌面Server端
./ 安装 X11vnc 软件,可以通过下面两种方法:
// 通过OE环境直接编译到Embedded Linux Image里面去
-----------------------
# add x11vnc to build/conf/local.conf
IMAGE_INSTALL_append = " x11vnc"
-----------------------
// 或者可以在Apalis iMX6模块系统上面通过opkg命令来在线安装
-----------------------
# on Apalis iMX6 Linux, make sure it has internet access
$ opkg update
$ opkg install x11vnc
-----------------------
./ 通过下面示例命令启动远程桌面Server,然后即可通过vncviewer client来进行连接
-----------------------
# on Apalis iMX6, startup vnc server
$ x11vnc -display :0
# on vnc client, use vncviewer to visit
$ vncviewer apalis_imx6_ipadress:0
-----------------------
b). 通过 Teamviewer Host工具,建立teamviewer远程桌面Server端
./ 由于teamviewer软件本身的特性,可以提供穿透局域网的远程桌面服务,而上述所列的软件默认都是只能在局域网内工作
./ 安装 Teamviewer Host软件
// 在Linux主机上面下载Teamviewer Host针对armv7架构的tar压缩包,解压并重新打包为tar.bz2压缩包以便于在Apalis iMX6系统上面解压
-----------------------
# on Linux host
$ wget https://download.teamviewer.com/download/linux/teamviewer-host_armhf.tar.xz
$ tar Jxf teamviewer-host_armhf.tar.xz
$ tar cjvf teamviewer-host_armhf.tar.bz2 teamviewer/
-----------------------
// 将teamviewer安装包上传到Apalis iMX6系统上进行解压并检查安装依赖环境,teamviewer需要Qt的一些基本库。
-----------------------
# on Apalis iMX6 Linux
$ tar xjvf teamviewer-host_armhf.tar.bz2
$ cd teamviewer
# run below command to check the dependency requirement
./tv-setup checklibs
…
-----------------------
// 由于本文这里编译的image绝大多数Qt库都已经有了,个别没有的可以通过OE环境单独编译出来ipk安装包,再在Apalis iMX6上面进行安装。通过上面打印信息看到缺少的是 libqt5x11extras5 依赖库,参考如下进行安装
-----------------------
# on OE envirionment
$ bitbake qtx11extras
# cp below ipks to Apalis iMX6 and install
$ cd deploy/ipk/armv7at2hf-neon
$ scp libqt5x11extras5_5.9.7+git0+34dcc9ea76-r0_armv7at2hf-neon.ipk root@ipaddress_aplis_imx6:/home/root/
$ opkg install libqt5x11extras5_5.9.7+git0+34dcc9ea76-r0_armv7at2hf-neon.ipk
-----------------------
// 检查依赖没有问题后,通过下面命令进行安装,安装过程中遇到提示都选择Yes。
-----------------------
$ ./tv-setup install
-----------------------
// 安装成功后,修改teamviewer开机自启动systemd服务文件 /etc/systemd/system/termviewerd.service 为如下内容
-----------------------
[Unit]
Description = TeamViewer remote control daemon
After = systemd-networkd-wait-online.service network.target network-online.target dbus-org.freedesktop.network1.service
Wants = dbus-org.freedesktop.network1.service network-online.target
Requires = dbus-org.freedesktop.network1.service
[Service]
Type = forking
PIDFile = /var/run/teamviewerd.pid
ExecStart = /opt/teamviewer/tv_bin/teamviewerd -d
Restart = on-abort
StartLimitInterval = 60
StartLimitBurst = 10
[Install]
WantedBy = multi-user.target
-----------------------
// 另外,我这里遇到了random pool 初始化延迟的问题导致teamviewer开机自启动timeout失败,可以通过安装下面ipk包解决
-----------------------
# random pool initiate will print below kernel message when finished
kernel: random: crng init done
# on OE environment, compile rng-tools ipk package
$ bitbake rng-tools
# cp below ipks to Apalis iMX6 and install
$ cd deploy/ipk/armv7at2hf-neon
$ scp rng-tools_5-r0_armv7at2hf-neon.ipk root@ipaddress_aplis_imx6:/home/root/
$ opkg install rng-tools_5-r0_armv7at2hf-neon.ipk
-----------------------
// 上述项目都配置完成后重启
./ 卡机后稍微等待一小段时间teamviewr服务即可自启动成功,这时候打开teamviewr界面根据提示的ID等信息,通过teamviewer client端进行连接访问
6). 总结
本文示例了基于ARM嵌入式平台进行远程桌面client和server配置的方法供参考。