系统初始化:
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中执行,在这里的脚本会在系统启动所有服务后再执行。