龙芯lacf-utils1.0 用户手册
1. 龙芯LACF概述
龙芯LACF框架主要目标是尝试解决linux系统桌面应用程序二进制兼容问题。
Linux操作系统版本林立,系统软件包数量达到数万之多,各操作系统厂商不同发行版本之间、同操作系统厂商不同发行版本之间,操作系统包含的软件包版本各不相同,相同软件前后版本的兼容性、各软件包之间的兼容性问题相互交织,应用的构建和运行往往只能与特定操作系统发行版本组合绑定,操作系统更换或升级极易导致应用因依赖软件包不满足、底层API环境兼容性变化等原因,发生应用崩溃、拒绝运行、甚至无法安装的情况。LACF框架的目标是在所有同架构linux操作系统平台实现应用软件的兼容,开发者仅需一次开发,便可在所有同架构linux操作系统平台上安装部署运行;使用者仅需简单操作便能完成已有二进制包的迁移。
2. 龙芯LACF框架组成
LACF框架包含lmg包、lmg包仓库、自研容器、制作器、管理器、运行器、部署程序等7个部分,如图1.1 LACF框架所示。
图2.1 LACF框架
lacf-utils软件包是LACF框架在操作系统上的部署程序。目前lacf-utils处于闭源状态,对外只提供二进制程序。
3. 部署lacf-utils
- 适用范围
lacf-utils适用于所有loongarch64架构的linux桌面操作系统,包括但不限于龙芯loongnix等操作系统。
- 安装依赖
lacf-utils安装程序自依赖,为单独的一个安装包。它的安装、运行不依赖任何额外的软件包。
- 安装下载
lacf-utils当前基于Loongnix20系统提供下载,当前版本为1.0-1.lnd.1。
如安装体验,请先下载Loongnix-20.5系统,在龙芯电脑上安装后,进入系统执行以下命令即可:
sudo apt update && sudo apt install lacf-utils -y
4. lmg包概述
lmg是linux image package的缩写,是LACF应用打包格式的后缀名称。类似于debian系统的软件包的.deb后缀、centos系统软件包的.rpm后缀。 本章节主要描述龙芯LACF应用兼容框架下lmg源码包、二进制包的定义、类型。
4.1. lmg源码包
lmg源码包是用于构建lmg二进制包的原始素材的集合,它之所以被称为源码包是相对于lmg二进制包而言的,它不一定包含源码。通过lmgcraft命令可以将lmg源码包转化为lmg二进制包。
lmg的源码包后缀名为.src.lmg。类似于rpm包管理系统中的.src.rpm源码包后缀,包含用于构建lmg二进制包的素材和元数据信息。通过lmg包制作器工具lmgcraft可以将这些用于构建lmg二进制包的原始素材打包为src.lmg源码包。
lmg源码包有三种类型,分别是运行时源码包,应用软件源码包,运行时升级源码包。
运行时源码包
运行时源码包是用于构建运行时二进制包的原始素材的集合,这些原始素材清单如图4.1所示,在配置文件lmgcraft.yaml中使用BASERUNTIME标识源码包的类型。系统容器镜像的制作方法将在6.1节中介绍。
图4.1 运行时源码包
- 应用软件源码包
应用软件源码包是用于构建应用软件二进制包的原始素材的集合。这些原始素材的清单如图4.2所示,在配置文件lmgcraft.yaml中使用APPLICATIONS标识源码包的类型。
图4.2应用软件源码包
- 运行时升级源码包
运行时升级源码包是用于构建运行时升级二进制包的原始素材的集合。这些原始素材的清单如图4.3所示,在配置文件lmgcraft.yaml中使用UPBASERUNTIME标识源码包的类型。升级层tar包的制作方法将在6.5节中介绍。
图4.3运行时升级源码包
4.2. lmg二进制包
lmg二进制包,是指由.src.lmg源码包构建出来的,可在目标系统上直接运行的lmg软件包。
lmg二进制包后缀名为.lmg。类似rpm包管理系统中的.rpm二进制包后缀。.src.lmg源码包可通过lmgcraft构建为.lmg二进制包,然后通过lpkg -i xxx.lmg命令将lmg二进制包安装到系统中,类似于使用rpm -i xxx.rpm命令将rpm二进制包安装到系统中。
对应lmg源码包三种源码包类型,lmg二进制包也有三种类型,分别用BASERUNTIME、APPLICATIONS、UPBASERUNTIME进行标识。
- 运行时二进制包
运行时二进制包是用于安装系统级容器镜像的lmg二进制包,它同时被应用软件二进制包和运行时升级二进制包依赖,在元数据文件中使用BASERUNTIME标识。
- 应用软件二进制包
应用软件二进制包是用于安装应用程序的lmg二进制包,它依赖运行时二进制包,如果发现运行时二进制包未安装,则安装失败。在元数据文件中使用APPLICATIONS标识。
- 运行时升级二进制包
运行时升级二进制包是用于安装系统容器镜像的二进制修复补丁的lmg二进制包。它依赖运行时二进制包,如果发现需要修复的运行时二进制包未安装,则安装失败。在元数据文件中使用UPBASERUNTIME标识。
5. lmgcraft打包工具
lmgcraft是龙芯LACF应用兼容框架的制作器,打包工具,核心功能是制作.src.lmg源码包、.lmg二进制包。
5.1. lmgcraft工具
主要功能如图5.1 lmgcraft命令功能所示:
图5.1 lmgcraft命令功能
6. 如何制作lmg的源码包
本章节主要讲述lmg源码包的制作过程,以及制作过程中需要注意的地方。
lmg源码包是用于构建lmg二进制包的原始素材的集合,它之所以被称为源码包是相对于lmg二进制包而言的,它不一定包含源码。通过lmgcraft命令可以将lmg源码包转化为lmg二进制包。
例如,我们希望某厂商上的bino软件包能在Loongnix20系统上也能运行,那么我们可以将此厂商上的bino_1.6.6-3_loongarch64.deb文件封装成一个.src.lmg文件,然后再通过lmgcraft构建成.lmg的二进制文件,从而实现在Loongnix系统上运行;封装成.src.lmg的lmg源码文件中并未包含源码,实际素材是一个二进制文件包。
制作.src.lmg源码包之前,须首先具备两个条件,首先要制作一个基础系统容器镜像,其次制作用于制作lmg二进制包时进行签名的私钥证书和用于安装lmg二进制时进行包认证的公钥证书。制作lmg二进制包的目的是验证lmg源码包中的内容能够制作出正确的lmg二进制包。
6.1. 制作基础系统容器镜像
基础系统容器镜像是为应用程序的构建和运行提供底层依赖环境的系统容器镜像。获取目标系统容器镜像的方法如下所示。
使用wget命令将镜像的tar文件下载到本地。
如果您需要某厂商1的系统镜像,请下载文件uos20_1_10_brl.tar。
wget ftp://xxx:/tmp/lmg/baseruntime/loong64/uos20_1_10_brl.tar
如果您需要某厂商2的系统镜像,请下载文件kylin_1_6_brl.tar。
wget ftp://xxx:/tmp/lmg/baseruntime/loong64/kylin_1_6_brl.tar
6.2. 制作用于包签名的私钥证书和用于包认证的公钥证书
使用openssl工具制作包签名证书,命令如下:
openssl genpkey -algorithm RSA -out private.pem
openssl rsa -pubout -in private.pem -out publib.pem
6.3. 制作运行时源码包
以某厂商1的系统为例,已有基础系统容器镜像uos20_1_10_brl.tar的情况下,制作运行时源码包有三个步骤,步骤如下:
1) 创建工作目录
# mkdir workspace && cd workspace
将uos20_1_10_brl.tar,拷贝到工作目录中。
2) 在工作目录中创建文件lmgcraft.yaml
# touch lmgcraft.yaml
在lmgcraft.yaml文件中添加内容如下:
# cat lmgcraft.yaml
base: uos20\_1\_10:brl
description: "lmg app"
lmgtype: BASERUNTIME
3) 运行时源码包素材验证
本步骤,基于构建运行时源码包的素材,操作生成二进制包,并进行安装验证,以此来确认构建运行时源码包的素材无误。
使用命令lmgcraft pack --prikey /root/private.pem生成运行时二进制包。文件/root/private.pem来自6.2节中生成的私钥证书。将6.2节中生成的公钥证书也拷贝到目录/var/lib/lpkg/certs中。如图6.1 生成lmg运行时包。
图6.1 生成lmg运行时包
如图6.2安装lmg运行时包,并查看是否安装成功。
图6.2 安装lmg运行时包
4) 根据上一步骤确认无误的素材,执行命令lmgcraft packsrc生成源码包
如图6.3清理文件,执行lmgcraft distclean命令清理构建二进制lmg过程中产生的文件。
图6.3 清理文件
执行lmgcraft packsrc命令,如图6.4生成运行时源码包。
图6.4 生成运行时源码包
6.4. 制作应用程序源码包
应用程序源码包包含两类:分别是桌面类应用程序源码包和服务类应用程序源码包。
桌面类应用程序是指在计算机桌面上运行的图形界面应用程序,这些程序使用图形用户界面(GUI)来与用户进行交互。桌面图形类程序广泛应用于各种领域,如办公软件,图形处理,多媒体播放等。
服务类应用程序是指为客户端提供特定服务的应用程序。这些程序通过网络协议(如HTTP、FTP、SMTP等)与客户端进行通信,以提供各种服务,如网页浏览、文件传输、邮件发送等。
应用程序类别 | 启动方式 | 与客户的交互 |
---|---|---|
桌面类应用程序 | 双击桌面图标 | 图形用户界面(GUI) |
服务类应用程序 | 通过systemd启动 | 网络协议 |
制作桌面类应用程序源码包
bino是一款用于播放3D视频的开源软件。下面以制作某厂商1系统上bino_1.6.6-3_loongarch64.deb软件包为例,制作一个lmg桌面类应用程序源码包。包含七个步骤,步骤如下:
1) 环境、依赖包准备
首先,将基础容器镜像导入到loongker容器管理器中,目前有两种方法。
方法1:导入6.1节中获取的容器镜像的tar文件,如图6.5加载容器镜像。
图6.5 加载容器镜像
方法2:安装在6.2节已经制作生成的lmg二进制包uos20_1_10_brl.loongarch64.lmg,如图6.6安装lmg二进制包。
图6.6 安装lmg二进制包
其次,获取依赖的软件包。
执行以下命令进入容器。
loongker run -it --name uos uos20\_1\_10:brl bash
执行以下命令将deb包拷贝到容器中。
loongker cp bino_1.6.6-3_loongarch64.deb uos20:/root/
清空目录/var/cache/apt/archives。
rm /var/cache/apt/archives/* -rf
执行以下命令安装deb包。
apt-get install /root/bino_1.6.6-3_loongarch64.deb
软件包cn.huorong.esm_2.0.1.0_loongarch64.deb依赖的deb包就会下载到目录/var/cache/apt/archives中,最终找到制作lmg包需要的所有的素材。
libglew2.1_2.1.0-4_loongarch64.deb
liblirc-client0_0.10.1-6.3~deb10u1_loongarch64.deb
bino_1.6.6-3_loongarch64.deb
2) 工作目录准备
首先创建工作目录:
# mkdir bino_lmg && cd bino_lmg
然后将bino_1.6.6-3_loongarch64.deb和其依赖的deb包,拷贝到工作目录bino_lmg中。
3) 生成模板文件
执行lmgcraft gentemp命令生成模板文件lmgcraft-temp.yaml,模板文件内容如下:
# cat lmgcraft-temp.yaml
base:
project:
version:
release:
description:
lmgtype: APPLICATIONS
apps:
parts:
bino\_1.6.6-3\_loongarch64:
plugin: dump
source: bino\_1.6.6-3\_loongarch64.deb
source-type: deb
libglew2.1\_2.1.0-4\_loongarch64:
plugin: dump
source: libglew2.1\_2.1.0-4\_loongarch64.deb
source-type: deb
liblirc-client0\_0.10.1-6.3~deb10u1\_loongarch64:
plugin: dump
source: liblirc-client0\_0.10.1-6.3~deb10u1\_loongarch64.deb
source-type: deb
4) 初步修改lmgcraft.yaml配置文件
完善模板文件lmgcraft-temp.yaml 的内容,并重命名为lmgcraft.yaml,完善后的文件如下:
# cat lmgcraft.yaml
base: uos20\_1\_10:brl
project: bino
version: 1.6.6-3
release: '1'
description: "lmg app"
lmgtype: APPLICATIONS
apps:
bino:
command: bino
parts:
liblirc-client0_0.10.1-6.3~deb10u1_loongarch64:
plugin: dump
source: liblirc-client0\_0.10.1-6.3~deb10u1\_loongarch64.deb
source-type: deb
bino_1.6.6-3_loongarch64:
plugin: dump
source: bino\_1.6.6-3\_loongarch64.deb
source-type: deb
libglew2.1_2.1.0-4_loongarch64:
plugin: dump
source: libglew2.1\_2.1.0-4\_loongarch64.deb
source-type: deb
5) bino应用程序分析
首先,执行lmgcraft prime生成prime目录。
考虑到bino是一个桌面的图形应用程序,需要告诉lmgcraft bino的desktop文件的位置以及桌面图标的位置。在prime目录中查找desktop文件。
# find ./prime -name "\*.desktop"
./prime/usr/share/applications/bino.desktop
查看bino.desktop文件内容,获得桌面图标文件和启动应用程序的命令。
# cat ./prime/usr/share/applications/bino.desktop
[Desktop Entry]
Name=Bino
GenericName=3D video player
GenericName[de]=3D Videospieler
GenericName[fr]=Lecteur vidéo 3D
GenericName[pl]=Odtwarzacz 3D
GenericName[ru]=3D видео плеер
Icon=bino
Categories=AudioVideo;Player;Video;
Type=Application
Exec=bino %u
StartupNotify=true
Terminal=false
MimeType=application/ogg;application/x-matroska;application/x-ogg;video/flv;video/mp4;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;video/x-totem-stream;
通过Icon字段,我们可以知道桌面图标文件的名称为bino(不带后缀)。
# find ./prime -name "bino*"
./prime/usr/bin/bino
./prime/usr/share/applications/bino.desktop
./prime/usr/share/doc/bino
./prime/usr/share/doc/bino/html/bino.html
./prime/usr/share/doc-base/bino-manual
./prime/usr/share/icons/hicolor/16x16/apps/bino.png
./prime/usr/share/icons/hicolor/32x32/apps/bino.png
./prime/usr/share/icons/hicolor/48x48/apps/bino.png
./prime/usr/share/icons/hicolor/64x64/apps/bino.png
./prime/usr/share/icons/hicolor/scalable/apps/bino.svg
./prime/usr/share/locale/bg/LC\_MESSAGES/bino.mo
./prime/usr/share/locale/cs/LC\_MESSAGES/bino.mo
./prime/usr/share/locale/de/LC\_MESSAGES/bino.mo
./prime/usr/share/locale/fr/LC\_MESSAGES/bino.mo
./prime/usr/share/locale/ru/LC\_MESSAGES/bino.mo
./prime/usr/share/locale/zh\_cn/LC\_MESSAGES/bino.mo
./prime/usr/share/man/man1/bino.1.gz
我们选择文件./prime/usr/share/icons/hicolor/48x48/apps/bino.png作为桌面图标。
通过Exec字段,我们可以知道启动应用程序的程序名称为bino。
# find ./prime -name bino
./prime/usr/bin/bino
./prime/usr/share/doc/bino
我们可以猜测出/prime/usr/bin/下的bino文件就是启动应用程序的二进制文件。
6) 优化后的lmgcraft.yaml文件
根据以上分析,优化后的lmgcraft.yaml文件内容如下:
# cat lmgcraft.yaml
base: uos20_1_10:brl
project: bino
version: 1.6.6-3
release: '1'
description: "lmg app"
lmgtype: APPLICATIONS
apps:
bino:
command: /usr/bin/bino
desktop: usr/share/applications/bino.desktop
icon:usr/share/icons/hicolor/48x48/apps/bino.png
parts:
liblirc-client0\_0.10.1-6.3~deb10u1\_loongarch64:
plugin: dump
source: liblirc-client0\_0.10.1-6.3~deb10u1\_loongarch64.deb
source-type: deb
bino_1.6.6-3_loongarch64:
plugin: dump
source: bino_1.6.6-3_loongarch64.deb
source-type: deb
libglew2.1_2.1.0-4_loongarch64:
plugin: dump
source: libglew2.1_2.1.0-4_loongarch64.deb
source-type: deb
做这样修改的依据是:
desktop字段描述desktop文件相对prime目录的相对路径。
icon字段描述icon文件相对prime目录的相对路径。
command字段描述启动命令在容器中的绝对路径。
7) 应用程序源码包素材验证
本步骤,基于应用程序源码包的素材,构建生成二进制包,并进行安装和运行验证,以此来确认构建应用程序源码包的素材无误。
命令中使用的私钥证书private.pem来自6.2节。
使用命令lmgcraft pack --prikey ./private.pem尝试构建lmg包。构建后如图6.7 生成lmg文件。
图6.7 生成lmg文件
如图6.8查看已安装的lmg包,安装前请确保bino依赖的基础运行时二进制包已经被安装,如果未安装请参考6.3节和7.1节制作基础运行时二进制包并安装。
图6.8 查看已安装的lmg包
如图6.9失败安装lmg包,执行命令lpkg -i ./bino_1.6.6-3_1.loongarch64.lmg安装lmg包失败。
图6.9 失败安装lmg包
拷贝6.2节生成公钥证书到目录/var/lib/lpkg/certs。
如图6.10成功安装lmg包, 再次执行命令lpkg -i ./bino_1.6.6-3_1.loongarch64.lmg成功安装lmg包。
图6.10 成功安装lmg包
如图6.11显示已安装的lmg包,执行命令查看lmg包是否已经被安装。
图6.11 显示已安装的lmg包
如图6.12查看桌面图标,在桌面的lmg目录中找到Bino图标。
图6.12 查看桌面图标
双击执行,并尝试播放视频,如图6.13运行中的bino播放器,验证程序能正常运行。
图6.13 运行中的bino播放器
8) 将验证无误的应用程序源码目录制作成lmg源码包
如图6.14清理文件,执行lmgcraft distclean清理构建二进制包时产生的文件。
图6.14 清理文件
如图6.15生成lmg源码包,执行命令lmgcraft packsrc。
图6.15 生成lmg源码包
制作服务类应用程序源码包
cn.huorong.esm是火绒公司的一款Linux下的安全软件。下面以制作某厂商2系统上cn.huorong.esm_2.0.1.0_loongarch64.deb软件包为例,制作一个lmg服务类应用程序源码包。包含七个步骤,步骤如下:
1) 环境、依赖包准备
下载某厂商2的系统镜像到当前目录。
wget ftp://xxx:/tmp/lmg/baseruntime/loong64/kylin_1_6_brl.tar
首先加载基础系统容器镜像,执行命令loongker load -i ./kylin_1_6_brl.tar,如图6.16 加载某厂商2的系统镜像。
图6.16 加载某厂商2的系统镜像
其次,获取依赖的软件包。
执行以下命令进入容器。
loongker run -it --name kylin kylin_1_6:brl bash
执行以下命令将deb包拷贝到容器中。
loongker cp cn.huorong.esm_2.0.1.0_loongarch64.deb uos20:/root/
清空目录/var/cache/apt/archives。
rm /var/cache/apt/archives/* -rf
执行以下命令安装deb包。
apt-get install ./cn.huorong.esm_2.0.1.0_loongarch64.deb
软件包cn.huorong.esm_2.0.1.0_loongarch64.deb依赖的deb包就会下载到目录/var/cache/apt/archives中最终找到制作lmg包需要的所有的素材。
cn.huorong.esm_2.0.1.0_loongarch64.deb
2) 工作目录准备 首先创建工作目录:
# mkdir huorong_lmg && cd huorong_lmg
然后将cn.huorong.esm_2.0.1.0_loongarch64.deb,拷贝到工作目录。
3) 生成模板文件
执行lmgcraft gentemp命令生成模板文件lmgcraft-temp.yaml,模板文件内容如下:
# cat lmgcraft-temp.yaml
base:
project:
version:
release:
description:
lmgtype: APPLICATIONS
apps:
parts:
cn.huorong.esm\_2.0.1.0\_loongarch64:
plugin: dump
source: cn.huorong.esm\_2.0.1.0\_loongarch64.deb
source-type: deb
4) 初步修改lmgcraft.yaml配置文件
完善模板文件lmgcraft-temp.yaml 的内容,并重命名为lmgcraft.yaml,完善后的文件如下:
# cat lmgcraft.yaml
base: kylin_1_6:brl
project: huorong.esm
version: 2.0.1.0
release: "1"
description: "lmg app"
lmgtype: APPLICATIONS
apps:
huorong:
command: xxxx
parts:
huorong:
plugin: dump
source: cn.huorong.esm\_2.0.1.0\_loongarch64.deb
source-type: deb
5) cn.huorong.esm应用程序分析
首先,执行lmgcraft prime生成prime目录。 考虑到cn.huorong.esm是一个桌面的程序,需要告诉lmgcraft cn.huorong.esm的desktop文件的位置以及桌面图标的位置。执行命令lmgcraft prime,并在prime目录中搜索desktop文件。
# find . -name "*.desktop"
./etc/xdg/autostart/cn.huorong.esm_tray.desktop
./opt/apps/cn.huorong.esm/entries/applications/cn.huorong.esm.desktop
./opt/apps/cn.huorong.esm/entries/applications/cn.huorong.esm_tray.desktop
./usr/share/applications/cn.huorong.esm.desktop
通过分析,我们选择文件cn.huorong.esm.desktop作为主程序的桌面desktop文件。
我们需要确定deb包cn.huorong.esm_2.0.1.0_loongarch64.deb是否存在安装后的执行脚本, 执行dpkg -e ./cn.huorong.esm_2.0.1.0_loongarch64.deb生成目录DEBIAN目录,通过分析目录中的postinst文件,服务hressclnt.service在deb包被安装后被启动。
function register_auto_run
{
cp $INST_DIR/script/hressclnt.service /etc/systemd/system/hressclnt.service
chmod a+x /etc/systemd/system/hressclnt.service
systemctl enable hressclnt.service
}
确定了服务hressclnt.service确实在这个deb软件包被安装之后被启动了,因此这个deb包既需要一个desktop进程,又需要一个服务进程。
我们在prime目录中搜索service文件,确定service文件的路径。
# find . -name "*.service"
./opt/apps/cn.huorong.esm/files/script/hressclnt.service
更改配置文件的内容如下:
# cat lmgcraft.yaml
base: kylin_1_6:brl
project: huorong.esm
version: 2.0.1.0
release: "1"
description: "lmg app"
lmgtype: APPLICATIONS
apps:
huorong:
command: /opt/apps/cn.huorong.esm/files/bin/hipsmain
desktop: opt/apps/cn.huorong.esm/entries/applications/cn.huorong.esm.desktop
icon: opt/apps/cn.huorong.esm/entries/applications/icons/hicolor/scalable/apps/logo.svg
watchdog:
service: opt/apps/cn.huorong.esm/files/script/hressclnt.service
install-mode: true
parts:
huorong:
plugin: dump
source: cn.huorong.esm_2.0.1.0_loongarch64.deb
source-type: deb
通过分析desktop文件cn.huorong.esm.desktop,确定桌面进程的相关字段如下:
huorong:
command: /opt/apps/cn.huorong.esm/files/bin/hipsmain
desktop: opt/apps/cn.huorong.esm/entries/applications/cn.huorong.esm.desktop
icon: opt/apps/cn.huorong.esm/entries/applications/icons/hicolor/scalable/apps/logo.svg
command:表示这个桌面应用程序的启动文件在容器中的绝对路径。
desktop:表示desktop文件相对于prime目录的相对路径。
icon:表示桌面图标文件相对于prime目录的相对路径。
确定服务进程的相关内容如下:
watchdog:
service: opt/apps/cn.huorong.esm/files/script/hressclnt.service
install-mode: true
service字段的值为service文件相对于prime目录的相对路径。 install-mode的值为true表示lmg包被安装后,立即启动这个服务。
6) 优化后的lmgcraft.yaml文件
# cat lmgcraft.yaml
base: kylin_1_6:brl
project: huorong.esm
version: 2.0.1.0
release: "1"
description: "lmg app"
lmgtype: APPLICATIONS
apps:
huorong:
command: /opt/apps/cn.huorong.esm/files/bin/hipsmain
desktop: opt/apps/cn.huorong.esm/entries/applications/cn.huorong.esm.desktop
icon: opt/apps/cn.huorong.esm/entries/applications/icons/hicolor/scalable/apps/logo.svg
watchdog:
service: opt/apps/cn.huorong.esm/files/script/hressclnt.service
install-mode: true
parts:
huorong:
plugin: dump
source: cn.huorong.esm\_2.0.1.0\_loongarch64.deb
source-type: deb
7) 应用程序源码包素材验证
本步骤,基于应用程序源码包的素材,构建生成二进制包,并进行安装和运行验证,以此来确认构建应用程序的源码包的素材无误。
执行命令lmgcraft pack --prikey ./private.pem尝试制作lmg包。
生成huorong.esm_2.0.1.0_1.loongarch64.lmg,命令中涉及的文件private.pem是6.2节生成的私钥证书。安装lmg包,安装前请确保huorong依赖的基础运行时二进制包已经被安装,如果未安装请参考6.3节和7.1节制作基础运行时二进制包并安装,如图6.17查看已经安装的lmg包,显示kylin的BASERUNTIME类型的二进制lmg包已经被安装。
图6.17 查看已经安装的lmg包
执行命令lpkg -i ./huorong.esm_2.0.1.0_1.loongarch64.lmg。
如果缺少公钥证书就无法通过认证,如图6.18 安装lmg包失败。
图6.18 安装lmg包失败
将6.2节生成的public.pem拷贝到目录/var/lib/lpkg/certs中,再次执行命令lpkg -i ./huorong.esm_2.0.1.0_1.loongarch64.lmg,如图6.19安装lmg包成功。
图6.19 安装lmg包成功
如图6.20 查看火绒桌面图标,双击桌面lmg目录中的图标,无响应,程序无法正常启动。
图6.20 查看火绒桌面图标
考虑可能是deb包中的preinst和postinst脚本没有执行,将两个脚本拷贝到当前目录下,如图6.21 获取postinst和preinst文件。
图6.21 获取postinst和preinst文件
重新修改lmgcraft的内容如下:
# cat lmgcraft.yaml
base: kylin_1_6:brl
project: huorong.esm
version: 2.0.1.0
release: "1"
description: "lmg app"
lmgtype: APPLICATIONS
apps:
huorong:
command: /opt/apps/cn.huorong.esm/files/bin/hipsmain
desktop: opt/apps/cn.huorong.esm/entries/applications/cn.huorong.esm.desktop
icon: opt/apps/cn.huorong.esm/entries/applications/icons/hicolor/scalable/apps/logo.svg
watchdog:
service: opt/apps/cn.huorong.esm/files/script/hressclnt.service
install-mode: true
exec-in-container: |
./preinst install
./postinst
parts:
huorong:
plugin: dump
source: cn.huorong.esm_2.0.1.0_loongarch64.deb
source-type: deb
prime目录的内容生成后,lmgcraft会根据基础镜像生成一个容器,并且将prime目录的内容拷贝容器的根目录,其中字段exec-in-container表示的含义是在容器被固化为镜像之前需要执行的命令。
按照之前描述的步骤生成lmg包,安装并运行,如图6.22 火绒启动成功。
图6.22 火绒启动成功
8) 将验证无误的应用程序源码目录制作成lmg源码包
如图6.23清理文件,执行lmgcraft distclean清理构建二进制包时产生的文件。
图6.23 清理文件
如图6.24 生成lmg源码包。
图6.24 生成lmg源码包
6.5. 制作运行时升级源码包
运行时升级类的源码包是用于构建运行时升级二进制包的原始素材的集合。包含三个步骤,步骤如下:
1) 首先,制作升级tar包。
1.1) 创建工作目录
# mkdir workspace && cd workspace
1.2) 进入容器 loongker run -it b97c92f7121d bash
1.3) 创建升级层 echo "some change" > /usr/bin/1.txt
1.4) Ctrl+D退出容器
1.5) 查看容器id:
loongker ps -a (选择创建时间最近的那个)
1.6) 提交容器中的镜像 loongker commit 145a72cdc1e0 uos20_1_11:brl
1.7) 查看提交的镜像 loongker images (一般是最顶上那个)
1.8) 将镜像与原本的镜像作对比,抽取出更新层
loongker saveupgrade -a 2b4e29ff7096 -b b97c92f7121d -t uos20_1_11:brl -o uos20_1_10_up.11.tar (-b 原镜像id, -a 升级后的基础镜像的id,-t 抽出来的升级包的REPOSITORY:TAG,-o 输出的升级包的tar包的名称,应符合命令规范:【系统名】_【版本】_【原始relase号】_【up】.【新版本release号】.【tar】)
2) 然后,定义lmgcraft.yaml配置文件
将制作好的文件uos20_1_10_up.11.tar拷贝到目录workspace中,创建lmgcraft.yaml文件,添加内容如下:
# cat lmgcraft.yaml
base: uos20_1_10:brl
description: "lmg app"
lmgtype: UPBASERUNTIME
3) 运行时升级源码包素材验证
本步骤,基于运行时升级源码包的素材,构建生成二进制包,并进行安装和运行验证,以此来确认构建运行时升级源码包的素材无误。
命令中使用的私钥证书private.pem来自6.2节。
使用命令lmgcraft pack --prikey ./private.pem尝试构建lmg包。构建后如图6.25 生成lmg文件。
图6.25 生成lmg文件
验证运行时升级二进制软件包的环境准备。
1 已经安装运行时升级包依赖的运行时二进制软件包,如图6.26已安装运行时uos20。
图6.26 已安装运行时uos20
2 已经安装依赖基础运行时的应用程序二进制软件包,如图6.27已安装应用程序bino。
图6.27 已安装应用程序bino
安装运行时二进制升级包,如图6.28升级运行时。
如图6.28 升级运行时
如图6.29 应用程序依赖的运行时被更新。
图 6.29 应用程序依赖的运行时被更新
4) 最后将验证无误的原始素材打包成lmg源码包
如图6.30 清除文件,将构建过程中产生的文件删除。
图6.30 清除文件
执行命令lmgcraft packsrc,生成文件uos20_1_10_up.11.loongarch64.src.lmg,如图6.31 生成lmg源码包。
图 6.31 生成lmg源码包
7. 如何制作lmg二进制包
本章节主要讲述lmg二进制包的制作过程。lmg的二进制包是指由.src.lmg源码包通过lmgcraft工具构建的,可在目标系统上直接运行的lmg软件包。
7.1. 制作运行时二进制包
制作运行时二进制包有两个步骤,以uos20_1_10_brl.loongarch64.src.lmg文件为例,步骤如下:
1) 准备.src.lmg源码包文件,并初始化环境
执行lmgcraft extract uos20_1_10_brl.loongarch64.src.lmg解压源码包生成目录uos20_1_10_brl.loongarch64。
2) 生成lmg二进制包并签名,文件private.pem来自6.2节生成的私钥证书
进入目录uos20_1_10_brl.loongarch64,执行lmgcraft pack --prikey private.pem生成lmg包。
7.2. 制作应用程序二进制包
制作应用程序的二进制包有两个步骤,以源码包bino_1.6.6-3_1.loongarch64.src.lmg文件为例,步骤如下:
1) 准备.src.lmg源码包文件,并初始化环境
执行lmgcraft extract bino_1.6.6-3_1.loongarch64.src.lmg解压源码包生成目录bino_1.6.6-3_1.loongarch64。
2) 生成lmg二进制包并签名,文件private.pem来自6.2节生成的私钥证书
进入目录bino_1.6.6-3_1.loongarch64,执行lmgcraft pack --prikey private.pem生成lmg包。
7.3. 制作运行时升级二进制包
制作运行时升级二进制包有两个步骤,以源码包uos20_1_10_up.11.loongarch64.src.lmg文件为例,步骤如下:
1) 准备.src.lmg源码包文件,并初始化环境
执行lmgcraft extract uos20_1_10_up.11.loongarch64.src.lmg解压源码包生成目录uos20_1_10_up.11.loongarch64。
2) 生成lmg二进制包并签名,文件private.pem来自6.2节生成的私钥证书
进入目录uos20_1_10_up.11.loongarch64,执行lmgcraft pack --prikey private.pem生成lmg包。
8. 安装lmg二进制包
本章节讲述lmg二进制包的安装,以及安装过程中内部的运作过程。
8.1. 安装BASERUNTIME 类型的二进制包
以二进制包uos20_1_10.loongarch64.lmg为例,BASERUNTIME 类型的二进制包安装命令、安装解析过程如下:
1) 安装命令
lpkg -i ./uos20_1_10.loongarch64.lmg
2) 安装过程解析
如果在目录/var/lib/lpkg/certs/中无法找到公钥证书,将报安装失败。
需要将与签名这个软件包的私钥证书对应的公钥证书拷贝到目录/var/lib/lpkg/certs中,重新执行lpkg -i ./uos20_1_10.loongarch64.lmg进行安装。
8.2. 安装APPLICATIONS类型的二进制包
以二进制包bino_1.6.6-3_1.loongarch64.src.lmg的安装为例,APPLICATIONS类型的二进制包安装命令、安装解析过程如下:
1) 安装命令
执行lpkg -i ./bino_1.6.6-3_1.loongarch64.lmg
2) 安装过程解析
lpkg将尝试搜索软件包bino_1.6.6-3_1.loongarch64.lmg依赖的BASERUNTIME 类型的二进制包是否已经被安装,如果没有被安装,将尝试在当前目录搜索其依赖的二进制包uos20_1_10.loongarch64.lmg,如果找到了,就安装当前目录的uos20_1_10.loongarch64.lmg,如果没有找到则尝试从远程仓库下载,远程仓库的下载地址则是文件/etc/lacf/lacf.conf配置的结果。如果下载失败,则所有安装过程被终止。
8.3. 安装UPBASERUNTIME 类型的二进制包
以二进制包uos20_1_10_up.11.loongarch64.lmg的安装为例,UPBASERUNTIME 类型的二进制包安装命令、安装解析过程如下:
1) 安装命令
执行lpkg -i ./uos20_1_10_up.11.loongarch64.lmg。
2) 安装过程解析
lpkg将尝试搜索升级包uos20_1_10_up.11.loongarch64.lmg依赖的BASERUNTIME 类型的二进制包uos20_1_10是否已经被安装,如果没有被安装则升级失败。
9. 运行安装成功的APPLICATIONS类型的二进制包
1) 查看软件包的安装情况
# lpkg -l
名称 版本 体系结构
kylin 1\_6 loongarch64
huorong.esm 2.0.1.0\_1 loongarch64
2) 查看软件包的启动方式、运行情况:以应用程序huorong.esm为例
# lpkg -L huorong.esm
apptag: huorong.esm_2.0.1.0_1:kylin_1_6
files:
- /opt/lmg/cn.huorong.esm.desktop
- /usr/share/icons/lmg/logo.svg
- /lmg/bin/huorong.esm.huorong
- /lib/systemd/system/huorong.esm.hressclnt.service
- /opt/huorong.esm_2.0.1.0_1.loongarch64.app
command:
- huorong.esm.huorong
- 图标启动:
从包含文件cn.huorong.esm.desktop可知此应用程序可以通过桌面图标启动,进入桌面的lmg目录,双击桌面图标启动程序;
- 命令行启动
从command字段可知此应用程序可以通过命令huorong.esm.huorong启动。在shell终端上执行命令/lmg/bin/huorong.esm.huorong启动程序;
- 后台服务运行
从huorong.esm.hressclnt.service文件可知此应用程序包含一个后台服务进程,可以通过systemctl status huorong.esm.hressclnt.service查看后台服务的状态,可以通过systemctl restart huorong.esm.hressclnt.service重新启动后台服务。
10. 常见错误处理
本章节着重讲述一些制作lmg二进制包过程中常见错误的处理,内容将会不断的进行完善。
1) 在制作应用程序二进制lmg包的过程中,如何创建软链接
在制作某厂商1的blender lmg软件包的过程中,发现其依赖libtinyxml.so.2.6.2,但是在某厂商1的软件仓库中deb包libtinyxml2.6.2v5_2.6.2.1-deepin1_loongarch64.deb解压后只有libtinyxml.so.2.6.2.1,为了能够让程序能够动态链接成功,通过创建一个新的part和关键字after创建一个软链接文件,并将其加入到prime目录中,示例如下:
libtinyxml:
plugin: dump
source: libtinyxml2.6.2v5_2.6.2.1-deepin1_loongarch64.deb
source-type: deb
libtinyxml1:
plugin: dump
after: [libtinyxml]
source: .
override-stage: |
ln -s libtinyxml.so.2.6.2.1 usr/lib/loongarch64-linux-gnu/libtinyxml.so.2.6.2
prime:
- usr/lib/loongarch64-linux-gnu/libtinyxml.so.2.6.2
2) 如何在构建lmg二进制包过程中执行deb包中postinst脚本程序
在制作lmg二进制包过程中,如果part中定义的deb包存在postinst脚本程序,在整个parts的生命周期模型中,这个脚本并不会被执行,导致制作出来的lmg应用程序无法正常启动运行,这是一种比较常见的情况。为此lmgcraft增加了关键字exec-in-container,用于解决此类问题。
比如在制作quadrapassel包时,lmgcraft.yaml文件中增加配置如下:
exec-in-container: |
"/usr/lib/loongarch64-linux-gnu/glib-2.0/glib-compile-schemas" /usr/share/glib-2.0/schemas || true
再比如kylin系统中360安全浏览器的deb转化为lmg包时,需要执行postinst脚本,使其启动时通过安全认证,配置如下:
# cat lmgcraft.yaml
base: kylin\_1\_6:brl
project: browser360-cn-stable
version: 10.6.1000.37-1
release: "1"
description: "lmg app"
lmgtype: APPLICATIONS
apps:
browser360-cn-stable:
command: /usr/bin/browser360-cn-stable
desktop: usr/share/applications/browser360-cn.desktop
icon: opt/browser360/product\_logo.svg
exec-in-container: |
./postinst
parts:
browser360-cn-stable:
plugin: dump
source: browser360-cn-stable\_10.6.1000.37-1\_loongarch64.deb
source-type: deb
libu2f:
plugin: dump
source: libu2f-udev\_1.1.10-1kylin1\_all.deb
source-type: deb