linux系统启动的流程现场版(QQ聊天记录)@dalin
npcomet
|
1#
npcomet 发表于 2007-12-19 03:58
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/ |