首页 百科知识 开机流程详解

开机流程详解

时间:2022-10-10 百科知识 版权反馈
【摘要】:在Intel i386体系结构下,不同发行版本的Linux的启动过程有很多相似之处。分析/etc/inittab和所有被它source的脚本,就可以完全地了解系统的启动过程。根据grub设定的内核映像所在路径,系统读取内核映像,并进行解压缩操作。Linux中init进程的主要任务是按照inittab文件所提供的信息创建进程,由于进行系统初始化的那些进程都由init创建,所以init进程也称为系统初始化进程。

5.1 开机流程详解

学习目标

·熟悉Linux开机流程

·了解开机中每个程序的内容

在Intel i386体系结构下,不同发行版本的Linux的启动过程有很多相似之处。BIOS读取位于第一个扇区(硬盘或光盘的主引导记录,简称MBR)的Linux内核加载器。内核加载器加载内核。新的发行版本使用的大多是2.6系列的内核,不过2.4系列的内核仍然得到广泛的应用。运行init进程并执行多个脚本。如果从硬盘启动Linux,内核加载器(Intel兼容体系结构)主要使用的是Lilo或Grub。如果从光盘引导Linux,比如:Live CD或安装盘,则常选择SysLinux作为内核加载器。

在配置文件etc/lilo.conf和/boot/grub/grub.conf中可以设置:

(1)内核加载器安装在哪里(主引导记录还是单个分区的引导记录);

(2)指定系统根文件系统(/)所在的分区;

(3)内核image和initrd的路径;

(4)可以配置启动不同的操作系统(Linux或是其他的操作系统)和不同版本的内核。

每一个发行版本的Linux内核都源自Linus Torvalds内核,但是可能会具有不同的版本机制,或由版本的维护者加入的非Linus补丁。可以重新并编译安装官方的内核代码或不同发行版本的内核源码包。

Unix系统启动的第一个进程总是init进程,它的配置文件总是/etc/inittab。分析/etc/inittab和所有被它source的脚本,就可以完全地了解系统的启动过程。

Linux/Unix的主要区别大多是Shell(初始化)脚本的不同。很多的Linux发行版使用Unix System V的启动方法。基于rc脚本,根据不同的运行级别启动/etc/init.d/目录下相应的脚本。

以下主要来介绍Fedora的启动。

Fedora采用RedHat的方式来启动系统。以下是它的启动流程。

1.加载BIOS

BIOS(Basic Input Output System),是固化到计算机内主板上一个ROM芯片上的程序。保存CPU相关信息、设备启动顺序信息、硬盘信息、内存信息等。

打开计算机电源第一项工作即加载BIOS,进行POST(Power On Self Test自检),对硬件进行检测;第二步进行本地设备的枚举和初始化。

2.读取MBR

MBR(Master Boot Record),位于硬盘第0磁道第一扇区,大小512字节,存放预启动信息、分区表信息。

要引导一个操作系统,BIOS运行时会按照CMOS的设置定义的顺序,搜索处于活动状态可以引导的设备。通常Linux都从硬盘上引导,而MBR中包含主引导加载程序。当MBR被加载到RAM以后,BIOS将控制权交给MBR。

查看MBR内容,可以使用以下语句:

img172

3.运行Boot Loader

GRUB引导程序不能由仅有512B的MBR完整表示,因此MBR引导程序开始加载第二阶段的引导程序,然后读取/boot/grub/menu.lst组织文件里的数据,menu.lst中列出了所有可用的操作系统和启动参数,grub按照配置信息来启动不同的操作系统。

4.加载内核

Linux不能直接加载内核,需要首先加载initrd文件。

initrd初始RAM磁盘(initial RAM disk),是在系统引导过程中挂载的一个临时根文件系统。文件中包含各种可执行程序和驱动程序,与内核绑定并作为内核引导过程的一部分进行加载,然后再将initrd卸载释放内存。

根据grub设定的内核映像所在路径,系统读取内核映像,并进行解压缩操作。系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux内核环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。在start_kernel()的最后调用init()函数,进入下一步设定运行等级。

5.用户层init依据inittab文件来设定运行等级

init进程是系统中所有进程的父进程,init进程繁衍出完成通常操作所需的子进程,这些操作包括:设置机器名、检查和安装磁盘及文件系统、启动系统日志、配置网络接口并启动网络和邮件服务,启动打印服务等。Linux中init进程的主要任务是按照inittab文件所提供的信息创建进程,由于进行系统初始化的那些进程都由init创建,所以init进程也称为系统初始化进程。

内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:

·0:关机;

·1:单用户模式;

·2:无网络支持的多用户模式;

·3:有网络支持的多用户模式;

·4:保留,未使用;

·5:有网络支持有X-Window支持的多用户模式;

·6:重新引导系统,即重启。

6.Init进程执行rc.sysinit

在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等。

7.执行不同运行级别的脚本程序

根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。

8.执行etc/rc.d/rc.local程序

让用户在初始化完成之后,登录之前个性化设置启动的东西。

9.建立终端,Mingetty启动操作系统的登录

10.登录Shell,建立用户与操作系统的交互

可以将上面的步骤简化为如图5-1所示的过程。

img173

图5-1 系统的启动过程

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈