最新消息:

linux启动脚本详解(一)

Linux运维 大步 1722浏览 0评论

以下都摘自《Linux系统管理技术手册(第二版)》,由于书是04年出版的,所以可能描述的与现在的系统版本有些不同,但思路值得我们深入。   linux 启动脚本 init.d 详解

init执行启动脚本,都是由sh解释的shell脚本。不通版本的系统,这些脚本的位置和内容,结构可能有区别。

启动脚本经常执行的任务如下:

  • 设置计算机的名称
  • 设置时区
  • 用fsck检查磁盘(只有在自动模式下)
  • 安装系统的磁盘
  • 从/tmp目录删除旧文件
  • 配置网络接口
  • 启动守护进程和网络服务

系统因为安装了各种软件提供的小脚本,这些脚本从若干个独立的的文件读取他们自己的本地配置信息,这些本地配置文件基本都是用shell脚本设置的变量。然后启动脚本再用这些变量的取值。

init和运行级别

init定义了7个"运行级别(run level)",每个级别都会运行特定的某些服务:

  • 0级别是完全关闭的级别
  • 1级或S级别代表单用户模式
  • 2~5级是多用户模式
  • 6级别相当于重启也可以说成重新引导(reboot)

0级和6级的效果相当于关闭系统和重新引导系统。大部分系统是运行在2或3级,运行级5常用于Xwindows的登录进程。运行级4很少用,运行级1和S的定义在每种系统上是不同的。

init1是单用户模式,他关闭所有的多用户和远程登录进程,确保系统运行在最小的软件组合的模式下。在这个级别下,别人就无法ssh登录等。在init下,因为是要求超级用户访问权限,所以,会提示输入root密码。创建S运行级是为了解决下面的需要:它产生一个进程提示输入root的口令。在linux下,这个级只是为了用来提示输入root的口令,而没有其他的运行目的。

linux实际上有10个运行级别,但是7~9并没有定义。

/etc/inittab文件告诉init在它每个级别要做什么事。它的的格式随系统的不同而异,但基本思想是:inittab规定了系统进入每一个级别索要运行(或要保持运行)的命令。

在机器引导时,init从运行级0开始,一级级的网上运行到/etc/inittab中所设置的默认运行级别。为了完成每一对相邻运行级别间的过渡,init运行在/etc/inittab中为这种过渡而说明的一些操作。当关机的时候,又以相反的顺序执行同样的处理过程。 linux 启动脚本 init.d 详解

因为inittab文件的语义有点儿不完善,为了把inittab文件的功能映射成为某种更为灵活的形式,它采用“改变运行级别”的脚本形式如(/etc/init.d/rc),由inittab调用,这个脚本再调用位于与运行级有关的目录下的其他脚本,从而把系统带入到新的的运行级别。

可以通过修改inittab文件,来改变默认运行级别:

id:5:initdefault:

可以修改id后面的数字,就可以设置系统启动的默认运行级别。不过一般,我们都不直接修改/etc/inittab,而是修改对应的init脚本。

启动脚本位于/etc/init.d目录下。每个脚本负责一个守护进程或者系统的某个特定的方面。这些脚本都认识start和stop参数,即通过这些参数来开启和关闭服务。restart就是先执行stop再执行start。系统管理员,要启动和关闭各个服务,只要手动运行与之相关的init.d脚本就可以了(类似windows下的autorun.dat)。文件下面用一个启动sshd的脚本来说明:

#!/bin/sh
test -f /usr/bin/sshd ||exit 0
case "$1" in
start)
echo -n "starting sshd: sshd"
/usr/sbin/sshd
echo "."
;;
stop)
echo -n "stopping sshd: sshd"
kill "cat /var/run/sshd.pid"
echo "."
;;
restart)
echo -n "stopping sshd: sshd"
kill "cat /var/run/sshd.pid"
echo "."
echo -n "starting sshd: sshd"
/usr/sbin/sshd
echo "."
;;
*)
echo "usage: /etc/init.d/sshd start|stop|restart"
exit 1
;;
esac

可能你会发现现在的sshd的启动脚本并不和这个相符,但是思路是一样的。

尽管/etc/init.d中的脚本能够启动和停止各个服务。但由于init运行的主控制脚本需要知道其他一些信息。这些信息说明了要进入任何指定的运行级别所需要运行哪些脚本(并带什么参数)。当主脚本系统带入到一个新的运行级别时,它不是直接在init.d目录下查找,而是查找叫做rclevel.d的目录(level就是对应的运行级别编号,如rc0.d、rc3.d等)。比如我的/etc/rc/下的目录结构如下:

init.d  rc.local    rc0.d  rc2.d  rc4.d  rc6.d
rc      rc.sysinit  rc1.d  rc3.d  rc5.d

init.d目录  在   /etc/rc.d/目录下,在大部分情况下,这些rclevel.d目录包含的符号链接都连接到了init.d目录中的脚本上。这些符号的名称都以S或K开头,后面跟着一个数字以及该脚本所控制的服务名(S34named)。当init从低级运行到高级别时候,它按照数字体检的顺序运行所有以K(表示kill,杀死进程的意思)开头,带有stop参数的脚本。

这中机制的好处就是让管理员可以细粒度地控制启动服务的顺序。例如,在网络接口启动之前先启动ssh服务就是无意义的。在Fedora系统桑,虽然network和sshd都配置了在运行级2启动,但是network的脚本序号为10,而sshd的及哦啊本序号为55,所以network肯定先运行。在加入新服务的时候,一定要考虑到这种依赖关系。要告诉系统什么时候启动一个守护进程,我们必须在适当的目录下创建符号链接。例如,要告诉系统在运行级2间启动cups并在系统关闭以前妥善地停止这个守护进程,那么创建下面这一对链接就够了:

#ln -s  /etc/init.d/cups  /etc/rc2.d/S80cups#ln -s  /etc/init.d/cups  /etc/rc2.d/K80cups
第一行命令告诉系统:当系统进入运行级2时,把运行启动脚本/etc.init.d/cups作为最后要做的事情之一,并且带start参数去运行这个脚本。第二行告诉系统:关闭系统时,要较早早运行/etc/init.d/cups,并且带stop参数来运行这个脚本。有些系统以不同方式处理系统关闭和重新引导,所以我们需要在/etc/rc6.d目录中也放一个符号链接,以确保当系统重新启动时候,该守护进程能够被正常关闭。(其实这从另外一面告诉我们如何设置某个程序或服务为开机启动)
下面一篇讲解不同linux版本的启动脚本的区别

linux 启动脚本 init.d 详解

linux 启动脚本 init.d 详解

 

转载请注明:大步's Blog » linux启动脚本详解(一)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

SiteMap