ubuntu的init与系统服务设置

init

Init是位于/sbin/init的一个程序,它是在linux下,在系统启动过程当中,初始化全部的设备驱动程序和数据结构等以后,由内核启动的一个用户级程序,并由此init程序进而完成系统的启动过程。 linux

ubuntu与传统的linux略有不一样,使用upstart完成系统的启动,但表面上仍维持init程序的形式。 apache


运行级别

传统上,linux有几种不一样的运行级别,包括以下几种: ubuntu

# 0 - 停机
# 1 - 单用户模式
# 2 - 多用户,没有 NFS
# 3 - 彻底多用户模式(标准的运行级)
# 4 – 系统保留的
# 5 – X11 (x window)
# 6 - 从新启动 服务器

系统启动后处于哪种级别由init读取/etc/inittab文件中的缺省级别设置来肯定,一半图形界面的系统是进入级别3。 网络

可是ubuntu与传统的不太同样,默认状况下是找不到/etc/inittab文件的,并且运行级别也有差异,具体分这样几个级别: 数据结构

# 0 – 关闭系统 工具

# 1 – 单用户模式 spa

# 2~5 – 完整的多用户模式 rest

# 6 – 从新启动 rem

也就是说,默认状况下级别二、三、四、5都是同样的,同时系统的默认级别设定也不是在inittab文件中,而是写在/etc/init/rc-sysinit.conf文件中。打开此文件,能够找到下面一句:

env DEFAULT_RUNLEVEL=2

这代表系统当前默认是进入级别2。


另外,在此文见中还有一段以if [ -r /etc/inittab ] 开始的代码,这里保留了使用inittab指定系统默认运行级别的功能,也就是说,若是用户手动建立了/etc/inittab,那么init将以 /etc/inittab中指定的默认运行级别进行系统的启动。好比说用户但愿系统以级别3为默认运行级别,则只需在inittab文件中加入以下一行:

id:3:initdefault:

在通过/etc/init/rc-sysinit.conf肯定运行级别后,init将进一步运行/etc/init.d/rc,而后根据级别进入/etc/rc[?].d启动或关闭相应的服务。


服务的启动与关闭脚本

ubuntu下启动与关闭服务的脚本存放与/etc/rc[?].d目录下。其中[x]表示0~6,分别对应级别0~6,如/etc目录下的 rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d。假设rc-sysinit.conf或inittab中指定的默认级别是2,那么init将执行/etc/rc2.d目录下的脚本启动或关 闭相应服务。

若是打开/etc/rc[?].d目录,会发现这些目录下的文件都是形如SnnxxxxKnnxxxx符号连接,并且都是指向/etc /init.d。也就是说不一样运行级别下服务的启动或关闭脚本均是放在/etc/init.d下,只不过根据不一样级别的须要,在对应/etc /rc[?].d目录下放一个连接,不一样的级别会须要不一样的服务,所以不一样/etc/rc[?].d目录下的连接文件也不尽相同以此区分。

其中连接文件中以S开头的表示在调用/etc/init.d目录中对应脚本的时候会传递一个start参数,也就是启动对应服务,而以K开头的则是传递一个stop参数,由此关闭此服务,此处的K表示kill。

S和K后面的nn是一个数字,表示本脚本被执行的前后顺序,小号在前大号在后,这样以解决不一样服务之间可能存在的前后依赖关系。好比说ftp服务依赖于网络服务的启动,因此ftp服务的编号就要大于网络服务的编号,在网络服务启动后再行启动。

最后的xxxx则是服务的名字。

另外,除了/etc/rc[0~6].d文件外,还有一个/etc/rcS.d目录,这个目录下的服务脚本与/etc/rc[0~6].d格式相似,也为指向/etc/init.d中的脚本的连接,可是会在/etc/rc[0~6].d中的脚本执行前首先被执行。


服务的安装

根据上面的介绍,如何将一个软件安装为服务也就比较清楚了,那就是在/etc/init.d添加一个服务的启动脚本,而后在须要启动服务的对应级别的/etc/rc[0~6].d中按照文件名格式添加一个指向/etc/init.d中脚本的符号连接

以apache2为例,默认状况下,apache2编译安装在/usr/local/apache2,apache2的服务器启动脚本是/usr /local/apache2/bin/apachectl,那么安装服务就是要把此apachectl拷贝到须要启动apache2服务器的运行级别对 应的/etc/rc[?].d目录下,一半来讲ubuntu是运行在级别2下,因此也就是拷到/etc/rc2.d下,命令以下:

sudo cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd

在这里,咱们把拷贝的脚本文件名改成惯用的httpd,那么在系统服务中apache2的名称也就是httpd。

手动添加服务的话,就是要在/etc/rc2.d里为httpd做一个形如Snnxxxx的连接。假定启动顺序咱们定为80,那么就是要创建一个指向/etc/init.d/httpd的连接/etc/rc2.d/S80httpd,命令以下:

sudo ln -s /etc/init.d/httpd /etc/rc2.d/S80httpd

而后用sysv-rc-conf或者chkconfig –list检查一下就能看到已经在运行级别2下创建的名为httpd的服务,重启后,系统会自动启动apache2。

如今要手动启动、关闭或重启httpd服务器可使用service命令+服务名+参数的形式,以下三句分别是启动、关闭和重启apache2服务器的命令:

service httpd start

service httpd stop

service httpd restart

要安装服务除了以上手动做连接外,还可使用一些工具软件来实现,好比经常使用的有update-rc.d、chkconfig和sysv-rc-conf等。

这里主要以update-rc.d为例

update-rc.d

如用update-rc.d在运行级别2,3,4,5中都添加httpd服务启动命令,并指定启动序号是80,能够以下(注意命令最后的那个点号不能少):

sudo update-rc.d httpd start 80 2 3 4 5 .

若是要在运行级别2,3,4,5中都添加httpd服务关闭命令,并指定关闭序号是80,则能够以下(注意命令最后的那个点号不能少):

sudo update-rc.d httpd stop 80 2 3 4 5 .

而若是要删除httpd服务,则用如下命令就删掉/etc/rc[?].d中全部存在的指向/etc/init.d/httpd的连接:

sudo update-rc.d httpd remove

另外,还能够用带有defaults参数的形式同时向运行级别2,3,4,5中添加启动服务命令,即Start命令,并同时向运行级别0,1,6添加关闭命令,即Kill命令,其中start命令的序号是80,kill命令的序号是90:

sudo update-rc.d httpd defaults 80 90

这条命令也等同于(注意命令stop前面和最后的那两个点号不能少):

sudo update-rc.d httpd start 80 2 3 4 5 . stop 90 0 1 6 .

以上两条命令的效果就是做了以下几个连接:

/etc/rc0.d/K90httpd -> ../init.d/httpd

/etc/rc1.d/K90httpd -> ../init.d/httpd

/etc/rc6.d/K90httpd -> ../init.d/httpd

/etc/rc2.d/S80httpd -> ../init.d/httpd

/etc/rc3.d/S80httpd -> ../init.d/httpd

/etc/rc4.d/S80httpd -> ../init.d/httpd

/etc/rc5.d/S80httpd -> ../init.d/httpd

chkconfig

查看全部服务在全部级别下的状况:

chkconfig –list

查看某服务的状况,以下将查看httpd服务在哪些级别下是被启动的:

chkconfig httpd

在此,若是httpd在2,3,4,5下是被启动,将返回信息:

httpd 2345

sysv-rc-conf

这个软件是有图形界面的,比较直观简单,就很少说了,看看就明白了。

rc.local

在/etc/rc[2~5].d目录下都会有一个S99rc.local,这是一个指向/etc/init.d/rc.local的连接,能够看 出,在正常的2~5级别启动的最后都会调用这个rc.local脚本,而/etc/init.d/rc.local中又会检查是否存在/etc /rc.local,并运行之,所以,咱们就能够在/etc/rc.local中写入代码,来随系统启动某些程序,实现相似服务的功能。

系统的启动过程

综上,能够看到,系统的启动调用过程就以下过程:

内核 → /etc/init/rc-sysinit.conf → [/etc/inittab] → /etc/init.d/rc → /etc/rc[?].d → /etc/init.d/rc.local → /etc/rc.local

其余linux系统

在其余系统下以上的文件结构和过程略有不一样,以Redhat系的CentOS5为例,系统中默认init是使用/etc/inittab文件的,而后读取/etc/rc.sysinit,再根据运行级别进入/etc/rc[?].d。

其中,/etc/rc.sysinit是指向/etc/rc.d/rc.sysinit的连接,/etc/rc[?].d是指向/etc/rc.d /rc[?].d的连接,/etc/rc.local是指向/etc/rc.d/rc.local的连接,因此系统启动的顺序就变成以下:

内核 → /etc/inittab → /etc/ rc.sysinit(/etc/rc.d/rc.sysinit) → /etc/rc[?].d(/etc/rc.d/rc[?].d) → /etc/rc.local(/etc/rc.d/rc.local)

相关文章
相关标签/搜索