浅谈-LINUX 操作系统启动过程

LINUX 操作系统启动过程



通过一段时间的学习已经对linux有了一定的了解,接下来就开始研究一下linux 操作系统的启动过程吧。当然这是为了让大家比较容易发现linux启动过程中容易发生问题的地方以及解决办法。

目录

一、简述

二、详解

1、BIOS加电自检

2、读取MBR

三、加载内核

1、Grub引导分为三个阶段

2、Stage1.5阶段存在的原因

3、详解三阶段引导过程

四、调用init进程

1、init的功能作用

2、init初始化流程

3、init 执行 run-level 的各个服务启动

4、init 执行 /etc/rc.d/rc.local

5、init 执行终端机仿真程序mingetty来启动程序

五、linux系统启动流程图

  一、简述

简单的说linux的启动过程如下:

1.加载BIOS的硬件信息及自检,并根据bios设置读取第一启动设备。

2.读取并执行第一启动设备内MBR的boot loader (即grub、等程序)

3.根据boot loader的设置加载你kernel,kernel会开始检测硬件与加载驱动程序

4.在硬件驱动成功后,内核会调用init进程,init进程会取得runlevel信息(启动级别)

5.init 执行 /etc/rc.d/rc.sysinit 档案来准备软件执行的作业环境 (如网络、时区等)

6.init 执行 run-level 的各个服务启动 (script 方式)

7.init 执行 /etc/rc.d/rc.local 档案

8.init 执行终端机仿真程序mingetty来启动程序,最后就等待用户登入

图示:

上图来自chunaunix博客http://blog.chinaunix.net/uid-26495963-id-3066282.html

    二、详解

1、BIOS加电自检

Bios(base input/output system )基本输入输出系统,基本上有点计算机基础的同学多少都是有些了解的。其实是一组固化在计算机ROM芯片上的程序,它保存着计算机最重要的基本输入输出程序、开机后自检程序和系统自启动程序,它可以从cmos读取计算机的硬件信息。

BIOS主要分为三部分:

第一部分:对刚开机加电的计算机硬件进行检测,称为加电自检(POST power on self test)

主要功能检查计算机各硬件部分,对于计算机硬盘、主板、各接口、及键盘等作出检查并对检测给予相关提示及报警信息。

第二部分:初始化,主要对硬件设备参数的设置和检测,当计算机启动时读取这些参数并与实际硬件设置比对。

第三部分:引导程序,功能是引导操作系统。Bios从第一启动设备读取扇区MBR(主引导记录),如果没有找到MBR,则显示没有引导设备。如果找到会把电脑控制权转给MBR,有引导记录启动操作系统,bios的任务就完成了。

    2、读取MBR

MBR(Master Boot Record)主引导记录。硬盘的0柱面0磁头0扇区称为主引导扇区。它有三部分组成,主引导程序(boot loader)、硬盘分区表DPT(disk partition table) 和硬盘有效标志(55AA)【hexdump  –C  -n 512 /dev/sda(硬盘) 可以查看】其结构如下:

硬盘分区表主要包含partitionID(5:延伸 82:swap  83:linux  8e:lvm fd:RAID)

三、加载内核

1、Grub引导分为三个阶段

通常大家认为是两个阶段这里给大家分享一下linux启动中1.5阶段

stage1:stage1阶段是直接被写入MBR中的(也就是大家说的bootloader)

stage1.5:存放在磁盘mbr之后的扇区中,让stage1中bootloader能识别stage2所在的分区的文件系统;

stage2:磁盘分区(/boot/grub/stage2)删除时候系统无法启动。

注意:根据stage2阶段文件定义内容找grub.conf文件然后根据这个文件里定义的内容找boot下的内核vmlinuz..与驱动模块initamfs..,至此有bootloader到grub加载内核文件与模块系统引导启动。

2、Stage1.5阶段存在的原因

Stage:通常大家都认为grub放在mbr里,但mbr太小了前面只有446个字节,所以分为2段引导,第一段存放在MBR中,第二段存放于内核文件系统中,第一段引导完成可以找到第二段。但是,第二段是存放在内核文件中的,此时还没有挂载文件系统,那么如何让可以访问到第二段的引导配置文件,就需要借助1.5阶段,有它来协助stage1段来访问stage2阶段。Stage1.5通常位于stage1后的扇区(或理解为mbr后的扇区内)由于stage2

在内存中存放可以使用文件系统不确定,所以这就是有多个1.5阶段的原因。

3、详解三阶段引导过程

详细说明:引导加载程序先读取MBR上的gurb第一阶段,由于MBR很小只有512字节采用grub这种方式引导程序,随后读取扇区中的stage1.5阶段,读取1.5阶段以后从而就能驱动第二阶段stage2所在的磁盘分区,stage2是存放在磁盘分区上的还包括了内核文件及ramdisk等都在这个分区上存放的;这就是为什么通过Bootloader之grub就能够加载内核文件的原因。

当然硬盘设备能识别,并不代表硬盘上的文件系统能识别,因为文件系统是额外附加的一层软件组织的文件结构,所以要能够对接一种文件系统,必须要用到文件系统驱动;对应的应用程序必须能识别和理解这样的文件系统才可以,这种程序就称为文件系统驱动;grub的1.5阶段就是给gurb提供了文件系统驱动的,从而就能够访问对应的第二阶段和内核所在的分区了,这通常是一个基本磁盘分区;所以grub第二阶段以及内核和ramdisk文件通常都会放在一个基本磁盘分区上;因为grub驱动不了逻辑卷这种高级接口(所以在给boot分区的时候不要使用逻辑卷当然绝大多数的生产环境也不会去使用逻辑卷的)。

四、调用init进程

1、init的功能作用

在核心加载完毕、进行完硬件侦测与驱动程序加载后,此时你的主机硬件应该已经准备就绪了(ready) , 此时内核会主动调用第一个程序,那就是 /sbin/init (记得进程管理那章说过init的PID为1)。 /sbin/init 最主要的功能就是准备软件执行环境,包括系统的主机名、网络设定、语言处理、文件系统格式及其它服务等。 而所有的动作都会通过init 的配置文件,亦即是 /etc/inittab 来进行,而 inittab 内还有一个很重要的作用,那就是默认的runlevel(开机执行级别)

0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

1:单用户工作状态,root权限,用于系统维护,禁止远程登陆

2:多用户状态(没有NFS)

3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式

4:系统未使用,保留

5:X11控制台,登陆后进入图形GUI模式

6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

2、init初始化流程

在整个linux开始各项服务之前应该先设置后系统环境。主要利用/etc/init.d/sysinit这个脚本来这是系统环境。下面就是init初始化linux系统环境的流程(不同的linux发行版也用不同之处)。

(1)获取网络环境与主机类型。首先会读取网络环境设置文件"/etc/sysconfig/network",获取主机名称与默认网关等网络环境。

(2)测试与股灾内存设备/proc及usb设备/sys。

除了/proc外,系统会主动检测是否有usb设备,并主动加载usb驱动,尝试载入usb文件系统。

(3)决定是否启动SELinux。

(4)启动系统随机数设备(产生随机数功能)。

(5)设置终端的控制台的字体。

(6)设置显示与启动过程中的欢迎界面

(7)设置系统时间(clock)读取/etc/sysconfig/clock的。

(8)接口设备的检测与即插即用(pnp)参数的测试。

(9)用户自定义模块的加载。

通过"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。

(10)加载内核的相关设置

系统会主动读取/etc/sysctl.conf文件的设置值

(11)设置主机名与初始化电源模块管理(ACPI)

(12)初始化软件磁盘阵列:主要通过/etc/mdadm.conf来设置好的

(13)初始化LVM的文件系统功能。

(14)以fsck检验磁盘文件系统:会对filesystem check

(15)进行磁盘配额quota的转换(非必要)。

(16)重新以读取模式载入系统磁盘。

(17)启动quota功能。

(18)启动系统伪随机数生成器(pseudo-random)

(19)清楚启动过程中的临时文件

(20)将启动相关信息加载/var/log/dmesg文件中

3、init 执行 run-level 的各个服务启动

内核加载完成并通过/etc/rc.d/rc.sysinit加载系统模块和初始化相关硬件设备信息后,centos已经可以正常工作了。但再次之前系统还需要启动各项服务已满足需求。

系统会根据/etc/inittab文件里的run-level设置(上文提到过)来设置启动项。

假如你的系统级别现在为5那系统就会调用/etc/rc.5.d/内的脚本程序:

找到/ect/rc.5.d/K##* 开头的文件,并进行/ect/rc.5.d/K##* stop操作。

找到/ect/rc.5.d/S##* 开头的文件,并进行/ect/rc.5.d/S##* start操作。

(## 代表数字    * 文件名)

4、init 执行 /etc/rc.d/rc.local

/etc.rc.d/rc.local 用户自定义开机启动程序配置文件。如果将脚本或程序写入/etc.rc.d/rc.local配置文件中那系统启动时会直接启动。系统在加载内核初始化环境之后调用run-level启动开机启动程序,最后调用/etc.rc.d/rc.local文件查看是否有需要开机启动的脚本等。

5、init 执行终端机仿真程序mingetty来启动程序

mingetty程序能打开终端、设置模式。同时它会 显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验 证用户的身份。

mingetty将提示入户输入程序(以login为例),调用login程序,login验证通过后将执行配置文件/etc/profile(如果存在),由于mingetty是用来调用login进行身份验证的所有这是个守护进程杀死后自动重生。

系统启动时init调用mingety程序等待用户登录。

五、linux系统启动流程图

时间: 2024-11-11 19:32:29

浅谈-LINUX 操作系统启动过程的相关文章

浅谈Linux中的信号机制(二)

首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Linux内核源码评头论足.以后的路还很长,我还是一步一个脚印的慢慢走着吧,Linux内核这座山,我才刚刚抵达山脚下. 好了,言归正传,我接着昨天写下去.如有错误还请各位看官指正,先此谢过. 上篇末尾,我们看到了这样的现象:send进程总共发送了500次SIGINT信号给rcv进程,但是实际过程中rcv只接受/处理了1

[]转帖] 浅谈Linux下的五种I/O模型

浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html  一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer.如下图所示: 整个请求过程为: 用户进程发起请求,内核接受到请求后,从I/O设备中获取数据到buffer中,再将buffer中的数据copy到用户进程的地址空间,该用户进程获取到数

(转)浅谈 Linux 内核无线子系统

前言 Linux 内核是如何实现无线网络接口呢?数据包是通过怎样的方式被发送和接收呢? 刚开始工作接触 Linux 无线网络时,我曾迷失在浩瀚的基础代码中,寻找具有介绍性的材料来回答如上面提到的那些高层次的问题. 跟踪探索了一段时间的源代码后,我写下了这篇总结,希望在 Linux 无线网络的工作原理上,读者能从这篇文章获得一个具有帮助性的概览. 1.全局概览 在开始探索 Linux 无线具体细节之前,让我们先来把握一下 Linux 无线子系统整体结构.如图1,展示了 Linux 无线子系统各个模

Linux操作系统启动管理器GRUB

转载:http://58vpn.blog.sohu.com/309434214.html [GRUB是什么]GNU GRUB(简称"GRUB")是一个来自GNU项目的启动引导程序.GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统.GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数.GRUB是在计算机启动后运行的第一个程序,他是用来负责加载.传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2pl/ 浅谈 Linux

浅谈Linux下Makefile编写

浅谈Linux下Makefile的编写 前言:本文简要介绍Makefile文件的编写规范,结合具体项目中的应用进行讲解. 具体代码地址: https://github.com/AnSwErYWJ/DogFood/blob/master/Makefile 简介 Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作.而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关

浅谈linux内核栈(基于3.16-rc4)

在3.16-rc4内核源码中,内核给每个进程分配的内核栈大小为8KB.这个内核栈被称为异常栈,在进程的内核空间运行时或者执行异常处理程序时,使用的都是异常栈,看下异常栈的代码(include/linux/sched.h): 1 union thread_union { 2 struct thread_info thread_info; 3 unsigned long stack[THREAD_SIZE/sizeof(long)]; 4 }; THREAD_SIZE值为8KB,因此内核为进程的异常

Js之浅谈dom操作

JavaScript之浅谈dom操作 1.理解dom: DOM(Document Object Model ,文档对象模型)一种独立于语言,用于操作xml,html文档的应用编程接口. 怎么说,我从两个角度理解: 对于JavaScript,为了能够使JavaScript操作Html,JavaScript就有了一套自己的dom编程接口. 对于Html,dom使得html形成一棵dom树,类似于一颗家族树一样,一层接一层,子子孙孙. 所以说,有了DOM,在我看来就是相当于JavaScript拿到了钥

linux操作系统启动流程和光盘镜像制作

1.简述linux操作系统启动流程 POST (加电自检):自检主要硬件设备如:CPU.内存.硬盘是否正常,以及输入输出设备是否存在问题等. BIOS(Boot Sequence):BIOS(基本的输入输出系统)装载在硬件芯片CMOS之上,自检时会启动这个程序,并根据CMOS上的配置信息去读取其他的硬件信息,检测正常之后进行硬件设备的初始化. 读取MBR:引导加载程序,在MBR(主引导记录)中,主要功能是识别,加载系统的核心文件,并提交到内存中运行来启动对应的系统. Kernel运行:Kerne