当前位置:   article > 正文

grub2引导linux内核,启动流程、模块管理、BootLoader(Grub2)

grub引导界面用就内核登录

系统启动是一项非常复杂的程序,因为内核得先检测硬件并加载适当的驱动程序后,接下来则必须要调用程序来准备好系统运行的环境,让用户能够顺利操作主机系统。

如果你能够理解开机的原理,那么将有助于你在系统出问题时能够快速修复系统。而且还能够顺利的配置多重操作系统的多重引导问题。

为了多重引导,就不能不学grub2这个Linux下优秀的引导装载程序(boot loader)。而且在系统运作期间,你也要学会管理内核模块。

1、Linux的启动流程分析

如果想要多重开机,如果root密码忘记,如果/etc/fstab设置错误等,如何解决?

1.1、启动流程一览

目前各大Linux distributions使用的主流 boot loader为grub2,早期是grub1或LILO。

以个人Linux主机为例,当按下电源后,电脑硬件会主动读取BIOS或UEFI BIOS来载入硬件信息及进行硬件系统的自我测试。之后系统会主动去读取第一个可开机的设备(由BIOS设置),此时就可以读入引导装载程序。

引导装载程序可以指定使用哪个内核文件来启动,并实际加载内核到内存当中解压缩与执行,此时内核就可以在内存中运行,并检测所有硬件信息与加载适当的驱动程序来使这部主机运行。等到内核检测硬件与加载驱动程序完毕后,操作系统已在你的PC上面跑起来了。

主机系统运行后,Linux才会调用外部程序开始准备软件执行的环境,并实际加载系统运行所需的软件程序。最后系统就会开始等待你的登录与操作。

系统启动过程如下:1,加载BIOS的硬件信息与进行自检,并依据设置取得第一个可启动的设备(硬盘,光盘,U盘);

2,读取并执行第一个启动设备内MBR(主引导分区)的 boot loader(如grub2);

3,依据 boot loader的设置加载Kernel,Kernel会开始检测硬件与加载驱动程序;

4,在硬件驱动成功后,Kernel会主动调用systemd进程(原来的init进程),并以default.targert流程开机;

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需要的服务

1.2、BIOS,boot loader与Kernel加载

BIOS:不论传统的BIOS还是UEFI BIOS都会被称为BIOS;

MBR:虽然分割表有传统MBR以及新式的GPT,不过GPT也保留一块相容的MBR的区块,因此,底下的说明在安装boot loader的部分,都简称MBR。总之,MBR就代表该磁盘最前面可安装boot loader的那个区块。

BIOS,开机自检与MBR/GPT

由于不同的操作系统的文件格式各不相同,因此我们必须要以一个开机管理程序来处理核心文件载入(load)的问题,因此这个开机管理程序就被称为 boot loader。boot loader安装在开机装置的第一个扇区(sector)内,也就是我们一直谈论的MBR。

只要BIOS能够检测到你的磁盘(无论SATA还是IDE接口),那它就有办法通过INT 13 这条信道来读取该磁盘的第一个扇区内的MBR,这样boot loader也就能够被执行。Tips:

我们知道每科硬盘的最前面区块含有MBR或GPT分割表的提供loader的区块,那么如果我的主机上面有两个硬盘,系统会去哪个硬盘的最前面区块读取boot loader呢?这个就要看BIOS的设定了。

基本上,我们常常讲的 "系统的MBR" 其实指的是第一个开机装置的MBR才对。需要注意。

Boot Loader的功能

loader最主要的功能是要认识操作系统的文件格式并载入内核到内存中去执行,由于不同的操作系统的文件格式不一致,因此每种作业系统都有自己的boot loader。

多重操作系统?必须要使用自己的loader才能够载入属于自己的操作系统内核;但系统的MBR只有一个,那么怎么样同时在一台主机上面安装Linux和Windows呢?

其实每个文件系统(filesystem)或分区(partition)都会保留一块开机磁区(boot sector)提供作业系统安装boot loader,而通常操作系统默认会安装一份loader到他根目录所在的文件系统的boot sector上。

7276a98e74cf

boot sector与操作系统的关系

如图所示,每个操作系统都会安装一套boot loader到它自己的文件系统中。Linux安装时,可以选择将boot loader安装到MBR去,也可以选择不安装。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。

7276a98e74cf

引导装载程序菜单功能与控制权转交示意图选单一:MBR(grub2) --> kernel file --> booting;

选单二:MBR(grub2) --> boot sector(Windows loader) --> Windows kernel --> booting;

选单三:MBR(grub2) --> boot sector(grub2) --> kernel file --> booting;

加载内核检测硬件与initramfs的功能

当由boot loader的管理而开始读取内核文件后,Linux就会将内核解压缩到内存中,并利用内核的功能开始测试与驱动各周边设备。此时,Linux内核会以自己的功能重新侦测一次硬件,而不一定会使用BIOS检测的硬件。

一般来说,内核文件放置在/boot里,并取名为/boot/vmlinuz。

7276a98e74cf

Linux内核模块放置在/lib/modules/ 目录内(/lib不可与/放置于不同的分区),因为在开机过程中内核必须要先挂载根目录,这样才能够读取内核模块来载入驱动程序。

一般来说,非必要的功能且可以编译成模块的内核功能,目前的Linux distributions都会将它编译成模块。如USB,SATA等设备的驱动程序通常都是以模块的方式存在的。

但是,内核根本不认识SATA磁盘,所以需要载入SATA磁盘的驱动,否则根本就无法挂载根目录。但是SATA的驱动在/lib/modules内,你根本无法挂载 /目录 又怎么读取到/lib/modules内的驱动呢?

这时候就需要通过虚拟文件系统来解决了。虚拟文件系统(Initial RAM Disk(Filesystem)),一般的文件名为/boot/initrd或/boot/initramfs。它能够通过boot loader来载入到内存中,然后这个文档会被解压缩并且在内存中模拟成一个根目录,且此模拟在内存中的文件系统能够提供一支可执行的程序,通过该程序来载入开机过程中所需要的核心模块,通常这些模块就是USB,RAID,LVM,SCSI等文件系统与磁盘的驱动程序。

7276a98e74cf

BIOS与boot loader及内核载入流程

在核心完整载入后,你的主机应该就开始正常的运作了,接下来就要开始执行系统的第一支进程:systemd!

1.3、第一个进程systemd及使用default.target进入开机程序分析

在内核载入完毕&#

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/262987
推荐阅读
相关标签
  

闽ICP备14008679号