问题描述
在 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