概述

Linux是一种自由和开放源代码的类UNIX操作系统。该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布。在加上用户空间的应用程序之后,成为Linux操作系统。Linux是自由软件和开放源代码软件发展中最著名的例子。

下面简单记录一下Linux系统从开机到能使用的整个过程,以作备忘!


LINUX启动流程

先通过一张图来简单了解下整个系统启动的流程,整个过程基本可以分为POST-->BIOS-->MBR(GRUB)-->Kernel-->Init-->Runlevel。下面会详细说明每个过程的作用。


BIOS

BIOS(Basic Input/Output System),基本输入输出系统,该系统存储于主板的ROM芯片上,计算机在开机时,会最先读取该系统,然后会有一个加电自检过程,这个过程其实就是检查CPU和内存,计算机最基本的组成单元(控制器、运算器和存储器),还会检查其他硬件,若没有异常就开始加载BIOS程序到内存当中。详细的BIOS功能,这边就不说了,BIOS主要的一个功能就是存储了磁盘的启动顺序,BIOS会按照启动顺序去查找第一个磁盘头的MBR信息,并加载和执行MBR中的Bootloader程序,若第一个磁盘不存在MBR,则会继续查找第二个磁盘(PS:启动顺序可以在BIOS的界面中进行设置),一旦BootLoader程序被检测并加载内存中,BIOS就将控制权交接给了BootLoader程序。


MBR

MBR(Master Boot Record),主引导记录,MBR存储于磁盘的头部,大小为512bytes,其中,446bytes用于存储BootLoader程序,64bytes用于存储分区表信息,最后2bytes用于MBR的有效性检查。


GRUB

GRUB(Grand Unified Bootloader),多系统启动程序,其执行过程可分为三个步骤:

Stage1:这个其实就是MBR,它的主要工作就是查找并加载第二段Bootloader程序(stage2),但系统在没启动时,MBR根本找不到文件系统,也就找不到stage2所存放的位置,因此,就有了stage1_5

Stage1_5:该步骤就是为了识别文件系统

Stage2:GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息,然后开始加载Kernel程序,当Kernel程序被检测并在加载到内存中,GRUB就将控制权交接给了Kernel程序。

PS:实际上这个步骤/boot还没被挂载,GRUB直接识别grub所在磁盘的文件系统,所以实际上应该是/grub/grub.conf文件,该配置文件的信息如下:

grub.conf:

#boot=/dev/sdadefault=0 #设定默认启动的title的编号,从0开始timeout=5 #等待用户选择的超时时间splashimage=(hd0,0)/boot/grub/splash.xpm.gz #GRUB的背景图片hiddenmenu #隐藏菜单title CentOS (2.6.18-194.el5PAE) #内核标题root (hd0,0) #内核文件所在的设备kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ #内核文件路径以及传递给内核的参数initrd /initrd-2.6.18-194.el5PAE.img #ramdisk文件路径

Kernel

Kernel,内核,Kernel是Linux系统最主要的程序,实际上,Kernel的文件很小,只保留了最基本的模块,并以压缩的文件形式存储在硬盘中,当GRUB将Kernel读进内存,内存开始解压缩内核文件。讲内核启动,应该先讲下initrd这个文件,

initrd(Initial RAM Disk),它在stage2这个步骤就被拷贝到了内存中,这个文件是在安装系统时产生的,是一个临时的根文件系统(rootfs)。因为Kernel为了精简,只保留了最基本的模块,因此,Kernel上并没有各种硬件的驱动程序,也就无法识rootfs所在的设备,故产生了initrd这个文件,该文件装载了必要的驱动模块,当Kernel启动时,可以从initrd文件中装载驱动模块,直到挂载真正的rootfs,然后将initrd从内存中移除。

Kernel会以只读方式挂载根文件系统,当根文件系统被挂载后,开始装载第一个进程(用户空间的进程),执行/sbin/init,之后就将控制权交接给了init程序。


Init

init,初始化,顾名思义,该程序就是进行OS初始化操作,实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行,第一个被执行的脚本为/etc/rc.d/rc.sysinit,这个是真正的OS初始化脚本,简单讲下这个脚本的任务(可以去看看实际脚本,看看都做了什么):

1、激活udev和selinux;

2、根据/etc/sysctl.conf文件,来设定内核参数;

3、设定系统时钟;

4、装载硬盘映射;

5、启用交换分区;

6、设置主机名;

7、根文件系统检测,并以读写方式重新挂载根文件系统;

8、激活RAID和LVM设备;

9、启用磁盘配额;

10、根据/etc/fstab,检查并挂载其他文件系统;

11、清理过期的锁和PID文件

执行完后,根据配置的启动级别,执行对应目录底下的脚本,最后执行/etc/rc.d/rc.local这个脚本,至此,系统启动完成。


Runlevel

runlevel,运行级别,不同的级别会启动的服务不一样,init会根据定义的级别去执行相应目录下的脚本,Linux的启动级别分为以下几种

0:关机模式

1:单一用户模式(直接以管理员身份进入)

2:多用户模式(无网络)

3:多用户模式(命令行)

4:保留

5:多用户模式(图形界面)

6:重启

在不同的运行级别下,/etc/rc.d/rc这个脚本会分别执行不同目录下的脚本

  • Run level 0 – /etc/rc.d/rc0.d/
  • Run level 1 – /etc/rc.d/rc1.d/
  • Run level 2 – /etc/rc.d/rc2.d/
  • Run level 3 – /etc/rc.d/rc3.d/
  • Run level 4 – /etc/rc.d/rc4.d/
  • Run level 5 – /etc/rc.d/rc5.d/
  • Run level 6 – /etc/rc.d/rc6.d/

这些目录下的脚本只有K*和S*开头的文件,K开头的文件为开机需要执行关闭的服务,S开头的文件为开机需要执行开启的服务。


觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

linux c 读写mbr_一文看懂Linux开机流程BIOS-MBR-GRUB-Kernel-Init-Runlevel相关推荐

  1. zabbix3.4监控linux磁盘使用率_一文看懂Linux全能型监控命令--dstat,值得收藏

    概述 在linux上有top.free.iostat.vmstat.netstat等诸多监控系统各项性能的工具,如top,可以实时监控到系统负载.内存等使用情况,iostat能监控系统I/O情况,而v ...

  2. 深度:一文看懂Linux内核,Linux内核架构和工作原理详解

    简介 作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址.目前支持模块的动态装卸(裁剪).Linux内核就是基于这个策略实现的.Linux进程1.采用层次结构,每个 ...

  3. 一文看懂 Linux 系统结构

    Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图1-1所 ...

  4. 一文看懂Linux内核!Linux内核架构和工作原理详解

    linux内核相关视频解析: 5个方面分析linux内核架构,让你对内核不再陌生 90分钟了解Linux内存架构,numa的优势,slab的实现,vmalloc的原理 手把手带你实现一个Linux内核 ...

  5. 深度:一文看懂Linux内核!Linux内核架构和工作原理详解

    简介 作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址.目前支持模块的动态装卸(裁剪).Linux内核就是基于这个策略实现的.Linux进程1.采用层次结构,每个 ...

  6. 一文看懂Linux内核的整体架构

    1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统.之后,会介绍Linux内核源文件的 ...

  7. 【Linux入门】一文看懂 Linux man 手册

    前言 man是Linux的一个非常强的的命令,它的全称为manual(手册) 当我们遇到忘记的指令,可以直接通过man指令来获得提示 举个例子,当我们输入man grep,就会获得以下界面.为了快速检 ...

  8. 一文看懂Linux网络管理

    介绍 我认为把知识给别人讲会,讲明白,自己才彻底明白. 努力把文章写好,写明白每一篇文章,分享给更多人. 一个赞.一个评论.一个关注,真的好开心,努力没有白费,得到了这么多人的认可. 已经玩Linux ...

  9. python怎么读写文件-一文看懂Python文件的读取写入操作,建议收藏-bak文件怎么打开...

    文件的读取写入操作 读取文件read() 假设我们有一个与操作文件同级的1.txt文档with open('pi_digits.txt') as file_object: contents = fil ...

最新文章

  1. java列表包含列表_java – 包含另一个列表的列表
  2. 机器学习虽好,也要看什么场合!
  3. Cocos2d-X中实现菜单特效
  4. python常见异常
  5. AS3中,setTimeOut、setInterval、Timer区别
  6. mysql主从克隆服务器_mysql主从复制服务器配置
  7. 【ARM】ARM汇编程序设计(一)
  8. python websocket爬虫_详解python websocket获取实时数据的几种常见链接方式
  9. php之简单使用数据库
  10. linux版本和目录结构
  11. php arrayaccess 二维,PHP数组式访问接口ArrayAccess用法分析
  12. jQuery学习(二)—jQuery对象的获取
  13. html图表实现,用 Flotr2 实现的 HTML5 图表
  14. Linux:UDP Socket编程(代码实战)
  15. macOS 安装postman 中文语言包
  16. 禁止QQ2010(2009)弹迷你首页的方法
  17. Raspberry-Pi-PICO系列--第七篇 创建自己的工程
  18. 【web渗透思路】任意账号的注册、登录、重置、查看
  19. 简单分类模型设计与实现
  20. JSP——连接数据库、编写api接口

热门文章

  1. linux keepalived 脚本,Linux下 keepalived 的安装和配置
  2. windows 安装 php memcached,Windows安装配置php+memcached的方法
  3. php写的微信聊天界面,浅谈 聊天界面 核心架构设计
  4. db2关闭下一句sql的日志_DB2_数据库日志管理
  5. mysql root 提权_mysql以ROOT权限提权方法
  6. python中从键盘输入的代码_Python读取键盘输入的2种方法
  7. 计算机辅助教学导学设计研究,《计算机辅助教学》实验报告
  8. python衍生特征
  9. Python:if判断与while、for循环语句
  10. Python集合list,tuple,dict,set