rc.local不执行,不生效(rc.d rc.local rc.sysinit 等系统脚本启动顺序)

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 等系统脚本启动顺序,让你在使用这些脚本时能得心应手。

rc.d rc.local rc.sysinit等系统脚本启动顺序

Linux系统有多个命令如service, setup , chkconfig 控制系统服务和启动脚本的设置。

一、Redhat 系统启动顺序

Redhat 系统按如下系统启动:

  1. 加载内核
  2. 执行init程序
  3. /etc/rc.d/rc.sysinit   # 由init执行的第一个脚本
  4. /etc/rc.d/rc${RUNLEVEL}d/* # $RUNLEVEL为缺省的运行模式
  5. /etc/rc.d/rc.local     #相应级别服务启动之后、在执行该文件(其实也可以把需要执行的命令写到该文件中)
  6. /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 代替, 后一位代表示当前运行级别。

  • 设置和修改运行级别的几种方式:

这些设置运行级别的方法一般不会随便使用,且都有使用惯例。

  1. 在启动的时候指定运行级别,在GRUB的系统选择时选择修改设置,如默认启动级别是3或5时,可以修改为 1 或其它数字代表的运行级别,1 也可以用 single 代替,这种用法一般用于系统紧急修复或特殊情况。如第二行最后添加运行级别的数字即可: (下图将进入运行级别 runlevel 1 )
    GRUB 修改 运行级别
  2. 在使用 运行级别 3 即文字界面时 要切换到 图形界面 5 ,则使用以下命令:
    1
    [root@localhost init.d]# startx
  3. init 命令控制运行级别,如下:
    1
    2
    3
    4
    # 重启
    [root@localhost init.d]# init 6
    # 关机
    [root@localhost init.d]# init 0
  4. 修改默认运行级别,在前面已经讲过,修改 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:
总计 108
drwxr-xr-x 2 root root  4096 07-18 15:19 init.d
-rwxr-xr-x 1 root root  2255 2008-11-13 rc
drwxr-xr-x 2 root root  4096 07-18 15:19 rc0.d
drwxr-xr-x 2 root root  4096 07-18 15:19 rc1.d
drwxr-xr-x 2 root root  4096 07-19 09:20 rc2.d
drwxr-xr-x 2 root root  4096 07-19 09:20 rc3.d
drwxr-xr-x 2 root root  4096 07-19 09:20 rc4.d
drwxr-xr-x 2 root root  4096 07-19 09:20 rc5.d
drwxr-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/
总计 268
lrwxrwxrwx 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 MB
free -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}"
        ;;
esac
exit $RETVAL

注意以下几个地方:

  • 在注释中包括
    1
    # chkconfig: 2345 4 99

    这一行是必需的,其中 2345 表示运行级别,如果这个服务默认在任何级别都不启动,则使用 – 代替。4 表示启动顺序,99 表示杀死顺序。

  • 注释中的描述必须包含,多行描述在行尾使用 \ ,如下:
    1
    2
    3
    # 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=0
 
start() {
        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
esac
 
exit $RETVAL

至此,你应该对 rc.d rc.local rc.sysinit 这些脚本有了全盘的了解与认识了。

 

posted @ 2012-07-26 15:27  陳聽溪  阅读(2862)  评论(0)    收藏  举报