linux系统开机过程

一、linux系统的启动流程

   关于linux系统的启动流程我们可以按步进行划分为如下:

POST加电自检-->BIOS(Boot Sequence)-->加载对应引导上的MBR(bootloader)-->主引导设置加载其BootLoader-->Kernel初始化-->initrd—>/etc/init进程加载/etc/inittab,其进程流程图如下:

图像 148

二、剖析详细启动过程

⑴、


POST开机自检:电脑主机打开电源的时候,随后会听到滴的一声,系统启动开始了开机自检(POST-power on self

test)自检开始),这个过程中主要是检测计算机硬件设备比如:CPU,内存,主板,显卡,CMOS等设备是否有故障存

在,如果有硬件故障的话将按两种情况理:对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,

不能给出任何提示或信号;对于非严重故障则给出提示或声音报警信号,等待用户处理),如果没有故障,POST完整自己

的接力任务,将尾部工作交接给BIOS处理。




⑵、


BIOS:计算机加电自检完成后第一个读取的地方就是就是BIOS(Basic Input Output System,基础输入输出系统)

,BIOS里面记录了主机板的芯片集与相关设置,如CPU与接口设备的通信频率、启动设备的搜索顺序、硬盘的大小与

类型、系统时间、外部总线、各种接口设备的I/O地址、已经与CPU通信的IRQ中断信息,所以,启动如果要顺利启动,

首先要读取BIOS设置。




⑶、


按照BIOS所设定的系统启动流程,如果检测通过,则根据引导次序(Boot Sequence)开始在第一台设备上支持启动

程序,我们的启动设备主要包括硬盘、USB、SD等,我们一般用的是硬盘,然后进行读取第一个设备就是硬盘,第一个

要读去的就是该硬盘的主引导记录MBR(Master Boot Record),然后系统可以根据启动区安装的

引导加载程序(Boot Loader)开始执行核心识别的工作。【在此插一句:MBR程序只是找到只是硬盘分区内最前面

的446个字节的Boot Loader】然后查找相关配置和定义。




⑷、


Boot Loader 加载Grub程序 

    在这个过程中主要靠Grub的引导开始的,Grub分为连个阶段:

     stage1:主要是Boot loader

     stage 1.5:过渡

    stage2:主要是/boot/grub




图像 149

通过上面我们可以发现linux的内核VMLnuz,grub、initrd都在/boot目录下

图像 150

在/boot/grub/下面我们看到了熟悉的stage1,stage2及grub工具的配置文件  grub.conf,那么grub.conf内都定义了什么呐??

图像 151

⑸、Kernel

根据Grub内的定义,grub读取完毕后就把下面的工作交个内核了。kernel主要是完成系统硬件探测及硬件驱动的初始

化,并且以读写的方式挂载根文件系统(根切换),那么这里就出现了一个“先有鸡还是先有蛋的文件了”,具体是什么

那?

     要想访问真正的根文件系统(rootfs)的话,就必须加载根文件系统中的设备,这时根文件系统又没有挂载,

要挂载根文件系统又得加载根文件系统中的驱动程序,哪怎么办呢?为了解决这个问题,这是就用到了initrd文件了。  

在来说下kernel初始化所要工作的内容做下简单总结:  

      探测硬件->加载驱动(initrd)->挂载根文件系统->rootfs(/sbin/init)



⑹、

到此止内核空间的相关工作已经完成,内核空间的任务开始向用户空间转移,内核空间通过一个间接的initrd(微型

linux)向用户空间的/sbin/init过度,所以gurb开始引导内核转向initrd。

    initrd:一个虚拟的文件系统,里面有lib、bin、sbin、usr、proc、sys、var、dev、boot等一些目录,

其实你会发现里面的目录有点像真的/对吧,所以我们称之为虚拟的根文件系统,作用就是将kernel和真的根文件系统

建立关联关系,让kernel去initrd中加载根文件系统所需要的驱动程序,并以读写的方式挂载根文件系统,并让执行

用户当中第一个进程init。



图像 152

下面我们看下init脚本内的内容:

图像 153


图像 154

图像 155

从上面的脚本内容我们可以看到init进程的主要工作:

挂载 :将initrd中的/proc, /sys  /dev 挂载到当前的主分区中的相应目录  

创建目录:/dev/mapper  

通过mknod完成block or character special files的创建  

相关模块的挂载  

创建root设备  

挂载 /sysroot  

最后完成根切换



⑺、init执行完毕以后会启动系统内的/etc/inittab文件,来完成系统系统的初始化工作。下面我们来介绍一下inittab这个配置文件内的详细内容

图像 156

图像 157


各个级别的定义:

默认运行级别      

0:halt                      //关机  

1: single user mode    //单用户维护模式)  

2:multi user mode, without NFS  //不支持NFS功能  

3: multi user mode, text mode     //字符界面  

4:reserved   //系统保留  

5: multi user mode, graphic mode   //图形化界面  

6: reboot   //重启




/etc/inittab格式及语法(:)    

[选项]:[runlevel]:[行为]:[命令]

行为:  

                  initdefault:代表默认运行级别  

                  sysinit:代表系统初始化操作选项  

                  ctrlaltdel:代表重启的相关设置  

                  wait:代表上一个命令执行结束后方可执行下面的操作  

                  respawn:代表后面字段可以无限制再生(reboot)

命令选项  

              一些命令,不过通常都是脚本




下面说下inittab内定义的初始化脚本:rc.sysinit  --/etc/rc.d/rc.sysinit

图像 158

图像 159

如上图所示:rc.sysinit脚本内定义了一些与系统初始化的定义

设定主机名

检测并挂载/etc/fstab中其他文件系统

启动swap分区

/etc/sysctl.conf设定内核参数

装载键映射-->键盘上每个键的功能

然后根据系统运行级别运行相关的服务脚本:/etc/rc.d/init.d/脚本和/etc/rc.d/rc#d



图像 161

rc0-rc6目录下脚本:

K*     ##只要是以K开头的文件均执行stop工作  

S*     ##只要是以S开头的文件均执行start工作  

0-99  (执行次序,数字越小越先被执行)

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

可以根据自己的需求将一些执行命令或是脚本写到/etc/rc.d/rc.local里,当开机时,就可以加载啦



三、总结

系统初始化的大致内容总结如下:

硬件的初始化,图像界面启动的初始化(如果设置了默认启动基本)  

主机RAID的设置初始化,device mapper 及相关的初始化,  

检测根文件系统,以只读方式挂载  

激活udev和selinux  

设置内核参数 /etc/sysctl.conf  

设置系统时钟  

启用交换分区,设置主机名  

加载键盘映射  

激活RAID和LVM逻辑卷  

挂载额外的文件系统 /etc/fstab  

最后根据mingetty程序调用login让用户登录->用户登录(完成系统启动) 

在系统启动过程中主要的脚本和目录有: 

boot 

/grub 

/boot/grub/grub.conf 

/boot/initrd+内核版本 

/initrd文件中的/proc/  /sys/    /dev/ 目录的挂载 及根的切换 

/etc/inittab  脚本 

/etc/rc.d/rc.sysinit  脚本 等



转载于:https://my.oschina.net/liting/blog/390087

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值