免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 717 | 回复: 0
打印 上一主题 下一主题

Linux系统引导过程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-21 20:10 |只看该作者 |倒序浏览

当打开计算机时,计算机执行存储在ROM中的引导代码,这些代码反过来试图确定如何加载并启动内核。内核检测系统的硬件,然后产生系统的init进程,这个进程总是PID1。
在出现登录提示符以前,系统必须检查并安装文件系统,而且系统的守护进程必须启动起来,这些步骤是由init进程按顺序运行的一系列shell脚本来管理的。启动脚本由于它们的命名方式而经常被称作“rc文件”,“rc”代表“runcom”或“run command”,这是大约出现于1965年的CTSS操作系统的遗迹。启动脚本的确切布局以及它们的执行方式随操作系统的不同而异。
Linux系统既可以以自动方式也可以以手工方式来引导。在自动方式下,系统自己执行全部引导过程,而不需要任何外部的帮助。在手工方式下,系统先自动执行一些过程,然后到某一时刻后,在运行大多数初始化脚本以前,把控制权交给操作员。在这时候,计算机处于“单用户模式”,大多数系统进程还没有运行,其他用户还不能够登录进入系统。
在日常运行中,几乎总是使用自动引导。对于用户来说,在现代机器上典型的引导过程就是打开计算机的电源并等待(再等待)系统准备就绪。尽管如此,懂得自动引导过程并知道怎样执行手工引导还是很重要的。当出现某些故障而打断了自动引导过程时,例如,出现损坏的文件系统或者出现没有正确配置的网络接口时,通常不得不采用手动引导。
典型的引导过程由下面6个不同的阶段组成:
l         加载并初始化内核;
l         检测和配置设备;
l         创建自发的系统进程;
l         操作员干预(仅用于手工引导)
l         执行系统启动脚本;
l         多用户操作。
系统管理员对以上步骤中的在多数几乎没有什么控制权。我们通过编辑系统启动脚本来影响大多数的引导配置。
Linux内核本身就是一个程序,第一个引导任务就是把这个程序载入内存,以便能够执行它。内核的路径名通常是/vmlinuz或者/boot/vmlinuz。
Linux系统实现了一个两阶段加载过程。在第一个阶段,系统ROM从磁盘加载一个小的引导程序到内存中。然后,这个程序安排内核的载入。这个过程发生在Linux领域之外,所以各个系统之间并没有标准的过程。
内核执行内存检测来确定有多少RAM可用。内核的一些内部数据结构是被静态分配其内存大小的,因此,当内核启动时,它就为自己划分出一块固定数量的实际内存空间。这块空间保留给内核使用,而不能够为用户级进程使用。内核在控制台上打印一条消息,报告物理内存的总量以及用户进程可用的内存量。
内核的第一项任务是检查机器的环境以确定机器有什么硬件。当您为自己的系统构建内核时,要告诉内核,它应该期望找到哪些硬件设备;当内核开始执行时,它试图找到并初始化已经告诉它的每一个设备。大多数内核为它们所找到的每个设备打印出一行专门信息。
在内核配置期间提供的设备信息经常不够明确。这种情况下,内核通过推测设备总线和向适当的驱动程序寻求信息来尝试确定它所需要的其他信息。那些没有检测到设备的驱动程序或者那些没有响应探测的驱动程序将被禁用。如果某个设备后来的被连接到系统上,那么还是有可能随时加载或者启用它的驱动程序。
一旦完成了基本的初始化任务,内核就在用户空间创建几个“自发”的进程。它们之所以被称作是自发进程,是因为这些进程通常不是由系统的fork机制所创建的。
自发进程的数量和特性随系统的不同而不同。在Linux上,看不到有PID 0进程。和进程init(一定是进程1)一起的是几个内存和内核处理进程,一般包括kflushd、kupdate、kpiod和kswapd。在所有这些进程中,只有init是真正完整的用户进程。其他进程实际上都是内核的一部分,为了调度或者结构上的原因而进行了装扮,使它们看上去像是进程罢了。
一旦创建完毕自发进程,内核在引导阶段的任务就完成了。不过处理基本操作(比如接受登陆)的进程还一个都没有创建呢,而且大多数Linux守护进程也都没有启动。这些任务都是由init来(有些情况下是间接)负责。
如果系统以单用户模式进行引导,那么在init启动时,内核所给出的命令行标志会通知init实际要引导的是单用户模式。进程init最后会把控制权交给sulogin,后者是login 一个“中立而热心”的特殊版本,它提示用户输入root口令。如果输入的口令正确,系统将生成一个root shell。用户可以按下而不是输入口令来绕过单用户模式而继续进入到多用户模式。
在单用户shell中执行命令的方式和登录到已完全引导的系统上执行命令的方式类似。不过在SuSE和Debian系统上,这时通常只安装了root分区;为了使用不在/bin、/sbin或/etc下的程序,用户必须手工安装其他文件系统。在单用户模式下守护进程通常并不运行,因此依赖服务器进程的那些命令(例如mail)将不能够正常地工作。
在正常情况下,会在自动引导的过程中运行fsck命令,以检查并修复文件系统。当您以单用户模式启动系统时,可能需要手工运行fsck。
当退出单用户shell时,系统将试图继续引导进入多用户模式。
到了系统准备运行其启动脚本的时候,我们就能看出它是Linux系统了。尽管它看起来还没很像全部启动完毕的系统,但在启动过程中已经没有什么“奇妙”步骤了。启动脚本就是普通的shell脚本,它们由init根据一定的算法来选择并运行,尽管算法有时候有些复杂,但还是相当容易理解的。
在初始化脚本运行过以后, 系统就是完全可操作的了,不过现在用户还不能登录进来。为了在某个特定终端(包括控制台)上接受用户登录,必须有一个getty进程监听终端或者控制台。init直接生成这些getty进程,完成引导过程。init还负责生成图形登录系统,例如xdm或gdm。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/23381/showart_235647.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP