QNX SLM 学习笔记

背景

了解学习QNX -SLM机制

内容

参考 QNX7.0 SLM,若需了解更过内容可移步

SLM是什么

系统启动和监控:启动由许多必须按特定顺序启动的进程组成的复杂应用程序,下图是可以看到SLM在整个QNX BOOT的运行位置。
在这里插入图片描述

怎么用

可以通过slmctrl控制。但是我们通常使用xml配置的方式来确定进程的启动顺序。

SLM 配置概要

//根节点
<SLM:system>
	//组件,可以有多个组件
    <SLM:component name="io-pkt"> 
		//指令--执行/sbin/io-pkt-v6-hc
        <SLM:command>/sbin/io-pkt-v6-hc</SLM:command> 
		//执行指令需要的参数--ptcpip stacksize=8192
        <SLM:args>-ptcpip stacksize=8192</ SLM:args> 
		//启动后等待--等待/dev/socket起来
        <SLM:waitfor wait="pathname">/dev/socket</SLM:waitfor> 
    </SLM:component> 
    <SLM:component name="ifconfig"> 
		//依赖项--需要依赖io-pkt起来后才能启动
        <SLM:depend>io-pkt</ SLM:depend> 
        <SLM:command>/sbin/ifconfig</SLM:command> 
        <SLM:args>en0 192.168.1.5 up</SLM:args> 
        <SLM:waitfor wait="exits"></SLM:waitfor > 
    </SLM:component> 
	
	//由组件组成
    <SLM:module name="net-setup"> 
		//执行io-pkt
        <SLM:member>io-pkt</SLM:member> 
		//执行ifconfig
        <SLM:member>ifconfig</SLM:member> 
    </SLM:module> 
</SLM:system>

SLM 组件属性

<SLM:ability>:procnto赋予能力。

<SLM:ability> ability </SLM:ability>

procnto(结合了内核和进程管理器)赋予能力的过程,如root,deny,fork(参考on)。

<SLM:args>:启动进程的命令行参数列表。

<SLM:args>args</SLM:args>

<SLM:cd>:启动进程时切换到的目录。

<SLM:cd>directory </SLM:cd>

<SLM:command>:启动执行指令

<SLM:command [launch=" launch_option [ launch_option ]..."]>
              executable_path </SLM:command>
  • executable_path–要执行的二进制文件或脚本文件路径。

<SLM:debug>:在调试模式下启动进程时要使用的命令行参数。

<SLM:debug> command_args </SLM:debug>

<SLM:depend>:启动组件所需要的依赖

<SLM:depend [state="session|stateless"]>
                 component_name </SLM:depend>

在所有依赖都在运行并且所有等待完成之前,SLM 不会启动组件。

  • session–停止组件时,SLM 首先停止依赖它的组件。
  • stateless–停止组件时,依赖组件不受影响。

<SLM:envar>:指定对环境变量的更改。

<SLM:envar [clear="none|login|all"]>
                environment_variables </SLM:envar>

默认情况下,这些变量是从 SLM 继承的。

  • none–保留所有环境变量(default)
  • login-- 清除所有环境变量,除了 环境元素指定 BAUD、DISPLAY、 HZ、PHOTON、 SYSNAME、TERM、TZ、 HOME、LOGNAME、 PATH、SHELL、TERM和 USERNAME。
  • all–清除所有当前环境变量。

<SLM:groups>:指定组件进程的组访问列表的组 ID 列表

<SLM:groups> gid_1 [, gid_2 ]... </SLM:groups>

<SLM:partition>:指定将进程放入的自适应调度程序分区。

<SLM:partition> partition_name </SLM:partition>

<SLM:priority>:指示分配进程的优先级和调度策略

<SLM:priority> priority_algorithm </SLM:priority>
  • f— SCHED_FIFO(先进先出调度)
  • r— SCHED_RR(循环调度)
  • ○— SCHED_OTHER(其他调度)
    调度策略的描述请参见程序员指南中的 “调度策略”

<SLM:repair>:指定组件异常终止时要采取的操作

<SLM:repair> default|none|stop|restart </SLM:repair>
  • default-- SLM 执行由-r命令行选项指定的操作。
  • none–SLM 不采取恢复行动。
  • stop–SLM 停止依赖于发生故障的组件的任何其他组件
  • restart–SLM 重新启动出现故障的组件

<SLM:runmask>:指定进程可以在哪些处理器上运行

<SLM:runmask> component_runmask   </SLM:runmask>

解释为位掩码的值,它指定进程可以在哪些处理器上运行。它是一个 32 位整数,可以使用strtol()识别的任何格式指定 。
例如,十进制值 5对应于位掩码 00000101,它允许线程在 CPU 0 和 2 上运行。

<SLM:stderr>:错误文件地址

<SLM:stderr [iomode="w[+]|a[+]"]> stderr_filename </SLM:stderr>

overwrite (w), read and overwrite (w+; default), append (a), or read and append (a+).

<SLM:stdin>:输入文件地址

<SLM:stdin [iomode="r[+]"]> stdin_filename </SLM:stdin>

read only ® or read and write (r+).

<SLM:stdout>:输出文件地址

<SLM:stdout [iomode="w|a"]> stdout_filename </SLM:stdout>

overwrite (w) or append (a).

<SLM:stop>:停止组件

<SLM:stop 
        [stop="none|signal"] [child="false|true"] [timeout=" timeout_time "]>
         stop_data </SLM:stop>

停止进程索要发生的信号编码或者名字。

  • stop:signal(default)发送信号编码或名字给下层进程,none表示什么都不做。
  • child:true停止进程前先停掉子进程,false(default)不会先停子进程。
  • timeout:停止操作的超时时间,超时发送SIGKILL

<SLM:tty>:错误,输入,输出文件地址

<SLM:tty> tty_filename </SLM:tty>

<SLM:type>:要启动组件的安全类型的名称

<SLM:type> type_name </SLM:type>

该名称是反映正在实施的安全策略的标签。通常,您应该根据您尝试启动的内容来选择一个名称。有关安全策略的信息,请参阅安全开发人员指南中的“安全策略”一章。

<SLM:user>:为底层进程分配用户 ID (UID)、组 ID (GID) 或两者。

<SLM:user> uid |: gid | uid : gid </SLM:user>

这些值可以是要在/etc/passwd和 /etc/group 中查找的名称。

<SLM:waitfor>:组件起来后执行一些操作

<SLM:waitfor [wait="none|delay|pathname|exists|blocks"]
                 [ polltime=poll_time:timeout_time]> waitfor_data </SLM:waitfor>
  • none–立即启动相关组件
  • delay–启动相关组件前延迟一会
  • pathname–检查相关组件是否启动
  • exists–等待相关组件以指定的代码退出,若预期不同将重启该组件
  • blocks–等待进程中的指定线程到达 RECV 阻塞 状态。
  • polltime–例如, polltime=“100:20000” 结果每 100 毫秒轮询一次,并在 20 秒后超时。

waitfor_data:对应到上面说的参数,可以是时间、路径、预期的退出代码、线程id

SLM 组件复用(系统中常用方式)

可以定义模块和组件以在一个或多个 SLM 文件中重复使用。这对于分解 SLM 模块和组件以在不同的 SLM 配置文件中重用非常有用。

<!DOCTYPE SLM_system [ 
    <!ENTITY resumeModules SYSTEM 'my_reusable_modules.xml'> 
]> 
... 
<SLM:system> 
    ... 
    <!--通过指定实体'包含'my_reusable_modules.xml'中指定的内容重用模块'--> 
    &reuseModules; 
    ... 
</SLM:system>

SLM 进程终止

SLM 仅在以下情况下认为进程已正常终止:

  • 通过执行创建停止操作 slmctl 停止 组件。
  • 依赖项需要 SLM 来停止组件的进程。
  • 该组件配置了一个 等待=退出 并且组件的进程以预期的退出代码退出。
    所有其他进程终止都被视为异常并导致 SLM 重新启动组件的进程。如果某个进程在某个时间段内死得太频繁,即使终止异常,SLM 也会停止尝试重新启动该进程。

SLM7.0 & 7.1 对比

暂未识别出差异

参考

QNX BOOT
QNX7.0 SLM
QNX7.1 SLM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值