NXP iMX8MM ARM 平台 Weston RDP 远程桌面部署测试
By Toradex秦海
1). 简介
嵌入式平台开发部署过程中为了方便需要远程桌面连接到设备以便于直接在 PC 上面操控设备,本文就基于NXP i.MX8M Mini ARM SoC 平台,通过 Weston Compositor 的 RDP 组件来测试远程桌面功能。
本文所演示的平台来自于 Toradex Verdin i.MX8MM 嵌入式平台。
2. 准备
a). Verdin i.MX8MM ARM核心版配合Dahlia 载板,并连接调试串口用于测试。
b). Dahlia 载板通过 DSI-HDMI 转接卡连接 HDMI 显示器。
3). 通过 Yocto 环境编译部署 RDP 相关支持
a). 首先参考这里说明创建 Yocto/Openembedded 编译框架,当前最新版本是对应于 Toradex Yocto Linux BSP 7.x 版本的 scarthgap-7.x.y branch。
b). 创建定制化 layer meta-customer-demos。
---------------------------------------
$ mkdir -p ../oe_core/layers/meta-customer-demos/conf
$ cd .../oe_core/layers/meta-customer-demos/conf
### create layer.conf file ###
# We have a conf and classes directory, append to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "customer-demos"
BBFILE_PATTERN_customer-demos = "^${LAYERDIR}/"
BBFILE_PRIORITY_customer-demos = "24"
# Let us add layer-specific bbappends which are only applied when that
# layer is included in our configuration
BBFILES += "${@' '.join('${LAYERDIR}/%s/recipes*/*/*.bbappend' % layer \
for layer in BBFILE_COLLECTIONS.split())}"
# Add layer-specific bb files too
BBFILES += "${@' '.join('${LAYERDIR}/%s/recipes*/*/*.bb' % layer \
for layer in BBFILE_COLLECTIONS.split())}"
LAYERDEPENDS_customer-demos = " \
core \
yocto \
openembedded-layer gnome-layer multimedia-layer networking-layer \
"
LAYERSERIES_COMPAT_customer-demos = "hardknott honister kirkstone scarthgap"
---------------------------------------
c). 在定制化 layer meta-customer-demos 下面添加 Weston bbappend 文件以增加 RDP 支持。
---------------------------------------
$ cd .../oe_core/layers/meta-customer-demos/
$ mkdir recipes-graphics/wayland/
$ cd recipes-graphics/wayland
### cteate weston_%.bbappend file ###
# enable weston rdp backend
PACKAGECONFIG:append = " rdp"
# add TLS keys when rdp enabled
RRECOMMENDS:${PN}:append = " ${@bb.utils.contains('PACKAGECONFIG', ' rdp', ' weston-rdp-keys', '', d)} "
---------------------------------------
d). 在上述同样 wayland 目录下增加 weston-init.bbappend 来修改默认的 weston.ini 配置文件以便使能 RDP / Screen share。
---------------------------------------
$ cd .../oe_core/layers/meta-customer-demos/recipes-graphics/wayland
### cteate weston-init.bbappend file ###
o_install:append() {
# add screen share modules
sed -i '/#enable-overlay-view/ a modules=screen-share.so' ${D}${sysconfdir}/xdg/weston/weston.ini
# add rdp backend support
sed -i '/^command/s/$/ --rdp-tls-key=\/etc\/xdg\/weston\/weston-rdp-tls.key --rdp-tls-cert=\/etc\/xdg\/weston\/weston-rdp-tls.crt --force-no-compression/' ${D}${sysconfdir}/xdg/weston/weston.ini
# auto start screen share
sed -i 's/^#start-on-startup=true/start-on-startup=true/' ${D}${sysconfdir}/xdg/weston/weston.ini
}
---------------------------------------
e). 在开发 Ubuntu 主机使用下面命令生成 RDP 服务需要的 TLS keys 相关文件。
---------------------------------------
$ winpr-makecert -rdp -path <work_dir>
$ cd weston-rdp-cert/ && ls
weston-rdp-tls.crt weston-rdp-tls.key
---------------------------------------
f). 在上述同样 wayland 目录下增加 TLS keys 相关bb file 和上述步骤生成的具体 key 文件用于编译时候部署。
---------------------------------------
$ cd .../oe_core/layers/meta-customer-demos/recipes-graphics/wayland
### cteate weston-rdp-keys_1.0.bb file ###
SUMMARY = "Weston RDP TLS keys"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
# generated with winpr-makecert tool
SRC_URI = " \
file://weston-rdp-tls.crt \
file://weston-rdp-tls.key \
"
S = "${WORKDIR}"
do_install() {
# create floder
install -d ${D}${sysconfdir}/xdg/weston
# install key files
install -m0644 ${WORKDIR}/weston-rdp-tls.crt ${D}${sysconfdir}/xdg/weston/
install -m0600 ${WORKDIR}/weston-rdp-tls.key ${D}${sysconfdir}/xdg/weston/
}
FILES:${PN} = "${sysconfdir}/xdg/weston/weston-rdp-tls.crt ${sysconfdir}/xdg/weston/weston-rdp-tls.key"
---------------------------------------
然后将生成的 keys 文件也部署好
---------------------------------------
$ mkdir weston-rdp-keys
$ cd weston-rdp-keys/ && ls
weston-rdp-tls.crt weston-rdp-tls.key
---------------------------------------
g). 最终完整 meta-customer-demos layer 文件结构如下:
meta-customer-demos
├── conf
│ └── layer.conf
├── recipes-graphics
│ └── wayland
│ ├── weston_%.bbappend
│ ├── weston-init.bbappend
│ ├── weston-rdp-keys
│ │ ├── weston-rdp-tls.crt
│ │ └── weston-rdp-tls.key
│ └── weston-rdp-keys_1.0.bb
h). 修改 bblayers.conf 和 local.conf 文件
-------------------------------
### modify bblayer.conf ###
--- a/build/conf/bblayers.conf
+++ b/build/conf/bblayers.conf
@@ -34,7 +34,7 @@
${TOPDIR}/../layers/meta-openembedded/meta-python \
${TOPDIR}/../layers/meta-freescale-distro \
${TOPDIR}/../layers/meta-toradex-demos \
+ ${TOPDIR}/../layers/meta-customer-demos \
\
\
${TOPDIR}/../layers/meta-toradex-distro \
### add below to local.conf ###
# add Freescale EULA
ACCEPT_FSL_EULA = "1"
-------------------------------
i). 编译 Yocto Linux image。
-------------------------------
### compile Reference-Multimedia image ###
$ MACHINE="verdin-imx8mm" bitbake tdx-reference-multimedia-image
-------------------------------
j). Yocto Linux image部署。
参考这里通过Toradex Easy installer将上面编译好的image更新部署到模块
4). 部署测试
a). 模块启动后,首先通过下面命令将开机自动运行的 Qt Cinema 示例应用停止。
-------------------------------
$ systemctl stop wayland-app-launch
$ systemctl disable wayland-app-launch
-------------------------------
b). 确认 weston.ini 的修改以及新部署的 keys 文件正确。
-------------------------------
root@verdin-imx8mm-07276322:~# ls /etc/xdg/weston/
weston-rdp-tls.crt weston-rdp-tls.key weston.ini
### /etc/xdg/weston/weston.ini ###
[core]
use-g2d=true
repaint-window=16
idle-time=0
xwayland=true
#enable-overlay-view=1
modules=screen-share.so
...
[screen-share]
command=/usr/bin/weston --backend=rdp-backend.so --shell=fullscreen-shell.so --no-clients-resize --rdp-tls-key=/etc/xdg/weston/weston-rdp-tls.key --rdp-tls-cert=/etc/xdg/weston/weston-rdp-tls.crt --force-no-compression
start-on-startup=true
-------------------------------
c). 连接的 HDMI 屏幕已经正常显示 Weston desktop 桌面,同时可以通过如下命令查看 RDP 服务是否启动成功。
-------------------------------
root@verdin-imx8mm-07276322:~# netstat -tuln | grep 3389
tcp 0 0 0.0.0.0:3389 0.0.0.0:* LISTEN
-------------------------------
d). 在同一局域网内的 PC 主机上面通过核心板的 IP 地址使用 RDP Client 应用连接,本文使用 Windows 自带的远程桌面连接工具测试连接。
5). Headless 模式 RDP 连接测试
a). 由于上述测试中, weston 默认使用 drm-backend 来输出显示,然后通过 screen-share module 来共享到 RDP 输出,因此需要设备实际连接物理显示器,当设备是 Headless 时候,RDP 服务无法启动成功。如果在 Headless 下需要 RDP 连接,就需要修改相关配置文件,让 weston 直接使用 rdp-backend 来输出显示。
b). 如下修改 /etc/xdg/weston/weston.ini 来关闭之前配置的 screen share :
-------------------------------
--- a/etc/xdg/weston/weston.ini
+++ b/etc/xdg/weston/weston.ini
@@ -4,7 +4,7 @@
idle-time=0
xwayland=true
#enable-overlay-view=1
-modules=screen-share.so
+#modules=screen-share.so
[shell]
@@ -28,5 +28,5 @@
#transform=rotate-90
[screen-share]
-command=/usr/bin/weston --backend=rdp-backend.so --shell=fullscreen-shell.so --no-clients-r
esize --rdp-tls-key=/etc/xdg/weston/weston-rdp-tls.key --rdp-tls-cert=/etc/xdg/weston/weston
-rdp-tls.crt --force-no-compression
-start-on-startup=true
+#command=/usr/bin/weston --backend=rdp-backend.so --shell=fullscreen-shell.so --no-clients-
resize --rdp-tls-key=/etc/xdg/weston/weston-rdp-tls.key --rdp-tls-cert=/etc/xdg/weston/westo
n-rdp-tls.crt --force-no-compression
+#start-on-startup=true
-------------------------------
c). 如下修改 /lib/system/systemd/weston.service 文件来配置 weston 直接输出到 drm-backend :
-------------------------------
--- a/lib/systemd/system/weston.service
+++ b/lib/systemd/system/weston.service
@@ -36,7 +36,10 @@
EnvironmentFile=/etc/default/weston
ExecStartPre=-/usr/bin/udevadm wait --timeout=30 /dev/dri/card0
ExecStartPre=-/usr/bin/sh -c "ls /dev/dri/by-path/*gpu* &> /dev/null && /usr/bin/udevadm wa
it --timeout=30 /dev/dri/card1"
-ExecStart=/usr/bin/weston --modules=systemd-notify.so
+ExecStart=/usr/bin/weston --backend=rdp-backend.so --shell=desktop-shell.so \
+--no-clients-resize --rdp-tls-key=/etc/xdg/weston/weston-rdp-tls.key \
+--rdp-tls-cert=/etc/xdg/weston/weston-rdp-tls.crt \
+--width=1920 --height=1080 --modules=systemd-notify.so
# Optional watchdog setup
#TimeoutStartSec=60
-------------------------------
d). 重启设备后,此时无论是否连接 HDMI 显示器(如果连接了,显示器也只会显示 console 信息),RDP 服务都可以正常使能,并通过 RDP client 连接到 weston 桌面。
6). 总结
本文基于 NXP i.MX8MM 处理器平台测试了 RDP 远程桌面功能,不过请注意远程桌面功能由于安全性以及显示质量会受到影响,通常只用于开发测试阶段,不建议在量产设备上面开通这个功能。