ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Linux的启动过程介绍

Linux的启动过程介绍

原创 Linux操作系统 作者:BTxigua 时间:2007-08-18 00:00:00 0 删除 编辑

用户的登陆过程已经介绍,顺便也从网上搜到的资料中总结一下Linux的启动过程。

(1)BIOS自检
BIOS自检,BIOS 运行时会按照 CMOS 的设置定义的顺序来搜索处于活动状态并且可以引导的设备。加载程序主引导记录MBR。MBR 是一个512字节大小的扇区,位于磁盘上的第一个扇区中的0 道 0 柱面 1 扇区。
当MBR被加载到RAM中之后,BIOS就会将控制权交给MBR。
要查看 MBR 的内容,请使用下面的命令:
  # dd if=/dev/hda of=mbr.bin bs=512 count=1
# od -xa mbr.bin


(2)加载引导程序GRUB和LILO
主引导记录中的代码将检查分区表(同样位于主引导记录内),鉴定活动分区(该分区已被标注为可引导的),再从这个活动分区内读取引导区,后启动引导区内的代码。该代码的作用是从分区内读取并启动内核。
但是用一个单独的分区来保存内核映像通常是没有用的,该分区引导区内的代码不能连续读取硬盘。所以常用LILO或者GRUB来动系统。
GRUB和LILO都是引导加载程序,它一般会直接读取并启动默认内核。
(3)加载内核
当内核映像被加载到内存之后,内核阶段就开始了。内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个 zImage(压缩映像,小于 512KB),它是提前使用 zlib 进行压缩过的。所以第一步是自行解压,实现少量硬件设置,内核映像的开始处有一个专门为此设计的小程序。解压后将其放入高端内存中,如果有初始 RAM 磁盘映像,就会将它移动到内存中,并标明以后使用。
在这一过程中,内核检查还存在哪些其他的硬件(硬盘、软盘、网络适配器等等),并配置相应的设备驱动程序;在它进行这个步骤期间,它将输出自己找到的信息。
然后,内核将试着装入根文件系统。装入点是在编辑时间或任何时候,利用LILO或GRUB配置的。文件系统类型可以自动侦测。如果文件系统装入失败了,比如说因为你忘了把相应的文件系统驱动程序包括在内核内,内核停止不前了。
之后,内核便在后台启动init程序/sbin/init
(4)执行init进程
init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空间内加载init程序,它的进程号是1。init进程是所有进程的发起者和控制者。因为在任何基于Unix的系统(比如Linux)中,它都是第一个运行的进程,所以init进程的编号(Process ID,PID)永远是1。如果init出现了问题,系统的其余部分也就随之而垮掉了。
  init进程有两个作用。第一个作用是扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程就都会以init作为它们的父进程。快速执行一下ps -af 命令,可以列出许多父进程ID(Parent Process ID,PPID)为1的进程来。
  init的第二个角色是在进入某个特定的运行级别(Runlevel)时运行相应的程序,以此对各种运行级别进行管理。它的这个作用是由/etc/inittab文件定义的。
(5)通过/etc/inittab文件进行初始化
  init的工作是根据/etc/inittab来执行相应的脚本进行系统初始化,如设置键盘、字体, 装载模块,设置网络,等等。
  对于RedhatLinux来说,执行的顺序为:
  /etc/rc.d/rc.sysinit # 由init执行的第一个脚本
  /etc/rc.d/rc.sysinit
# 主要做在各个运行模式中相同的初始化工作,包括:
设置初始的$PATH变量。
配置网络。
为虚拟内存启动交换。
设置系统的主机名。
检查root文件系统,以进行必要的修复。
检查root文件系统的配额。
为root文件系统打开用户和组的配额。
以读/写的方式重新装载root文件系统。
清除被装载的文件系统表/etc/mtab。
把root文件系统输入到mtab。
使系统为装入模块做准备。
查找模块的相关文件。
检查文件系统,以进行必要的修复。
加载所有其他文件系统。
清除几个/etc文件:/etc/mtab、/etc/fastboot和/etc/nologin。
删除UUCP的lock文件。
删除过时的子系统文件。
删除过时的pid文件。
设置系统时钟。
打开交换。
初始化串行端口。
装入模块。
  /etc/rc.d/rcX.d/[KS]
  首先终止“K”开头的服务,然后启动“S”开头的服务。
  对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。这些运行级别的下级子目录的命名方法是rcX.d,其中的X就是代表运行级别的数字。比如说,运行级别3的全部命令脚本程序都保存在/etc/rc.d/rc3.d子目录中。在各个运行级别的子目录中,都建立有到/etc/rc.d/init.d子目录中命令脚本程序的符号链接,但是,这些符号链接并不使用命令脚本程序在 /etc/rc.d/init.d子目录中原来的名字。如果命令脚本程序是用来启动一个服务的,其符号链接的名字就以字母S打头;如果命令脚本程序是用来关闭一个服务的,其符号链接的名字就以字母K打头。许多情况下,这些命令脚本程序的执行顺序都很重要。如果没有先配置网络接口,就没有办法使用DNS服务解析主机名!为了安排它们的执行顺序,在字母S或者 K的后面紧跟着一个两位数字,数值小的在数值大的前面执行。比如:/etc/rc.d/rc3.d/S50inet就会在 /etc/rc.d/rc3.d/S55named之前执行。存放在/etc/rc.d/init.d子目录中的、被符号链接上的命令脚本程序是真正的实干家,是它们完成了启动或者停止各种服务的操作过程。当 /etc/rc.d/rc运行通过每个特定的运行级别子目录的时候,它会根据数字的顺序依次调用各个命令脚本程序执行。它先运行以字母K打头的命令脚本程序,然后再运行以字母S打头的命令脚本程序。对以字母K打头的命令脚本程序来说,会传递Stop参数;类似地对以字母S打头的命令脚本程序来说,会传递 Start参数。
  执行/etc/ec.d/rc.local
  Redhat Linux中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。在维护Linux系统运转的日子里,肯定会遇到需要系统管理员对开机或者关机命令脚本进行修改的情况。如果所做的修改只在引导开机的时候起作用,并且改动不大的话,可以考虑简单地编辑一下/etc/rc.d/rc.local脚本。这个命令脚本程序是在引导过程的最后一步被执行的。
  执行 /bin/login 程式
  login 程序会提示使用者需输入账号及密码, 接着编码并确认密码的正确性, 若二者相合, 则为使用者进行初始化环境, 并将控制权交给 shell,即等待用户登录。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10867315/viewspace-194831/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-31

  • 博文量
    101
  • 访问量
    279179