您的位置:首页 > 运维架构 > Linux

Linux启动流程

2014-03-05 23:13 183 查看
1.POST(power on Self Test)开机自检
CPU通电后开始自检,cpu本身就是一个电器设备,如何自检呢?我们知道cpu都是执行指令的,但是开机的时候cpu也会去检测内存,说明内存还没初始化,那这时候都没有存储设备,cpu去哪里找执行的指令呢?这时,他就要去找ROM芯片中的指令了,ROM中已经内置有开机自检的代码了,实际上cpu看到的物理内存是ROM+RAM的.cpu设计厂商在设计cpu的时候就被设计成,执行的第一条指令就一定要到那个地方去找,而主板设计厂商在设计主板的时候就一定把指令放在那个地方,(算是默认约定吧),找到后就开始自检了,自检没问题就开始找内核了.当然这是仅仅只有一个外部存储设备是会这样,那要是有多个外部存储设备呢?那就要设置开机启动顺序了,这在我们的BIOS里面设置.
2.BIOS(Basic Input/Output System):基本输入输出系统
BIOS里面的设置很简单,我就不说了,接着说我们的找内核吧.
3.MBR
那去哪里找内核呢?一定是一个外部存储设备,比如硬盘,那硬盘由谁驱动呢?当然是内核驱动啦!那内核在哪里呢?当然在硬盘里啦.....那怎么找内核啊?所以,这个外部储存设备一定要在硬件级别就能被cpu所找到,那这就是MBR啦,(Main Boot Record 主引导记录区),它位于整个硬盘的0磁道0柱面1扇区,不过,在总共512字节的主引导扇区中,bootloader占用了其中的446个字节,另外的64个字节是DPT(Disk Partition Table硬盘分区表)其中每16个字节一个,所以一般我们的磁盘只能分成4个主分区,最后两个字节5A,是标识位,用来标识bootloader和分区表是否有效的.bootloader是提供一个选择菜单让你选择加载哪个分区上的操作系统的,如果我们选择了一个操作系统,那bootloader就一定要能引导这个操作系统,(引导就是加载操作系统的内核),但是此时没有文件系统,文件系统还在内核上,那怎么办?那就意味着bootloader自己就要能识别分区信息(或文件系统),所以很多人到这里很奇怪,操作系统都没启动,哪来的文件系统啊,现在明白了吧~~~,那bootloader要把内核加载到哪里去呢?当然是内存啦,任何程序运行都要加载到内存,内核也是一种应用程序,他当然也要去内存啦.那现在又有一个问题,bootloader很小,他只能识别基本的磁盘设备(文件系统?),但是我们的操作系统又在高级的磁盘系统里,所以不管多高级的文件系统或磁盘设备,内核都只能放在基本磁盘设备里,但是大家都知道Linux的根目录是在lvm磁盘设备里的,而内核又在根下,那这...........其实,根是内核访问文件系统的入口,内核把他挂成根,他裁成为根的,而内核早就在内存里面了,根下的内核只是一个文件而已,也就是在根下创建了一个目录,这个目录挂载了我们的内核所在的分区而已.大家注意,内核加载到内存中都是压缩后存放的,一.为了节约空间.二,因为内核加载到内存需要用到IO,为了加快速度.但是在内存中使用内核需要解压,所以内核是自带干粮的,它可以自解压.
4.内核搞定自己的事情就该启动/sbin/init了,来看看init是怎么工作的
那内核要加载根目录,但是根可能会在不同的磁盘设备上,那根如何去识别这些设备,因为内核是事先做好的,他要识别各种不同的根,就要内置各种各样的磁盘驱动?那有一万种磁盘驱动,他就得放一万个驱动文件?那内核得多大啊!所以我们得把设备的驱动做成模块,那模块在哪里啊?在根上,一般在/lib/modules下.那我们又面临一个问题,要挂载根,得先找到模块,要找到模块,得先挂载根,怎么办?所以我们在事先bootloader引导内核的时候就先把这些驱动模块放在与内核一起的目录下,那我们怎么知道要把哪些模块与内核目录放在一个目录下呢?在系统安装操作系统的时候的时候,安装程序本身在安装完以后可以通过一个脚本自动收集这设备需要的驱动,并把这些模块打包与内核放在一个目录下,所以操作系统安装的过程有一个额外的步骤,就是准备由内核能以模块化的方式加载根文件的驱动的文件,这个文件就叫做initrd,initrd是为了帮助内核能够完成初始化的文件,bootloader会把内核和initrd同事加载到内存中,但不再同一个范围内,内核会把initrd当成磁盘来用,大家都知道磁盘都有文件系统,所以initrd(rd:ram disk)也有文件系统,内核把他当成根来用,内核就可以通过initrd找到真正的根了,就是直接复制该根过去那只是initrd就没用了,内核会通过initrd中的一个应用程序把initrd从内存中移除,这个应用程序就是init,接下来就是init的工作了.
5.init:/sbin/init
那init要做什么呢?首先他要去执行/etc/rc.d/rc.sysinit脚本,这个脚本要完成后续的很多初始化的工作,那/etc/rc.d/rc.sysinit又不是init的配置文件,他怎么知道要去执行/etc/rc.d/rc.sysinit呢?其实init的配置文件是/etc/inittab,是这个文件定义了他要去执行/etc/rc.d/rc.sysinit,系统初始化完成后,就要开始启动系统了,大家知道Linux的启动有7个级别,那系统要启动哪个级别呢?那就要看/sbin/init中定义了哪个了,那我们来看看/sbin/init的配置文件/etc/inittab,如下图:



6.init工作详细内容
a.设定默认启动级别
b.运行指定系统运行的初始化脚本------/etc/rc.d/rc.sysinit(关键)
c.启动指定级别下要启动的服务,并关闭需要停止的服务------/etc/rc.d-----/etc/rc.d/rcN.d[1-6][K.S](关键)
d.定义Ctrl+Alt+Del组合键的动作
e.初始化字符终端
f.启动图形化终端
7./etc/rc.d/rc.sysinit工作详细内容
a.设置主机名
b.打印文本欢迎信息等
c.激活selinux和udev
d.启动交换分区
e.挂载本地文件系统(也就是/etc/fstab中定义的文件系统)
f.检测根文件系统并对其以读写方式重新挂载
g.设置系统时钟
h.装载键盘映射
i.根据/etc/sysctl.conf设置内核参数
j.激活软RAID和LVM设备
k.执行清理操作
8.MBR:GRUB工作机制
GRUB程序为了引导系统,但是把程序分成三阶段段(其实更复杂,我们只简单的说说),第一阶段在MBR中,它主要是识别基本的磁盘分区和完成引导第三阶段.第二阶段是作为第一个阶段的补充,它在boot基本磁盘分区中,主要为了识别内核文件所在的文件系统提供文件系统识别扩展(就是识别阔真磁盘分区,如:RAID,LVM).第三阶段才是GRUB的引导程序,位于boot基本磁盘分区上.
GRUB的功能
a.选择要启动的内核或系统(隐藏界面)
b.交互式接口,编辑模式等
c.基于密码的保护,两种方式(1.启用内核映象.2.传递参数)
GRUB配置文件---->/boot/grub/grub.conf,附图
Title:操作系统或内核标题
root:设定内核文件所在的分区为grub的根
kernel:定义要使用的内核文件,后面可附加传递给内核的参数
initrd:指定为内核提供额外驱动等功能的ram disk


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: