- 论坛徽章:
- 0
|
试析FreeBSD 6.2 的rc脚本系统
杜比环绕声
一、从mysql的启动脚本说起
配置mysql的时候,如果需要启动运行 mysql server,按照 mysql 手册上的说明,需要在 /etc/rc.conf 中,添加一条信息:
mysql_enable="YES"
这样在重新启动系统的时候,就可以自动运行 mysqlserver.
如果需要运行时,停止 mysqlserver 或者重新启动 mysqlserver,可以使用下面的命令:
停止mysqlserver: shell>/usr/local/etc/rc.d/mysql-server stop
重新启动mysqlserver: shell>/usr/local/etc/rc.d/mysql-server restart
其实无论是mysqlserver还是apache等系统服务,都可以利用上面提到的参数“stop“,”restart“等进行程序维护
这属于FreeBSD系统rc脚本系统的具体应用。
FreeBSD的rc脚本系统在服务程序的管理上,主要是体现在 /etc/rc.d 和 /usr/local/etc/rc.d 这两个目录下的可执行脚本,系统级别的服务程序的脚本大都安装在 /etc/rc.d目录下,而用户级别的服务程序的脚本都安装在 /usr/local/etc/rc.d 目录下。如 mysql server 在安装的时候会在 /usr/local/etc/rc.d目录下安装一个 mysql-server 的脚本文件。
服务程序的管理,其实运行的就是对应的脚本文件。如上面举例的停止服务,重新启动服务,运行的都是mysql-server脚本。
二、mysql-server 启动脚本的说明
下面的脚本代码是freebsd 6.2中mysqlserver 5.0的启动脚本。具体的功能在脚本代码中注释!
余下运行的都是根据本脚本运行过程中定义的各种变量来执行 /etc/rc.subr 中的run_rc_command 函数。
三、/etc/rc.subr中的run_rc_command 函数
这个函数中提供了很多参数的处理过程,诸如start,stop,restart,rcvar,pull等过程。
也提供了可选参数fast,force,one的具体执行代码。具体的代码就不作解释了,
如果这些参数的处理过程没有在服务程序的脚本中进行定义,那么运行的就是函数中定义的处理过程。
通过脚本分析获知使用rc脚本系统中一些细节。
1、如果运行具体服务程序的rc脚本没有带参数,rc_rc_command会打印出帮助信息
Usage: ./mysql-server [fast|force|one](start|stop|restart|rcvar|status|poll)
2、对于mysql-server这个脚本,如果没有在 /etc/rc.conf 中加入 mysql_enable="YES",并且在运行脚本时
没有使用[force][one]选项,start,stop,restart,status是没有运行结果的。
[force]的作用是强制 {rcvar} 有效,使得 mysql_enable="yes"临时有效
这样在 /etc/rc.conf 中不添加 mysql_enable="YES"的情况下,运行服务程序的管理,例如:
shell> /usr/local/etc/rc.d/mysql-server forcestart
shell> /usr/local/etc/rc.d/mysql-server forcerestart
rcvar参数是不需要上面的限制,因为rcvar参数的主要作用就是判断/etc/rc.conf 中是否有mysql_enable="YES"的设置。
[one]的作用和[force]类似,不同的是one 只是设置 {$rcvar}有效。
四、阶段性小结
通过上面的代码分析,以及参考更多的服务程序的rc脚本,大致可以理出rc脚本系统中服务程序管理的大致原理。
freebsd系统提供的 rc.subr 是整个rc脚本系统的核心,它提供了系统利用rc脚本管理服务程序的基石。
在这个基础上,实现了服务程序rc脚本的框架结构。定义了统一的运行规则。并且为服务程序诸如mysqlserver提供了很大的灵活性。
但rc.subr的作用不只如此,从rc.subr的代码可知,它提供的功能实际是架构起了FreeBSD整个系统的rc脚本系统。
五、系统启动自动运行服务程序的机制
前面提到,mysqlserver要实现随系统启动运行所要作的工作就是把 mysql_enable="YES"添加到 /etc/rc.conf之中即可。泛泛的理解是系统启动完内核后,在启动init之后有个rc脚本启动过程。而这些服务程序就是在这个过程中自动加载的。但具体的加载过程很少资料提到。本文在上面对mysql-server分析的基础上,试着分析一下rc脚本系统的启动原理。
1、rc脚本系统什么时候启动
按照《FreeBSD操作系统设计与实现》中的说法,rc脚本系统是在加载完系统内核,出现freebsd启动模式选择界面,选择运行方式,启动init之后开始运行。在多用户模式启动系统的情况下,init首先产生一个shell,默认的是 /bin/sh,所有的rc脚本都是用这个shell来解释执行。
选择不同的启动模式会导致下面的变量被赋值:
_boot
如果系统是自动运行,_boot=faststart
如果系统不是自动运行,_boot=start
这个变量的值会影响到后续的启动过程
2、rc脚本系统的始祖 /etc/rc
3、小结:
FreeBSD系统提供的rc脚本系统由以下的部分组成
shell
/etc/rc
/etc/defaults/rc.conf
/etc/rc.conf
/etc/rc.d/
/usr/local/etc/rc.d/
整个rc脚本系统的核心是 /etc/rc.subr 和 rcorder 组成,籍由这个机制,很多的系统功能都是通过rc脚本运行起来的,例如 login 等等
《freebsd操作系统设计与实现》中文版中所提到的reorder应该就是rcorder,估计是排版错误。
系统启动时自动运行特定的服务程序的大致流程是:
由 /etc/rc 脚本运行 /etc/rc.conf ,对应的 mysql_enable="YES"所起的作用就是设置rcvar变量
通过/etc/rc.subr提供的函数,使用 faststart或者start参数运行诸如 mysql-server这样的脚本,启动相关服务
六、FreeBSD的rc脚本系统总结
通过跟踪整个rc脚本系统的运作,给我一个特殊的印象,一个不太恰当的比喻,rc脚本系统相当于系统内核和具体服务程序的黏合剂和管理中枢。有了rc脚本系统,磁盘检查,用户登录等等服务才得以在系统中运行。
[ 本帖最后由 杜比环绕声 于 2007-5-8 23:45 编辑 ] |
|