计算机系统应用  2021, Vol. 30 Issue (9): 98-103   PDF    
基于国产操作系统独立GUI应用研究
赵正旭1, 徐棚2, 张庆海1     
1. 青岛理工大学 机械与汽车工程学院, 青岛 266525;
2. 石家庄铁道大学 信息科学与技术学院, 石家庄 050043
摘要:国产Linux操作系统运行第三方GUI应用软件需要解决软件依赖库问题, 官方提供的依赖软件无法满足依赖库环境配置, 导致大量第三方GUI应用软件无法在国产操作系统中安装使用. 现提出一种利用容器技术把第三方GUI应用软件及其运行环境打包成独立应用软件的方案, 使第三方GUI应用软件能够在国产操作系统上运行. 以开源的分布式渲染系统Equalizer为目标对象, 使用docker容器技术将其编译环境和运行环境所需的依赖库打包成镜像, docker镜像在国产操作系统NeoKylin上创建容器时配置容器与主机共享Linux系统中的X11服务, 容器中Equalizer解析操作系统中X11文件, 在主机屏幕展示图形界面. 本文利用现有的docker技术制作独立镜像, 并配置容器与主机系统共享Linux系统图形界面服务和显卡驱动程序, 最终实现Equalizer程序在国产操作系统环境中正常使用. 实验结果表明, 该方案是可行的, 并可以推广到其他GUI应用软件.
关键词: Linux    国产操作系统    docker    X11    
Research on Application of Independent GUI Based on Domestic Operating System
ZHAO Zheng-Xu1, XU Peng2, ZHANG Qing-Hai1     
1. School of Mechanical & Automotive Engineering, Qingdao University of Technology, Qingdao 266525, China;
2. School of Information Science and Technology, Shijiazhuang Tiedao University, Shijiazhuang 050043, China
Foundation item: Natural Science Foundation of Hebei Province (F2018210058)
Abstract: The domestic Linux operating system running third-party GUI application software needs to solve the software dependency library problem. The official dependent software cannot meet the configuration of the dependent library environment, resulting in a large amount of third-party GUI application software that cannot be installed and used in the domestic operating system. A solution is proposed to package third-party GUI application software and its operating environment into independent application software with container technology, so that the third-party GUI application software can run on a domestic operating system. With the open source distributed rendering system, Equalizer, as the target object, the docker container technology is used to package the dependent libraries required for its compilation environment and running environment into a mirror. In the X11 service in the container, the Equalizer in the container parses the X11 file in the operating system and displays the graphical interface on the host screen. This study uses the existing docker technology to create an independent image and configures the container to share the graphical interface service and graphics card driver of Linux system with the host system and finally realizes the normal use of the Equalizer program in the domestic operating system. Experimental results show that the scheme is feasible and can be extended to other GUI application software.
Key words: Linux     domestic operating system     docker     X11    

基于Linux内核的国产操作系统发行版众多, 却没有一款操作系统完全取代微软桌面系统. 根本原因是国产操作系统的软件生态资源匮乏, 软件种类不全面, 数量不充足导致[1]. 为扩大国产操作系统的应用软件资源, 文献[1-3]介绍了在国产操作系统NeoKylin环境中部署第三方开源软件的传统方法. 但是由于Linux操作系统中开源软件依赖问题, 大部分开源软件无法通过传统的软件部署方法安装, 因此软件依赖问题是主要关注点.

开源软件依赖关系的问题来源于操作系统中的函数库文件. 函数库是为实现某种特定功能而编译好的代码或数据, 以文件的形式存在操作系统上, 是操作系统的重要组成部分. Windows或Linux操作系统中有着大量的函数库文件, 函数库被应用程序调用, 应用软件的运行要依赖很多函数库文件[4].

Windows作为商业系统其基础函数库相对固定, 第三方软件在此环境中开发, 部署过程中不会有问题. Linux系统库函数文件分为静态库和动态库. 静态库在软件开发过程中会被包含在生成的二进制文件中. 共享库在程序编译时指定, 程序运行时调用, 不被包含在软件的二进制文件中. 而且开源平台上的软件一般依赖第三方函数库开发, 从而形成软件依赖关系. 所以在国产操作系统中部署第三方软件时会出现找不到依赖函数库的问题[5].

随着容器技术的发展, docker容器技术能够解决软件依赖问题, 但其主要被用来运行字符界面程序. 针对GUI应用程序但不仅限于第三方GUI应用程序, 本文的主要工作是: (1)分析GUI应用程序并将其部署在docker镜像内; (2)配置docker容器与主机共享Linux系统图形界面服务, 并根据GUI应用程序对硬件资源的要求, 配置容器与主机共享显卡等驱动程序.

1 相关背景 1.1 国产操作系统

在众多国产操作系统中, 以具有代表性的NeoKylin(中标麒麟)操作系统为例, 基于Linux内核开发, 是2010年国家核高基项目重点扶持的基础软件之一. 当前该桌面系统最新版本为V7.0, 采用Linux 3.10内核. 针对x86和国产CPU平台自主开发, 打造具有安全可靠和自主可控等特性的国产操作系统. NeoKylin桌面版操作系统独特的界面设计使其操作简单方便, 系统内置满足日常办公的应用软件[6]. 但是官方提供的应用软件资源, 无法满足用户的日常需求. 在NeoKylin上安装其他Linux发行版的软件, 通常会因为软件依赖问题, 无法安装运行. 应用软件资源匮乏, 严重制约国产操作系统的发展.

1.2 容器技术

容器技术(Linux container)中的容器通常被理解为集装箱, 它把应用程序及程序运行的环境封装在容器内部, 实现应用程序在容器中运行[7]. 在容器的发展当中, docker容器发展较快其技术也相当成熟, 被视为容器的代表[8]. Docker容器支持应用打包功能, 把应用程序运行需要的依赖程序和库打包在镜像中, 应用程序就能够在docker容器中稳定的执行程序. 容器是docker运行镜像后产生的实体, 容器被创建后可以执行暂停和销毁等操作. 容器可看作宿主机上的进程, 某一个容器出现宕机问题不会影响其他容器的正常运行. 虽然容器之间相互隔离, 但是无论在同一台宿主机还是在不同宿主机上的容器可以通过IP地址或者link机制等其他方式实现容器之间的相互通信[9]. Docker运行架构如图1所示.

图 1 Docker容器架构

封装后的镜像可以放在任意docker的主机上运行, docker利用镜像创建容器从而使用容器里的应用程序, 而容器内部应用程序运行完全不依赖主机的运行环境. 封装后的镜像可以放在任意安装docker的主机上运行, docker利用镜像创建容器从而使用容器里的应用程序[10]. 所以对于应用程序, 使用容器技术部署应用软件比传统软件部署方式更有实际意义.

1.3 X11

X11是X协议的第11个版本, 也叫做X Window System, 是一种以位图显示的网络透明化窗口系统[11]. X11标准是开发可携性图形界面的工业软件标准, 它有一个重要的特性是与设备无关结构, 任何支持X11协议的硬件, 就能执行应用程序, 显示图形界面窗口, 这种特性使得根据X11标准开发的应用程序, 可运行在不同环境下(个人电脑、大型计算机)[12].

X11是Linux图形界面环境的基础, Linux本质是命令行操作系统, 而X11作为应用程序运行在Linux操作系统的应用层, 为操作系统提供图形界面显示服务. X11基于C/S架构如图2所示, 包括X server、X client和X protocol. X client是客户端是运行在Linux系统上的应用程序, X server是服务端, 运行在显示设备主机上, X protocol是客户端和服务端的通信协议.

图 2 X11架构

1.4 Equalizer

Equalizer一个成熟的并行渲染框架, 它提供了大量的特性、算法和系统集成广泛的现实世界研究和工业应用[13]. Equalizer提供编译运行方式的Linux系统有Ubuntu 16.04和RHEL 6.8[14], 要编译运行Equalizer需要安装大量的软件依赖库, NeoKylin虽然基于Linux操作系统, 但官方提供的软件完全不足以编译运行Equalizer. NeoKylin使用三方软件, 配置Equalizer编译运行环境, 需要进行复杂的工作, 第三方软件还可能与系统自带软件冲突导致系统崩溃. Equalizer作为渲染框架, 在NeoKylin操作系统需要Linux图形界面服务X11的支持, 对软件运行环境的稳定性要求较高, 并且需要使用GPU等硬件. 因此以Equalizer为目标对象, 进行独立GUI应用的实验论证.

2 系统整体方案 2.1 独立应用设计

Docker镜像是容器运行的实例, 镜像为容器提供文件系统资源. Docker镜像都是由基础镜像制作而成, 而基础镜像是一般都是Linux发行版的docker镜像, 例如Ubunut、Fedora等.

Linux操作系统由内核空间和用户空间组成. 内核空间是kernel, Linux操作系统启动时会加载bootfs文件系统, bootfs引导kernel加载完成后就被卸载掉. Rootfs是用户空间的文件系统, rootfs通常包含的是操作系统运行所需的文件系统如/dev、/proc、/bin等标准目录. 对于不同的Linux发行版, 其bootfs基本一致, rootfs不同.

Docker镜像采用分层的方式构建, 每一个镜像都是由一层一层union文件系统叠加组成. Docker的基础镜像的文件系统分为bootfs和rootfs两层, 最底端是引导文件系统bootfs, 在bootfs之上的一层是rootfs. Docker架构下, 沿用Linux中rootfs思想. 当docker daemon为docker容器挂载rootfs的时候, 与传统Linux内核类似, 将其设定为只读模式. 在rootfs挂载完毕后, 与Linux内核不同的是, docker daemon没有将docker容器的文件系统设为读写模式, 而是利用union mount的技术, 在这个只读的rootfs之上再挂载一个读写的文件系统, 挂载时该读写文件系统内空无一物. 可以把docker基础镜像创建容器的文件系统理解为: 只含只读的rootfs和可读写的文件系统.

容器与主机共享kernel, 拥有独立的rootfs, 包含一个操作系统所必须的库文件及软件管理工具, 在容器内部部署软件与主机系统环境无关. 因此docker容器能够解决软件依赖问题.

接下来就是制作镜像, 把软件及相关依赖程序打包在镜像内部制作成独立的软件镜像. Docker制作镜像的方法有两种: 手动制作和dockerfile制作. 一般情况下使用dockerfile制作镜像, 但是基础镜像只包含操作系统基本函数库文件, 软件需要的一些未知三方库无法通过管理工具安装, 只能根据错误提示查找, 所以先通过手动制作镜像, 再把制作镜像的过程写成dockerfile或者shell脚本实现自动制作镜像.

2.2 GUI显示设计

国产操作系统NeoKylin采用X11提供图形桌面环境, 其X server版本号为1.19.3, X server在应用层负责接收键盘和鼠标的输入. GUI应用程序作为X client, 包含X lib和X protocol. X lib是X client的C语言接口库, 封装了X protocol, 主要提供X protocol的存取能力. X server运行在连接显示屏的主机上, X server接收并处理来自X client的请求, 在屏幕上绘制图形.

在NeoKylin中, X11通过DISPLAY环境变量指定图形显示的屏幕窗口. DISPLAY的格式是[unix:端口]或[主机名:端口], 前者表示使用本地的unix套接字, 后者表示使用TCP套接字. X11服务端默认配置是服务端监听本地的[unix:0]端口, DISPLAY的默认值为0. 当系统运行GUI程序后, 程序会通过本地的Unix套接字与X server通信, 然后X server在当前主机屏幕绘制图形界面.

镜像内部打包的GUI应用程序, 在主机屏幕显示图形界面, 需要实现GUI应用程序透过容器的隔离机制与主机的X server通信. Docker提供了一种机制, 能够实现把主机上的某个目录与容器的某个目录(挂载点)关联起来, 容器内挂载点下的文件就是主机系统目录下的文件, 类似Linux操作系统下的mount机制. 通过挂载文件的方式, 使主机与容器共享Unix套接字, 实现容器内部的应用程序与X server通信.

2.3 系统整体架构

Docker基于基础镜像打包GUI软件制作独立的GUI应用软件镜像. 软件镜像创建容器, 该容器可以看作独立运行GUI应用程序. 实际上GUI应用程序是在docker容器内运行, 因为容器的隔离特性, GUI应用程序不能直接与主机上的X server通信. 主机上GUI程序都是通过套接字实现与X server互传信息, 所以利用docker文件挂载机制把主机上的套接字文件挂载到容器内部, 实现主机和容器共享套接字. 容器内部的第三方GUI应用程序作为X client, 通过套接字与主机的X server通信, X server把GUI应用程序的图形界面绘制在屏幕上. 最终实现GUI应用软件在国产操作系统环境中运行. 系统的整体架构如图3所示.

图 3 系统整体架构

3 系统实现 3.1 封装独立GUI应用

Equalizer是开源渲染框架, 在Github上公布的源码, 提供了Linux、Mac OS和Windows三种编译方式. 本文利用docker容器做封装工具, 选择Linux发行版Ubuntu16.04系统镜像, 把Equalizer编译并封装在镜像中. 独立的应用程序(应用程序和程序运行环境)占用计算机的存储空间, 在制作镜像时要选择占用存储空间较小的镜像. 独立的GUI应用程序制作步骤如下:

(1)以Ubuntu16.04的镜像为基础镜像, 使用docker创建容器. 在创建容器时注意通过在启动命令中添加--gpus all参数, 把配置好的Nvidia驱动共享给容器.

(2)进入容器命令行, 按照官方网站给出的Equalizer编译环境配置方法操作, 配置Equalizer的编译环境.

(3)下载Equalizer源代码, 执行编译命令.

(4)进入编译后的/bin文件夹执行示例, 验证结果.

(5) docker commit命令, 永久保存容器, 生成镜像, 方便下次使用.

Equalizer封装成镜像之后, 作为独立的GUI应用使用. 为方便使用, 镜像创建容器时调用容器内部shell脚本, 执行容器内部的应用程序.

3.2 解析X11协议

NeoKylin操作系统, 采用Xorg实现X11协议, Xorg提供X server服务, 当系统内有程序运行时, 程序会与X server通信, X server接收鼠标、键盘的输入和管理屏幕输出. Docker内部运行的程序要在屏幕上显示界面, 应用程序就必须要与X server通信.

基于国产操作系统上GUI应用程序的图形界面展示原理, 采用主机与容器共享X11的Unix套接字的方式, 实现X client的内容从容器内部传递到主机上的X server. 把主机上的套接字目录挂载到容器内部, 实现主机和容器共享Unix套接字.

主机上套接字文件在tmp文件夹中, 将其挂载到容器内部, -v /tmp/.X11-unix:/tmp/.X11-unix, 实现主机和容器共享套接字目录. 启动程序后, 底层封装的Xlib(C语言接口库)通过共享unix套接字, 传递信息给X server. X server代码运行, main函数进入一个循环. 每次循环都包含, 初始化、处理X client信息和退出. 最后X server根据X client发送的请求, 在主机显示器上绘制图形界面.

4 实验论证

本章节主要通过具体实验, 验证在国产操作系统环境中方案实施的可行性.

4.1 实验平台

实验平台的计算机软件和硬件配置信息如表1所示, 主要包括: CPU、内存、显卡、系统、内核和容器版本信息.

表 1 实验软硬件环境

4.2 实验环境配置

实验环境配置的软件包含: Nvidia显卡驱动、docker、Nvidia-container-toolkit工具包.

在NeoKylin系统上安装Linux版本的Nvidia驱动, 驱动要与显卡型号匹配, 否则会安装失败. 在安装之前, 禁用系统默认的驱动, 要把系统运行级别更改为文本模式. 使用chmod命令设置驱动程序可执行权限, 再进行安装.

NeoKylin操作系统上安装docker无法直接安装, 直接下载rpm包强制安装也无法运行, 因为官方源中没有提供安装docker的依赖包. 首先需要给NeoKylin操作系统换源, 更换centos7的源, 然后引入docker源, 直接yum下载安装. Linux系统下, 应用程序稳定运行的基础就是依赖库文件齐全. Yum安装docker组件docker-ce、docker-ce-cli、containerd.io时, 操作系统仅提示安装container-seLinux依赖和升级libseccomp依赖软件. 系统能安装的依赖软件是保存在文件夹的库文件对系统不会有影响, 重点关注升级的依赖. Libseccomp包为Linux内核的系统调用过滤机制提供了一个易于使用且独立于平台的接口, 根据软件向下兼容的特性, 使其版本的升级对系统无影响. 依赖库文件配置齐全, docker应用在NeoKylin系统中即可稳定运行.

Equalizer是一个渲染框架, 需要用到Nvidia显卡, 安装Nvidia-container-toolkit工具包, 使docker内部能够调用Nvidia驱动程序. 安装方法参考Nvidia-docker网站提供的安装说明[15], 网站并没有提供针对NeoKylin操作系统的工具包, 可使用CentOS7的工具包替代.

NeoKylin操作系统, Xhost命令是X server的访问控制工具. 在当前桌面显示docker容器内的GUI应用程序, 需要对X server设置, 允许docker内部的GUI程序在显示器上显示. 终端执行Xhost +, 授予每个用户访问X server的权限.

以上是整个实验环境的配置, 完成以上设置后, 使用docker制作Equalizer渲染框架的镜像.

4.3 制作并运行独立GUI应用

NeoKylin环境中制作GUI应用程序镜像并运行步骤是: (1)基于Ubuntu16.04镜像创建容器, 创建命令中配置挂载X11的Unix套接字, 并引入显卡驱动程序; (2)在容器内部安装部署Equalizer; (3)容器内运行Equalizer程序, 测试启动是否正常; (4)主机内执行命令, Equalizer镜像创建容器并自动运行Equalizer.

编写shell脚本, 自动配置以上操作. 主要包括以下4个脚本:

1)脚本Run.sh在主机上运行, 负责运行ubuntu16.04镜像创建容器, 主要内容如下(#后为注释):

-v /tmp/.X11-unix:/tmp/.X11-unix #设置主机与容器共享套接字

-gpus all #设置容器与主机共享显卡驱动

2)脚本Equalizer.sh在容器内部运行, 负责编译Equalizer源码, 主要内容如下:

apt-get install … #安装编译环境

git clone … #下载源码

ninja #编译

3)脚本Init.sh在容器内部运行, 负责启动Equalizer可执行文件, 主要内容如下:

cd /Equalizer/build/bin/#进入编译后的文件目录

./eqPly #执行可执行文件

4)脚本EqualizerRun.sh在主机上运行, 负责启动容器内部GUI程序, 主要内容如下:

-v /tmp/.X11-unix:/tmp/.X11-unix #设置主机与容器共享套接字

-v /Equalizer:/Equalizer#主机与容器共享文件夹

-e DISPLAY=unix$DISPLAY #设置主机显示屏

-gpus all #共享显卡驱动

Docker运行Equalizer框架镜像, 使用分布式渲染时, 容器和主机要设置IP和端口号, 因为分布式渲染是通过网络实现通信.

4.4 实验结果分析

在NeoKylin操作系统中直接配置Equalizer编译安装环境, 由于官方源提供的软件不足以配置Equalizer的编译环境, 所以下载相关依赖软件源码编译安装, 而该软件又依赖其他软件, 整个过程陷入一个循环之中. 在安装软件过程中, 因为第三方依赖软件问题多次导致系统无法启动, 未能成功安装编译.

Equalizer渲染框架源码大小100.9 MB. 在容器内配置编译环境需要安装的软件及相关依赖库共394个, 需要269 MB存储空间, 安装完成使用978 MB的额外磁盘空间. 源码编译完成后制作的镜像为2.82 GB, 导出镜像包为2.68 GB.

为测试容器内Equalizer程序的稳定性, 对其进行压力测试. 使用两个节点渲染, 增加渲染模型的大小比较模型加载时间和渲染的帧率. 实验数据如表2所示.

表 2 Equalizer渲染不同模型产生的数据

实验结果表明, 在NeoKylin环境中使用docker容器运行Equalizer渲染的模型越大, 加载时间越久, 帧率降低. 虽然总体渲染效率下降, 在该环境下Equalizer不仅能够对4.4 MB的小模型进行渲染, 而且能够渲染1.05 GB的大模型, 证明其具有稳定性, 也表明在国产操作系统NeoKylin环境中, 使用docker容器运行GUI应用程序的方案是可行的.

5 总结与展望

本文对国产操作系统环境中制作并运行独立GUI应用程序进行探索, 利用容器技术初步实现制作独立GUI应用程序在国产操作系统上运行. 结果表明在NeoKylin国产操作系统上, 使用docker容器技术, 可以实现第三方GUI应用程序独立运行. 文中方案给国产操作系统兼容第三方GUI应用程序提供新思路, 使用该方案可以增加国产操作系统的应用软件资源. 但方案中还有许多细节问题需要研究, 包括容器和主机共享文件的机制, 完善容器技术或可解决国产操作系统软件资源匮乏的问题, 有助于加快国产操作系统的发展.

参考文献
[1]
赵正旭, 陶智, 徐骞. 基于国产操作系统应用软件部署对策的探讨. 微型机与应用, 2016, 35(18): 16-18. DOI:10.19358/j.issn.1674-7720.2016.18.004
[2]
赵正旭, 白英杰, 吴晓进. 国产操作系统JSP服务器部署策略的设计与实现. 软件, 2018, 39(6): 196-200.
[3]
白英杰, 赵正旭, 吴晓进, 等. 国产操作系统PHP服务部署策略的设计与实现. 计算机应用与软件, 2019, 36(1): 17-21. DOI:10.3969/j.issn.1000-386x.2019.01.004
[4]
赵广涛. 开源平台依赖关系解决方案的研究与实现[硕士学位论文]. 开封: 河南大学, 2012.
[5]
王静. 基于软件网络模型的开源操作系统复杂性及演化分析技术研究[博士学位论文]. 长沙: 国防科技大学, 2019.
[6]
赵正旭. 麒麟操作系统使用与推广. 北京: 科学出版社, 2014. 1–8.
[7]
Madhumathi R. The relevance of container monitoring towards container intelligence. Proceedings of 2018 9th International Conference on Computing, Communication and Networking Technologies. Bengaluru, India. 2018. 1–5.
[8]
郎丰凯. 基于云计算的容器技术概述. 中国新通信, 2019, 21(21): 123-124.
[9]
陈伟, 叶宏杰, 周家宏, 等. 基于领域知识的Docker镜像自动构建方法. 大数据, 2021, 7(1): 64-75.
[10]
房锦章, 武延军. 基于Docker技术的GUI应用的在线迁移研究. 计算机系统应用, 2016, 25(10): 246-251. DOI:10.15888/j.cnki.csa.005351
[11]
胡皓. X Window实务应用. 北京: 人民邮电出版社, 2000. 27–33.
[12]
江帆, 贺也平, 周启明. SurfaceFlinger在X Window系统环境下的运行方案. 计算机系统应用, 2017, 26(10): 95-101. DOI:10.15888/j.cnki.csa.006012
[13]
Eilemann S, Steiner D, Pajarola R. Equalizer 2.0—Convergence of a parallel rendering framework.. IEEE Transactions on Visualization and Computer Graphics, 2020, 26(2): 1292-1307. DOI:10.1109/TVCG.2018.2870822
[14]
Eyescale/Equalizer. Equalizer. https://github.com/Eyescale/Equalizer. (2019-11-14).
[15]
Nvidia. Nvidia-docker. https://nvidia.github.io/nvidia-docker. (2019-09-16).