linux系统启动的流程现场版(QQ聊天记录)@dalin

在RHCE群(19425996)里给人讲linux启动的一个过程,觉得也许会有人有需要,就顺便贴些记录在这里了:

@dalin(6050003) 00:45:09
首先我们要清楚系统启动的整个流程
#@四海浪子(277728893) 00:45:14
哈哈!是啊!
#@四海浪子(277728893) 00:45:17

@dalin(6050003) 00:45:28
对linux来说,理解这些流程其实是很简单的
@dalin(6050003) 00:45:51
因为它的一切过程都是可见的
@dalin(6050003) 00:47:59
系统启动的过程是这样的:开机->bios自检->根据bios里面设置启动介质(cdrom,软盘,硬盘等等,以硬盘为例)->硬盘上的引导程序(如grub,lilo等,以grub为例)
Cappuccino(87306587) 00:48:39
继续~
#@四海浪子(277728893) 00:48:43
之后是/etc/inittab
@dalin(6050003) 00:48:48
接下来grub会去读硬盘里面的配置文件,找到内核文件,加载内核->内核初始化
@dalin(6050003) 00:49:36
内核初始化做了一些这样的工作:检测电脑硬件,加载这些硬件的驱动
@dalin(6050003) 00:49:52
当这一切都正常的时候
@dalin(6050003) 00:50:38
它要开始挂载根分区,因为我们都知道,系统的配置啊,应用啊等等都放在这个地方,包括最重要的init程序跟shell
@dalin(6050003) 00:51:10
这个根分区就是在grub配置里面的kernel那一行,root=xxx这里指定
@dalin(6050003) 00:51:23
所以当root=xxx,这个xxx参数出错了
@dalin(6050003) 00:51:35
系统就无法正常启动了
@dalin(6050003) 00:51:42
通常表现为一个kernel panic
@dalin(6050003) 00:52:16
当加载/分区正常之后
#@四海浪子(277728893) 00:52:33
他启动的是根分区还是boot分区啊?!
@dalin(6050003) 00:52:34
它就开始从这个分区里面读取相关数据
@dalin(6050003) 00:53:02
boot分区只是放了内核的文件的地方
@dalin(6050003) 00:53:10
并不是系统真正工作的地方
#@四海浪子(277728893) 00:53:29
继续!
@dalin(6050003) 00:54:25
挂载完/分区之后,要读取的数据中,最重要的首先就是这个init程序,它是系统启动的第一个进程
@dalin(6050003) 00:54:37
还有它的配置文件/etc/inittab
@dalin(6050003) 00:55:22
所以在这个步骤出了问题,比如init不见了,inittab配置有误,那么系统也会启不来
@dalin(6050003) 00:56:01
inittab这个文件设置了系统将要怎么运行,比如默认的运行级别
Cappuccino(87306587) 00:56:06
那实际上,boot分区也就是个存放内核与启动文件配置的地方咯?
@dalin(6050003) 00:56:39
boot分区只是存放内核,以及引导程序还有它的配置文件的地方
@dalin(6050003) 00:56:58
事实上,当我们的系统启动到init这个时候,就用不着它了
@dalin(6050003) 00:57:15
以后系统在运行的过程中,也不需要它了,因为内核已经加载到内存中去了
@dalin(6050003) 00:57:45
明白了没有
#@四海浪子(277728893) 00:58:36
就是说,在BOOT中,存在的就是内核和GRUB及他俩相关的配置文件了把?!
@dalin(6050003) 00:59:04
是的,还有一个东西叫initrd.img的文件
#@四海浪子(277728893) 00:59:23
他是干什么用的啊?!
@dalin(6050003) 00:59:56
这个文件我们可以看成是一个迷你版的/根分区的镜像
@dalin(6050003) 01:00:28
在内核初始化的这个过程中,我们有可能会用到一些工具
@dalin(6050003) 01:00:47
而这个时候我们还没有加载真正的/分区,那么这些工具放在哪?
@dalin(6050003) 01:00:58
就放在这个initrd.img文件里
#@四海浪子(277728893) 01:01:01
哦,了解了
Cappuccino(87306587) 01:01:19
嗯.清楚明白
@dalin(6050003) 01:01:49
还有,这个内核里面不一定你所有硬件的驱动,有时候我们需要加载一些额外的模块,这些模块也是放在这个文件里面
@dalin(6050003) 01:02:15
当init正常启动了
@dalin(6050003) 01:03:06
它就会根据inittab里面定义的一些东西执行一些操作
@dalin(6050003) 01:03:31
比如,系统将启动到什么运行级别
@dalin(6050003) 01:04:07
具体的运行级别代表什么我就不多说了吧
#@四海浪子(277728893) 01:04:18
恩,了解
@dalin(6050003) 01:04:23
以红帽linux为例
@dalin(6050003) 01:04:59
假设要默认启动到运行级别3
#@四海浪子(277728893) 01:06:20
这个可以不讲拉,再往下把!
@dalin(6050003) 01:07:27
inittab里面就定义了,首先要执行rc.sysinit这个脚本(事实上,这个脚本是绝大多数运行级别要启动时得先执行的),接下来是执行运行级别3应该执行的脚本(在目录/etc/rc.d/rc3.d里面)
@dalin(6050003) 01:07:50
当所有的这些脚本都执行正确了
@dalin(6050003) 01:08:02
它就会执行rc.local这个脚本
@dalin(6050003) 01:08:56
接下来,如果要启动到图形界面的话,就会执行启动到图形界面的相关脚本,如果不是要启动到图形界面,这个启动过程就算结束了
#@四海浪子(277728893) 01:09:25
rc.local这个脚本里面没有什么东西啊,这个脚本感觉就是让我们放一些自启动的脚本的地方
@dalin(6050003) 01:10:22
有一点要注意的是:刚刚一直提到的,它们执行的是脚本!脚本要执行,必须有一个解释器,也就是shell,对linux来说,一般是指bash,所以这个过程中bash也必须是正常可用的
@dalin(6050003) 01:10:37
对,rc.local的作用就是这样
@dalin(6050003) 01:10:49
这就是一个粗略的启动过程
@dalin(6050003) 01:11:05
其中有一些细节,可以自己了解一下
@dalin(6050003) 01:11:31
但只要把这个流程,用简单的1、2、3几句话列出来
@dalin(6050003) 01:12:03
然后看一下每一步都要用到哪些文件,执行了哪些操作
#@四海浪子(277728893) 01:12:05
恩那, 现在最想了解的是在排错方面都有哪些地方能出现错误!或者说要是出现错误了后,要到哪些地方去查
@dalin(6050003) 01:12:15
当我们遇到故障的时候
@dalin(6050003) 01:12:26
看看现在是执行到哪一步了
@dalin(6050003) 01:12:37
顺藤摸瓜
@dalin(6050003) 01:12:53
想一想,在这一步的时候,它应该跟哪些文件有关
@dalin(6050003) 01:13:07
再去相应的地方检查,就可以了
#@四海浪子(277728893) 01:13:08
那一般都去rescue里面去修改把?!
@dalin(6050003) 01:13:53
有的错误不会导致单用户模式不可进,那可以在单用户模式修改,如果连单用户模式都进不了了,那就得进rescue了
#@四海浪子(277728893) 01:14:13
哦了!知道了
#@四海浪子(277728893) 01:14:45
能不能帮列出一下,大致在排错上面都能出现哪写错误那?!
#@四海浪子(277728893) 01:14:48

@dalin(6050003) 01:15:25
其实了解这个过程不难,记起来也不难
@dalin(6050003) 01:15:38
按我说的去排错也不难
@dalin(6050003) 01:15:52
难的地方在于,很多人没有这个意识
@dalin(6050003) 01:16:06
在遇到故障的时候,就会六神无主
@dalin(6050003) 01:16:21
不懂得静下心来思考
#@四海浪子(277728893) 01:16:24
也就是说,很多人看到错误了, 都害怕,是不!
@dalin(6050003) 01:16:28
到底哪里出错了
@dalin(6050003) 01:16:32
是的
#@四海浪子(277728893) 01:17:11
就象刚接触服务器,感觉都害怕不敢动它一样, 其实只要弄多了, 遇见得多了,排错就不会手忙脚乱的拉!
#@四海浪子(277728893) 01:17:13
是把?!
@dalin(6050003) 01:17:21
就是这样
#@四海浪子(277728893) 01:17:25

@dalin(6050003) 01:17:40
你现在再想想你刚刚碰到的那个问题
#@四海浪子(277728893) 01:18:29
恩那, 感觉是和刚才不一样!嘿嘿
@dalin(6050003) 01:19:14
现在你还不一定有能力解决,但你至少知道问题在哪了,是吧
#@四海浪子(277728893) 01:19:39
是啊
@dalin(6050003) 01:21:09
其实每一步中还有些细节的东西,进一步了解之后,对付这些故障,应该是小菜一碟了
@dalin(6050003) 01:21:58
我考CE的时候,上午的troubleshooting简单跟在做1+1等于多少这样的题差不多

来至大林的blog
http://www.idalin.cn/2007/11/27/ ... %e8%ae%b0%e5%bd%95/