背景
本人使用 Ubuntu Server 22.04 服务器,所以没有图形界面,而 QNX Software Center 需要图形界面。为了保证服务器环境的整理,计划使用Docker部署QNX Software Center 一瓶安装图形界面。本方既是实现方案的记录。
资源
- Dockerfile,Docker 创建脚本;
- start-vnc.sh,VNC 启动脚本;
- qnx-setup-2.0.4-202501021438-linux.run, qnx 安装包(官网下载 [链接])
方案
处理一、跳过qnx安装时提示
qnx安装时,大致有三个询问的交互接口:
[press q to scroll to the bottom of this agreement]
,输入q
并回车,跳至用户协议底部;Please type y to accept, n otherwise:
,输入y
并回车,同意用户协议;Specify installation path (default: /home/gaoyang3513/qnx):
,输入/opt/qnx
,安装至 /opt/qnx 目录下;
参考 qnx 安装的help信息,跳过交互并修改安装目录为/opt/qnx
的命令如下:
qnx-setup-2.0.4-202501021438-linux.run --quiet --noexec --nox11 --target /opt/qnx
处理二、支持图形显示与交互
当前 Ubuntu Server 宿主机无图形界面,参考AI工具给到的建议:选用 Xvfb 虚拟显示 + VNC 客户端 的方式支持用户连接并操作。其中 Xvfb(X Virtual Framebuffer) 是一个在内存中运行的虚拟 X11 服务器,它本身不提供可视化的图形界面,但可以运行需要图形环境的应用程序。将 Xvfb 的虚拟显示内容通过 VNC 暴露给用户。
-
安装 Xvfb 和 VNC 服务器:
sudo apt-get install xvfb x11vnc
-
启动 Xvfb 并绑定 VNC 服务:
# 启动 Xvfb(显示号 99) Xvfb :99 -screen 0 1280x1024x24 & # 启动 VNC 服务器,绑定到 Xvfb 的显示号 x11vnc -display :99 -forever -shared -nopw &
-
通过 VNC 客户端连接:
- 使用 VNC 客户端(如 TigerVNC、RealVNC)连接到服务器的
5900
端口。 - 此时可以看到 Xvfb 的虚拟显示界面,并操作其中的应用程序。
- 使用 VNC 客户端(如 TigerVNC、RealVNC)连接到服务器的
展示
启动Docker
# 构建Docker
docker build -t qnx-vnc .
# 启动Docker
docker run -it -v ${HOME}:${HOME} -v /opt/qnx:/opt/qnx -w ${PWD} -p 5901:5901 --privileged --name Ubuntu22_QNX qnx-vnc
安装 SDP8
附件
-
Dockerfile
# 基于 Ubuntu 22.04 FROM ubuntu:22.04 # 安装基础工具和依赖(新增 tini 进程管理器) RUN apt-get update && apt-get install -y \ vim \ wget \ xvfb \ fluxbox \ x11vnc \ xterm \ libgtk-3-0 \ libnss3 \ libx11-xcb1 \ libxtst6 \ libasound2 \ expect \ dbus-x11 \ gnome-session-bin \ libswt-gtk-4-jni \ sudo # 复制安装包和脚本 COPY qnx-setup-2.0.4-202501021438-linux.run /tmp RUN chmod +x /tmp/qnx-setup-2.0.4-202501021438-linux.run # 创建非 root 用户 RUN useradd -m -s /bin/bash gaoyang3513 && \ echo "gaoyang3513 ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers # 配置启动脚本 COPY start-vnc.sh /start-vnc.sh RUN chmod +x /start-vnc.sh # 设置环境变量 ENV DISPLAY=:1 \ VNC_PORT=5901 \ RESOLUTION=1280x1024x24 # 切换为非 root 用户 USER gaoyang3513 # 启动命令 CMD ["/start-vnc.sh"]
-
start-vnc.sh
#!/bin/bash # 清理残留文件 rm -rf /tmp/.X11-unix/X${DISPLAY#:} /tmp/.X*-lock # 启动 Xvfb 并启用 RANDR 和 DPMS 扩展 Xvfb $DISPLAY -screen 0 $RESOLUTION +extension RANDR +extension DPMS & XVFB_PID=$! # 等待 Xvfb 初始化 for i in {1..10}; do if xdpyinfo -display $DISPLAY >/dev/null 2>&1; then break; fi sleep 1 done # 检查 Xvfb 是否支持 DPMS if ! xdpyinfo -display $DISPLAY | grep -q DPMS; then echo "[WARN] Xvfb 未启用 DPMS 扩展,部分功能可能受限" fi # 启动 Fluxbox 和 x11vnc fluxbox & x11vnc -display $DISPLAY -forever -shared -rfbport $VNC_PORT -bg -nopw & # 运行自动化安装 if [ ! -e /opt/qnx/qnxsoftwarecenter/qnxsoftwarecenter ]; then sudo /tmp/qnx-setup-2.0.4-202501021438-linux.run --quiet --noexec --nox11 --target /opt/qnx fi # 启动 QNX exec /opt/qnx/qnxsoftwarecenter/qnxsoftwarecenter