嵌入式 | 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_COMMAND
要start
在启动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_syslogconf | syslogd的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 Name
和HEART_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_COMMAND
和TERM
已添加到以前脚本的位置:
#!/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 $*