启动流程

文字描述:

  1. 载入 BIOS 的硬件信息与进行自我测试,并依据设置取得第一个可开机的设备;
  2. 读取并执行第一个开机设备内 MBR 的 boot Loader (亦即是 grub2, spfdisk 等程 序);
  3. 依据 boot loader 的设置载入 Kernel ,Kernel 会开始侦测硬件与载入驱动程序;
  4. 在硬件驱动成功后,Kernel 会主动调用 systemd 程序,并以 default.target 流程开机;
  5. systemd 执行 sysinit.target 初始化系统及 basic.target 准备操作系统; systemd 启动 multi-user.target 下的本机与服务器服务;

    systemd 执行 multi-user.target 下的 /etc/rc.d/rc.local 文件;
    systemd 执行 multi-user.target 下的 getty.target 及登陆服务;
    systemd 执行 graphical 需要的服务

BIOS, 开机自我测试与 MBR/GPT

想要启动整部系统首先就得要让系统去载入 BIOS (Basic Input Output System),并通过
BIOS 程序去载入 CMOS 的信息,并且借由 CMOS 内的设置值取得主机的项硬件设 置, 例如 CPU 与周边设备的沟通频率啊、开机设备的搜寻顺序啊、硬盘的小与类型 啊、 系统时间啊、各周边总线的是否启动 Plug and Play (
PnP, 随插即用设备) 啊、 各周 边设备的 I/O 位址啊、以及与 CPU 沟通的 IRQ 岔断等等的信息。
在取得这些信息后,BIOS 还会进行开机自我测试 (Power-on Self Test, POST) 然后开始执行硬件侦测的初始化,并设置 PnP 设备,之后再定义出可开机的设备顺 序,接下来就会开始进行开机设备的数据读取了。
由于我们的系统软件大多放置到硬盘中嘛!所以 BIOS 会指定开机的设备好让我们 可以读取磁盘中的操作系统核心文件。

什么是boor loader ?

但由于不同的操作系统他的文件系统格式不相 同,因此我们必须要以一个开机管理程序来处理核心文件载入 (load) 的问题, 因此这 个开机管理程序就被称为 Boot Loader 了。那这个 Boot Loader 程序安装在哪里呢?就在 开机设备的第一个扇区 (sector) 内,也就是我们一直谈到的 MBR (Master Boot Record, 主要开机记录区)。
那你会不会觉得很奇怪啊?既然核心文件需要 loader 来读取,那每个操作系统的 loader 都不相同,

这样的话 BIOS 又是如何读取 MBR 内的 loader 呢?

其实 BIOS 是通过硬件的 INT 13 中断功能来读取 MBR 的,也就是说,只要 BIOS 能够侦 测的到你的磁盘 (不论该磁盘是 SATA 还是 SAS 接口),那他就有办法通过 INT 13 这 条信道来读取该磁盘的第一个扇区内的 MBR 软件啦!这样 boot loader 也就能够被执行 啰!

Tips:
我们知道每颗硬盘的最前面区块含有 MBR 或 GPT 分区表的提供 loader 的区块,那么如果我的主 机上面有两颗硬盘的话, 系统会去哪颗硬盘的最前面区块读取 boot loader 呢?这个就得要看s第一个开机设备的 MBR BIOS 的设置了。 基本上,我们常常讲的“系统的 MBR”其实指的是 才 对! 所以,改天如果你要将开 机管理程序安装到某颗硬盘的
MBR 时, 要特别注意当时系统的“第一个开机设备”是哪个,否则会安装到 错误的硬盘上面的 MBR 喔!重要重要!

Boot Loader 的功能

刚刚说到 Loader 的最主要功能是要认识操作系统的文件格式并据以载入核心到内
存中去执行。 由于不同操作系统的文件格式不一致,因此每种操作系统都有自己的 boot
loader 啦!用自己的 loader 才有办法载入核心文件嘛!那问题就来啦,你应该有听说过多
重操作系统吧?也就是在一部主机上面安装多种不同的操作系统。 既然你
(1)必须要使 用自己的 loader 才能够载入属于自己的操作系统核心,而
(2)系统的 MBR 只有一个, 那你怎么会有办法同时在一部主机上面安装 Windows 与 Linux 呢?
其实每个文件 系统 (filesystem, 或者是 partition) 都会保留一块开机扇区 (boot sector) 提供操作系统 安装 boot loader , 而通常操作系统默认都会安装一份 loader 到他根目录在的文件系统 的 boot sector 上。如果我们在一部主机上面安装 Windows 与 Linux 后,该 boot sector,
boot loader 与 MBR 的相关性会有点像下图:
image.png
如上图所示,每个操作系统默认是会安装一套 boot loader 到他自己的文件系统中 (就是每个 filesystem 左下角的方框),而在 Linux 系统安装时,你可以选择将 boot loader 安装到 MBR 去,也可以选择不安装。 如果选择安装到 MBR 的话,理论上你在 MBR 与 boot sector 都会保有一份 boot loader 程序的。 至于Windows 安装时,他默认会主 动的将 MBR 与 boot sector 都装上一份 boot loader!所以啦, 你会发现安装多重操作系统
时,你的 MBR 常常会被不同的操作系统的 boot loader 所覆盖


我们刚刚提到的两个问题还是没有解决啊!虽然各个操作系统都可以安装份
boot loader 到他们的 boot sector 中, 这样操作系统可以通过自己的 boot loader 来载入核心
了。问题是系统的 MBR 只有一个哩!
你要怎么执行 boot sector 里面的 loader 啊?这个我
们得要回忆一
boot loader 主要的功能如下
提供菜单:使用者可以选择不同的开机项目,这也是多重开机的重要功能!
载入核心文件:直接指向可开机的程序区段来开始操作系统;
转交其他 loader:将开机管理功能转交给其他 loader 负责。

由于具有菜单功能,因此我们可以选择不同的核心来开机。而由于具有控制权转 交的功能,因此我们可以载入其他 boot sector 内的 loader 啦!不过 Windows 的 loader 默 认不具有控制权转交的功能,因此你不能使用 Windows 的 loader 来载入 Linux 的 loader
这也是为啥特别强调先装 Windows 再装 Linux 的
缘故。 我们将上述的三个功能以下面的图示来解释你就看的懂了!(与第二章的图示也
非常类似啦!)
image.png

如上图所示,我的 MBR 使用 Linux 的 grub2 这个开机管理程序,并且里面假设已 经有了三个菜单, 第一个菜单可以直接指向 Linux 的核心文件并且直接载入核心来开 机;第二个菜单可以将开机管理程控权交给 Windows 来管理,此时 Windows 的 loader 会 接管开机流程,这个时候他就能够启动 windows 了。第三个菜单则是使用Linux 在 boot sector 内的开机管理程序,此时就会跳出另一个 grub2 的菜单啦!了解了吗?
菜单一:MBR
(grub2) —> kernel file —> booting
菜单二:MBR
(grub2) —> boot sector(Windows loader) —> Windows kernel —> booting
菜单三:MBR
(grub2) —> boot sector(grub2) —> kernel file —> booting
而最终 boot loader 的功能就是“载入 kernel 文件”啦!

载入核心侦测硬件与 initramfs 的功能

当我们借由 boot loader 的管理而开始读取核心文件后,接下来, Linux 就会将核
心解压缩到内存当中, 并且利用核心的功能,开始测试与驱动各个周边设备,包括储存
设备、CPU、网卡、声卡等等。 此时 Linux 核心会以自己的功能重新侦测一次硬件,而
不一定会使用 BIOS 侦测到的硬件信息喔!也就是说,核心此时才开始接管 BIOS 后的工
作了。 那么核心文件在哪里啊?一般来说,他会被放置到 /boot 里面,并且取名为/boot/vmlinuz 才对!
[root@study ~]# ls —format=single-column -F /boot
config-3.10.0-229.el7.x86_64 <==此版本核心被编译时选择的功能与模块配置文件
grub/ <==旧版 grub1 ,不需要理会这目录了!
grub2/ <==就是开机管理程序 grub2 相关数据目录
initramfs-0-rescue-309eb890d3d95ec7a.img <==下面几个为虚拟文件系统文件!这一个是用来救援的!
initramfs-3.10.0-229.el7.x86_64.img <==正常开机会用到的虚拟文件系统
initramfs-3.10.0-229.el7.x86_64kdump.img <==核心出问题时会用到的虚拟文件系统
System.map-3.10.0-229.el7.x86_64 <==核心功能放置到内存位址的对应表
vmlinuz-0-rescue-309eb890d09543d95ec7a <==救援用的核心文件
**vmlinuz-3.10.0-229.el7.x86_64
**<==就是核心文件啦!最重要者!
从上表中的特殊字体,我们也可以知道 CentOs 7.x 的 Linux 核心为 3.10.0-
229.el7.x86_64 这个版本!为了硬件开发商与其他核心功能开发者的便利, 因此 Linux 核
心是可以通过动态载入核心模块的 (就请想成驱动程序即可),这些核心模块就放置在
/lib/modules/ 目录内。 由于模块放置到磁盘根目录内 (要记得 /lib 不可以与 / 分别放在不
同的 partition !), 因此在开机的过程中核心必须要挂载根目录,这样才能够读取核心
模块提供载入驱动程序的功能。 而且为了担心影响到磁盘内的文件系统,因此开机过程
中根目录是以只读的方式来挂载的喔。
一般来说,非必要的功能且可以编译成为模块的核心功能,目前的 Linux
distributions 都会将他编译成为模块。 因此 USB, SATA, SCSI… 等磁盘设备的驱动程序通
常都是以模块的方式来存在的。 现在来思考一种情况,假设你的 linux 是安装在 SATA 磁
盘上面的,你可以通过 BIOS 的 INT 13 取得 boot loader 与 kernel 文件来开机,然后 kernel
会开始接管系统并且侦测硬件及尝试挂载根目录来取得额外的驱动程序。
问题是,核心根本不认识 SATA 磁盘,所以需要载入 SATA 磁盘的驱动程序, 否
则根本就无法挂载根目录。但是 SATA 的驱动程序在 /lib/modules 内,你根本无法挂载根
目录又怎么读取到 /lib/modules/ 内的驱动程序?是吧!非常的两难吧!在这个情况之下,
你的 Linux 是无法顺利开机的!
那怎办?没关系,我们可以通过虚拟文件系统来处理这
个问题。
虚拟文件系统 (
Initial RAM Disk 或 Initial RAM Filesystem) 一般使用的文件名为
/boot/initrd 或 /boot/initramfs ,这个文件的特色是,他也能够通过 boot loader 来载入到内
存中,然后这个文件会被解压缩并且在内存当中仿真成一个根目录, 且此仿真在内存当
中的文件系统能够提供一支可执行的程序,通过该程序来载入开机过程中所最需要的核心
模块, 通常这些模块就是 USB, RAID, LVM, SCSI 等文件系统与磁盘接口的驱动程序啦!
等载入完成后, 会帮助核心重新调用 systemd 来开始后续的正常开机流程。

内核模块的查看 制作 删除

在鸟哥P632