系统初始化:

POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init


init程序的类型:

        SysV: init, CentOS 5

                配置文件:/etc/inittab

        Upstart: init, CentOS 6

                配置文件:/etc/inittab, /etc/init/*.conf

        Systemd:systemd, CentOS 7

                配置文件:/usr/lib/systemd/system, /etc/systemd/system


        ramdisk:

        内核中的特性之一:使用缓冲和缓存来回事对磁盘上的文件访问

        ramdisk --> ramfs

        CentOS 5: initrd,  工具程序:mkinitrd

        CentOS 6: initramfs, 工具程序:mkinitrd, dracut


配置文件:/etc/inittab

        每一行定义一种action以及与之对应的process

        Centos6只有一行,其他的放在/etc/init目录中

        id:runlevel:action:process

                action:

                wait: 切换至此级别运行一次;

                respawn:此process终止,就重新启动之;

                initdefault:设定默认运行级别;process省略;

                sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit;

        

        id:3:initdefault:

        si::sysinit:/etc/rc.d/rc.sysinit

        

        l0:0:wait:/etc/rc.d/rc 0

        l1:1:wait:/etc/rc.d/rc 1

        ...

        l6:6:wait:/etc/rc.d/rc 6


启动级别:

        在/etc/rc.d目录中包含如下几个目录:

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

        每个目录代表一个启动级别,rc0.d目录表示启动在0级别所需要运行的进程,目录里面包含着要启动的进程,S开头的就表示要启动的进程,K开头的表示要关闭的进程,S或K后面的数字是代表启动或关闭的级别,S01XXX表示这个进程优先启动。


例:在/etc/rc.d/rc3.d目录中的所有文件

        K10saslauthd   K50vsftpd      K87restorecond  S10network      S19rpcgssd     S80postfix

        K15svnserve    K60nfs         K87rpcbind      S11auditd       S22messagebus  S90crond

        K35nmb         K69rpcsvcgssd  K89rdisc        S11portreserve  S25netfs       S95atd

        K35smb         K73winbind     S08ip6tables    S12rsyslog      S26udev-post   S99local

        K50netconsole  K87named       S08iptables     S14nfslock      S55sshd


        比如iptables服务在3级别要正常启动的,所以在rc3.d目录中包含着一个S开头并以iptables结尾的文件。相反要在3级别下关闭的服务则包含着一个以K开头的文件。

        在/etc/rc.d/init.d目录中包含着所有的系统服务,也就是chkconfig目录看到的所有系统服务。所以chkconfig命令就是专门用来处理系统服务的命令。


例:/etc/rc.d/init.d目录中的文件都是系统服务

        atd        halt       messagebus  network  portreserve  rpcbind     rsyslog    smb        vsftpd

        auditd     ip6tables  named       nfs      postfix      rpcgssd     sandbox    sshd       winbind

        crond      iptables   netconsole  nfslock  rdisc        rpcidmapd   saslauthd  svnserve

        functions  killall    netfs       nmb      restorecond  rpcsvcgssd  single     udev-post


例:chkconfig

        atd               0:关闭1:关闭2:关闭3:启用4:启用5:启用6:关闭

        auditd          0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭

        crond           0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭

        ip6tables      0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭

        iptables        0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭

        在chkconfig命令中看到的“0:关闭”就表示在/etc/rc.d/rc0.d目录中有一个K开头的文件,表示在这个运行级别下这个服务是关闭的。同理:“3:启用”表示系统运行在3级别下这个服务是启动的并且在/etc/rc.d/rc3.d目录中有一个S开头的文件。


说明:rc 0 --> 意味着读取/etc/rc.d/rc0.d/

        K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务。

        S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务。

        管理这些文件的脚本类似于下面这样的:

        for srv in /etc/rc.d/rc0.d/K*; do

        $srv stop

        done

        

        for srv in /etc/rc.d/rc0.d/S*; do

        $srv start

        done


将自定义脚本加入到系统服务中

        自定义脚本要想加入系统服务在脚本的头部分有固定格式,格式如下,其中chkconfig:   345 66 33中的345代表在3、4、5启动级别下是S级别,也就是启动级别,中间的66代表启动的优先级,最后一个33表示关闭优先级,假如自定义脚本名为demo.sh,则最终在S级别下的文件的形式为S66demo.sh,在K级别下的文件为K33demo.sh。


自定义脚本demo.sh,这个脚本要放在目录/etc/rc.d/init.d中。

        #!/bin/bash

        #

        # chkconfig:   345 66 33

        # description: 任意的描述信息

        添加执行权限:chmod +x demo.sh

        写完脚本后使用chkconfig --add demo.sh将脚本加入系统服务。使用chkconfig --list demo.sh查看是否加入成。

        例:chkconfig --list demo.sh 

        demo.sh        0:关闭1:关闭2:关闭3:启用4:启用5:启用6:关闭

检查一下在对应的目录下是否有对应的文件:

        ls -al /etc/rc0.d/K33demo.sh 

        lrwxrwxrwx. 1 root root 17 12月  7 10:29 /etc/rc0.d/K33demo.sh -> ../init.d/demo.sh

        ls -al /etc/rc3.d/S66demo.sh 

        lrwxrwxrwx. 1 root root 17 12月  7 10:29 /etc/rc3.d/S66demo.sh -> ../init.d/demo.sh


删除系统服务:

        刚才添加的系统服务可以用chkconfig --del命令删除,但是脚本并没有删除。/etc/rc.d/init.d/demo.sh这个脚本依然存在,只要再添加一次任然可以运行。

        例:chkconfig --del /etc/rc.d/init.d/demo.sh


修改运行级别:

        修改指定的服务运行级别,默认为2345下on。

        chkconfig --level 345  iptables


最后启动的服务:

        不适合放入系统服务的脚本可以放入/etc/rc.local中执行,在这里的脚本会在系统启动所有服务后再执行。