在线文档教程

嵌入式 | 1. Embedded Solaris

1嵌入式Solaris

本节介绍与Solaris相关的OTP的操作系统特定部分。

1.1 内存使用

在带有64 MB总RAM的系统上,Solaris需要大约17 MB的RAM。这为应用程序留下了大约47 MB​​的空间。如果系统使用交换,由于不必要的守护进程被换出,这些数字无法改善。但是,如果禁用交换,或者交换空间的系统资源有限,则有必要关闭不必要的守护进程。

1.2 磁盘空间使用

通过使用核心用户支持安装,可以最小化Solaris所需的磁盘空间。它需要大约80 MB的磁盘空间。这只安装启动和运行Solaris所需的最低软件。通过删除不必要的单个文件可以进一步减少磁盘空间。但是,除非磁盘空间是关键资源,否则所需的努力和涉及的风险是不合理的。

1.3安装嵌入式系统

本节介绍如何安装嵌入式系统。考虑以下主题:

  • 创建用户和安装目录

本节中的几个步骤需要有关Solaris操作系统的专业知识。对于他们中的大多数来说,需要超级用户权限。

创建用户和安装目录

建议嵌入式环境由普通用户运行,即没有超级用户权限的用户。

在本节中,假设用户名是,otpuser并且该用户的主目录是:

/export/home/otpuser

还假定在主目录中otpuser有一个名为的目录otp,其完整路径为:

/export/home/otpuser/otp

该目录是嵌入式环境的安装目录

安装嵌入式系统

安装嵌入式系统的过程与普通系统相同(请参阅安装指南),但以下情况除外:

  • (压缩的)磁带归档文件将在上面定义的安装目录中提取。

配置引导时的自动启动

系统启动时,必须启动真正的嵌入式系统。本节说明了实现这一点所需的必要配置。

如果将以下所示的脚本文件添加到目录中,嵌入式系统和所有应用程序将自动启动/etc/rc3.d。该文件必须是拥有且可读的root。它的名字不能任意指定; 建议使用以下名称:

S75otp.system

有关初始化(和终止)脚本及其命名的更多详细信息,请参见Solaris文档。

#!/bin/sh # # File name: S75otp.system # Purpose: Automatically starts Erlang and applications when the # system starts # Author: janne@erlang.ericsson.se # Resides in: /etc/rc3.d # if [ ! -d /usr/bin ] then # /usr not mounted exit fi killproc() { # kill the named process(es) pid=`/usr/bin/ps -e | /usr/bin/grep -w $1 | /usr/bin/sed -e 's/^ *//' -e 's/ .*//'` [ "$pid" != "" ] && kill $pid } # Start/stop processes required for Erlang case "$1" in 'start') # Start the Erlang emulator # su - otpuser -c "/export/home/otpuser/otp/bin/start" & ;; 'stop') killproc beam ;; *) echo "Usage: $0 { start | stop }" ;; esac

/export/home/otpuser/otp/bin/start在上面的脚本中引用的文件恰恰是start启动Erlang中描述的脚本。该脚本OTP_ROOT中的脚本变量start对应于本节中使用的以下示例路径:

/export/home/otpuser/otp

start脚本将被相应地编辑。

killproc在上面的脚本中使用该过程可以结合调用erl_call,例如:

$SOME_PATH/erl_call -n Node init stop

要优雅地使用Erlang,请参阅erl_call(1)手册页以erl_interface获取有关使用的详细信息erl_call。但是,这要求Erlang作为分布式节点运行,但情况并非总是如此。

killproc程序不会被删除。目的在于从运行级别3(具有网络资源的多用户模式)转换到运行级别2(没有这种资源的多用户模式),其中Erlang不运行。

使硬件Watchdog可用

对于从Force计算机运行在VME板上的Solaris,只要将VME总线驱动程序添加到操作系统中,就可以激活板载硬件看门狗(另请参阅安装问题)。

另请参阅heart(3)内核中的手册页。

更改重新启动的权限

如果HEART_COMMANDstart启动Erlang中的脚本中设置环境变量,并且该值要设置为Solaris reboot命令的路径,那么:

HEART_COMMAND=/usr/sbin/reboot

那么所有权和文件权限/usr/sbin/reboot必须更改如下:

chown 0 /usr/sbin/reboot chmod 4755 /usr/sbin/reboot

另请参阅heart(3)内核中的手册页。

设置TERM环境变量

当从S75otp.system脚本自动启动Erlang运行时系统时,TERM必须设置环境变量。以下是最低设置:

TERM=sun

这将被添加到start脚本中。

添加修补程序

为了在Solaris 2.5.1上将文件系统数据刷新到磁盘上,必须将具有编号103640-02的特定于版本的修补程序添加到操作系统中。其他补丁可能需要,请参阅发行版自述文件<ERL_INSTALL_DIR>/README。

在应用程序os_mon中安装模块os_sup

以下四个安装过程需要超级用户权限:

安装

  • 制作 syslogd**:** 的Solaris标准配置文件的副本

- 例如,如果只有源自UNIX内核的信息需要监控,则该行以`kern.LEVEL`开头。有关`LEVEL`的可能值,请参阅`syslog.conf(5)`。 - 在至少一个制表符后,添加的行将包含命名管道的全名,其中`syslogd`写入其信息。路径必须与文件`syslog.conf.ORIG`和`syslog.conf.OTP`相同。文件名必须是`syslog.otp`。 - 如果文件`syslog.conf.ORIG`和`syslog.conf.OTP`的目录是`/ etc`,`syslog.conf.OTP`中的行如下:kern.LEVEL / etc / syslog。 OTP

  • 检查配置文件的文件权限:

- Notice that if the files `syslog.conf.ORIG` and `syslog.conf.OTP` are not in directory `/etc`, the file path in the second and third command must be modified.

  • 修改该 实用程序的文件权限和所有权:mod_syslog

- 二进制可执行文件必须由root拥有,具有`rwsr-xr-x`文件权限,特别是用户的setuid位必须被设置。 - 一个简单的方法是发出以下命令:cd <OTP_ROOT> / lib / os_mon- <REV> / priv / bin / mod_syslog chmod 4755 mod_syslog chown root mod_syslog

测试应用程序配置文件

以下过程不需要root权限:

  • 确保应用程序中os_sup模块的配置参数os_mon是正确的。

参数功能标准值
start_os_sup指定是否启动os_sup。在硬件上是第一个实例; 对于其他实例为假
os_sup_own(1)备份副本的目录和(2)syslogd的Erlang特定配置文件“/等等”
os_sup_syslogconfsyslogd的Solaris标准配置文件的全名“/etc/syslog.conf文件”
error_tag在Erlang运行时系统中发送给错误记录器的消息的标记std_error

如果中列出的值os_mon.app不符合您的需要,也不能编辑该文件。而是覆盖系统配置文件中的值,命令行中给出了其完整路径名erl

示例:应用程序配置文件的内容:

[{os_mon, [{start_os_sup, true}, {os_sup_own, "/etc"}, {os_sup_syslogconf, "/etc/syslog.conf"}, {os_sup_errortag, std_error}]}].

相关文件

查看os_mon(3)应用程序,application(3)内核中的erl(1)手册页以及ERTS中的手册页。

安装问题

heart端口程序控制的硬件看门狗定时器需要FORCEvme安装包含VME总线驱动程序的包。但是,该驱动程序可能会与Sun mcp驱动程序发生冲突并导致系统拒绝启动。为了解决这个问题,需要将以下几行添加到/etc/system

  • exclude: drv/mcp

警告

建议添加这些行以避免冲突。冲突可能导致系统无法启动。

1.4启动Erlang

本节介绍如何启动嵌入式系统。涉及四个程序,它们通常驻留在目录中<ERL_INSTALL_DIR>/bin。唯一的例外是该start程序可以位于任何地方,也是唯一必须由用户修改的程序。

在嵌入式系统中,通常不存在交互式shell。但是,操作员可以通过命令连接到Erlang系统to_erl。然后运算符连接到Erlang外壳,并可以给普通的Erlang命令。所有通过这个shell与系统的交互都被记录在一个特殊的目录中。

基本上,程序如下:

  • start机器时启动的程序被调用。

1.5 程序

start

该程序在机器启动时调用。它可以修改或重写以适合特殊系统。默认情况下,它必须被调用start并驻留<ERL_INSTALL_DIR>/bin。通过使用start_prgSASL应用程序中的配置参数,可以使用另一个启动程序。

启动程序必须run_erl如下所示进行调用。它还必须带一个可选参数,默认为<ERL_INSTALL_DIR>/releases/start_erl.data。

这个程序是设置静态参数和环境变量,比如-sname NameHEART_COMMAND重启机器。

该<RELDIR>目录是安装新版本数据包的位置,以及释放处理程序保存有关发行版的信息的位置。有关更多信息,请参阅release_handler(3)SASL中的手册页。

以下脚本说明了该程序的默认行为:

#!/bin/sh # Usage: start [DataFile] # ROOTDIR=/usr/local/otp if [ -z "$RELDIR" ] then RELDIR=$ROOTDIR/releases fi START_ERL_DATA=${1:-$RELDIR/start_erl.data} $ROOTDIR/bin/run_erl /tmp/ $ROOTDIR/log "exec $ROOTDIR/bin/start_erl \ $ROOTDIR $RELDIR $START_ERL_DATA" > /dev/null 2>&1 &

以下脚本举例说明了一个修改,其中节点被赋予了名称cp1以及环境变量HEART_COMMANDTERM已添加到以前脚本的位置:

#!/bin/sh # Usage: start [DataFile] # HEART_COMMAND=/usr/sbin/reboot TERM=sun export HEART_COMMAND TERM ROOTDIR=/usr/local/otp if [ -z "$RELDIR" ] then RELDIR=$ROOTDIR/releases fi START_ERL_DATA=${1:-$RELDIR/start_erl.data} $ROOTDIR/bin/run_erl /tmp/ $ROOTDIR/log "exec $ROOTDIR/bin/start_erl \ $ROOTDIR $RELDIR $START_ERL_DATA -heart -sname cp1" > /dev/null 2>&1 &

如果diskless和/或只读客户机节点即将启动,则文件start_erl.data位于主节点的客户机目录中。因此,START_ERL_DATA行看起来像:

CLIENTDIR=$ROOTDIR/clients/clientname START_ERL_DATA=${1:-$CLIENTDIR/bin/start_erl.data}

run_erl

该程序用于启动模拟器,但不会连接到外壳。to_erl用于连接到Erlang shell。

Usage: run_erl pipe_dir/ log_dir "exec command [parameters ...]"

这里:

  • pipe_dir//tmp/to_erl默认使用这个名字)。

日志文件被写入log_dir。每个日志文件都有一个表单名称erlang.log.N,其中N是世代号,范围从1到5.每个日志文件最多可容纳100 kB文本。随着时间的推移,在日志文件目录中找到以下日志文​​件:

erlang.log.1 erlang.log.1, erlang.log.2 erlang.log.1, erlang.log.2, erlang.log.3 erlang.log.1, erlang.log.2, erlang.log.3, erlang.log.4 erlang.log.2, erlang.log.3, erlang.log.4, erlang.log.5 erlang.log.3, erlang.log.4, erlang.log.5, erlang.log.1 ...

最近的日志文件是每行中最右边的。也就是说,最近的文件是具有最高数字的文件,或者如果已经有四个文件,则是跳过之前的文件。

当打开一个日志文件(用于追加或创建)时,时间戳将写入该文件。如果15分钟内没有写入日志文件,则会插入一条记录,表明我们还活着。

to_erl

该程序用于附加到正在运行的Erlang运行时系统,并以此开始run_erl

Usage: to_erl [pipe_name | pipe_dir]

这里pipe_name默认为/tmp/erlang.pipe.N

要在不退出 Erlang 系统的情况下从外壳断开连接,请键入Ctrl-D

start_erl

该程序通过参数-boot和-config设置启动Erlang仿真器。它读取有关这些文件从一个文件名为定位的数据start_erl.data,这是位于<RELDIR>。每个新版本都引入一个新的数据文件。该文件由Erlang中的发布处理程序自动生成。

以下脚本说明了该程序的行为:

#!/bin/sh # # This program is called by run_erl. It starts # the Erlang emulator and sets -boot and -config parameters. # It should only be used at an embedded target system. # # Usage: start_erl RootDir RelDir DataFile [ErlFlags ...] # ROOTDIR=$1 shift RELDIR=$1 shift DataFile=$1 shift ERTS_VSN=`awk '{print $1}' $DataFile` VSN=`awk '{print $2}' $DataFile` BINDIR=$ROOTDIR/erts-$ERTS_VSN/bin EMU=beam PROGNAME=`echo $0 | sed 's/.*\///'` export EMU export ROOTDIR export BINDIR export PROGNAME export RELDIR exec $BINDIR/erlexec -boot $RELDIR/$VSN/start -config $RELDIR/$VSN/sys $*

如果static_emulator设置SASL配置参数的diskless和/或只读客户机节点true即将启动,则必须更改-boot-config标志。

因为这样的客户端无法读取新start_erl.data文件(该文件不能动态更改)。引导和配置文件总是从相同的地方获取(但是如果已经安装了新版本,则需要新内容)。

release_handler这些文件复制到bin在每当一个新的版本是永久的主节点的客户端目录目录。

假设与CLIENTDIR上面相同,最后一行看起来像:

exec $BINDIR/erlexec -boot $CLIENTDIR/bin/start \ -config $CLIENTDIR/bin/sys $*