Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86397
  • 博文数量: 42
  • 博客积分: 2630
  • 博客等级: 少校
  • 技术积分: 415
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-23 11:05
文章分类
文章存档

2011年(1)

2010年(41)

我的朋友

分类: LINUX

2010-09-24 15:44:53

启动流程

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

整个启动过程:

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

2.  读取第一个启动设备的MBR的引导加载程序(lilogrubspfdisk

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目录下。

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

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

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

 

grub是如何被载入的呢?

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

Stage1阶段

装载基本的引导程式(stage1),这也是安装在MBR中的内容,大小为512字节,但这并不意味着占用的空间为512字节,这还要看块的大小以及inode控制的块数。比如说,我用#du –b stage1,看到的是512字节,但用#du –h stage1却看到的是2Kstage1的主要功能就是装载第二引导程式(stage2)stage1应该还包括磁盘分区的信息,但这个信息应该只是刚开始装机时的信息了,对于后面又对磁盘进行的分区操作stage1应该是没有记录的,所以要备份的话,还是备份MBR为上策。

#dd if=/dev/had of=/tmp/mbr.back bs=512 count=1

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

 

Stage1.5阶段

所有文件名是【XXX_stage1_5】的都属于这阶段的文件,但至于为何会有这么多个文件?是因为其作用就像是连接stage1stage2的一个通道,里面唯一存放的是该系统文件的格式,所以只要是被支持的格式,就会预先存放一个格式文件在其中。

这阶段的过程可以让GRUBstage1启动完成后,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文件主要提供的功能如下。

提供菜单。

读取配置文件。

连接下一个boot sector

配置文件

device.mapmenu.lstgrub.conf都属于这类文件。

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

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

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

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

 

通过引导加载程序读取核心文件后,接下来,主机会把核心文件解压缩到主存储器中,并且利用核心的功能,开始测试与驱动各台外部设备(存储设备,CPU,网卡,声卡,等)。在加载核心的过程中,系统会以只读的方式载入根目录,而且会建立一个虚拟盘(RAM Disk),以协助启动过程。这就需要initrd的支持了,利用引导加载程序加载核心的时候,一起加载initrd的映像文件,他的作用是在没有mount  /分区以前,系统要执行一些操作,比如挂载scsi驱动,他就把initrd释放到内存里,作一个虚拟的/,然后执行其根目录下的一个脚本“init”(内核2.4的为linuxrc,新内核2.6init),运行insmodnash命令挂装模块。在核心驱动外部硬件的工作完成之后,initrd所建立的虚拟盘就会被删除。但注意initrd并非必要的。

 

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

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

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

       gzip -d initrd.gz

       cpio -idv < initrd

来查看initrd的内容。

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

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

Anash 指令。

B:挂载主要的文件系统。

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

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

E:加载相关模块。

F:切入实体操作系统。

 

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

noinitrd
命令代替后,就不存在initrd)
1)boot loader(grub)
加载内核和
initrd.img
2)
内核将压缩的initrd.img解压成正常的ram disk并且释放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 -d initrd.gz

       cpio -idv < initrd

 

 

 

 

 

 

 

 

 

 

 

BIOS

引导加载程序

核心

initrd

核心解压缩并搜索RAM

Initrd制作RAM

核心自动检测所有硬件与载入驱动程序

使用initrd功能找到RAM

init

Initrd内的linuxrc/init开始载入驱动程序入

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

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

 

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

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

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

2.  测试与载入内存设备 /procUSB设备/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.  设置RAIDLVM等硬盘功能。

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目录中的文件都是以SK开头的并加有数字的文件名

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

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

 

察看模块信息

#modinfo ext3

 

核心模块的加载也删除

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

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

rmmod:删除模块。

 

核心模块的额外参数设置:/etc/modprobe.conf

比如说设定中断号等等

 

阅读(508) | 评论(1) | 转发(0) |
0

上一篇:如何解开initrd文件

下一篇:硬盘状态

给主人留下些什么吧!~~

chinaunix网友2010-09-27 11:06:15

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com