Linux启动流程详解

​ 操作系统的启动分为两个阶段引导(boot)和启动(startup),引导阶段开始于打开电源开关,结束于内核初始化完成和systemd进程。启动阶段接管了剩余的工作,直到操作系统进入可操作状态。

​ 操作系统的开机引导和启动过程很容易理解,主要分为以下几个部分:

  • BIOS上电自检(POST)
  • 引导装载程序(GRUB2)
  • 内核初始化
  • 启动systemd,其是所有进程之父

上电自检

​ 上电自检的过程其实Linux什么也没做,上电主要由硬件部分来完成,这对于所有的操作系统都一样,接通电源后,开始执行BIOS基本输入输出系统(Basic I/O System)的POST上电自检(Power On Self Test)过程。BIOS上电自检确认硬件的基本功能正常,然后产生一个BIOS中断和INT 13H,该中断指向某个接入的可引导设备的引导扇区,它所找到的包含有效的引导记录的第一个引导扇区装在到内存中,并且内核的控制权也从引导扇区转移到此段代码。

​ 引导扇区是引导加载器真正的第一阶段,大多数Linux发行版本使用的引导加载器有三种:GRUB、GRUB2和LILO。GRUB2是最新的,也是使用最广泛的。

GRUB2

​ GRUB2 全称是 GRand Unified BootLoader,Version 2(第二版大一统引导装载程序)。它是目前流行的大部分 Linux 发行版本的主要引导加载程序。GRUB2 是一个用于计算机寻找操作系统内核并加载其到内存的智能程序。

​ GRUB通过/boot/grub/grub.conf进行配置。而/boot/grub2/grub.cfg配置GRUB2

两个GRUB的最主要作用都是把内核加载到内存运行,基本工作方式也一致,主要阶段也保持相同,都可分为三个阶段

阶段1

​ 如上文 POST(上电自检)阶段提到的,在 POST 阶段结束时,BIOS 将查找在接入的磁盘中查找引导记录,其通常位于 MBR(主引导记录Master Boot Record),它加载它找到的第一个引导记录中到内存中,并开始执行此代码。引导代码(及阶段 1 代码)必须非常小,因为它必须连同分区表放到硬盘的第一个 512 字节的扇区中。 在传统的常规 MBR 中,引导代码实际所占用的空间大小为 446 字节。这个阶段 1 的 446 字节的文件通常被叫做引导镜像(boot.img),其中不包含设备的分区信息,分区是一般单独添加到引导记录中。

​ ·由于引导记录必须非常的小,它不可能非常智能,且不能理解文件系统结构。因此阶段 1 的唯一功能就是定位并加载阶段 1.5 的代码。为了完成此任务,阶段 1.5 的代码必须位于引导记录与设备第一个分区之间的位置。在加载阶段 1.5 代码进入内存后,控制权将由阶段 1 转移到阶段 1.5。

阶段1.5

​ 如上所述,阶段 1.5 的代码必须位于引导记录与设备第一个分区之间的位置。该空间由于历史上的技术原因而空闲。第一个分区的开始位置在扇区 63 和 MBR(扇区 0)之间遗留下 62 个 512 字节的扇区(共 31744 字节),该区域用于存储阶段 1.5 的代码镜像 core.img 文件。该文件大小为 25389 字节,故此区域有足够大小的空间用来存储 core.img。

​ 因为有更大的存储空间用于阶段 1.5,且该空间足够容纳一些通用的文件系统驱动程序,如标准的 EXT 和其它的 Linux 文件系统,如 FAT 和 NTFS 等。GRUB2 的 core.img 远比更老的 GRUB1 阶段 1.5 更复杂且更强大。这意味着 GRUB2 的阶段 2 能够放在标准的 EXT 文件系统内,但是不能放在逻辑卷内。故阶段 2 的文件可以存放于 /boot 文件系统中,一般在 /boot/grub2 目录下。

​ 注意 /boot 目录必须放在一个 GRUB 所支持的文件系统(并不是所有的文件系统均可)。阶段 1.5 的功能是开始执行存放阶段 2 文件的 /boot 文件系统的驱动程序,并加载相关的驱动程序。

阶段2

​ GRUB 阶段 2 所有的文件都已存放于 /boot/grub2 目录及其几个子目录之下。该阶段没有一个类似于阶段 1 与阶段 1.5 的镜像文件。相应地,该阶段主要需要从 /boot/grub2/i386-pc 目录下加载一些内核运行时模块。

​ GRUB 阶段 2 的主要功能是定位和加载 Linux 内核到内存中,并转移控制权到内核。内核的相关文件位于 /boot 目录下,这些内核文件可以通过其文件名进行识别,其文件名均带有前缀 vmlinuz。你可以列出 /boot 目录中的内容来查看操作系统中当前已经安装的内核。

​ GRUB2 跟 GRUB1 类似,支持从 Linux 内核选择之一引导启动。Red Hat 包管理器(DNF)支持保留多个内核版本,以防最新版本内核发生问题而无法启动时,可以恢复老版本的内核。默认情况下,GRUB 提供了一个已安装内核的预引导菜单,其中包括问题诊断菜单(recuse)以及恢复菜单(如果配置已经设置恢复镜像)。

阶段 2 加载选定的内核到内存中,并转移控制权到内核代码。

内核

​ 内核文件都是以一种自解压的压缩格式存储以节省空间,它与一个初始化的内存映像和存储设备映射表都存储于 /boot 目录之下。

​ 在选定的内核加载到内存中并开始执行后,在其进行任何工作之前,内核文件首先必须从压缩格式解压自身。一旦内核自解压完成,则加载 systemd 进程(其是老式 System V 系统的 init 程序的替代品),并转移控制权到 systemd。

​ 这就是引导过程的结束。此刻,Linux 内核和 systemd 处于运行状态,但是由于没有其他任何程序在执行,故其不能执行任何有关用户的功能性任务。

启动过程

​ 启动过程紧随引导过程之后,启动过程使 Linux 系统进入可操作状态,并能够执行用户功能性任务。

systemd

​ systemd 是所有进程的父进程。它负责将 Linux 主机带到一个用户可操作状态(可以执行功能任务)。systemd 的一些功能远较旧式 init 程序更丰富,可以管理运行中的 Linux 主机的许多方面,包括挂载文件系统,以及开启和管理 Linux 主机的系统服务等。但是 systemd 的任何与系统启动过程无关的功能均不在此文的讨论范围。

首先,systemd 挂载在 /etc/fstab 中配置的文件系统,包括内存交换文件或分区。据此,systemd 必须能够访问位于 /etc 目录下的配置文件,包括它自己的。systemd 借助其配置文件 /etc/systemd/system/default.target 决定 Linux 系统应该启动达到哪个状态(或目标态target)。default.target 是一个真实的 target 文件的符号链接。对于桌面系统,其链接到 graphical.target,该文件相当于旧式 systemV init 方式的 runlevel 5。对于一个服务器操作系统来说,default.target 更多是默认链接到 multi-user.target, 相当于 systemV 系统的 runlevel 3emergency.target 相当于单用户模式。

(LCTT 译注:“target” 是 systemd 新引入的概念,目前尚未发现有官方的准确译名,考虑到其作用和使用的上下文环境,我们认为翻译为“目标态”比较贴切。以及,“unit” 是指 systemd 中服务和目标态等各个对象/文件,在此依照语境译作“单元”。)

注意,所有的目标态target和服务service均是 systemd 的单元unit。

SystemV 运行级别 systemd 目标态 systemd 目标态别名 描述
halt.target 停止系统运行但不切断电源。
0 poweroff.target runlevel0.target 停止系统运行并切断电源.
S emergency.target 单用户模式,没有服务进程运行,文件系统也没挂载。这是一个最基本的运行级别,仅在主控制台上提供一个 shell 用于用户与系统进行交互。
1 rescue.target runlevel1.target 挂载了文件系统,仅运行了最基本的服务进程的基本系统,并在主控制台启动了一个 shell 访问入口用于诊断。
2 runlevel2.target 多用户,没有挂载 NFS 文件系统,但是所有的非图形界面的服务进程已经运行。
3 multi-user.target runlevel3.target 所有服务都已运行,但只支持命令行接口访问。
4 runlevel4.target 未使用。
5 graphical.target runlevel5.target 多用户,且支持图形界面接口。
6 reboot.target runlevel6.target 重启。
default.target 这个目标态target是总是 multi-user.targetgraphical.target 的一个符号链接的别名。systemd 总是通过 default.target 启动系统。default.target 绝不应该指向 halt.targetpoweroff.targetreboot.target

​ 使用systemctl的set-default命令可更改默认的目标单元,如果要更改活动的目标单元使用systemctl isolate 目标单名

启动内核模块

​ 具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。

执行不同运行级别的脚本程序

​ 根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。

执行/etc/rc.d/rc.local

​ 你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:# This script will be executed after all the other init scripts.# You can put your own initialization stuff in here if you don’t# want to do the full Sys V style init stuff.rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。

MBR启动过程

​ BIOS–>MBR(主引导记录)–>DPT(硬盘分区表)–>DBR(分区引导扇区)–>BootMgr–>BCD–>Winload.exe(bootmgfw.efi)–>内核加载–>BIOS中存储硬盘启动顺序,选择从哪块硬盘启动。

​ MBR该硬盘的0柱面,0磁头,1扇区为MBR,存储主引导记录信息(具体,主引导程序446字节+DPT硬盘分区表64字节+磁盘有效标志55AA,共512字节,即一个扇区大小)。

EFI启动流程

​ BIOS–>ESP分区–>启动管理器bootxxx.efi–>加载BCD文件–>读取winload.efi

​ 启动管理器(bootxxx.efi)会首先加载BCD文件,从BCD中读取所有启动项,如果有多个启动项并且没有默认启动项就会有一个菜单来显示,当用户选中其中某个启动项后,启动管理器就会从对应的分区(通过分区GUID)中读取winload.efi,如果这时找不到winload.efi,或者winload.efi签名校验失败,就会蓝屏0xc000000e,即找不到引导文件,加载完winload.efi后,控制权就正式交给winload.efi。(该段原文:https://blog.csdn.net/yeshahayes/article/details/52806095)

LInux 开机启动之MBR引导相关推荐

  1. linux 开机启动文件夹,Linux开机启动流程

    linux开机启动详细流程图: 一.BIOS 加电自检 当你按电源开关开机时,电脑会首先去启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的. BIOS 的工作 1.检测连接硬件,比如显卡 ...

  2. linux 打开上一级目录,linux开机启动过程、PATH、过滤一级目录、cd的参数、ls -lrt、命令切割日志...

    第二波命令正向我方来袭 :开机启动过程.PATH.过滤一级目录.cd的参数.ls -lrt.命令切割日志 1.1 linux开机启动过程 1.1.1 开机自检(BIOS)-- MBR引导-- GRUB ...

  3. linux开机启动详细流程图

    linux开机启动详细流程图: 一.BIOS 加电自检 当你按电源开关开机时,电脑会首先去启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的. BIOS 的工作 1.检测连接硬件,比如显卡 ...

  4. Linux开机启动流程分析

    Linux开机启动十步骤 收藏分享2012-2-6 11:15| 发布者: 红黑魂| 查看数: 1366| 评论数: 0|来自: 比特网 摘要: 开机过程指的是从打开计算机电源直到LINUX显示用户登 ...

  5. linux开机启动过程(简述)

    简述linux开机启动过程 第一步:加电 第二步:加载BIOS设置,选择启动盘. 这是因为因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘信息.内存信息.时钟信 息.PnP特性等等.在此之 ...

  6. Linux开机启动过程:从点下电源键到系统正常运行

    学习内核,只要是要以柔克刚,不能急于求成.共勉 <Linux开机启动过程(1):内核引导过程> <Linux开机启动过程(2):内核启动的第一步> <Linux开机启动过 ...

  7. linux 自启动脚本顺序,(linux开机启动脚本的顺序.doc

    (linux开机启动脚本的顺序 linux开机启动脚本的顺序 来源: ChinaUnix博客 日期: 2009.11.07 13:54 (共有0条评论) 我要评论 ? 如果[url=javascrip ...

  8. linux系统设置服务开机启动3种方法,Linux开机启动程序详解

    linux系统设置服务开机启动 方法1:.利用ntsysv伪图形进行设置,利用root登陆 终端命令下输入ntsysv 回车:如下图 方法2:利用命令行chkconfig命令进行设置 简要说明一下ch ...

  9. linux开机启动服务详解

    http://blog.163.com/sjt_linux/blog/static/19931031920126295452884/ linux开机启动服务详解(转) 2012-07-29 17:45 ...

最新文章

  1. Windows 7 几个小问题的解决方法(二)
  2. 从用户的视角看待网页设计(一)
  3. Ocelot中文文档-微服务ServiceFabric
  4. 使用ConfigModule.withConfig替换SAP Spartacus标准Component
  5. centos中bash占用cpu,linux下如何定位CPU占用高的进程的问题点
  6. 大数据背后是个万亿市场
  7. python基础学习_转行零基础该如何学习python?很庆幸,三年前的我选对了
  8. 实战:Docker容器虚拟化技术(使用DockerFile构建镜像并搭建 swarm+compose集群)5
  9. arm上移植iconv命令
  10. sip 接听后没有声音
  11. HTML 拖放功能 - DragDrop
  12. Air202学习 二 (定时器使用)
  13. 在XP上将Office 2003升级到2010或并排运行
  14. python中binomial_二项堆python实现——eager binomial heap
  15. 微信实现qq群的qq小冰功能
  16. 第一类和第二类曲面积分的转换
  17. iOS 中 XML 数据交换格式
  18. 工业设计公司如何进行家电设计创新?
  19. 打开计算机桌面上没有跑哪里去了,Win8.1我的电脑图标跑哪去了怎么放桌面
  20. 文件设置默认打开方式

热门文章

  1. video-editing
  2. 发送 Splunk UBA 的anomalies and threats to Splunk ES
  3. 计算机基础第四章数据管理思维导图,计算机基础思维导图
  4. 2d手机游戏开发_我的手机游戏如何在2周内获得365K应用商店下载(以及为什么我退出独立游戏开发公司…...
  5. 软件的基于生命周期开发方法
  6. CSS3动画属性总结
  7. 一分钟搞懂逻辑运算符(并且) , |(或者) , !(非) , ^(异或) , (短路与) , ||(短路或)之间的关系
  8. 手机获取短信验证码登陆
  9. 在c语言中 n的作用是什么,c语言中(n)的意思,C语言中‘#92;n#39;是什么意思
  10. XML学习笔记 第二记