http://topic.csdn.net/u/20101127/21/870a0645-958d-4223-b155-68bdf2b8e6c0.html
rc.local文件 本身的文件是在/etc/rc.d/rc.local
/etc/rc.local是一个到/etc/rc.d/rc.local的软连接
/etc/rc3.d/S99local
/etc/rc5.d/S99local
这2个又分别是到/etc/rc.local的软连接
你一会确认一下
/etc/rc3.d/S99local
/etc/rc5.d/S99local
里 是不是有你添加的内容 如果没有 肯定就是连接被破坏了
http://www.jsxubar.info/linux-rc-d-rc-local-rc-sysinit.html
本文详细解析了 Linux系统 rc.d rc.local rc.sysinit 等系统脚本启动顺序,让你在使用这些脚本时能得心应手。
Linux系统有多个命令如service, setup , chkconfig 控制系统服务和启动脚本的设置。
一、Redhat 系统启动顺序
Redhat 系统按如下系统启动:
- 加载内核
- 执行init程序
- /etc/rc.d/rc.sysinit # 由init执行的第一个脚本
- /etc/rc.d/rc${RUNLEVEL}d/* # $RUNLEVEL为缺省的运行模式
- /etc/rc.d/rc.local #相应级别服务启动之后、在执行该文件(其实也可以把需要执行的命令写到该文件中)
- /sbin/mingetty # 等待用户登录
其中 /etc/rc.d/rc.sysinit 执行与运行模式(即runlevel,包括1,2,3,4,5,6六个级别)无关的相同的初始化任务:
- 调入keymap以及系统字体
- 启动swapping
- 设置主机名
- 设置NIS域名
- 检查(fsck)并mount文件系统
- 打开quota
- 装载声卡模块
- 设置系统时钟
- 其它
执行完 rc.sysinit 脚本之后,系统根据运行模式选择相应的/etc/rc.d/rcx.d 。其中运行模式从/etc/inittab 文件行:
|
1
|
id:3:initdefault:
|
取得。稍后会讲到每个数字代表的运行模式。
执行完 /etc/rc.d/rcn.d (这里的n 就是运行级0-6)下相应的脚本之后,就执行 /etc/rc.local 文件的内容。
再接下来等待登录,登录时会执行一系列用户环境的初始化脚本,可以参考 bashrc,bash_profile等shell配置文件详解 。
二、运行级别 runlevel 详解
1、什么是INIT
init是Linux系统操作中不可缺少的程序之一。
所谓的init进程,它是一个由内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
2、运行级别
运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。
不同的运行级定义如下:
- 0 – 停机(千万不能把initdefault 设置为0 )
- 1 – 单用户模式
- 2 – 多用户,没有 NFS
- 3 – 完全多用户模式,命令行文字界面
- 4 – 没有用到
- 5 – X11 多用户图形模式,采用xwindow
- 6 – 重新启动
这些级别和默认系统启动级别在/etc/inittab 文件里指定。
这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。
- 查看运行级别:使用 runlevel 命令查看
|
1
2
|
[root@localhost init.d]# runlevel
N 3 |
runlevel 使用的是 utmp (一般是文件 /var/run/utmp )的数据,命令输出两部分,前一位代表之前的运行级别,若没有则用 N 代替, 后一位代表示当前运行级别。
- 设置和修改运行级别的几种方式:
这些设置运行级别的方法一般不会随便使用,且都有使用惯例。
- 在启动的时候指定运行级别,在GRUB的系统选择时选择修改设置,如默认启动级别是3或5时,可以修改为 1 或其它数字代表的运行级别,1 也可以用 single 代替,这种用法一般用于系统紧急修复或特殊情况。如第二行最后添加运行级别的数字即可: (下图将进入运行级别 runlevel 1 )
- 在使用 运行级别 3 即文字界面时 要切换到 图形界面 5 ,则使用以下命令:
1
[root@localhost init.d]# startx - init 命令控制运行级别,如下:
1234
# 重启[root@localhost init.d]# init 6# 关机[root@localhost init.d]# init 0 - 修改默认运行级别,在前面已经讲过,修改 inittab 文件:
1
id:3:initdefault:
这些方法不要滥用,这些命令平常使用较少。
三 、/etc/rc.d/rcn.d 详解
我使用的系统版本是CentOS 5.8,查看 /etc/ 目录下以rc开头的文件和目录:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@localhost init.d]# ls /etc/rc.* -l
lrwxrwxrwx 1 root root 13 2011-04-03 /etc/rc.local -> rc.d/rc.local
lrwxrwxrwx 1 root root 15 2011-04-03 /etc/rc.sysinit -> rc.d/rc.sysinit
/etc/rc.d:
总计 108drwxr-xr-x 2 root root 4096 07-18 15:19 init.d-rwxr-xr-x 1 root root 2255 2008-11-13 rcdrwxr-xr-x 2 root root 4096 07-18 15:19 rc0.ddrwxr-xr-x 2 root root 4096 07-18 15:19 rc1.ddrwxr-xr-x 2 root root 4096 07-19 09:20 rc2.ddrwxr-xr-x 2 root root 4096 07-19 09:20 rc3.ddrwxr-xr-x 2 root root 4096 07-19 09:20 rc4.ddrwxr-xr-x 2 root root 4096 07-19 09:20 rc5.ddrwxr-xr-x 2 root root 4096 07-18 15:19 rc6.d-rwxr-xr-x 1 root root 453 03-16 00:44 rc.local
-rwxr-xr-x 1 root root 27183 2008-11-13 rc.sysinit |
可以看到 /etc/rc.sysinit 和 /etc/local 都是软链接,实际文件在 /etc/rc.d 目录下面。
其实 /etc/init.d 采用的也是类似的方式,如下所示:
|
1
2
|
[root@localhost init.d]# ls /etc/init.d -l
lrwxrwxrwx 1 root root 11 2011-04-03 /etc/init.d -> rc.d/init.d
|
我们再来看看 /etc/rc.d/rcn.d 里面的内容,挑一个典型常用的 3 级别的目录,文件如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
[root@localhost init.d]# ls -l /etc/rc.d/rc3.d/
总计 268lrwxrwxrwx 1 root root 17 2011-04-03 K01dnsmasq -> ../init.d/dnsmasq
lrwxrwxrwx 1 root root 24 2011-04-03 K02avahi-dnsconfd -> ../init.d/avahi-dnsconfd
lrwxrwxrwx 1 root root 24 2011-04-03 K02NetworkManager -> ../init.d/NetworkManager
lrwxrwxrwx 1 root root 16 2011-04-03 K05conman -> ../init.d/conman
lrwxrwxrwx 1 root root 19 2011-04-03 K05saslauthd -> ../init.d/saslauthd
lrwxrwxrwx 1 root root 17 2011-04-03 K05wdaemon -> ../init.d/wdaemon
lrwxrwxrwx 1 root root 16 2011-04-03 K10psacct -> ../init.d/psacct
lrwxrwxrwx 1 root root 13 2011-04-03 K20nfs -> ../init.d/nfs
lrwxrwxrwx 1 root root 14 2011-04-03 K24irda -> ../init.d/irda
lrwxrwxrwx 1 root root 13 2011-04-03 K35smb -> ../init.d/smb
lrwxrwxrwx 1 root root 19 2011-04-03 K35vncserver -> ../init.d/vncserver
lrwxrwxrwx 1 root root 17 2011-04-03 K35winbind -> ../init.d/winbind
lrwxrwxrwx 1 root root 20 2011-04-03 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx 1 root root 20 2011-04-03 K69rpcsvcgssd -> ../init.d/rpcsvcgssd
lrwxrwxrwx 1 root root 16 2011-04-03 K73ypbind -> ../init.d/ypbind
lrwxrwxrwx 1 root root 14 03-15 23:12 K74ipmi -> ../init.d/ipmi
lrwxrwxrwx 1 root root 14 2011-04-03 K74nscd -> ../init.d/nscd
lrwxrwxrwx 1 root root 14 2011-04-03 K74ntpd -> ../init.d/ntpd
lrwxrwxrwx 1 root root 15 2011-04-03 K80kdump -> ../init.d/kdump
lrwxrwxrwx 1 root root 15 2011-04-03 K85mdmpd -> ../init.d/mdmpd
lrwxrwxrwx 1 root root 20 2011-04-03 K87multipathd -> ../init.d/multipathd
lrwxrwxrwx 1 root root 24 2011-04-03 K88wpa_supplicant -> ../init.d/wpa_supplicant
lrwxrwxrwx 1 root root 14 2011-04-03 K89dund -> ../init.d/dund
lrwxrwxrwx 1 root root 18 2011-04-03 K89netplugd -> ../init.d/netplugd
lrwxrwxrwx 1 root root 14 2011-04-03 K89pand -> ../init.d/pand
lrwxrwxrwx 1 root root 15 2011-04-03 K89rdisc -> ../init.d/rdisc
lrwxrwxrwx 1 root root 25 2011-04-03 K99readahead_later -> ../init.d/readahead_later
lrwxrwxrwx 1 root root 23 2011-04-03 S00microcode_ctl -> ../init.d/microcode_ctl
lrwxrwxrwx 1 root root 22 2011-04-03 S02lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx 1 root root 25 07-19 09:20 S04readahead_early -> ../init.d/readahead_early
lrwxrwxrwx 1 root root 15 2011-04-03 S05kudzu -> ../init.d/kudzu
lrwxrwxrwx 1 root root 18 2011-04-03 S06cpuspeed -> ../init.d/cpuspeed
lrwxrwxrwx 1 root root 19 2011-04-03 S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx 1 root root 18 2011-04-03 S08iptables -> ../init.d/iptables
lrwxrwxrwx 1 root root 18 2011-04-03 S08mcstrans -> ../init.d/mcstrans
lrwxrwxrwx 1 root root 17 2011-04-03 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 16 2011-04-03 S11auditd -> ../init.d/auditd
lrwxrwxrwx 1 root root 21 2011-04-03 S12restorecond -> ../init.d/restorecond
lrwxrwxrwx 1 root root 16 2011-04-03 S12syslog -> ../init.d/syslog
lrwxrwxrwx 1 root root 20 2011-04-03 S13irqbalance -> ../init.d/irqbalance
lrwxrwxrwx 1 root root 17 2011-04-03 S13portmap -> ../init.d/portmap
lrwxrwxrwx 1 root root 24 2011-04-03 S13setroubleshoot -> ../init.d/setroubleshoot
lrwxrwxrwx 1 root root 17 2011-04-03 S14nfslock -> ../init.d/nfslock
lrwxrwxrwx 1 root root 19 2011-04-03 S15mdmonitor -> ../init.d/mdmonitor
lrwxrwxrwx 1 root root 19 2011-04-03 S18rpcidmapd -> ../init.d/rpcidmapd
lrwxrwxrwx 1 root root 17 2011-04-03 S19rpcgssd -> ../init.d/rpcgssd
lrwxrwxrwx 1 root root 20 2011-04-03 S22messagebus -> ../init.d/messagebus
lrwxrwxrwx 1 root root 19 2011-04-03 S25bluetooth -> ../init.d/bluetooth
lrwxrwxrwx 1 root root 15 2011-04-03 S25netfs -> ../init.d/netfs
lrwxrwxrwx 1 root root 15 2011-04-03 S25pcscd -> ../init.d/pcscd
lrwxrwxrwx 1 root root 14 2011-04-03 S26hidd -> ../init.d/hidd
lrwxrwxrwx 1 root root 16 2011-04-03 S28autofs -> ../init.d/autofs
lrwxrwxrwx 1 root root 15 2011-04-03 S44acpid -> ../init.d/acpid
lrwxrwxrwx 1 root root 14 2011-04-03 S55sshd -> ../init.d/sshd
lrwxrwxrwx 1 root root 14 2011-04-03 S56cups -> ../init.d/cups
lrwxrwxrwx 1 root root 16 2011-04-03 S56xinetd -> ../init.d/xinetd
lrwxrwxrwx 1 root root 18 2011-04-03 S80sendmail -> ../init.d/sendmail
lrwxrwxrwx 1 root root 13 2011-04-03 S85gpm -> ../init.d/gpm
lrwxrwxrwx 1 root root 15 2011-04-03 S90crond -> ../init.d/crond
lrwxrwxrwx 1 root root 13 2011-04-03 S90xfs -> ../init.d/xfs
lrwxrwxrwx 1 root root 17 2011-04-03 S95anacron -> ../init.d/anacron
lrwxrwxrwx 1 root root 13 2011-04-03 S95atd -> ../init.d/atd
lrwxrwxrwx 1 root root 15 2011-04-03 S97rhnsd -> ../init.d/rhnsd
lrwxrwxrwx 1 root root 22 2011-04-03 S97yum-updatesd -> ../init.d/yum-updatesd
lrwxrwxrwx 1 root root 22 2011-04-03 S98avahi-daemon -> ../init.d/avahi-daemon
lrwxrwxrwx 1 root root 19 2011-04-03 S98haldaemon -> ../init.d/haldaemon
lrwxrwxrwx 1 root root 19 2011-04-03 S99firstboot -> ../init.d/firstboot
lrwxrwxrwx 1 root root 11 2011-04-03 S99local -> ../rc.local
lrwxrwxrwx 1 root root 16 2011-04-03 S99smartd -> ../init.d/smartd
|
可以看到 这里面的文件都是以K或S开头,然后接一个数字,再接上一个服务名称,而且都是/etc/rc.d/init.d 目录下的文件的软链接。S表示启动,K表示杀死,数字表示启动顺序,数字来自于 /etc/rc.d/init.d 脚本内部,表示顺序,从小到大依次执行。
四、init.d 脚本详解
我们选一个 /etc/init.d/ 目录下比较简单的脚本来分析,如readahead_early ,这个脚本的内容如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#!/bin/sh## readahead: Prereads programs required for startup into memory## chkconfig: 2345 4 99# description: This service causes the programs used during startup \# to be loaded into memory before they are needed,\# thus improving startup performance### Sanity checks.[ -x /usr/sbin/readahead ] || exit 0
# Check for > 384 MBfree -m | gawk '/Mem:/ {exit ($2 >= 384)?0:1}' || exit 0
# Source function library.. /etc/rc.d/init.d/functions
start() { echo -n $"Starting background readahead: "
FILES=$( ls /etc/readahead.d/*.early )
/usr/sbin/readahead $FILES >/dev/null &
echo_success
echo
}stop() { /bin/true
}# See how we were called.case "$1" in
start)
start
;;
stop)
stop
;;
status)
;;
restart)
stop
start
;;
condrestart)
;;
reload)
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
;;
esacexit $RETVAL
|
注意以下几个地方:
- 在注释中包括
1
# chkconfig: 2345 4 99这一行是必需的,其中 2345 表示运行级别,如果这个服务默认在任何级别都不启动,则使用 – 代替。4 表示启动顺序,99 表示杀死顺序。
- 注释中的描述必须包含,多行描述在行尾使用 \ ,如下:
123
# description: This service causes the programs used during startup \# to be loaded into memory before they are needed,\# thus improving startup performance - . /etc/rc.d/init.d/functions 行,这是包含 /etc/rc.d/init.d/functions 这个文件,这个文件提供了一些函数供使用,如echo_success(), echo_failure()
- 脚本一般包含 start(), stop(), restart(), status() 这几个标准函数
- 脚本使用一个 case 选择操作符来进行相应的操作
- $RETVAL 表示返回值
在上面的 readahead_early 可能无法体现 $RETVAL 的作用,在下面这个yum-updatesd 这个服务中可以清楚看到:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
#!/bin/bash## yum Update notification daemon## Author: Jeremy Katz <katzj@redhat.com>## chkconfig: 345 97 03## description: This is a daemon which periodically checks for updates \# and can send notifications via mail, dbus or syslog.# processname: yum-updatesd# config: /etc/yum/yum-updatesd.conf# pidfile: /var/run/yum-updatesd.pid#### BEGIN INIT INFO# Provides: yum-updatesd# Required-Start: $syslog $local_fs messagebus# Required-Stop: $syslog $local_fs messagebus# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Short-Description: Update notification daemon# Description: Daemon which notifies about available updates via mail, dbus or# syslog. Can also be configured to automatically apply updates.### END INIT INFO# source function library. /etc/rc.d/init.d/functions
RETVAL=0start() { echo -n $"Starting yum-updatesd: "
daemon +19 'yum-updatesd &'
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/yum-updatesd
}stop() { echo -n $"Stopping yum-updatesd: "
killproc yum-updatesd
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/yum-updatesd
}restart() { stop
start
}case "$1" in
start)
start
;;
stop)
stop
;;
restart|force-reload|reload)
restart
;;
condrestart|try-restart)
[ -f /var/lock/subsys/yum-updatesd ] && restart
;;
status)
status yum-updatesd
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
exit 1
esacexit $RETVAL
|
至此,你应该对 rc.d rc.local rc.sysinit 这些脚本有了全盘的了解与认识了。