参阅CU上的很多关于rc的帖子,于是非常想弄清楚Linux/Unix到底是如何启动的?rc脚本有是如何起作用的?
幸亏goole什么都知道。
罗列一篇,方便类我等菜鸟来温习和查阅,以Solaris为例
按下电源,首先是BIOS取得系统控制权,BIOS进行最初的引导工作,然后交控制权交给引导分区,由引导分区加载内核并调用start_kernel函数。
内核首先引导核心数据结构的初始化,在start_kernel函数中完成如下工作:
至此start_kernel()结束,基本的核心环境已经建立起来了。
start_kernel最后一项是启动了init函数,接着由它来完成外设的初始化
这些步骤结束后,init()搜索文件系统中的init程序,并创建它,也就是我们通常所说的init进程,它是系统所有进程的起点,进程ID=1。
在启动了的Solaris下,利用 "$ps -p 1" 可以查看该进程,输出如下:
PID TTY TIME CMD
1 ? 0:01 init
接下来init进程读取/etc/inittab文件,来决定下一步如何做。
inittab是以行为单位的描述性(非执行性)文本,每一个指令行都具有以下格式:
id:runlevel:action:process 其中id为入口标识符,runlevel为运行级别,action为动作代号,process为具体的执行程序。
id一般要求4个字符以内,runlevel是init所处于的运行级别的标识,一般使用0-6以及S或s(S或s表示单用户模式)。
action字段则告诉init进程,如何对待process字段指定的进程:当inittab中各行的runlevel值与当前运行级别匹配时,指定的action才被执行。
但有几个特殊的action:
initdefault是一个特殊的action值,用于标识缺省的启动级别;当init由核心激活以后,它将首先读取inittab中的initdefault项,取得其中的runlevel,并作为当前的运行级别。
sysinit、boot、bootwait等action将在系统启动时无条件运行,而忽略其中的runlevel,即不管当前运行级别是什么,它都执行,并且是优先执行。其余的action(不含initdefault)都与某个runlevel相关。
我的Solaris9中的/etc/inittab如下
ap::sysinit:/sbin/autopush -f /etc/iu.ap #action=sysinit, 该行不管在什么运行级别下,都运行
ap::sysinit:/sbin/soconfig -f /etc/sock2path #同上
fs::sysinit:/sbin/rcS sysinit >/dev/msglog 2<>/dev/msglog
is:3:initdefault: #该行action=initdefault,表明系统的默认运行级别是3
p3:s1234:powerfail:/usr/sbin/shutdown -y -i5 -g0 >/dev/msglog 2<>/dev/msglog
sS:s:wait:/sbin/rcS >/dev/msglog 2<>/dev/msglog
s0:0:wait:/sbin/rc0 >/dev/msglog 2<>/dev/msglog
s1:1:respawn:/sbin/rc1 >/dev/msglog 2<>/dev/msglog
s2:23:wait:/sbin/rc2 >/dev/msglog 2<>/dev/msglog
s3:3:wait:/sbin/rc3 >/dev/msglog 2<>/dev/msglog
s5:5:wait:/sbin/rc5 >/dev/msglog 2<>/dev/msglog
s6:6:wait:/sbin/rc6 >/dev/msglog 2<>/dev/msglog
fw:0:wait:/sbin/uadmin 2 0 >/dev/msglog 2<>/dev/msglog
of:5:wait:/sbin/uadmin 2 6 >/dev/msglog 2<>/dev/msglog
rb:6:wait:/sbin/uadmin 2 1 >/dev/msglog 2<>/dev/msglog
sc:234:respawn:/usr/lib/saf/sac -t 300 #在2,3,4运行级别下都执行
co:234:respawn:/usr/lib/saf/ttymon -g -h -p "`uname -n` console login: " -T sun -d /dev/console -l console -m ldterm,ttcompat
去man inittab吧,什么都讲了 :)
接着看我的inittab文件,当action=sysinit的行执行完之后(前三行),将执行runlevel=3的行,即“ s3:3:wait:/sbin/rc3 ”。查找了一下,/sbin/rc3是一个shell脚本,用于初始化在运行级别3的系统。因此/etc/inittab中已经定义好了在运行级别X下,就运行 /sbin/rcX,那/sbin/rcX到底是什么?
cat一下/sbin/rc3,看看,重要的几行代码如下:
[ $_INIT_PREV_LEVEL = 2 -o $_INIT_PREV_LEVEL = 4 ] && \
echo 'Changing to state 3.' #如果以前运行级别是2或4,则打印信息“切换到状态三”
#如果运行级别!=4而且存在/etc/rc3.d这个目录,则停掉所有以K开始的脚本中的服务或程序,启动所有以S开始的脚本中的服务或程序
if [ $_INIT_PREV_LEVEL != 4 -a -d /etc/rc3.d ]; then
for f in /etc/rc3.d/K*; do
if [ -s $f ]; then
case $f in
*.sh) . $f ;;
*) /sbin/sh $f stop ;;
esac
fi
done
for f in /etc/rc3.d/S*; do
if [ -s $f ]; then
case $f in
*.sh) . $f ;;
*) /sbin/sh $f start ;;
esac
fi
done
fi
那就再追踪到/etc/rc3.d下面去,好累啊 :(
#cd /etc/rc3.d
K42amserver S13kdc.master S15nfs.server S34dhcp S50apache S52imq S77dmi S81volmgt S89sshd
README S14kdc S16boot.server S42amserver S50san_driverchk S76snmpdx S80mipagent S84appserv S90samba
哦,都是些程序或进程的启动脚本,S开头是启动脚本 K开头是停止脚本。这正是/sbin/rc3这个shell脚本中设定的执行方式。
例如:S90samba 代表一个启动samba服务的脚本,90表示启动顺序编号。 K42amserver代表结束服务的脚本。
rc程序执行完毕后,系统环境已经设置好了,下面就该用户登录系统了,终于结束了。
最后看张图,画的很清楚http://chinaunix.net/jh/4/31269.html
http://www-128.ibm.com/developerworks/cn/linux/kernel/startup/index.html#2
http://www.yesky.com/SoftChannel/72350098490654720/20040208/1766282.shtml