Linux系统引导过程.docx

上传人:b****8 文档编号:9311070 上传时间:2023-02-04 格式:DOCX 页数:17 大小:77.22KB
下载 相关 举报
Linux系统引导过程.docx_第1页
第1页 / 共17页
Linux系统引导过程.docx_第2页
第2页 / 共17页
Linux系统引导过程.docx_第3页
第3页 / 共17页
Linux系统引导过程.docx_第4页
第4页 / 共17页
Linux系统引导过程.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

Linux系统引导过程.docx

《Linux系统引导过程.docx》由会员分享,可在线阅读,更多相关《Linux系统引导过程.docx(17页珍藏版)》请在冰豆网上搜索。

Linux系统引导过程.docx

Linux系统引导过程

启动流程

启动时要加载核心,让核心来驱动整个硬件。

整个启动过程:

1.加载BIOS的硬件信息,并获得第一个启动设备的代号(CMOS中设定的启动项)。

2.读取第一个启动设备的MBR的引导加载程序(lilo、grub、spfdisk)

3.加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有硬件设备。

4.核心执行init程序并获取运行信息。

5.Init执行/etc/rc.d/rc.sysinit文件

6.启动核心的外挂模块(/etc/modprobe.conf)

7.Init执行各个批处理文件(根据运行级别)。

8.Init执行/etc/rc.d/rc.local文件

9.执行/bin/login程序,等待用户登录。

10.登录之后开始以shell控制主机。

引导加载程序与核心的载入

主机读取BIOS,并且了解主要的主机硬件信息后,主机便开始尝试加载操作系统。

主机首先读取的就是硬盘的主引导记录(MBR),在MBR中装有引导加载程序(比如说grub)。

主机刚启动时是不认识磁盘文件系统的,这就需要引导加载程序帮忙。

但我们知道MBR是整个硬盘的第一个扇区,整个大小为一个扇区的大小(512KB),而我们的加载程序却远远大于这个容量。

怎么办?

引导加载程序分成两个阶段来执行:

1,执行引导加载程序的主程序,这个主程序放在MBR或超级块中。

2,载入引导加载程序的所有设置文件与相关的环境参数文件。

一般来说,设置文件都放在/boot目录下。

引导加载程序必须能做到:

●引导加载程序可以直接指定并取用核心文件,并加载到主存储器中。

●也可以将加载程序的控制权移交给下一个加载程序(超级块中的引导加载程序)。

grub是如何被载入的呢?

grub有几个重要文档,stage1,stage2,以及stage1.5,这些文档都在/boot/grub下,grub被载入时有以下几个步骤。

Stage1阶段

装载基本的引导程式(stage1),这也是安装在MBR中的内容,大小为512字节,但这并不意味着占用的空间为512字节,这还要看块的大小以及inode控制的块数。

比如说,我用#du–bstage1,看到的是512字节,但用#du–hstage1却看到的是2K。

stage1的主要功能就是装载第二引导程式(stage2)。

stage1应该还包括磁盘分区的信息,但这个信息应该只是刚开始装机时的信息了,对于后面又对磁盘进行的分区操作stage1应该是没有记录的,所以要备份的话,还是备份MBR为上策。

#ddif=/dev/hadof=/tmp/mbr.backbs=512count=1

stage1只负责做引导的动作,不会有太多的功能,毕竟它也只有512bytes的大小(真正的stage1其实只能算446bytes),如果用户在启动时可以看到GRUBShell,那就是stage1的真正画面。

Stage1.5阶段

所有文件名是【XXX_stage1_5】的都属于这阶段的文件,但至于为何会有这么多个文件?

是因为其作用就像是连接stage1到stage2的一个通道,里面唯一存放的是该系统文件的格式,所以只要是被支持的格式,就会预先存放一个格式文件在其中。

这阶段的过程可以让GRUB在stage1启动完成后,stage2能在被搬移后的情况下,就算不在原本的目录或文件系统中,依然可以被安全地找到。

因为stage1.5被加载时,就已经赋予GRUB读取文件系统目录的能力,所以自然可以在一开始找不到stage2的情况下,从文件系统目录中,找出stage2的所在位置。

不过,通常stage1.5阶段的文件不会放在目录中,因为当stage1还没加载stage1.5时,原则上是不能识别ext2的,当然也无法找到stage1.5这个文件,所以,其实stage1.5是存在硬盘最前面的32KB的区段中的(但是要跳过MBR),当stage1调用stage1.5时,就直接去该区域将stage1.5找出来使用,所以即使你在/boot/grub目录下看不到这几个文件时,系统还是一样能启动。

Stage2阶段

装载第二引导程式(stage2),是为了引出更高级的功能,以允许用户装载一个特定的操作系统。

在GRUB中,这步是给用户显示一个菜单或输入命令。

该文件是GRUB的核心程序,能让用户以菜单方式将操作系统加载、新增参数、修改选项,这些全都是stage2的功用。

对GRUB来说,stage2除了不能自己启动外,剩下的事情全都由stage2完成。

像是用户在启动时所看到的GRUB启动倒数画面,或是紧接着的启动菜单画面,就都是由stage2所提供的。

Stage2文件主要提供的功能如下。

提供菜单。

读取配置文件。

连接下一个bootsector。

配置文件

device.map、menu.lst及grub.conf都属于这类文件。

device.map是直接侦测目前的硬件来假设BIOS所记录的实体磁盘有哪些,默认值是安装系统时就记录好的。

menu.lst在此只是一个链接文件,链接到grub.conf文件,但在SuSE中却刚好相反,会以menu.lst为主要文件。

grub.conf就是GRUB启动程序的主要配置文件,如果此文件丢失,会让GRUB在启动时失去默认的选项,但要强调的是,此时还可以临时(启动时)通过手动配置方式启动(只要其他文件还在)。

splash.xpm.gz文件就是启动时的背景图片

通过引导加载程序读取核心文件后,接下来,主机会把核心文件解压缩到主存储器中,并且利用核心的功能,开始测试与驱动各台外部设备(存储设备,CPU,网卡,声卡,等)。

在加载核心的过程中,系统会以只读的方式载入根目录,而且会建立一个虚拟盘(RAMDisk),以协助启动过程。

这就需要initrd的支持了,利用引导加载程序加载核心的时候,一起加载initrd的映像文件,他的作用是在没有mount/分区以前,系统要执行一些操作,比如挂载scsi驱动,他就把initrd释放到内存里,作一个虚拟的/,然后执行其根目录下的一个脚本“init”(内核2.4的为linuxrc,新内核2.6为init),运行insmod和nash命令挂装模块。

在核心驱动外部硬件的工作完成之后,initrd所建立的虚拟盘就会被删除。

但注意initrd并非必要的。

initrd文件分为2.4内核的与2.6内核的两种

2.4之前的查看initrd的内容只需要mount–oloop就可以了,但新内核2.6改成cpio方式了,要

mv/boot/initrd-2.6.5.13.58.img /tmp/initrd.gz

      gzip-dinitrd.gz

      cpio-idv

来查看initrd的内容。

initrd内容最大的不同就是由原先的linuxrc变成了init。

现在说一下init的工作内容。

A:

nash指令。

B:

挂载主要的文件系统。

C:

建立设备文件所需的文件系统。

D:

建立最初所需使用的设备文件。

E:

加载相关模块。

F:

切入实体操作系统。

initrd是initalramdisk的宿写.

当存在initrd的时候,机器启动的过程大概是以下几个步骤(当initrd这一行用

noinitrd命令代替后,就不存在initrd了)

1)bootloader(grub)加载内核和initrd.img

2)内核将压缩的initrd.img解压成正常的ramdisk并且释放initrd所占的内存空间

3)initrd作为根目录以读写方式被挂载

4)initrd里面的文档linuxrc被执行(内核为2.4之前的为linuxrc,新内核为init)

5)linuxrc挂载新的文档系统

6)linuxrc使用pivot_root系统调用指定新的根目录并将现有的根目录place到指定

位置.

7)在新的文档系统下正式init

8)initrd被卸载.

解开initrd文件。

mv/boot/initrd-2.6.5.13.58.img /tmp/initrd.gz

      gzip-dinitrd.gz

      cpio-idv

整个Linux系统中,第一个执行的程序就是“/sbin/init”这个程序的PID为1

这个程序会利用/etc/inittab来获取运行等级,并使用/etc/rc.d/rc.sysinit来初始化系统环境,并根据运行等级来启动服务项目。

/etc/rc.d/rc.sysinit的主要工作有:

1.获取网络环境与主机类型和主机名称/etc/sysconfig/network

网络环境只是获取网关,当然这个网关也可以在网卡的配置中定义。

2.测试与载入内存设备/proc及USB设备/sys

3.决定是否启动SELinux

4.接口设备的检测与即插即用(PnP)参数的测试。

根据核心在启动时检测的结果(/proc/sys/kernel/modprobe)开始进行ide,scsi,网络,音效等接口设备的检测,以及利用加载的核心模块进行PnP设备的参数测试。

5.用户自定义模块的加载

在/etc/sysconfig/modules/*.modules中加入自己定义的模块。

6.加载核心的相关设置

/etc/sysctl.conf

7.设置系统时间

/etc/sysconfig/clock

8.设置终端控制台的字形。

9.设置RAID与LVM等硬盘功能。

10.以fsck检验磁盘文件系统。

11.进行磁盘配额quota的转换。

12.重新以可读取模式载入系统磁盘。

13.启动quota功能。

14.启动系统随机数设备。

15.清除启动过程中的临时文件。

16.将启动相关信息加载到/var/log/dmesg文件中。

基本上rc.sysinit执行初始化的工作都在/etc/sysconfig中。

启动系统服务与相关启动设置文件(/etc/rc.d/rc.n)

不同运行等级有不相同的目录

比如说运行等级3的启动目录放在/etc/rc.d/rc3.d目录中,这个目录中的文件都链接到/etc/rc.d/init.d目录的相应文件,另外/etc/init.d目录也是链接到/etc/rc.d/init.d

在/etc/rc.d/rc3.d目录中的文件都是以S或K开头的并加有数字的文件名

S表示启动时要启动的服务,后面的数字表示执行顺序,

K表示关机时要执行的脚本,后面的数字同样表示顺序。

用户自定义引导启动程序(/etc/rc.d/rc.local)

用户自己写的脚本可放到/etc/rc.d/rc.local中,这样在系统启动的时候就会自动加载,而不必等我们登录系统去启动。

根据/etc/inittab设置加载终端或X-Window界面

关于模块/etc/modprobe.conf

加载用户自定义模块的地方在/etc/sysconfig/modules/目录下,对模块的一些参数设定在/etc/modprobe.conf

核心与核心模块

核心一般都是压缩文件。

核心:

/boot/vmlinuz

核心模块:

/lib/modules/`uname–r`/kernel/

如果有一新硬件,操作系统不支持,怎么办?

1.重新编译核心,并加入最新的硬件驱动程序源码

2.将该硬件的驱动程序编译为模块,在启动时加载该模块。

核心模块与依赖性

在/lib/modules/`uname–r`/kernel/中里面又分成几个目录

arch:

硬件平台有关的项目,如CPU

crypo:

核心所支持的加密技术

drivers:

硬件的驱动程序。

fs:

核心所支持的文件系统。

lib:

一些函数库。

net:

与网络有关的各项协议。

sound:

与音效有关的各模块。

各个模块之间可能存在依赖性。

在/lib/modules/`uname–r`/modules.dep文件中记录了核心支持的各个模块之间的相互依赖性。

使用depmod命令建立该文件

参数:

-A:

不加任何参数时,depmod分析当前的核心模块,并重新写入到

/lib/modules/`uname–r`/modules.dep中,若加了-A参数,则只增加新的模块到这个文件中。

-n:

不写入到modules.dep,而只是输出到屏幕。

-e:

显示当前已经加载的不可执行的模块。

新编译来的的模块,根据核心模块放置到相信的位置后,然后输入depmod,更新modules.dep,核心就能识别该模块了。

察看当前核心已经加载的模块

lsmod

这个命令可以看到,已经加载的模块名称,模块大小,模块是否被其它模块使用及使用这个模块的数量。

察看模块信息

#modinfoext3

核心模块的加载也删除

insmod:

由用户自行加载的完整文件名的模块,但不会去分析模块的依赖性。

modprobe:

根据modules.dep的内容,先解决模块的依赖性后,才决定需要加载模块。

rmmod:

删除模块。

核心模块的额外参数设置:

/etc/modprobe.conf

比如说设定中断号等等

Linux引导过程内幕

从主引导记录到第一个用户空间应用程序的指导

M.TimJones(mtj@),顾问工程师,Emulex

M.TimJones是一名嵌入式软件架构师,他是GNU/LinuxApplicationProgramming、AIApplicationProgramming和BSDSocketsProgrammingfromaMultilanguagePerspective等书的作者。

他的工程背景涉及从同步太空船开发内核,到嵌入式系统架构和网络协议开发。

Tim是位于科罗拉多州的Longmont的Emulex公司的一名顾问工程师。

简介:

 引导Linux®系统的过程包括很多阶段。

不管您是引导一个标准的x86桌面系统,还是引导一台嵌入式的PowerPC®机器,很多流程都惊人地相似。

本文将探索Linux的引导过程,从最初的引导到启动第一个用户空间应用程序。

在本文介绍的过程中,您将学习到各种与引导有关的主题,例如引导加载程序、内核解压、初始RAM磁盘以及Linux引导的其他一些元素。

本文的标签:

 boot,kernel,linux,linux_on_power,内核,管理,系统管理

标记本文!

发布日期:

 2006年7月26日

级别:

 初级

访问情况:

 17190次浏览

评论:

 1 (查看 | 添加评论-登录)

平均分(36个评分)

为本文评分

早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序。

尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行必要的简化。

让我们先从高级的视角来查看Linux引导过程,这样就可以看到整个过程的全貌了。

然后将回顾一下在各个步骤到底发生了什么。

在整个过程中,参考一下内核源代码可以帮助我们更好地了解内核源代码树,并在以后对其进行深入分析。

概述

图1是我们在20,000英尺的高度看到的视图。

图1.Linux引导过程在20,000英尺处的视图

当系统首次引导时,或系统被重置时,处理器会执行一个位于已知位置处的代码。

在个人计算机(PC)中,这个位置在基本输入/输出系统(BIOS)中,它保存在主板上的闪存中。

嵌入式系统中的中央处理单元(CPU)会调用这个重置向量来启动一个位于闪存/ROM中的已知地址处的程序。

在这两种情况下,结果都是相同的。

因为PC提供了很多灵活性,BIOS必须确定要使用哪个设备来引导系统。

稍后我们将详细介绍这个过程。

当找到一个引导设备之后,第一阶段的引导加载程序就被装入RAM并执行。

这个引导加载程序在大小上小于512字节(一个扇区),其作用是加载第二阶段的引导加载程序。

当第二阶段的引导加载程序被装入RAM并执行时,通常会显示一个动画屏幕,并将Linux和一个可选的初始RAM磁盘(临时根文件系统)加载到内存中。

在加载映像时,第二阶段的引导加载程序就会将控制权交给内核映像,然后内核就可以进行解压和初始化了。

在这个阶段中,第二阶段的引导加载程序会检测系统硬件、枚举系统链接的硬件设备、挂载根设备,然后加载必要的内核模块。

完成这些操作之后启动第一个用户空间程序(init),并执行高级系统初始化工作。

这就是Linux引导的整个过程。

现在让我们深入挖掘一下这个过程,并深入研究一下Linux引导过程的一些详细信息。

回页首

系统启动

系统启动阶段依赖于引导Linux系统上的硬件。

在嵌入式平台中,当系统加电或重置时,会使用一个启动环境。

这方面的例子包括U-Boot、RedBoot和Lucent的MicroMonitor。

嵌入式平台通常都是与引导监视器搭配销售的。

这些程序位于目标硬件上的闪存中的某一段特殊区域,它们提供了将Linux内核映像下载到闪存并继续执行的方法。

除了可以存储并引导Linux映像之外,这些引导监视器还执行一定级别的系统测试和硬件初始化过程。

在嵌入式平台中,这些引导监视器通常会涉及第一阶段和第二阶段的引导加载程序。

提取MBR的信息

要查看MBR的内容,请使用下面的命令:

#ddif=/dev/hdaof=mbr.binbs=512count=1#od-xambr.bin

这个dd命令需要以root用户的身份运行,它从/dev/hda(第一个IDE盘)上读取前512个字节的内容,并将其写入mbr.bin文件中。

od命令会以十六进制和ASCII码格式打印这个二进制文件的内容。

在PC中,引导Linux是从BIOS中的地址0xFFFF0处开始的。

BIOS的第一个步骤是加电自检(POST)。

POST的工作是对硬件进行检测。

BIOS的第二个步骤是进行本地设备的枚举和初始化。

给定BIOS功能的不同用法之后,BIOS由两部分组成:

POST代码和运行时服务。

当POST完成之后,它被从内存中清理了出来,但是BIOS运行时服务依然保留在内存中,目标操作系统可以使用这些服务。

要引导一个操作系统,BIOS运行时会按照CMOS的设置定义的顺序来搜索处于活动状态并且可以引导的设备。

引导设备可以是软盘、CD-ROM、硬盘上的某个分区、网络上的某个设备,甚至是USB闪存。

通常,Linux都是从硬盘上引导的,其中主引导记录(MBR)中包含主引导加载程序。

MBR是一个512字节大小的扇区,位于磁盘上的第一个扇区中(0道0柱面1扇区)。

当MBR被加载到RAM中之后,BIOS就会将控制权交给MBR。

回页首

第一阶段引导加载程序

MBR中的主引导加载程序是一个512字节大小的映像,其中包含程序代码和一个小分区表(参见图2)。

前446个字节是主引导加载程序,其中包含可执行代码和错误消息文本。

接下来的64个字节是分区表,其中包含4个分区的记录(每个记录的大小是16个字节)。

MBR以两个特殊数字的字节(0xAA55)结束。

这个数字会用来进行MBR的有效性检查。

图2.MBR剖析

主引导加载程序的工作是查找并加载次引导加载程序(第二阶段)。

它是通过在分区表中查找一个活动分区来实现这种功能的。

当找到一个活动分区时,它会扫描分区表中的其他分区,以确保它们都不是活动的。

当这个过程验证完成之后,就将活动分区的引导记录从这个设备中读入RAM中并执行它。

回页首

第二阶段引导加载程序

次引导加载程序(第二阶段引导加载程序)可以更形象地称为内核加载程序。

这个阶段的任务是加载Linux内核和可选的初始RAM磁盘。

GRUB阶段引导加载程序

/boot/grub目录中包含了stage1、stage1.5和stage2引导加载程序,以及很多其他加载程序(例如,CR-ROM使用的是iso9660_stage_1_5)。

在x86PC环境中,第一阶段和第二阶段的引导加载程序一起称为LinuxLoader(LILO)或GRandUnifiedBootloader(GRUB)。

由于LILO有一些缺点,而GRUB克服了这些缺点,因此下面让我们就来看一下GRUB。

(有关GRUB、LILO和相关主题的更多内容,请参阅本文后面的参考资料部分的内容。

关于GRUB,很好的一件事情是它包含了有关Linux文件系统的知识。

GRUB不像LILO一样使用裸扇区,而是可以从ext2或ext3文件系统中加载Linux内核。

它是通过将两阶段的引导加载程序转换成三阶段的引导加载程序来实现这项功能的。

阶段1(MBR)引导了一个阶段1.5的引导加载程序,它可以理解包含Linux内核映像的特殊文件系统。

这方面的例子包括reiserfs_stage1_5(要从Reiser日志文件系统上进行加载)或e2fs_stage1_5(要从ext2或ext3文件系统上进行加载)。

当阶段1.5的引导加载程序被加载并运行时,阶段2的引导加载程序就可以进行加载了。

当阶段2加载之后,GRUB就可以在请求时显示可用内核列表(在/etc/grub.conf中进行定义,同时还有几个软符号链接/etc/grub/menu.lst和/etc/grub.conf)。

我们可以选择内核甚至修改附加内核参数。

另外,我们也可以使用一个命令行的shell对引导过程进行高级手工控制。

将第二阶段的引导加载程序加载到内存中之后,就可以对文件系统进行查询了,并将默认的内核映像和initrd映像加载到内存中。

当这些映像文件准备好之后,阶段2的引导加载程序就可以调用内核映像了。

回页首

内核

GRUB中的手工引导

在GRUB命令行中,我们可以使用initrd映像引导一个特定的内核,方法如下:

grub>kernel/bzImage-2.6.14.2

[Linux-bzImage,setup=0x1400,size=0x29672e]

grub>initrd/initrd-2.6.14.2.img

[Linux-initrd@0x5f13000,0xcc199bytes]

grub>boot

UncompressingLinux...Ok,bootingthekernel.

如果您不知道要引导的内核的名称,只需使用斜线(/)然后按下Tab键即可。

GRUB会显示内核和initrd映像列表。

当内核映像被加载到内存中,并且阶段2的引导加载程序释放控制权之后,内核阶段就开始了。

内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。

通常它是一个zImage(压缩映像,小于512KB)或一个bzImage(较大的压缩映像,大于512KB),它是提前使用zlib进行压缩过的。

在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1