Linux内核启动和启动过程简介

大家好! 因此,我们打开了Linux管理员课程的下一个,连续第四个部分,该课程自信地占据了devopersky课程旁边的位置。 更多的老师 ,更多的信息和立场。 像往常一样,老师们收集了更多有趣的信息。

走吧

您是否想知道系统准备运行应用程序需要什么?

了解加载内核和启动Linux系统的过程对于配置Linux和解决启动问题非常重要。 本文概述了使用GRUB2引导加载程序的内核引导过程以及由systemd初始化系统运行的启动。

实际上,要使Linux计算机进入工作状态,必须有两个系列的事件:内核启动(boot)和系统启动(startup)。 内核启动过程在您打开计算机电源时开始,并以内核初始化和启动systemd结束。 此后,启动系统的过程开始了,是他使Linux计算机进入工作状态。



通常,加载内核和启动Linux系统的过程非常简单。 它由以下步骤组成,将在以下各节中进行详细说明:

  • BIOS开机自检;
  • 内核加载(GRUB2);
  • 内核初始化;
  • 运行systemd,是所有进程的父级。

请注意,本文是关于GRUB2和systemd的,因为它们是大多数发行版的内核加载器和初始化程序。 以前使用了其他选项,有时仍可以在某些发行版中找到它们。

内核启动过程

内核启动过程可以通过几种方式启动。 首先,如果关闭电源,则打开计算机电源将启动引导过程。 其次,如果本地用户(包括root用户和非特权用户)已经在计算机上运行,​​则该用户可以使用GUI或命令行以编程方式启动内核引导过程以重新引导。 重新启动将首先关闭计算机,然后再重新启动。

BIOS开机自检

Linux内核启动过程的第一步与Linux无关。 这是过程的硬件部分,所有操作系统都一样。 给计算机供电后,首先启动的是POST(开机自检),它是BIOS(基本I / O系统,基本输入/输出系统)的一部分。

当IBM在1981年推出其第一台个人计算机时,BIOS旨在初始化硬件组件。 POST是BIOS的一部分,BIOS的任务是确保计算机设备正确运行。 如果POST失败,则计算机可能出现故障,并且引导过程将无法继续。

BIOS POST检查硬件的基本性能,然后导致BIOS 中断 -INT 13H,该中断会在所有具有引导功能的连接的设备上找到内核的引导扇区。 找到的第一个包含有效引导记录的扇区被加载到RAM中,然后将控制权从引导扇区转移到代码中。
引导扇区只是第一步。 大多数Linux发行版使用以下三个引导加载程序选项之一:GRUB,GRUB2和LILO。 GRUB2是最新的,现在比旧版本使用更多。

GRUB2

GRUB2代表“ GRand Unified Bootloader,版本2”,现在它是大多数现代Linux发行版的主要引导程序。 GRUB2是使计算机足够智能的程序,因此它可以找到操作系统的内核并将其加载到内存中。 由于说和写GRUB比GRUB2容易,因此在本文中,我可能会使用GRUB一词,但除非另有说明,否则暗指GRUB2。

GRUB与multiboot规范兼容, 该规范允许它加载Linux和其他操作系统的不同版本。 它还可以启动链中专有操作系统的启动记录。

GRUB还允许用户从提供的任何Linux发行版的几种可能的内核下载中进行选择。 如果更新后的内核无法正确启动或与软件的某些重要部分不兼容,则可以下载内核的先前版本。 可以在/boot/grub/grub.conf文件中配置GRUB。

GRUB1现在被认为是过时的,并且在大多数现代发行版中都被GRUB2(它的重写版本)所取代。 基于Red Hat的发行版在Fedora 15和CentOS / RHEL 7周围已升级到GRUB2。GRUB2具有与GRUB1相同的启动功能,但除此之外,它还提供了类似大型机的基于OS的基于命令的环境,并且在预启动阶段具有更大的灵活性。 GRUB2是在/boot/grub2/grub.cfg配置的。

任何GRUB的主要任务是将Linux内核加载到内存中并运行它。 两种版本的GRUB在三个阶段中的工作方式相似,但是在本文中,我将使用GRUB2来描述GRUB的工作方式。 配置GRUB和GRUB2以及使用GRUB2命令超出了本文的范围。

尽管GRUB2正式不使用步骤编号,但是为了方便起见,我将在本文中使用它。

第一阶段

如BIOS POST部分中已提到的那样,在POST结束时,BIOS在通常位于主启动记录(MBR)中的附加磁盘上搜索启动记录,然后将找到的第一条记录加载到内存中并开始执行它。 引导代码(即GRUB2的第一阶段)占用的空间很小,因为它必须与分区表一起放入硬盘的前512字节扇区。 在标准MBR中为引导程序代码本身分配的空间总量为446字节。 第1阶段的446字节文件称为boot-img,不包含分区表-它将单独添加到启动记录中。

由于引导记录应该很小,因此它不是很“智能”,也无法理解文件系统的结构。 因此,步骤1的唯一目的是检测并加载步骤1.5。 为此,GRUB的步骤1.5必须位于引导记录本身和磁盘上的第一个分区之间的空间中。 将第1.5阶段GRUB加载到RAM之后,第1阶段将控制权转移到第1.5阶段。

1.5阶段

如上所述,GRUB的步骤1.5应该在启动记录和磁盘上的第一个分区之间。 从历史上看,由于技术原因,此空间一直未使用。 硬盘驱动器上的第一个分区从扇区63开始,考虑到扇区0中的MBR,共有62 512字节的扇区-31744字节-您可以在其中存储core.img文件-1.5 GRUB阶段。 core.img文件重25389字节,足够在MBR和第一个磁盘分区之间存储它。

由于可以在步骤1.5中使用更多代码,因此足以包含几个常见的文件系统驱动程序,例如标准EXT和其他Linux文件系统,FAT和NTFS。 与GRUB1的步骤1.5相比,GRUB2中的core.img更复杂,功能更强大。 这意味着GRUB2的阶段2可以驻留在标准EXT文件系统中,但不能驻留在逻辑卷中。 因此,阶段2文件的标准位置是/boot文件系统,或者是/boot/grub2

请注意,/ boot目录必须位于GRUB支持的文件系统中。 并非所有文件系统都具有此支持。 1.5阶段的任务是从必要的文件系统驱动程序开始,以在/ boot文件系统中搜索第2阶段文件并加载必要的驱动程序。

第二阶段

所有GRUB Stage 2文件都位于/boot/grub2和几个子目录中。 GRUB2没有第1步和第2步中的映像文件。相反,它主要由运行时内核模块组成,并根据需要从/boot/grub2/i386-pc目录加载。

GRUB2第2阶段的任务是检测Linux内核并将其加载到RAM中,并将计算机控制权转移给内核。 内核及其相关文件位于/boot目录中。 内核文件易于识别,因为它们的名称以vmlinuz开头。 您可以列出/boot目录的内容,以查看系统上当前安装的内核。

与GRUB1一样,GRUB2也支持加载多个Linux内核之一。 红帽软件包管理系统支持存储内核的多个版本,以便在最新版本出现问题时可以加载旧版本的内核。 默认情况下,GRUB提供预装的已安装内核菜单,包括救援选项,配置后还包括恢复选项。

第2阶段GRUB2将选定的内核加载到内存中,并将计算机控制权转移给内核。

核心

所有内核均采用自解压的压缩格式,以节省空间。 内核与原始RAM磁盘映像以及硬盘驱动器上的分区列表一起位于/boot目录中。

在将选定的内核加载到内存中并开始执行之后,首先,它必须从文件的压缩版本中提取自身,然后才能开始进行有用的工作。 提取完成后,它将加载systemd ,以替换旧的SysV init程序,并将控制权转移给它。

内核启动过程到此结束。 此时,Linux内核和systemd正在运行,但是对于最终用户而言无法执行任何有用的任务,因为没有其他事情要做。

系统启动过程

系统启动过程遵循内核启动过程,并使Linux计算机启动并运行。

系统的

systemd是负责使Linux主机达到高效状态的所有进程的父级。 它的某些功能要比旧的初始化程序中提供的功能更广泛,应该管理正在运行的Linux主机的许多方面,包括安装文件系统,启动和管理Linux主机有效工作所需的系统服务。 与系统启动过程无关的所有systemd任务都不在本文讨论的范围之内。

首先,systemd挂载/etc/fstab定义的文件系统,包括所有交换文件和分区。 此时,他可以访问/etc的配置文件,包括他自己的配置文件。 它使用自己的配置文件/etc/systemd/system/default.target来确定要加载主机的目标。 default.target文件只是指向实际目标文件的符号链接。 对于台式机工作站,这通常是graphic.target,相当于旧的SystemV初始化程序中的运行级别5。 对于服务器,默认值可能是multi-user.target,类似于SystemV中的运行级别3。 Emergency.target类似于单用户模式。

请注意,目标和服务是系统单位。

下表1比较了所有systemd目标和SystemV中的旧运行级别。 systemd提供的目标别名是向后兼容的。 目标别名允许脚本(包括我在内的许多系统管理员)使用SystemV命令(如init3)更改执行级别。 当然,SystemV命令由systemd指导以进行解释和执行。
Systemv运行级别系统目标系统目标别名内容描述
停止目标在不关闭电源的情况下挂起系统
0poweroff.targetrunlevel0.target暂停系统并关闭电源
小号紧急目标单用户模式。 服务未运行; 文件系统未挂载。 这是最基本的操作级别。 为了与用户进行系统交互,仅在主控制台中启动紧急外壳。
1个救援目标runlevel1.target基本系统,包括在主控制台中安装具有最基本服务集和救援外壳的文件系统。
2runlevel2.target没有NFS,但所有非GUI服务正在运行的多用户模式。
3多用户目标runlevel3.target所有服务都在运行,但仅通过命令行界面(CLI)运行。
4runlevel4.target未使用。
5图形目标runlevel5.target带GUI的多用户模式。
6重新启动目标runlevel6.target重新开机
default.target此目标始终与multi-user.target或graphic.target具有符号链接。 systemd始终使用default.target来启动系统。 default.target不应与halt.target,poweroff.target或reboot.target关联。

表1:SystemV控件级别与systemd目标和一些目标别名的比较。

每个目标都有一组在配置文件中描述的依赖项。 systemd运行必要的。 这些依赖项是运行具有特定功能级别的Linux主机所需的服务。 加载并启动目标配置文件中列出的所有依赖项后,系统将在此目标级别运行。

systemd还会扫描过时的SystemV初始化目录以查找启动文件。 如果是这样,systemd会将它们用作配置文件来运行文件中描述的服务。 一个过时的网络服务就是一个很好的例子,它仍然在Fedora中使用SystemV启动文件。

下面的图1直接从启动主页复制。 它显示了systemd启动期间事件的一般顺序以及确保其成功的基本要求。

可以将sysinit.target和basic.target目标视为系统启动期间的检查点。 尽管systemd的目标之一是并行运行系统服务,但是必须先启动某些服务和功能目标。 在完成所需的所有服务和目标之前,无法传递这些控制点。

因此,当sysinit.target所依赖的所有单元都完成时,即可实现。 以下所有单元均应完成:安装文件系统,设置交换文件,启动udev,设置随机数生成器的初始状态,初始化低级服务,如果至少一个文件系统被加密则设置密码服务。 在sysinit.target中,它们可以并行执行。
sysinit.target运行系统最低功能所必需的所有低层服务和单元,以及进入basic.target所需的那些服务和单元。


图1. Systemd启动图

执行sysinit.target之后,systemd从执行该命令所需的所有单元开始启动basic.target。 基本目标通过启动下一个目标所需的单元来提供其他功能,包括设置各种可执行目录,通信套接字和计时器的路径。

最后,您可以开始初始化用户级别的目标:multi-user.target或graphic.target。 值得注意的是,必须在执行图形目标的依赖项之前达到multi-user.target。

图1中带下划线的目标是典型的启动目标。 当达到其中之一时,系统启动结束。 如果multi-user.target是默认目标,那么在控制台中,您将以文本模式看到登录名。 如果默认指定了graphical.target,那么您将看到图形登录。 登录屏幕GUI取决于您使用的屏幕管理器。

问题所在

最近,我不得不在使用GRUB2的Linux计算机上更改默认的启动内核。 我发现某些命令停止正常运行,或者我以某种方式不正确地使用了它们。 我仍然不知道问题出在什么地方,需要更多时间进行研究。

grub2-set-default命令在/etc/default/grub文件中错误地配置了默认内核索引,因此未加载所需的替代内核。 我手动更改了/etc/default/grub GRUB_DEFAULT=savedGRUB_DEFAULT=2 ,其中2是我要运行的已安装内核的索引。 然后,我运行了grub2-mkconfig > /boot/grub2/grub.cfg命令来创建一个新的grub配置文件。 这个技巧奏效了,并启动了另一个内核。

结论

GRUB2和systemd初始化系统是大多数现代Linux发行版的内核引导和系统启动阶段的关键组件。 尽管存在矛盾,特别是在systemd周围,这两个组件可以很好地协同工作以加载内核并运行创建功能性Linux系统所需的所有系统服务。
尽管我认为GRUB2和systemd总体上比其前任更为复杂,但它们的掌握和管理并不困难。 这些手册包含有关systemd的许多信息,并且在freedesktop.org上完整显示了其页面列表。 有关更多信息,请参见下面的链接:



仅此而已。 我们正在这里等待问题和评论,或者可以在公开课程中直接提出他们。

Source: https://habr.com/ru/post/zh-CN424761/


All Articles