原文地址:http://blog.csdn.net/soulxu/archive/2008/05/11/2432942.aspx
Linux 启动脚本 完全注释 1 -- 整体流程
1.由引导程序(grub)加载内核,内核初始化
2.由内核调用初始化程序由内核参数 init="" 指定,默认为"/sbin/init"
3.init依照"/etc/inittab", 启动系统
先执行 K 开头的(按从低到高),再执行S开头的(从低到高)
------------------------------------------------------------------------------
#默认为6个运行级别,加上一个系统初始化脚本,同过传递参数给rc脚本,来运行各个级别的初始化,个级别的脚本放在"/etc/rc.d/rcX.d".
#"/etc/rc.d/rcX.d"中的脚本都为/etc/rc.d/init.d中的链接文件,脚本命名为 Sxxxx和Kxxxx, S为start,,K为Stop, xxxx为数字,是调用的顺序,从小到大,由rc传递个给该脚本,并按顺序调用.
#"/etc/rc.d/init.d"中的脚本,都可以接受三种参数start, stop, restart.
#记录格式
# id:rstate:action:process
# id: 4个字符的唯一标识
# rstate: 被调用的运行级别, 可以为多个级别,为空则是所有级别
# action: 执行的动作。
# respawn: 如果该进程不存在,则运行,并继续扫描inittab,执行其他项目。如果改进程结束,init将,重启该进程
# wait: 运行该进程,并等待结束,在处理其他记录
# once: 运行该进程,并继续其他记录,进程中止了也不在运行
# sysinit: 只有在启动或重启并首先进入单用户模式时调用。并等待结束,不指定运行界别
# initdefault: 指定默认级别,如果没指定,则要求用户指定一个
# ctrlaltdel: 同时按下ctrl+alt+del键执行
# boot: 系统启动时调用,并继续其他记录,进程中止,不在运行
# bootwait: 第一次从单用户到多用户模式时调用,并等待结束,中止不再运行
# powerfail: 当接到断电信号(SIGPWR), 运行
# powerwait: 同上,并等待结束
# off: 如果指定进程存在,则向它发出SIGTERM
# ondemand: 同respawn, 但与运行级别无关,只用于a,b,c字段
# process: 指定要运行的进程
# Begin /etc/inittab
id:3:initdefault: # 默认初始化级别
si::sysinit:/etc/rc.d/init.d/rc sysinit # 系统初始化运行的脚本
10:0:wait:/etc/rc.d/init.d/rc 0 # 0-6运行界别 0为关机,6为重启,1为单用户,3为多用户,5为x
11:S1:wait:/etc/rc.d/init.d/rc 1
12:2:wait:/etc/rc.d/init.d/rc 2
13:3:wait:/etc/rc.d/init.d/rc 3
14:4:wait:/etc/rc.d/init.d/rc 4
15:5:wait:/etc/rc.d/init.d/rc 5
16:6:wait:/etc/rc.d/init.d/rc 6
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now # ctrl+alt+del时,重启
su:S016:once:/sbin/sulogin # ?
1:2345:respawn:/sbin/agetty tty1 9600 #控制台,agetty初始化控制台,然后调用login程序,当用户退出时,重新调用agetty
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600
# End /etc/inittab
------------------------------------------------------------------------------
------------------------------------------------------------------------------
init初始化的脚本过程
所有启动脚本 /etc/rc.d/init.d/
运行级别控制函数 /etc/rc.d/init.d/function
主要运行级别控制脚本 /etc/rc.d/init.d/rc
rc脚本配置 /etc/sysconfig/rc 设置启动脚本的目录,运行级别控制函数脚本目录位置,网络配置目录
------------------------------------------------------------------------------
由inittab指定运行agetty,agetty运行login程序,等待登录
启动 login shell (默认是 /bin/sh),并执行 ~/.bashprofile
~/.bashprofile 会自动执行 ~/.bashrc ,而 ~/.bashrc 又调用 /etc/bashrc
Linux 启动脚本 完全注释2 --- rc脚本注释
从/etc/inittab中可以看出,启动的核心就是rc脚本.
首先init程序调用rc脚本,并将级别传递给rc脚本.
其次rc脚本去调用该级别内(/etc/rcX.d)各项服务的脚本.
rc脚本的注释如下:
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/rc
#
# Description : Main Run Level Control Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc #指定rc_bash=/etc/rc.d rc_functions = ${rc_bash}/init.d/functions network_devices=/etc/sysconfig/network-devices
. ${rc_functions}
# This sets a few default terminal options.
stty sane
# These 3 signals will not cause our script to exit
trap "" INT QUIT TSTP #trap是bash内建的命令,用来指定信号的行为,“”为忽略该信号
[ "${1}" != "" ] && runlevel=${1} #从参数中得到运行级别,在/etc/inittab中指定的
if [ "${runlevel}" = "" ]; then #运行级别为空则退出
fi
previous=${PREVLEVEL} #前一个级别
[ "${previous}" = "" ] && previous=N #没有前一级别则为n
if [ ! -d ${rc_base}/rc${runlevel}.d ]; then #是否有该级别的目录
fi
# Attempt to stop all service started by previous runlevel,
# and killed in this runlevel
#结束该级别中K开头的脚本
if [ "${previous}" != "N" ]; then #如果有前一个级别
fi
#Start all functions in this runlevel
#开始所有S开头的脚本
for i in $( ls -v ${rc_base}/rc${runlevel}.d/S* 2> /dev/null) #获得每个脚本
do