LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: drowsyboy

LFS启动脚本分析,以及相关配置文件理解

[复制链接]
 楼主| 发表于 2005-11-16 13:11:26 | 显示全部楼层
怎么一发上来,格式就乱了呢
回复 支持 反对

使用道具 举报

发表于 2005-11-16 22:35:01 | 显示全部楼层
Sir的文字编辑器不懂得留空格的说
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-18 09:08:15 | 显示全部楼层

运行等级切换分析

在初始化rc脚本注释中,我们介绍了系统起动和运行等级切换时,系统大概要做哪些工作,现在我们来具体分析一下,默认等级为3,机器从开机到初始化完成具体做了哪些工作。
一、系统刚开机的启动分析
  首先,我们知道不管是哪种原因进入init进程,必然会按以下命令si::sysinit:/etc/rc.d/init.d/rc sysinit生成一个初始化进程,现在刚开机,这个子进程自然也会得到运行。在以sysinit为参数调用rc脚本,后将执行以下操作:
1、载入/etc/sysconfig/rc中的变量和functions中的函数,设置终端显示参数和信号处理方式;
2、由于刚开机,前一个运行级别被设为N;
3、previous=N,所以等级切换部分跳过,也就是找以K开头的那部分不做(事实上rcsysinit.d中也不存在以K开头的服务)
4、找出rcsysinit.d中所有以S开头的服务,具体为:
                /etc/rc.d/rcsysinit.d/S00mountkernfs
                /etc/rc.d/rcsysinit.d/S05modules
                /etc/rc.d/rcsysinit.d/S10udev
                /etc/rc.d/rcsysinit.d/S20swap
                /etc/rc.d/rcsysinit.d/S30checkfs
                /etc/rc.d/rcsysinit.d/S40mountfs
                /etc/rc.d/rcsysinit.d/S50cleanfs
                /etc/rc.d/rcsysinit.d/S60setclock
                /etc/rc.d/rcsysinit.d/S70console
                /etc/rc.d/rcsysinit.d/S80localnet
5、由于previous=N,刚开机且runlevel=sysinit,所以以上的服务被依此启动
6、以上服务启动完成后,该子进程结束。

关于以上服务的具体代码注释将在单独的文件中给出。

由于默认的运行等级3,所以系统在rc sysinit子进程结束后,将启动13:3:wait:/etc/rc.d/init.d/rc 3,即以参数3,运行脚本rc,分析一下过程:
1、初始同上;
2、刚开机,不执第一个循环判,即查找以K开头的服务
3、在查找以S开头的服务时,只有以下两个服务存在
                /etc/rc.d/rc3.d/S10sysklogd  
                /etc/rc.d/rc3.d/S20network
4、由于previous=N,刚开机且runlevel=sysinit,以上两项服务被启动;
5、以上服务启动完成后,该子进程结束。

二、等级切换的情况
  现在我们假设,如果我们切换运行等级,那系统会做些什么呢(要切换运行等级,只要以带参数形式运行init进程即可,例如init 1,表示切换至我zai   当前运行级别为3,我们使用init 1,切换至到单用户模式,这时init进程运行过程如下:
  首先,以参数sysinit运行rc脚本,通过简单的分析我们可知,由于其中的服务都已经启动,所以不会有任何服务启动或停止(有点问题,我再想一下)。
  其次,以参数1运行脚本rc,其执行过程也很简单,由于previous!=N 所以找出/etc/rc1.d目录下以K开头服务,有以下两项:
                /etc/rc.d/rc1.d/K80network
                /etc/rc.d/rc1.d/K90sysklogd
同时,发现该服务在/etc/rc3.d中(也就是已经被开启),所以以参数stop运行该项服务,也就是要停止服务。同时下一个循环中,判断/etc/rc1.d是否存在以S开头的服务,需要启动。如果有则启动,否则子进程结束。

三、关机和重启动分析
  有了以上的基础,就很容易知道关机和重新启动的过程了。
  首先,在rc sysinit中关闭以K开头,而且已经启动的服务,只有:
                /etc/rc.d/rc0.d/K90sysklogd
  其次,在rc 0(rc 6)中以stop为参数运所有以S开头的服务,通常有以下几项:
                /etc/rc.d/rc0.d/S60sendsignals
                /etc/rc.d/rc0.d/S70mountfs
                /etc/rc.d/rc0.d/S80swap
                /etc/rc.d/rc0.d/S90localnet
                /etc/rc.d/rc0.d/S99halt

呵呵,似乎应该结束了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-18 09:15:21 | 显示全部楼层
还剩下的就是所有脚本的注释了

一开始觉得很好玩
注释到后面,就成了机械劳动了

我在考虑要不要贴上来占版面……
不过确实有几处脚本命令不知道什么意思,比如:
exec 9>&0 < /etc/sysconfig/modules  就搞不懂(有好几处有这样的命令)
再如:       
restart)
                $0 stop
                sleep 1
           睡眠一秒钟 ? why?
                $0 start
各位兄弟指教呵
回复 支持 反对

使用道具 举报

发表于 2005-11-18 10:58:55 | 显示全部楼层
exec 的那个,我觉得是吧 /etc/sysconfig/modules这个文件当作stdin,9只是一个占位符而已。
头晕脑涨的,睡觉起来再琢磨。:)。

这个睡眠的作用,是等上一个进程完全结束后才重新开始进程。没什么特殊意义的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-18 15:28:01 | 显示全部楼层
Post by 黯然销魂

这个睡眠的作用,是等上一个进程完全结束后才重新开始进程。没什么特殊意义的。


精辟!

对于exec那个命令,我已经明白了, 9 文件描述符标识
大家一看就知道我是现学现卖的那种
呵呵
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-22 17:21:52 | 显示全部楼层
终于完成了这部分的所有注释工作了
怎么说呢,看上去感觉还可以,不是很难
可是脚本确实写的非常巧妙
还有一点感受就是,学linux,会shell编程有很大帮助

随便找了本书,决定先把shell编程看一遍
不懂再来请教各位大侠
回复 支持 反对

使用道具 举报

发表于 2005-12-2 12:50:30 | 显示全部楼层
还有一个地方就是系统启动时第一个进程通常都认为是init,但是实际上感觉应该是swapper进程,在《The Design of UNIX OS》这本书中提到就是:"rocess 0 is a special process that is created "by hand" when the system boots; after forking a child process(process 1), process 0 becomes the swapper process. Process 1, known as init, is the ancestor of every other process in the system and enjoys a special relationship with them,... ..."

还有启动方式目前System V和BSD两种风格,大部分GNU/Linux版本都使用system V风格,也就是/etc/rc.d/rcN.d/S or K[num]process的风格,好像只有slackware是使用了BSD风格,所以有些人说slackware是GNU/Linux的“叛徒”呵呵。不过两种风格大体上差不多。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-6 12:52:20 | 显示全部楼层
Post by zhy2111314
还有一个地方就是系统启动时第一个进程通常都认为是init,但是实际上感觉应该是swapper进程,在《The Design of UNIX OS》这本书中提到就是:"rocess 0 is a special process that is created "by hand" when the system boots; after forking a child process(process 1), process 0 becomes the swapper process. Process 1, known as init, is the ancestor of every other process in the system and enjoys a special relationship with them,... ..."

还有启动方式目前System V和BSD两种风格,大部分GNU/Linux版本都使用system V风格,也就是/etc/rc.d/rcN.d/S or K[num]process的风格,好像只有slackware是使用了BSD风格,所以有些人说slackware是GNU/Linux的“叛徒”呵呵。不过两种风格大体上差不多。
受益非浅

没有装过slackware,不知道BSD风格怎样
回复 支持 反对

使用道具 举报

发表于 2005-12-6 16:08:16 | 显示全部楼层
好帖好帖,在编lfs的时候也感觉这部分不是很清楚,正想好好研究一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表