当前位置:文档之家› Linux引导过程的九个步骤

Linux引导过程的九个步骤

Linux引导过程的九个步骤【1】硬件和固件以及读入MBRBIOS 或其它固件系统读取硬盘或者其它引导设备(例如,光盘、软盘、网络引导等等)上的主引导记录。

计算器在接通电源之后,首先由BIOS 进行自检,即进行所谓的POST(Power On Self Test),然依据BIOS内设置的引导顺序从硬盘、软盘或CDROM中读入“引导块”。

例如,通常BIOS中设置的引导顺序为第一个IDE硬盘的C分区在最前面,那就是说,计算机开机启动时会把C盘的第0柱面,第0头的第1个扇区读入内存,然跳到那里开始执行。

这个扇区有一个大家很熟悉的名字,它就是: MBR(Main Boot Record)。

换句话说,MBR里面存放的是一小段程序以及分区表的数据。

在使用WIN9X和DOS 时,这里面存放的代码就会把分区表里标记为Active 的分区的第一个扇区(一般存放着操作系统的引导代码)读入内存并跳转到那里开始执行.【2】引导装载程序运行x86 系统上的Linux 系统通常使用LILO 或者GRUB。

某些老式系统可能使用loadlin 通过一个中间DOS 分区进行引导。

在Power PC® 系统上,这可能是BootX或者yaboot。

一般来说,引导装载程序是一种简单的程序,它知道到哪里寻找Linux 内核,可能在几个版本之间进行选择,甚至可以选择同一计算机上的其它操作系统。

在用LILO 来引导LINUX 时,有两种选择:(a) BIOS->LILO(直接安装在MBR中)->KERNEL把LILO直接安装在MBR,这时就由BIOS直接把LILO代码调入内存,然跳转执行LILO即可.(b) BIOS->MBR->LILO(安装在活动分区的第一个扇区)->KERNEL把LILO安装在LINUX分区,必须把LINUX分区设为Active. 这时BIOS调入的是WIN9X/DOS 下的MBR代码,然由这段代码来调入LILO的代码(位于活动分区的第一个扇区).在过去,对于能够设置可引导分区的最高柱面,最大硬盘大小, 在大硬盘上主分区的位置等等有许多限制。

因为在读入及执行MBR 时,操作系统还没有起来, 所以只能用BIOS 提供的INT13 来进行磁盘操作,而INT13 只能读写硬盘1024 柱面之前的数据,由此可知任何操作系统的引导代码都必须在1024 柱面之前。

对于LINUX的引导装载程序来说,不管你是使用方式(a)还是方式(b)来启动,都要保证KERNEL放在1024柱面之前。

但因为LINUX不使用INT13来进行硬盘操作, 所以在KERNEL启动以后, 就有读写1024 柱面以后数据的能力了。

不过, 现在几乎所有硬件系统的BIOS 都得到了改进, 能够处理实际上无限大的硬盘, 因此现代的引导装载程序(至少是Linux的引导装载程序),对于分区大小或位置已经没什么限制了.【3】内核装载并进入保护模式当启动电源之际,计算机的BIOS 就会找寻有无系统开机磁盘,有可能使用软盘、硬盘或者是随身碟开机,BIOS会将boot loader载入RAM中,接者boot Loader 会载入Linux Kernel,而Kernel 一旦起动后,第一件事就是切入保护模式(protected mode),此时,所有的硬件交由Kernel 来控制,也意味挣脱BIOS 的羁绊。

【4】初始化硬件并安装根文件系统当Kernel 加载完毕后,便开始初始化系统所有硬设备。

而当所有的硬件初始化的动作也告完成之际,系统将尝试挂载root partition(根分区). 所谓Root partition 也就是将被挂上后当作"/"的根目录,如果无法正确挂载root partition,系统将无法运作。

在某些情况下,可能需要先装载一个临时ramdisk 映像, 以便加载启用真实根文件系统所需的特殊驱动程序或模块, 例如SCSI驱动模块, 然后再安装真正的根文件系统。

安装好根檔系统之后,就可以开始系统初始化了。

【5】启动进程init来初始化Linux系统当root file system 成功的挂载后,就会去执行init这个程序。

init会检查/etc/inittab文檔, 找出该文檔中标明sysinit 的这一行, 并执行该行指定的script. 在Redhat Linux系统上此脚本名为/etc/rc.d/rc.sysinit,它是一个比较复杂和冗长的Shell脚本(有几百行),也就是说rc.sysinit 将开始肩负接下来的系统初始化大任; 而在Debian 系统上此脚本则名为/etc/init.d/rcS, 它其实是只包含一行调用命令的脚本(exec /etc/init.d/rc S);在内核起来之后所生成第一个进程init(/sbin/init),是所有其它Linux进程的父进程(PID为1). 它(init)的工作就是根据/etc/inittab配置文文件来执行相应的脚本进行系统初始化,例如设置键盘,字体,装载模块,设置网络等等(下面6,7,8步骤都是相关的详细介绍).【6】读取/etc/inittab 的内容,对余下的引导步骤进行配置此步骤中特别重要的内容是: 如何利用/etc/inittab 中的命令行控制语法, 来将系统引导到指定的运行级别, 从而决定初始化期间还要执行哪些步骤. 实际上此后的所有引导过程, 完全是由檔/etc/inittab 的内容来控制的.具体来说,脚本和工具一般是按照某些约定来运行的,这些所谓约定, 其实就是定义了几个运行级别, 并指定各个运行级别所需要运行的脚本, 因此在理论上完全可以通过修改/etc/inittab 来运行不同的脚本.【7】与运行级别无关的系统初始化(sysinit)一般情况下,无论运行级别如何,都要执行某些系统初始化操作。

指定运行系统初始化脚本的步骤在/etc/inittab 中用下面这样的命令行表示:# System initialization.si::sysinit:/etc/rc.d/rc.sysinit #适用于RedHat系统;si::sysinit:/etc/init.d/rcS #适用于Debian系统;此行通常设置为开头第二项配置, 其中Red Hat系统的/etc/rc.d/rc.sysinit 是一个很长的脚本(超过800行),用于执行所有初始化过程; 而在Debian系统的/etc/init.d/rcS 则是一个非常简单的脚本, 只包括一行调用命令, 即是带参数S 调用另一个脚本/etc/init.d/rc文檔(exec /etc/init.d/rc S),实际上它只是运行每个匹配/etc/rcS.d/[Ss]??* 的脚本;在Redhat系统中/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -. 呼叫/sbin/initlog 纪录系统初始化过程. 设定path、主机名(hostname)和NIS域名等信息. banner 画面:一般我们看到"Welcome to RedHat Linux" 的讯息. 系统会执行mount -t proc /proc /proc 命令﹐为核心挂载一个特殊的档案系统. 执行/sbin/setsysfont 来设定系统使用的字型. Configure kernel parameters. 装载声卡模块. 设定好系统时钟(system clock). 加载keymap﹐按照您安装时指定的键盘信息来确定您的键盘类型. 启动swapping. 启动系统的置换(swap)空间. Remount the root filesystem read-write、清空mtab﹐. 加载一系列的核心模块. 对档案系统进行检查(fsck). 打开quota. 关于rc.sysinit 在启动过程中所显示的所有信息﹐都会存放到/var/log/dmesg 里面去...等等...- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -系统初始化脚本(sysinit)的一个最重要的任务, 是检查所有的本地文件系统, 如果发现问题, 此脚本会跳到一个shell的sulogin 登录接口,以便让管理者干涉和修正问题. 而若遇到某些文件系统的问题,则可能?**貑?机器. 如果使用和设置了配额, 那么rc.sysinit脚本也将会负责启用配额. 另外在RedHat系统中, 通常还有一个/etc/rc.d/rc.local脚本文檔,它一般是用来启动本地进程的脚本.【8】特定的运行级别的系统初始化在/etc/inittab文檔内容中有一行特定设置特别关键, 此行通常设置在接近檔顶部,也即是在rc.sysinit之前的第一项设置,它就是设置预设运行级别(default runlevel):# The default runlevel.id:3:initdefault: #这是RedHat系统的预设启动级别;id:2:initdefault: #这是Debian系统的预设启动级别;这个预设运行级别将控制/etc/inittab 脚本的其余部分中所要采取的相应操作, 这些操作主要是: 处理/etc/inittab脚本时将会发生什么? 具体来说就是在这个过程中将要涉及哪些文件和目录. 这个操作选择过程则按下述方法来实现:当rc.sysinit执行完毕后,控制权立即移转回init手中, 然后再根据之前已经从/etc/inittab中读出的此项设置行来选择预设的run level, 以便决定要执行哪些服务程序. 实际上可以把任意数量的操作与运行级别联系起来, 而且一个操作也可以与一个或者多个运行级别相关联, 这个关联的设置命令则包含在/etc/inittab 后面的代码中,内容如下:#Red Hat系统中的设置:l0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3l4:4:wait:/etc/rc.d/rc 4l5:5:wait:/etc/rc.d/rc 5l6:6:wait:/etc/rc.d/rc 6#Debian系统中的设置:l0:0:wait:/etc/init.d/rc 0l1:1:wait:/etc/init.d/rc 1l2:2:wait:/etc/init.d/rc 2l3:3:wait:/etc/init.d/rc 3l4:4:wait:/etc/init.d/rc 4l5:5:wait:/etc/init.d/rc 5l6:6:wait:/etc/init.d/rc 6可以看出,上述设置定义了同所有运行级别相关联的脚本运行方式, 也就是以运行级别的数值为参数来调用rc 脚本. 例如在Red Hat系统中, 执行/etc/rc.d/rc X 命令将调用所有路径匹配/etc/rcX.d/[KkSs][0-9][0-9]* 模式的脚本文件. 例如, 在以运行级别5启动的系统上, 会依次运行以下檔:ls -l /etc/rc5.d/;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -/etc/rc5.d/K15postgresql/etc/rc5.d/S01switchprofile/etc/rc5.d/S05harddrake... 略 .../etc/rc5.d/S99linuxconf/etc/rc5.d/S99local- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -请注意: 以“K”或“k”开头的文件是杀死脚本(以stop为参数来调用), 它们结束进程或者清除进程的操作.以“S”或“s”开头的檔是启动脚本,以start为参数来调用,它们一般启动新进程或者使系统准备在此运行级别上运行. 这些文件都是链接到/etc/init.d/中的shell脚本.这也就是说,系统真正要执行的程序,可按照/etc/rc.d/rcX.d/(X代表不同的runlevel号码)目录里面的script内容来决定. 例如:id:3:initdefault: #指定的runlevel为3,会执行/etc/rc.d/rc3.d/目录下的脚本;id:5:initdefault: #指定的runlevel为5,会执行/etc/rc.d/rc5.d/目录下的脚本;【9】在提示符下登录在大多数情况下,当Linux 系统在一个运行级别上运行之后,您希望作为用户登录进系统。

相关主题