「Linux」- 安装向日葵远程控制(Ubuntu、Debian、CentOS)

问题描述

在 Debian 10 中,我们尝试安装 SunloginClient-10.1.1.38139_amd64.deb 应用,但是安装失败(原因是 libwebkitgtk-3.0-0 无法满足)。

想要安装 SunloginClient-10.1.1.38139_amd64.deb 需要 Ubuntu 18.04(或者 Deepin、CentOS 系统)

该笔记将记录:在 Debian 10 中,通过 Ubuntu 18.04 Docker Image 来运行 Sunlogin(向日葵)软件。以后,我们将补充其他发行版的安装方法。

补充说明

# 01/15/2021 我们尝试在 Debian 10 中直接安装 SunloginClient-10.1.1.38139_amd64.deb 包,但是安装失败,并破坏系统的依赖关系。因此,我们只能通过 Docker 创建 Ubuntu 18.04 容器(libwebkitgtk-3.0-0 属于 Ubuntu Bionic 因此使用 Ubuntu 18.04 镜像),来运行向日葵客户端。

# 01/26/2021 我们发现,在控制台中(登录官方站点,进入控制台)可以直接发起设备的远程控制,无需专门安装客户端(可能客户端体验更好)。

# 01/27/2021 我们又想到了其他几个方案:修改 deb 安装包;或者在虚拟机中运行,然后通过 SSH -X 转发到宿主机运行;

# 03/22/2021 今天我们在 Ubuntu 20.04 LTS 中安装该应用,虽然出现 sunloginclient: no process found 提示(看起来像错误),但是整体还是能够正常运行的。

解决方案

Sunloginclient 11.0.0.36662 on Ubuntu 20.04

# 第一步、访问官网下载 deb 安装包
# https://down.oray.com/sunlogin/linux/sunloginclient-11.0.0.36662-amd64.deb

# 第二步、安装 Sunloginclient 应用
dpkg -i sunloginclient-11.0.0.36662-amd64.deb

# 第三步、启动 Sunloginclient 应用
/usr/local/sunlogin/bin/sunloginclient

方案一、通过 Docker 运行(存在问题)

实验步骤(TL;DR)

下面是我们实验过程中的步骤记录:

# 第一步、启动 Ubuntu 18.04 镜像,需要内置 systemd 服务的镜像(因为 SunloginClient 需要,否则安装失败)
docker run -d --name dvm-ubuntu-18.04 \
    --net=host --env="DISPLAY" \
    --privileged \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    -v $(printenv XAUTHORITY):/root/.Xauthority:rw \
    jrei/systemd-ubuntu:18.04

# 第二步、安装依赖(容器内执行)
docker container exec -it dvm-ubuntu-18.04 /bin/bash
apt-get update && apt-get install -y \
    bash-completion wget curl rsync \
    xterm x11-apps libwebkitgtk-3.0-0 gdm3

# 第三步、安装 SunloginClient-10.1.1.38139_amd64.deb 应用(容器内执行)
wget -P /tmp https://down.oray.com/sunlogin/linux/SunloginClient-10.1.1.38139_amd64.deb
dpkg -i /tmp/SunloginClient-10.1.1.38139_amd64.deb

# 第四步、启动 sunloginclient 程序
/usr/local/sunlogin/bin/sunloginclient # 在容器内执行
docker container exec -it dvm-ubuntu-18.04 /usr/local/sunlogin/bin/sunloginclient # 或者在容器外执行

就这样,我们成功的在容器中运行向日葵远程客户端:

如果需要创建 .desktop 文件,应该取消 -t -i 选项:

[Desktop Entry]
Icon=/usr/local/share/icons/d3rm/sunloginclient-128x128.png
Name=SUNLOGIN CLIENT
Exec=docker container exec dvm-ubuntu-18.04 /usr/local/sunlogin/bin/sunloginclient
StartupWMClass=sunloginclient
StartupNotify=false
Terminal=false
Type=Application
Categories=Network;RemoteControl;

改进方案(存在问题)

基于前面的步骤之后,我们可以编写 Dockerfile 构建出可以运行的 Docker 镜像:

FROM jrei/systemd-ubuntu:18.04

RUN apt-get update && apt-get install -y \
    bash-completion wget curl rsync \
    xterm x11-apps libwebkitgtk-3.0-0 gdm3

RUN wget -P /tmp https://down.oray.com/sunlogin/linux/SunloginClient-10.1.1.38139_amd64.deb \
        && dpkg -i /tmp/SunloginClient-10.1.1.38139_amd64.deb

但是失败了,因为 SunloginClient-10.1.1.38139_amd64.deb 的安装需要 systemd 处于运行状态,而 systemd 的运行需要挂载 sysfs,但是这无法在 docker build 中完成(即目前(01/26/2021)无法在构建过程中挂在宿主机文件系统,也可能是我们不知道)。

注意事项

我们无法接收远程连接请求
在这里的 Docker 提供运行环境,“等同于”将客户端运行在本机,但是(经过测试)无法接受远程连接请求。(我们的推断)因为我们仅仅映射 Xauthority 文件,只能够 与 XOrg 通信,完成显示渲染等工作,而无法获取桌面信息。
虽然无法接受远程连接请求,但是这也是我们期望中的样子,我们不需要接收远程连接,只希望能够远程其他设备。

导致当前桌面重启(未解决)
当重新启动容器时,会导致宿主机桌面重启。可能是在启动容器时,会操作 X Server(通过 Xauthority 文件),两者冲突。
但是我们没有找到解决方案,最后我们依旧无法使用才方案。

方案二、修改 deb 安装包

集中修改 postinst、prerm 等等脚本,因为他们仅支持 ubuntu deepin kylin 三个版本,然后重新打包。

相关方法参考 package management – Easily unpack DEB, edit postinst, and repack DEB 问题。

方案三、使用 KVM 虚拟机(已采用)

1)在 KVM 中,安装 Ubuntu 18.04 AMD64 系统,
2)然后,通过 ssh -X 进行转发:ssh -X -i ~/.ssh/id_rsa root@ubuntu-18 /usr/local/sunlogin/bin/sunloginclient

参考文献

Running GUI apps with Docker | Fabio Rehm’s Blog
Running GUI Applications inside Docker Containers | by Saravanan Sundaramoorthy | Medium
Ubuntu Releases