构建第三方应用程序
Junos OS 演化版支持使用 C、C++ 和 Python 开发的已签名第三方应用程序包,以及适用于 Junos OS 演化的 JET SDK。Junos OS 演化版应用程序管理器 () 或 Linux 系统管理器 (SysMan
systemd
) 根据应用程序的性质和使用情况控制这些第三方应用程序。
适用于 Junos OS 演化的 JET SDK
在构建要在设备上运行的第三方应用程序之前,必须先生成签名密钥以授予应用程序运行权限。有关详细信息,请参阅 生成签名密钥 。
Junos OS 演化版 22.4R1 及更高版本在以下平台上支持 JET SDK for Junos OS 演化版:
ACX | 系列 PTX 系列QFX 系列 | |
---|---|---|
ACX7100-32C | PTX10001-36MR | QFX5130-32光盘 |
ACX7100-48L | PTX10003 | QFX5130-48C |
ACX7509 | PTX10004 | QFX5220 |
PTX10008 | ||
PTX10016 |
下载 JET SDK 和 JET 工具包
在开始构建第三方应用程序之前,请下载并安装适用于 Junos OS 演化的 JET SDK 和适用于 Junos OS 演化的 JET 工具包。您可以在 Juniper Extension Toolkit(适用于 Junos Evolved) 页面找到这些文件:
-
适用于 Junos OS 演化的 JET SDK: jet-junos-evo-sdk--releaseEVO.deb
-
The JET Toolkit for Junos OS Evolved: jet-junos-evo-toolkit-release-EVO.tar.gz
安装 Junos OS 演化版的 JET SDK 和 JET 工具包
下载适用于 Junos OS 演化的 JET 工具包后,解压缩 tar 文件并从软件包中提取 Jet-evo
实用程序。
从 Junos OS 演化版 23.2R1 及更高版本开始,您还可以提取 Jet-evo-bundle-iso
用于创建捆绑 ISO 的实用程序。有关捆绑 ISO 的详细信息,请参阅 创建捆绑 ISO。
下载 SDK 后,安装并获取它。JET SDK for Junos OS Evolved 是一个 Debian 软件包,您可以将其安装在基于 Debian 的 Linux 发行版(如 Ubuntu 和 Debian)上。使用以下 Linux 命令安装 JET SDK for Junos OS 演化版 22.4R1:
user@host:~$ dpkg -i jet-junos-evo-sdk-22.4R1.10-EVO.deb
该 dpkg
命令会将 SDK 安装到 / opt/jnpr/sdk/3.0.2-31 文件夹中。
接下来,您需要为第三方软件包提供 SDK。使用以下命令为 Junos OS 演化版 22.4R1 中的软件包获取适用于 Junos OS 演化版的 JET SDK:
user@host:~/package-name$ source /opt/jnpr/sdk/3.0.2-31/environment-setup-core2-32-poky-linux user@host:~/package-name$ source/opt/jnpr/sdk/3.0.2-31/environment-setup-core2-64-poky-linux user@host:~~/package-name$ source /opt/jnpr/sdk/3.0.2-31/environment-setup-x86-pokymllib32-linux
系统曼和系统控制应用程序
本机 Junos OS 演化版应用程序管理器 () 或 Linux 系统管理器 (SysMan
systemd
) 可以控制第三方应用程序。受控应用程序可以利用 Junos OS 演化版的分布式基础架构并跨多个节点运行。 SysMan
同时,托管应用程序只能在单个节点上运行,systemd
因此SysMan
在大多数情况下,首选的应用程序管理器也是如此。
SysMan
托管 systemd
应用程序使用不同的方法通过服务文件定义策略。通过管理的应用程序 SysMan
使用 .yaml
文件来定义策略和分配服务。有关详细信息,请参阅 .yaml 文件 。
通过定义策略和通过文件分配服务.service
来systemd
管理的应用程序。有关详细信息,请参阅服务文件。
发生路由引擎切换时,托管应用程序将在新的主路由引擎上自动启动, SysMan
但 systemd
托管应用程序将继续在原始路由引擎上运行。我们建议尽可能在双路由引擎系统上使用 SysMan
受控应用程序。
第三方应用程序的文件夹结构
第三方应用程序包遵循 Junos OS 演化版中的特定文件夹结构。
根 fs 文件夹结构
该 root-fs
文件夹包含以下文件夹:
-
usr/sbin (必需):包含应用程序的二进制可执行文件。
-
usr/lib64 (可选):包含应用程序所需的库。
-
etc/sytemd/sytem (可选):包含
systemd
受控应用程序的服务单元文件systemd
(对于systemd
托管应用程序是必需的)。 -
usr/conf (可选):包含
.yaml
用于策略生成的文件(对于SysMan
托管应用程序是必需的)。
您可以在文件夹外部 root-fs
找到以下可选文件夹:
-
脚本(可选):包含预安装、安装后和预卸载脚本。
-
etc/config (可选):包含特定于应用程序的配置。
安装后文件夹结构
安装第三方软件包后,默认情况下会将文件存储在以下路径:
-
/usr/sbin/:包含包中应用程序的二进制可执行文件。
-
/usr/lib64/:包含包中应用程序的库。
-
/data/var/external//current-evo-version:包含预安装、安装后和预卸载脚本文件,以及
.bom
包中应用程序的 、.sh
.fs
和.ima
文件。 -
/etc/systemd/system/:包含
.service
用于设置应用程序策略和附加服务的文件。 -
/usr/conf/:包含
.yaml
受控应用程序的文件SysMan
。
您可以在文件夹中找到库和二进制文件 read-only
的文件。我们不建议将库和二进制文件 read-write
放在启用的文件夹中,如 / etc 或 /var。
第三方应用程序文件
第三方应用程序包包含多种类型的文件。继续阅读有关不同文件类型的更多信息:
生成文件
生成文件是构建和安装第三方应用程序的必要文件。生成文件需要包含其他文件的路径,如 SRC 文件、配置文件和 .yaml
文件。它还控制必要文件的安装位置。
SRC 文件
SRC 文件包含应用程序的源代码。您可以使用 C、C++ 或 Python 编写 SRC 文件。这些文件对于第三方应用程序的功能是必需的。
脚本文件
脚本文件包括预安装、安装后和预卸载脚本。这些可选文件是 shell 脚本,您可以对其进行自定义以满足应用程序的需求。
-
预安装脚本会在安装第三方软件包之前运行。这些脚本通常用于测试和检查设备上的各种因素。例如,您可以创建一个预安装脚本,在开始安装之前检查正在运行的 Junos OS 演化版。
-
安装后脚本在安装第三方软件包后运行。这些脚本包含完成安装后要运行的命令。例如,为包创建其他日志文件或日志记录目录。
-
卸载前脚本会在卸载第三方软件包之前运行。这些脚本通常用于清理在安装第三方软件包期间创建的文件夹和文件。
所有脚本在成功执行时必须返回零,在失败时必须返回非零。
可以在任何文件夹中创建脚本。在使用该工具创建 Jet-evo
第三方包的过程中,您可以输入每种脚本类型的路径,它们将安装在设备上的 / data/var/external/current-evo-version/ 文件夹中。有关该工具 Jet-evo
的详细信息,请参阅 Jet-evo 工具配置。
如果要创建自定义脚本,我们建议您不要使用任何 bash
将创建其他 CLI 输出的命令。您可以将 CLI 输出重定向到您自己的日志文件。
服务文件
服务文件是受控应用程序的必需文件 systemd
。这些文件控制应用程序策略并确定应用程序在哪些节点和路由引擎上运行。
您必须将服务文件放在软件包目录中的 root-fs
etc/systemd/system/ 文件夹中。
下面的示例是 .service
名为 Sample App
的应用程序的文件。此 .service
文件定义启动应用程序的路径,以及运行应用程序所需的系统状态。
[Unit] Description="Sample App" After=syslog.target sysman.service network.target network-online.target Before=pre-evoapp-shutdown.service OnFailure=failure_handler@%p.service [Service] EnvironmentFile=/usr/conf/system/system_env TimeoutStopSec=60 WorkingDirectory=/usr/sbin ExecStart=/usr/evo/evostart -d /usr/sbin -p %p /usr/bin/python /usr/sbin/sample/sample_app.py ExecStop=/usr/sbin/exit_foo.py --bar ExecStopPost=/usr/evo/exit_handler.sh %p Restart=no StartLimitBurst=3 StartLimitInterval=300 MemoryLimit=2G RemainAfterExit=true SyslogIdentifier=sample_app
以下字段是必填字段,应使用与示例文件相同的语法:
-
后
-
之前
-
故障时
-
工作目录
-
执行启动
-
ExeStopPost
.yaml 文件
.yaml
文件是受控应用程序的必需文件SysMan
。这些文件用于传递应用程序特定的策略,这些策略用于在安装期间创建systemd
基于服务单元和SysMan
基于的策略。 文件还用于确定应用程序在哪些节点和路由引擎上运行。 .yaml
如果在包中包含同一应用程序的和.yaml
.service
文件,.service
则文件属性将优先,并且应用程序将被视为sysman
受控应用程序。
第三方包可以附加多个服务。对于SysMan
每个附加的服务,每个应用程序都必须有一个单独的.yaml
文件,其中服务名称作为.yaml
文件名。文件名应与服务名称匹配,而不是与包名称匹配,因为第三方包名称可能与包中包含的服务不同。 .yaml
必须将文件usr/conf
放在.yaml
包目录中的root-fs
文件夹中。
文件 .yaml
由多个字段组成,其中包含有关相应应用程序的信息。有关文件字段的定义 .yaml
,请参阅以下列表:
binpath | 定义二进制可执行文件的路径。 |
exec-start | 定义如何启动应用程序,包括启动应用程序所需的路径和参数。此字段对应于 |
working-dir | 使用二进制文件定义父目录的路径。 |
id | 控制应用程序的名称。应与 |
network | 设置网络类型,值为 |
on-exit | 控制退出时重新启动应用程序的设置。
|
resource | 设置应用程序使用的系统资源限制:
|
以下示例.yaml
文件显示了将在主路由引擎上运行的示例应用程序的配置,只有一个实例。设置字段all_nodes
以防止false
应用程序在所有路由引擎上运行。将max_number_of_instances
1
字段设置为 将应用程序限制为 1 个实例。node-attribute
将字段设置为 使-re
应用程序在路由引擎上运行。使用此配置,如果主路由引擎出现故障,应用程序将自动在备份路由引擎上启动。
description: "Sample app" binpath: /usr/sbin/sample/sample_app.py exec-start: "/usr/bin/python /usr/sbin/sample/sample_app.py" working-dir: /usr/sbin id: sample-app network: internal on-exit: restart: true resource: instances: all_nodes: false max_num_of_instances: 1 node-attributes: - re max-memory: 2G startup: true
创建第三方软件包
该工具 Jet-evo
使用应用程序开发人员创建的应用程序、二进制文件和库创建第三方包。创建第三方软件包的过程因 Junos OS 演化 SysMan
版进程还是 Linux systemd
进程管理软件包而异。有关每个特定方案的更多详细信息,请参阅下文:
SysMan
创建托管包
管理的 SysMan
外部应用程序需要将服务的文件附加到 .yaml
应用程序。
- 使用 Junos OS 演化版的 JET SDK 使用 C、C++ 或 Python 构建和编译应用程序。
- 按照 第三方应用程序的文件夹结构中所述创建必要的文件夹。
- 将二进制可执行文件保存在 usr/sbin/ 文件夹中。
- 将
.yaml
文件保存在 usr/conf / 文件夹中,将配置文件保存在 etc/config/ 文件夹中。 Jet-evo
使用特定于包的选项运行该工具。有关工具中Jet-evo
配置选项的详细信息,请参阅 Jet-evo 工具配置。
如果需要使用文件中无法包含.yaml
的复杂函数systemd
,您可以选择将自己的systemd
文件与文件一起.yaml
打包。将服务文件放在 etc/systemd/system/ 文件夹中,将.yaml
文件放在 usr/conf 文件夹中。
systemd
创建托管包
管理的 systemd
外部应用程序需要具有 .service
附加到应用程序的服务的文件。
- 使用 Junos OS 演化版的 JET SDK 使用 C、C++ 或 Python 构建和编译应用程序。
- 按照 第三方应用程序的文件夹结构中所述创建必要的文件夹。
- 将二进制可执行文件保存在 usr/sbin/ 文件夹中。
- 将服务文件保存在 etc/ systemd/system/ 文件夹中。
Jet-evo
使用特定于包的选项运行该工具。有关工具中Jet-evo
配置选项的详细信息,请参阅 Jet-evo 工具配置。
Jet-evo
工具配置
该工具 Jet-evo
用于命名第三方软件包、设置版本号、运行安装脚本以及设置第三方软件包的安装位置。这些变量都由运行 jet-evo
命令时设置的选项控制:
$ ./Jet-evo -h usage: Jet-evo [-h] -n NAME -r ROOT [-v VERSION] [-a ARCH] [-N NODE] [-i PREINSTALL] [-p POSTINSTALL] [-u PREUNINSTALL] [-d DIRECTORY] [-x] [-t] [-l LOGFILE] [-k KEY]
有关生成用于Jet-evo
该工具的私钥的信息,请参阅生成签名密钥。
必需参数
需要以下参数:
-n name | 设置第三方软件包的名称。 |
-r root: | 定义包中包含的应用程序的根路径,以逗号分隔。 |
-v version: | 为包设置版本号。 |
可选参数
以下参数是可选的:
-h | 显示解释字段的 |
-a architecture | 选择第三方软件包的目标体系结构。 |
-n node | 定义第三方包的目标节点。 |
-i pre-install | 指定预安装脚本的文件路径。 |
-p post-install | 指定安装后脚本的文件路径。 |
-u pre-uninstall |
指定预卸载脚本的文件路径。 |
-d directory | 设置用于安装包的目标目录。 |
-x | 从包中删除所有调试文件。 |
-t | 创建一个包含该工具所有 |
-l name | 设置打包程序日志文件的名称和路径。 |
-k key | 用于对第三方包进行签名的私钥。 |
语法示例
以下是使用以版本 1.0.1 命名的sample_package
包的命令语法jet-evo
示例:
$ jet-evo -n sample_package -v 1.0.1 -t -i ./src/scripts/sample_package_preinstall -p ./src/scripts/sample_package_postinstall -u ./src/scripts/sample_package_preuninstall -d ./target/ -r ./install/ -k ima-privkey.pem
安装第三方软件包
构建或获取第三方应用程序包后,可以将其安装到 Junos OS 演化版设备上。一个包可以一起安装多个应用程序。安装过程将覆盖包中存在的任何以前安装的应用程序。我们建议使包内的应用程序在不同的包中保持唯一。
在安装第三方应用程序之前,必须先在所有 RE 上安装相应的签名密钥和证书。如果未正确生成签名密钥,安装将失败。有关详细信息,请参阅 生成签名密钥 。
您可以使用命令 show security integrity extended-keyring
查看已安装的密钥。
您可以使用命令 request system software add package-name
安装第三方软件包。例如:
request system software add sample_package.1.0.1.tgz
第三方软件包只能从主路由引擎安装。
成功安装第三方软件包后,安装过程会将所有相关文件复制到文件夹中 /data/var/external/current-evo-version/
。 show version
输出将在以下 External Software
字段下显示每个路由引擎上特定软件版本的所有第三方软件包:
user@host> show version Hostname: sample_host Model: ptx10008 Junos: 22.4I20221214083306-EVO Yocto: 3.0.2 Linux Kernel: 5.2.60-yocto-standard-gae998d995 JUNOS-EVO OS 64-bit [junos-evo-install-ptx-x86-64-22.4I20221214083306-EVO] External Software: JET app sample_package 1.0.1
要显示设备上安装的所有 Junos OS 演化版,以及每个节点和每个路由引擎上为当前版本安装的第三方软件包,可以使用以下命令 show software list
:
user@host> show system software list | no-more ------------------------------- node: re0 ------------------------------- Active boot device is primary: /dev/vda List of installed version(s) : '-' running version '>' next boot version after upgrade/downgrade '<' rollback boot version '*' deleted JSU version > junos-evo-install-ptx-x86-64-22.4I20221214085042 - [2022-12-14 09:14:39] - junos-evo-install-ptx-x86-64-22.4I20221214083306 - [2022-12-14 08:58:24] < junos-evo-install-ptx-x86-64-22.4I20221214072149 - [2022-12-14 08:04:20] junos-evo-install-ptx-x86-64-22.4I20221214055215 - [2022-12-14 06:39:46] External Software: JET app sample_package 1.0.1 ------------------------------- node: re1 ------------------------------- Active boot device is primary: /dev/vda List of installed version(s) : '-' running version '>' next boot version after upgrade/downgrade '<' rollback boot version '*' deleted JSU version > junos-evo-install-ptx-x86-64-22.4I20221214085042 - [2022-12-14 09:16:48] - junos-evo-install-ptx-x86-64-22.4I20221214083306 - [2022-12-14 08:58:59] < junos-evo-install-ptx-x86-64-22.4I20221214072149 - [2022-12-14 08:04:52] junos-evo-install-ptx-x86-64-22.4I20221214055215 - [2022-12-14 06:40:38] External Software: JET app sample_package 1.0.1