linux系统启动流程详解

来源:互联网 发布:什么软件可以写日记 编辑:程序博客网 时间:2024/06/06 10:50

linux系统启动流程详解
对系统的流程先有一个大概的了解开电源==BIOS自检==启动设备(磁盘
orU盘or光驱)==引导程序(lilo或grub)==内核==init程序(==rc.sysinit和
rc)==mingetty==终端登录==shell.

现在分为四个阶段来讲述
第一阶段BIOS启动引导阶段实现硬件的初始
化以及查找启动介质从MBR中装载启动引导管理器(GRUB)并运行该启动引导
管理器.
第二阶段GRUB启动引导管理器装载stage1装载stage2读取
/boot/grub.conf文件并显示启动菜单装载所选的kernel和initrd文件到
内存中.
第三阶段内核启动阶段运行内核启动参数解压并挂载initrd文件系统,
装载所需的驱动挂载根文件系统.
第四阶段init初始化阶段启动/sbin/init进程运行rc.sysinit脚本,
设置系统环境,启动swap分区,检查和挂载文件系统读取/etc/inittab文件,
运行在/etc/rc.d/rc n.d中定义的不同的运行级别服务初始化运行脚本打开
字符终端1–6号控制台or图形管理的7号控制台.
第一阶段系统开机上电后,主板BIOS运行POST(Power on self test)代
码,检测系统外围关键设备(如CPU,内存,显卡,I/O,键盘,鼠标等),硬件配置信
息及一些用户配置参数存储在主板的CMOS(Complementary Metal Oxide
Semiconductor)上(一般64字节),实际上就是主板上一块可读写的RAM芯片,由
主板上的电池供电,系统掉电后,信息不会丢失.执行POST代码对系统外围关键
设备检测通过后,系统启动自举程序,根据我们在BIOS中设置的启动顺序搜索启
动驱动器(比如的硬盘,光驱,网络服务器等).选择合适的启动器,通常是硬盘设备,
BIOS会读取硬盘的第一个扇区(MBR,512字节),并执行其中的代码.实际上这
里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内
容,并执行,BIOS的任务就完成了.此后将系统启动的控制权移交到MBR部分的
代码.
第二阶段BIOS通过下面两种方法之一来传递引导记录第一,将控制权
传递给initial program loader(IPL)该程序安装在磁盘主引导记录(MBR)中第
二,将控制权传递给initial program loader(IPL),该程序安装在磁盘分区的
启动引导扇区中无论上面的哪种情况中,IPL都是MBR的一部分并应该存储于一
个不大于446字节的磁盘空间中,因为MBR是一个不大于512字节的空间.因此
IPL仅仅是GRUB的第一个部分(stage1),他的作用就是定位和装载GRUB的第二
个部分(stage2)stage2对启动系统起关键作用,该部分提供了GRUB启动菜单
和交互式的GRUB的shell.启动菜单在启动时候通过/boot/grub/grub.conf文
件所定义的内容生成.在启动菜单中选择了kernel之后,GRUB会负责解压和装
载kernel image并且将initrd装载到内存中.最后GRUB初始化kernel启动代
码.完成之后后续的引导权被移交给kernel.
假设bootloader为grub,其引导系统的过程如下grub分为
stage1(stage1.5)和stage2,stage1可以看成是IPL,而stage2则是起到了
grub的关键作用,包括对特定文件系统的支持(ext2,ext3等),grub自己的
shell,以及一些内部程序(如kernel,initrd,root)等.stage1MBR(0头0道
1扇区),前446字节是存放stage1,后面跟的是硬盘分区表信息,BIOS将stage1
载入内存的0x7c00处并跳转执行stage1(/stage1/start.S)的任务很单纯,就
是将硬盘0头0道2扇区的读入内存.0头0道2扇区的内容是源代码中的
/stage2/start.S,编译后512字节,是stage2或stage1.5的入口.
是关于grub常用的几个指令对应的函数grub root(hd0,0)–root指令
为grub指定了一个根分区grub kernel/xen.gz-2.6.18-37.el5–kernel指令
将操作系统内核载入内存grub module/vmlinuz-2.6.18-37.el5xen ro
root=/dev/sda2–module指令加载指定的模块grub module/initrd-2.6.18-
37.el5xen.img–指定initrd文件grub boot–boot指令调用相应的启动函数
启动OS内核

第三阶段grub boot指令后,系统启动的控制权移交给kernel.Kernel会
立即初始化系统中各设备并做相关配置工作,其中包括CPU,I/O,存储设备等.关
于设备驱动加载,有两部分一部分设备驱动编入Linux Kernel中,Kernel会
调用这部分驱动初始化相关设备,同时将日志输出到kernel message buffer,
系统启动后dmesg可以查看到这部分输出信息.另外有一部分设备驱动并没有编
入Kernel,而是作为模块形式放在initrd(ramdisk)中.initrd是一种基于内存
的文件系统,启动过程中,系统在访问真正的根文件系统/时,会先访问initrd文
件系统.将initrd中的内容打开来看,会发现有
bin,devetc,lib,procsys,sysroot,init等文件(包含目录).其中包含了一些设
备的驱动模块,比如scsi ata等设备驱动模块,同时还有几个基本的可执行程序
insmod,modprobe,lvm,nash.主要目的是加载一些存储介质的驱动模块,如上面
所说的scsi ideusb等设备驱动模块,初始化LVM,把/根文件系统以只读方式挂
载.initrd中的内容释放到rootfs中后,Kernel会执行其中的init文件,这里
的init是一个脚本,由nash解释器执行.这个时候内核的控制权移交给init文
件处理,我们查看init文件的内容,主要也是加载各种存储介质相关的设备驱动.
驱动加载后,会创建一个根设备,然后将根文件系统/以只读的方式挂载.这
步结束后释放未使用内存并执行switchroot,转换到真正的根/上面去,同时运
行/sbin/init程序.开启系统的1号进程,此后系统启动的控制权移交给init
进程.关于switchroot是在nash中定义的程序.实际上Linux Kernel仅是包含
了基本的硬件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息和系
统硬件信息将一部分设备驱动写入initrd.这样在以后启动系统时,一部分设备
驱动就放在initrd中来加载.
第四阶段init进程起来后,系统启动的控制权交给init进
程./sbin/init是所有进程的父进程,当init起来后会先读取inittab文件,进
行以下的工作a)执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基
本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起
来了,后面需要进行运行级别的确定及相应服务的启动b)确定启动后进入的运
行级别c)执行/etc/rc.d/rc,该文件定义了服务启动的顺序是先K后S,而具
体的每个运行级别的服务状态是放在/etc/rc.d/rcn.d(n=0~6)目录下,所有的文
件均链接至/etc/init.d下的相应文件.d)有关key sequence的设置e)有关

原创粉丝点击