Linux引导过程

时间:2020-03-21 11:46:02  来源:igfitidea点击:

在本教程中,我们将讨论计算机的启动方式。
我必须说一下具有Linux操作系统的计算机是如何启动的。
几天前,一位读者要求我们提出这个问题,因为这是采访中常见的问题。
我希望这对其他读者也有帮助。

了解启动过程,将了解硬件和软件如何协同工作,并为我们提供所需的信息,以开始对我们遇到的启动问题进行故障排除。

Linux引导过程可以分为多个阶段。
下图显示了不同的阶段。
我们将在各自的部分中详细讨论每个阶段。

步骤1:电源和SMPS

计算机的主要组件之一是SMPS(开关电源)。
该组件的主要目的是为主板和其他计算机组件提供理想的电压水平。
电脑内部使用直流电工作,但是我们在家里和其他地方使用的电源是交流电。
SMPS将交流电转换为直流电并保持所需的电压水平,以便计算机可以正常工作。

但是,SMPS执行的主要任务是告知良好的电源。
如我所讲,电压是大还是小,在这两种情况下,计算机都无法工作。
只要为计算机供电,SMPS就会检查其提供给主板的电压水平。
如果电源信号电平正确,则SMPS将向主板计时器发送POWER GOOD信号。

从SMPS收到此POWER GOOD信号后,主板计时器将停止向CPU发送复位信号。
这意味着电源级别良好,并且计算机可以启动。

步骤2:自检

默认情况下,必须对某些程序进行编程,以便CPU知道其中搜索指令。

这是ROM中的地址位置。
在基于X86的计算机中,此地址位置几乎总是恒定的。
地址位置是FFFF:0000h。

此地址位置是ROM的最后一个区域。
它仅包含一条指令。
该指令是跳转到另一个存储器地址位置。
此JUMP命令将告知BIOS程序在ROM中的位置。

这是计算机如何知道BIOS程序所在的位置。

步骤3:BIOS在引导过程中的作用

引导这个词来自另一个叫做引导的词。
当我们按下开始按钮时,计算机便知道如何启动计算机,这是因为将说明传送给称为BIOS的程序。
BIOS代表基本输入输出系统。
在引导过程中,BIOS最重要的用途是POST。
POST代表开机自检。
它是由BIOS进行的一系列测试,确认了连接到计算机的不同硬件组件是否正常运行。

在加载操作系统之前,POST是非常重要的事情。
试想一下,如果硬盘驱动器或者内存有问题,有时这些事情可能会导致数据丢失。
POST检查并确认以下硬件组件的完整性。

  • 计时器IC
  • DMA控制器
  • CPU
  • 显卡ROM

全面的POST检查还将确认以下设备的完整性。

  • 主板
  • 键盘
  • 打印机端口
  • 硬盘等

如果我们要进行热启动(这意味着我们对运行中的计算机进行了复位,则大多数情况下,复位按钮是CPU上电源按钮附近的小按钮),BIOS将不会进行完整的POST检查。
但是,如果我们要进行冷启动,这意味着我们现在已经通电,它将执行完整的POST。

BIOS通过查看预定义内存位置中的标志来确定其启动是冷启动还是热启动。
POST完成后,BIOS将在哔声代码的帮助下(通过系统扬声器)通知我们有关发现的任何问题的信息。
不同数量的哔声代码具有不同的含义。

人们经常会混淆两件事。
其CMOS和BIOS。
CMOS和BIOS是计算机主板中完全不同的两件事。
CMOS是主板上的小型内存芯片。
此内存与计算机的主内存芯片(可更换的存储芯片)不同。

目前,内存芯片的可用范围为千兆字节。
与主内存芯片不同,当计算机关闭时,CMOS 内存不会刷新其内存。
它借助一个称为CMOS电池的电池来记住所有配置。

卸下CMOS电池会使CMOS忘记我们之前保存的所有配置。

  • 这就是我们只需卸下CMOS电池即可解锁受CMOS密码保护的计算机的原因。
  • 另外,卸下CMOS电池会使操作系统显示错误的时间。因为在CMOS设置中保持了系统时间的一致性。

因此,始终建议我们定期更换CMOS电池,以使计算机正常运行。

通常人们会说我们已经修改了BIOS设置。
但是它是完全错误的。
他们修改的实际上是CMOS设置。
CMOS设置是我们修改引导顺序等的地方。

用户无法更改BIOS设置。
它需要制造商提供的闪存程序。

现在,让我们回到启动过程。
POST检查成功完成后,BIOS将查找CMOS设置以了解引导顺序。
引导顺序不过是用户定义的顺序,该顺序告诉用户其中寻找操作系统。

该命令将类似于以下内容。

  • 光盘
  • 硬盘
  • USB
  • 软盘

上面显示的顺序意味着BIOS将首先查看CD ROM,以检查是否可以从那里加载操作系统,如果在CD ROM中找不到可引导的磁盘,则它将查看是否存在可引导的操作系统。
硬盘,然后是USB,然后是软盘。

假设CD ROM驱动器中没有可引导的CD,则BIOS将变为HARD磁盘。

步骤4:MBR和GRUB

现在,由于CD ROM驱动器中没有任何可引导CD,因此BIOS将从引导顺序设置中查看第二个设备。
第二个设备是硬盘。

BIOS被编程为查看硬盘上的永久位置以完成其任务。
此位置称为引导扇区。
这不过是硬盘的第一个扇区。
该区域有时称为MBR(主引导记录)。
这是包含程序的位置,该程序我们的计算机加载操作系统。
一旦bios找到有效的MBR,它将MBR的全部内容加载到内存,然后MBR的内容将进一步执行。

硬盘的第一个扇区只有512字节。
是的,它的面积太小,无法容纳整个引导加载程序。
因此,大多数操作系统在此处仅存储其引导加载程序的第一阶段。
第一级引导加载程序仅使用512字节总数中的前440字节,其余部分用于存储分区表信息。

正如本文标题所说的“ Linux Booting process”一样,我们将在MBR的前440个字节中处于grub阶段1.
我建议阅读下面的文章,以了解grub及其详细信息。

我们可以在以下命令的帮助下在Linux中进行MBR的整个转储/备份。

root@ubuntu-dev:~# dd if=/dev/sda of=mbr bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000134061 s, 3.8 MB/s

上面的命令所做的只是将第一个512字节扇区的内容转储到名为mbr的文件中。
上面命令中的bs代表块大小。
计数意味着只转储第一个扇区(转储将从硬盘的开头开始,大小为512字节)

MBR包含grub的第一阶段以及分区表信息。
我们可以从我们的MBR备份文件中看到分区表信息,如下所示。

root@ubuntu-dev:~# file mbr.bin
mbr.bin: x86 boot sector; partition 1: ID=0x83, active, starthead 32, startsector 2048, 19451904 sectors; partition 2: ID=0x5, starthead 254, startsector 19455998, 2093058 sectors, code offset 0x63

我在系统上只有两个分区,这就是为什么它显示分区1和分区2的原因。
MBR包含以下要总结的内容。
从上面的mbr转储输出中显示的分区表中,MBR的Grub阶段1将寻找在其上设置了活动标志的分区。
请记住一个事实,即4中只有一个活动分区。
如果我们在上方看到我的分区表输出,则分区1具有活动标志。

  • 第一阶段grub
  • 分区表信息
  • 错误讯息
  • 魔术数

第四个是2字节的魔术数(幻数)。
此幻数用作MBR的验证方法。
这个2字节的幻数将包含类似于AA55的值。
不同的幻数表示MBR损坏或者MBR无效。

第1阶段引导加载程序的主要工作是加载第二阶段引导加载程序。
第二阶段引导加载程序是阶段2 grub,它实际上完成了加载内核和其他initrd镜像文件的工作(我们将在一段时间内介绍该部分)。
GRUB(大统一引导加载程序)是为grub的不同阶段提供的组合名称。

现在,有个小小的惊喜即将揭晓。
rub没有两个阶段。
但是总共有三个阶段。
我将向我们解释其背后的原因。
下面提到三个阶段。

  • GRUB第一阶段
  • GRUB第1.5阶段
  • GRUB第2阶段

现在,这个阶段1.5是从其中来的。
硬盘扇区从0开始计数到最后一个扇区。
如前所述,第一个扇区(扇区0)包含GRUB阶段1.
通常,分区将不会在扇区63之前开始。
因此分区将从扇区号63开始。
因此,我们从1-63的空闲扇区开始。
该空间用于存储GRUB阶段1.5.
MBR和分区开始之间的可用空间称为MBR GAP。

现在我们可能会想到grub添加阶段的要求是什么。
如果我们是Linux专家,则可能已经配置了grub配置文件。
如果我们还记得配置,它将包含内核文件的位置和名称及其分区。
现在,grub如何在没有文件系统驱动程序的情况下访问那些内核文件?

位于MBR GAP中的Grub Stage 1.5(第一个分区开始之前的扇区1到63)基本上包含用于读取文件系统的驱动程序。
因此,grub阶段1会将grub阶段1.5加载到内存,并将控制权传递给它。

现在,grub stage 1.5将加载文件系统驱动程序,并且一旦加载了文件系统驱动程序,它现在就可以访问/boot/grub/grub.conf文件,该文件包含有关内核路径和initrd路径等的其他详细信息。

现在,我们会看到一个漂亮的TUI(终端用户界面),在这里我们可以选择操作系统的内核,然后按Enter来启动它。

步骤5加载内核镜像

与GRUB相似,内核也是分阶段加载的。
Linux内核负责处理进程管理,内存管理,用户,进程间通信等。
我必须说,用户从未使用过内核。
内核所做的是为程序运行维护良好的环境。
是的,我们通过不同的程序使用内核。

内核是压缩的图像文件。
该压缩内核镜像的位置在grub 2配置文件中指定。
它基本上是一个可执行的bzImage文件。

现在,我们需要有许多驱动程序和模块来访问基础硬件和其他内容。
例如,如果在/分区上配置了RAID,那么在不知道程序的情况下如何挂载RAID,或者考虑如何包含内核模块或者如何删除内核模块。
所有这些事情需要不同的程序和代码集。
在内核中包含所有这些代码将使它成为更大的文件镜像。

但是我们的内核镜像文件需要更小,这就是其压缩镜像文件的原因。
因此,大多数驱动程序和工具以及类似的小型根文件系统感觉都是由initrd提供的。
Initrd有时称为初始根文件系统。
内核会在安装实际的根文件系统之前使用它。
Initrd以类似于内核镜像文件的镜像形式提供。
让我们看看这个initrd图像文件的内容是什么。
我们可以在/boot目录中找到initrd镜像文件和内核镜像文件。

[root@localhost initrd]# mv initramfs-2.6.32-358.14.1.el6.x86_64.img initramfs-2.6.32-358.14.1.el6.x86_64.gz
[root@localhost initrd]# gunzip initramfs-2.6.32-358.14.1.el6.x86_64.gz
[root@localhost initrd]# cpio -id < initramfs-2.6.32-358.14.1.el6.x86_64
90587 blocks
[root@localhost initrd]# ls
bin                 initqueue                             mount        sysroot
cmdline             initqueue-finished                    pre-pivot    tmp
dev                 initqueue-settled                     pre-trigger  usr
dracut-004-303.el6  initqueue-timeout                     pre-udev     var
emergency           initramfs-2.6.32-358.14.1.el6.x86_64  proc
etc                 lib                                   sbin
init                lib64                                 sys

如果我们看到上述命令,则我们首先解压缩了initrd镜像文件,然后可以在cpio命令的帮助下查看该文件的内容。

现在我们可以看到initrd图像文件的内容。
有些文件夹与我们的linux目录strucutre非常相似。
在/sbin等目录中有/etc /,/lib和一些必要的命令。
它是一个很小的根文件系统,内核在装入实际根文件系统之前将其作为临时根文件系统装入。

内核模块的加载和卸载是通过initrd镜像中存在的insmod和rmmod之类的程序完成的。

现在,当内核加载到内存中时,执行将通过检查处理器系列和体系结构开始。
内核执行许多特定于硬件的操作,并且它执行的第一个用户空间程序是/sbin/init。

由于这是内核执行的第一个程序,因此它的进程ID号为1.
初始化该进程的ID号1并不是有意保留的,但这是由于它是内核执行的第一个进程。

现在,内核一旦执行了初始化过程,它将查看/etc/inittab配置文件以查看默认运行级别。

linux中有不同的运行级别。

运行级别用法
0系统停止/关闭
1单用户模式
2多用户模式无网络
3全多用户模式
4未使用
5gui/x11
6重启

/etc/inittab文件包含默认的运行级别,如下所示。

id:3:initdefault:

现在这意味着,我们将运行级别3作为默认运行级别。
一旦确定了这一点,内核便会启动特定于运行级别的程序。
这就是我们拥有以下目录的原因。

[root@localhost]# cd /etc/rc.d/
[root@localhost rc.d]# ll
drwxr-xr-x. 2 root root  4096 Oct  8 00:50 init.d
-rwxr-xr-x. 1 root root  2617 May 24 08:53 rc
drwxr-xr-x. 2 root root  4096 Oct  8 00:50 rc0.d
drwxr-xr-x. 2 root root  4096 Oct  8 00:50 rc1.d
drwxr-xr-x. 2 root root  4096 Oct  8 00:50 rc2.d
drwxr-xr-x. 2 root root  4096 Oct  8 00:50 rc3.d
drwxr-xr-x. 2 root root  4096 Oct  8 00:50 rc4.d
drwxr-xr-x. 2 root root  4096 Oct  8 00:50 rc5.d
drwxr-xr-x. 2 root root  4096 Oct  8 00:50 rc6.d
-rwxr-xr-x. 1 root root   499 Aug 13 10:55 rc.local
-rwxr-xr-x. 1 root root 19216 May 24 08:53 rc.sysinit

文件夹rc0.d,rc1.d,rc2.d等包含特定于运行级别的程序,这些程序将根据inittab配置文件中的默认运行级别来执行。

让我们看看这些运行级别文件夹中的内容是什么。

[root@localhost rc3.d]# ls
K01numad       K80kdump               S13cpuspeed          S28autofs
K01smartd      K84wpa_supplicant      S13irqbalance        S50choose_repo
K02oddjobd     K86cgred               S13rpcbind           S50cloud-init-local
K10psacct      K87restorecond         S15mdmonitor         S50mcelogd

如果我们在这些运行级别特定的文件夹中看到文件,则它们或者以S开头,或者以K开头。
这些文件也被编号。
现在,启动时带有S的文件将在启动过程中执行,而以K开头的文件将在关机过程中被杀死。

S或者K后面的数字是执行它们的顺序。

内核启动后,我们所需的运行级别目录中的所有程序。
将显示登录界面。