Linux的那些事-系统启动(增加开机启动项)
1 /etc/init.d
2 /etc/inittab
3 /etc/rc.d/init.d
1. /etc/init.d 是一般开机的启动服务存放在这个目录下,至于实现机制,其实/etc/init.d是一个符号链接文件,链接指向/etc/rc.d/init.d
如下 lrwxrwxrwx. 1 root root 11 Jul 4 00:30 init.d -> rc.d/init.d
2. /etc/inittab
Init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。
root 1 0.0 0.1 19356 1352 ? Ss 09:11 0:03 /sbin/init
init进程上来首先做的事是去读取/etc/inittab文件中initdefault id值,这个值称为运行级别(run-level)。它决定了系统启动之后运行于什么级别。运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6 ,具有不同的功能。不同的运行级定义如下:
# 0 - 停机 千万别把initdefault设为0,否则系统永远无法启动
# 1 - 单用户模式
# 2 - 多用户,没有 NFS(网络文件系统)
# 3 - 完全多用户模式(标准的运行级)
# 4 – 系统保留的
# 5 - X11 (x window 可视桌面)
# 6 - 重新启动 (千万不要把initdefault 设置为6,否则将一直在重启 )
3. /etc/rc.d/init.d
先说rc.d目录吧,其下有这些目录
目录文件: init.d rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d SH
文件: rc rc.local rc.sysinit
init.d :各种服务器和程序的二进制文件存放目录。
rc:则根据其参数指定的运行模式
redhat的启动方式和执行次序是:
- 加载内核:
- 执行init程序:
#init进程的编号(PID)永远是1
Init的工作是根据/etc/inittab来执行相应的脚本 - /etc/rc.d/rc.sysinit:
# 由init执行的第一个脚本 运行模式初始化工作,是每一个运行级别都要首先运行的重要脚本 - /etc/rc.d/rc $RUNLEVEL :
# $RUNLEVEL为缺省的运行模式
至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig来自行设定 - /etc/rc.d/rc.local:
RHEL 4中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后、登录之前执行的命令 - /sbin/mingetty :
# 等待用户登录
系统是如何选择哪些需要启动哪些不要呢?这时刚才说的运行级别就起作用了。在决定了系统启动的run level之后,/etc/rc.d/rc这个脚本先执行。知道了运行级别之后,对于每一个运行级别,在rc.d下都有一个子目录分别是rc0.d,rc1.d ….. rc6.d。每个目录下都是到init.d目录的一部分脚本一些链接。每个级别要执行哪些服务就在相对应的目录下,比如级别5要启动的服务就都放在rc5.d下,但是放在这个rc5.d下的都是一些链接文件,链接到init.d中相对应的文件,真正干活到init.d里的脚本。
init在等待/etc/rc.d/rc执行完毕之后(因为在/etc/inittab中/etc/rc.d/rc的action是wait),将在指定的各个虚拟终端上运行/sbin/mingetty,等待用户的登录。
至此,LINUX的启动结束。
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
#在文件末尾(exit 0之前)加上你开机需要启动的程序或执行的命令即可(执行的程序需要写绝对路径,添加到系统环境变量的除外),如