系统及硬件

银河麒麟系统5.4.18-77.66GF版
CPU:FTD2000
内存:16G

问题

该系统一般会离线使用,存在如下限制:

系统及架构限制

离线条件下很难部署完整的镜像源,同时银河麒麟系统与Ubuntu等系统存在较大区别,特别时aarch64架构下,其生态完善性还不足;

MoganStem尚无适配

MoganStem是基于Texmacs开发的一款所见即所得的科研学术编辑软件的社区版,在一定程度上可以替代LaTex进行学术文本的编写,此外,还可以嵌入python、Gnuplot、maxima等插件进行绘图和程序等。在易用性上具有较大优势。个人认为,在国产化条件下,该软件应当可以发挥较大替代作用,提前推广可获得先发优势,有助于改变当前国产平台科研软件支撑不足的现状。但是目前,开发者尚未对国产平台进行适配。

难点

主要难点在于国产平台性能偏弱,且开发环境与主流开发环境特别是需要多个开源项目协同下的联网环境开发条件普遍不具备。对于一款以商业化为目的的软件而言,很多事不是不能做,而是不好做。
国产平台主要的问题在于:默认支持的Qt只到Qt5,而Mogan需Qt6支持。同时,还有很多依赖问题不好解决。

解决方法

通过docker构建基于arm架构的ubuntu系统镜像,在该镜像基础上编译构建arm架构的MoganStem,尽量减少对银河麒麟系统本身环境的依赖,同时获得通用系统环境支持。并通过挂载和UI映射,实现docker容器运行GUI应用程序。

Dockerfile

# 使用 aarch64 兼容的基础镜像(Ubuntu 22.04)
FROM ubuntu:22.04

# 设置非交互式安装
ENV DEBIAN_FRONTEND=noninteractive

# =============================
# 0. 先安装 ca-certificates 和 gnupg,否则无法验证 HTTPS 证书和 GPG 签名
# =============================
RUN apt-get update && \
    apt-get install -y --no-install-recommends ca-certificates gnupg && \
    rm -rf /var/lib/apt/lists/*

# =============================
# 1. 替换 Ubuntu apt 源为清华源(兼容 aarch64/ports.ubuntu.com)
# =============================
RUN sed -i 's|http://[a-z0-9\.]*\.ubuntu\.com|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list && \
    sed -i 's|http://[a-z0-9\.]*\.ports\.ubuntu\.com|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list && \
    sed -i 's|http://security\.ubuntu\.com|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list
# =============================
#  安装 xmake
# =============================
RUN useradd -m -s /bin/bash mogan && \
    echo 'mogan:mogan123' | chpasswd && \
    usermod -aG sudo mogan
WORKDIR /home/mogan
RUN apt-get update && \
    apt-get install -y git make build-essential sudo emacs vim \
    libfontconfig1-dev \
    qt6-base-dev libqt6svg6-dev qt6-image-formats-plugins \
    libcurl4-openssl-dev \
    libfreetype-dev \
    libgit2-dev \
    zlib1g-dev \
    libssl-dev \
    libjpeg-turbo8-dev \
    ninja-build \
    cmake \
    mupdf \
    curl \
    wget \
    gnuplot \
    aglfn gnuplot-data gnuplot-x11 liblua5.3-0 libwxbase3.0-0v5 libwxgtk3.0-gtk3-0v5 maxima-share tex-common \
    gnuplot-doc  maxima-doc xmaxima maxima-emacs wish debhelper \
    fonts-wqy-microhei \
    fonts-wqy-zenhei && \
    rm -rf /var/lib/apt/lists/*
USER mogan

RUN git clone --recursive https://gitee.com/tboox/xmake.git && \
    cd ./xmake && \
    ./configure && \
    make -j4 && \
    ./scripts/get.sh __local__ __install_only__

RUN echo "source ~/.xmake/profile" >> ~/.bashrc && \
    tail ~/.bashrc
# 确保/bin/sh 能够找到,而不是bash。只有bash能够使用~/.bashrc
ENV PATH="/home/mogan/.local/bin":${PATH}

# =============================
# 编译mogan stem, 网络不好,提前下载几个安装包到Dockerfile同级目录
# 以备xmake查找使用,跳过下载过程
# =============================
RUN git clone https://gitee.com/XmacsLabs/mogan.git
COPY cmake-4.0.3-linux-aarch64.tar.gz /home/mogan/mogan/cmake-4.0.3-linux-aarch64.tar.gz
COPY 1.12.0.tar.gz /home/mogan/mogan/1.12.0.tar.gz
COPY mupdf-1.25.1-source.tar.gz /home/mogan/mogan/mupdf-1.25.1-source.tar.gz

RUN cd mogan && \
    xmake build -y stem

# ============================
# 设置依赖env
# ============================
ENV TEXMACS_PATH=/home/mogan/mogan/TeXmacs
ENV PATH=/home/mogan/mogan/build/linux/arm64/release/:$PATH

ENV DISPLAY=:0

构建docker

docker build -f Dockerfile-mogan-release -t mogan_release:ubuntu22.04 .

运行docker

#docker run -itd -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY --name test-mogan-release mogan_release:ubuntu22.04
xhost +local:root  #  赋予权限
#docker exec -it test-mogan-release /bin/bash
# run xmake run stem can display gui
# to avoid Personality failure 1 when calling maxima, see https://blog.gitcode.com/43550a5dc904b8861fa9f459e157b549.html
# --security-opt seccomp=unconfined 主要是为了解决运行moganstem时,启动maxima回话失败,提示“Personality failure 1”错误的问题
docker run -it --env DISPLAY=$DISPLAY  --volume /tmp/.X11-unix:/tmp/.X11-unix:rw -u root --security-opt seccomp=unconfined mogan_release:ubuntu22.04 /bin/bash

启动应用

# 已经在dockerfile中设置了环境变量和依赖的TEXMACS_PATH
moganstem

离线部署

在离线环境下安装docker.io, 通过docker save 命令保存并导出镜像; 刻录保存镜像到光盘,导入目标计算机。通过docker load命令导入后可正常使用。

TODO

本质上,在有源代码情况下,主要解决的是依赖问题。本文采用了一种取巧的方法,在本机编译的话,如果相关依赖都具备,理论上可以直接编译。
同时,docker如何使用数据持久化方法,即程序与数据分离,数据保存在本地,尚未测试。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐