一、linux系统的启动流程

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

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

二、剖析详细启动过程

⑴、

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

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

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

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

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

⑵、

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

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

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

  4. 首先要读取BIOS设置。

⑶、

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

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

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

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

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

⑷、

  1. Boot Loader 加载Grub程序

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

  3. stage1:主要是Boot loader

  4. stage 1.5:过渡

  5. stage2:主要是/boot/grub

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

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

⑸、Kernel

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

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

  3. 那?

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

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

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

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

⑹、

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

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

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

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

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

  6. 用户当中第一个进程init。

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

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

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

  2. 创建目录:/dev/mapper

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

  4. 相关模块的挂载

  5. 创建root设备

  6. 挂载 /sysroot

  7. 最后完成根切换

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

各个级别的定义:

默认运行级别

  1. 0:halt                      //关机

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

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

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

  5. 4:reserved   //系统保留

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

  7. 6: reboot   //重启

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

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

  2. 行为:

  3. initdefault:代表默认运行级别

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

  5. ctrlaltdel:代表重启的相关设置

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

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

  8. 命令选项

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

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

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

  2. 设定主机名

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

  4. 启动swap分区

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

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

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

  1. rc0-rc6目录下脚本:

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

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

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

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

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

三、总结

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

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

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

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

  4. 激活udev和selinux

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

  6. 设置系统时钟

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

  8. 加载键盘映射

  9. 激活RAID和LVM逻辑卷

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

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

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

  13. boot

  14. /grub

  15. /boot/grub/grub.conf

  16. /boot/initrd+内核版本

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

  18. /etc/inittab  脚本

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

这些重要的脚本和目录,还有其他重要的目录和文件,脚本等。由此篇我们可以详细了解linux系统的启动和初始化过程,然后我们可以根据linux系统启动的过程和所用到的命令自己动手DIY一个微型linux系统,关于“DIY微型linux系统”会再后两至三天内发表博文,到时候我们在一起探讨探讨linux系统的组成部分等更详细的相关

信息!!!

转自:http://chrinux.blog.51cto.com/6466723/1192004

详解linux系统的启动过程及系统初始化的更多相关文章

  1. linux系统的启动过程及系统初始化

    (其中/etc/inittab是一个很重要的文件,值得细究http://www.2cto.com/os/201108/98426.html) 其开头的446字节内容特指为"主引导记录&quo ...

  2. Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)

    1 前景回顾 1.1 Linux的调度器组成 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测 ...

  3. 探索 Linux 系统的启动过程

    引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...

  4. Linux系统的启动过程

    Linux 系统启动过程 Linux系统的启动过程可以分为5个阶段: BIOS自检 内核的引导. 运行init. 系统初始化. 用户登录系统. BIOS自检: BIOS是英文"Basic I ...

  5. 详解Linux下swig 3.0.12的手动安装过程

    详解Linux下swig 3.0.12的手动安装过程 首先 从http://www.linuxfromscratch.org/blfs/view/cvs/general/swig.html上下载swi ...

  6. Linux基础-6.系统的启动过程

    Linux启动时我们会看到许多启动信息 Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导 运行init 系统初始化 建立终端 用户登录系统 init程序的类型: ...

  7. Linux:系统的启动过程

    Linux系统的启动过程 过程 通电-> BIOS-> LILO/GRUB-> Kernel Boot-> init->rc.sysinit init->rc -& ...

  8. [转帖]详解Linux系统inode原理--硬链接、软链接、innodb大小和划分等

    详解Linux系统inode原理--硬链接.软链接.innodb大小和划分等 原创 波波说运维 2019-07-17 00:03:00 https://www.toutiao.com/i6713116 ...

  9. 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)

    一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)     概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...

随机推荐

  1. 使用Spring的jdbcTemplate进一步简化JDBC操作

    先看applicationContext.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <b ...

  2. http://jingyan.baidu.com/article/86112f13582848273797879b.html

    http://jingyan.baidu.com/article/86112f13582848273797879b.html

  3. Google不支持小于12px字体 终极办法

    每个浏览器厂商都会自己有设计的主观性,而这些出发点看似很好的却往往深深地伤害程序员. 1.需求 呈现指定为Google浏览器,字号为6-8px(为了打印细小的尺寸). 2.探索 2.1 CSS HAC ...

  4. POJ1511 Invitation Cards(多源单汇最短路)

    边取反,从汇点跑单源最短路即可. #include<cstdio> #include<cstring> #include<queue> #include<al ...

  5. GridView点击排序

    快速预览:GridView无代码分页排序GridView选中,编辑,取消,删除GridView正反双向排序GridView和下拉菜单DropDownList结合GridView和CheckBox结合鼠 ...

  6. Guaranteeing message processing —— 可靠的消息处理

    Storm's reliability API: how Storm guarantees that every message coming off a spout will be fully pr ...

  7. 20145325张梓靖 实验三 "敏捷开发与XP实践"

    20145325张梓靖 实验三 "敏捷开发与XP实践" 程序设计过程 实验内容 使用 git 上传代码 git上传中遇到的问题 使用 git 相互更改代码 实现代码的重构 git ...

  8. linux下安装7z命令及7z命令的使用

    本文主要介绍了在linux下安装7z命令的方法,同时介绍了7z命令的使用.7z压缩格式拥有众多优点,具有极高的压缩比率,如果你还不了解,请看文章:7z格式.LZMA压缩算法和7-Zip详细介绍. re ...

  9. c++ namespace的使用

    ** namespace:命名空间就是为解决C++中的变量.函数的命名冲突而服务的. ** namespace定义的格式基本格式是: namespace identifier {    entitie ...

  10. 清除 WD MyCloud 自动生成的 .wdmc 目录

    1. 先 SSH,停止相应服务 /etc/init.d/wdmcserverd stop/etc/init.d/wdphotodbmergerd stop 2. 禁止服务自启动 update-rc.d ...