linux,启动引导过程_Linux引导和启动过程简介

linux,启动引导过程

了解Linux启动和启动过程对于能够配置Linux和解决启动问题很重要。 本文概述了使用GRUB2引导程序的引导顺序以及由systemd初始化系统执行的引导顺序。

实际上,启动Linux计算机并使其可用需要两个事件序列: bootstartup引导顺序在计算机打开时开始,在内核初始化并启动systemd时完成。 然后, 启动过程将接管并完成使Linux计算机进入运行状态的任务。

总体而言,Linux启动和启动过程非常容易理解。 它由以下步骤组成,将在以下各节中进行详细说明。

  • BIOS开机自检
  • 引导加载程序(GRUB2)
  • 内核初始化
  • 启动systemd,它是所有进程的父级。

请注意,本文介绍了GRUB2和systemd,因为它们是大多数主要发行版的当前引导加载程序和初始化软件。 其他软件选项历史悠久,至今仍在某些发行版中找到。

开机过程

引导过程可以通过以下两种方式之一启动。 首先,如果关闭电源,则打开电源将开始引导过程。 如果计算机已经在运行本地用户(包括root用户或非特权用户),则该用户可以通过使用GUI或命令行启动重新启动来以编程方式启动启动顺序。 重新启动将首先关闭计算机,然后重新启动计算机。

BIOS开机自检

Linux引导过程的第一步实际上与Linux无关。 这是引导过程的硬件部分,对于任何操作系统都是相同的。 第一次给计算机通电时,它将运行POST(开机自检),该程序是BIOS(基本I / O系统)的一部分。

当IBM在1981年设计出第一台PC时,BIOS旨在初始化硬件组件。 POST是BIOS的一部分,其任务是确保计算机硬件正常运行。 如果POST失败,则计算机可能无法使用,因此引导过程不会继续。

BIOS POST检查硬件的基本可操作性,然后发出BIOS 中断 INT 13H,该中断在任何连接的可引导设备上定位引导扇区。 它发现包含有效引导记录的第一个引导扇区被加载到RAM中,然后控制权转移到从引导扇区加载的代码。

引导扇区实际上是引导加载程序的第一阶段。 大多数Linux发行版使用三个引导加载程序,GRUB,GRUB2和LILO。 GRUB2是最新的,并且如今比其他旧选项更频繁地使用。

GRUB2

GRUB2代表“ GRand Unified Bootloader,版本2”,现在它是大多数当前Linux发行版的主要Bootloader。 GRUB2是使计算机足够智能以找到操作系统内核并将其加载到内存的程序。 因为与GRUB2相比,GRUB的编写和说起来要容易得多,所以在本文档中我可能会使用术语GRUB,但除非另有说明,否则我将引用GRUB2。

GRUB设计为与多重引导规范兼容,该规范允许GRUB引导Linux和其他免费操作系统的许多版本; 它还可以链式加载专有操作系统的启动记录。

GRUB还可以允许用户从任何给定Linux发行版的多个不同内核中选择引导。 如果更新的版本由于某种原因失败或与重要的软件不兼容,则可以引导至先前的内核版本。 可以使用/boot/grub/grub.conf文件配置GRUB。

现在,GRUB1被认为是旧版,并且在大多数现代发行版中已被GRUB2取代,GRUB2是对GRUB1的重写。 基于Red Hat的发行版在Fedora 15和CentOS / RHEL 7左右升级到GRUB2。GRUB2提供了与GRUB1相同的启动功能,但是GRUB2还是基于大型机的基于命令的pre-OS环境,并在预启动阶段提供了更大的灵活性。 GRUB2使用/boot/grub2/grub.cfg配置。

这两个GRUB的主要功能是将Linux内核加载到内存中并运行。 两种版本的GRUB基本上都以相同的方式工作,并且具有相同的三个阶段,但是我将使用GRUB2来讨论GRUB的工作方式。 GRUB或GRUB2的配置以及GRUB2命令的使用不在本文讨论范围之内。

尽管GRUB2并未正式使用GRUB2的三个阶段的阶段表示法,但以这种方式引用它们很方便,因此我将在本文中介绍。

阶段1

如BIOS POST部分所述,在POST结束时,BIOS在连接的磁盘上搜索引导记录,通常位于主引导记录(MBR)中,它将找到的第一个引导记录加载到内存中,然后开始执行引导记录。 引导程序代码(即GRUB2阶段1)非常小,因为它必须与分区表一起放入硬盘驱动器的第一个512字节扇区。 经典通用MBR中为实际引导程序代码分配的空间总量为446字节。 第1阶段的446字节文件名为boot.img,不包含分区表,该分区表已单独添加到启动记录中。

因为引导记录必须很小,所以它也不是很聪明,也不了解文件系统的结构。 因此,阶段1的唯一目的是定位并加载阶段1.5。 为此,GRUB的阶段1.5必须位于引导记录本身和驱动器上的第一个分区之间的空间中。 将GRUB阶段1.5加载到RAM之后,阶段1将控制权移交给阶段1.5。

1.5阶段

如上所述,GRUB的阶段1.5必须位于引导记录本身与磁盘驱动器上的第一个分区之间的空间中。 由于技术原因,此空间在历史上一直未使用。 硬盘驱动器上的第一个分区从扇区63开始,MBR在扇区0中,剩下62 512字节的扇区(31,744字节),其中存储了GRUB的1.5阶段的core.img文件。 core.img文件为25,389字节,因此MBR与第一个磁盘分区之间有足够的可用空间来存储它。

由于阶段1.5可以容纳更多的代码,因此它可以具有足够的代码来包含一些常见的文件系统驱动程序,例如标准EXT和其他Linux文件系统,FAT和NTFS。 GRUB2 core.img比旧的GRUB1 stage 1.5更复杂,功能更强大。 这意味着GRUB2的阶段2可以位于标准EXT文件系统上,但不能位于逻辑卷上。 因此,第2阶段文件的标准位置位于/ boot文件系统中,尤其是/ boot / grub2。

请注意,/ boot目录必须位于GRUB支持的文件系统上。 并非所有文件系统都是。 1.5阶段的功能是从在/ boot文件系统中找到第2阶段文件并加载所需的驱动程序所需的文件系统驱动程序开始执行。

第二阶段

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

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

与GRUB1一样,GRUB2也支持从多种Linux内核之一进行引导。 红帽软件包管理器DNF支持保留内核的多个版本,因此,如果最新版本的内核出现问题,则可以引导较旧版本的内核。 默认情况下,GRUB提供已安装内核的预引导菜单,包括救援选项和恢复选项(如果已配置)。

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

核心

所有内核均采用自解压压缩格式,以节省空间。 内核以及初始的RAM磁盘映像以及硬盘驱动器的设备映射位于/ boot目录中。

将选定的内核加载到内存中并开始执行后,它必须首先从文件的压缩版本中提取自身,然后才能执行任何有用的工作。 内核提取自身后,将加载systemd (它是旧SysV init程序的替代品),并将控制权交给它。

引导过程到此结束。 此时,Linux内核和systemd正在运行,但由于没有其他运行,因此无法为最终用户执行任何生产性任务。

启动过程

启动过程遵循引导过程,使Linux计算机进入可用于生产性工作的操作状态。

系统的

systemd是所有进程的源泉,它负责使Linux主机达到可以完成生产性工作的状态。 它的某些功能要比旧的init程序要广泛得多,它们的功能是管理运行中的Linux主机的许多方面,包括挂载文件系统以及启动和管理生产型Linux主机所需的系统服务。 与启动顺序无关的所有systemd任务都不在本文讨论范围之内。

首先,systemd挂载/ etc / fstab定义的文件系统,包括所有交换文件或分区。 此时,它可以访问/ etc中的配置文件,包括它自己的文件。 它使用其配置文件/etc/systemd/system/default.target来确定将主机引导至哪个状态或目标。 default.target文件只是指向真实目标文件的符号链接。 对于台式机工作站,通常将其作为graphic.target,等效于旧SystemV init中的运行级别 5 。 对于服务器,默认值更可能是multi-user.target ,类似于SystemV中的运行级别 3Emergency.target与单用户模式相似。

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

下表1是对systemd目标与旧的SystemV启动运行级别的比较。 systemd提供的目标别名是向后兼容的。 目标别名允许脚本(以及许多像我这样的系统管理员)使用init 3这样的SystemV命令来更改运行级别。 当然,SystemV命令将转发给systemd进行解释和执行。

SystemV Runlevel 系统目标 系统目标别名 描述
  停止目标   在不关闭电源的情况下暂停系统。
0 poweroff.target runlevel0.target 停止系统并关闭电源。
S 紧急目标   单用户模式。 没有服务正在运行; 文件系统未挂载。 这是最基本的操作级别,只有在主控制台上运行的紧急外壳供用户与系统交互。
1 救援目标 runlevel1.target 一个基本系统,包括在仅运行最基本服务的情况下挂载文件系统,并在主控制台上安装急救外壳。
2   runlevel2.target 多用户,没有NFS,但所有其他非GUI服务正在运行。
3 多用户目标 runlevel3.target 除命令行界面(CLI)外,所有服务都在运行。
4   runlevel4.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.targetbasic.target目标可以视为启动过程中的检查点。 尽管systemd将并行启动系统服务作为其设计目标之一,但是在启动其他服务和目标之前,仍然必须启动某些服务和功能目标。 在满足该检查点所需的所有服务和目标之前,无法通过这些检查点。

因此,当sysinit.target所依赖的所有单元完成时, 可以到达该目录 。 所有这些单元,安装文件系统,设置交换文件,启动udev,设置随机生成器种子,启动低级服务以及在加密一个或多个文件系统时设置加密服务都必须在sysinit内完成。针对那些任务可以并行执行。

sysinit.target将启动系统仅能正常运行所需的所有低层服务和单元,并且还需要启用这些服务和单元才能继续运行basic.target。


   
   
   local-fs-pre.target
            |
            v
   (various mounts and   (various swap   (various cryptsetup
    fsck services...)     devices...)        devices...)       (various low-level   (various low-level
            |                  |                  |             services: udevd,     API VFS mounts:
            v                  v                  v             tmpfiles, random     mqueue, configfs,
     local-fs.target      swap.target     cryptsetup.target    seed, sysctl, ...)      debugfs, ...)
            |                  |                  |                    |                    |
            \__________________|_________________ | ___________________|____________________/
                                                 \|/
                                                  v
                                           sysinit.target
                                                  |
             ____________________________________/|\________________________________________
            /                  |                  |                    |                    \
            |                  |                  |                    |                    |
            v                  v                  |                    v                    v
        (various           (various               |                (various          rescue.service
       timers...)          paths...)              |               sockets...)               |
            |                  |                  |                    |                    v
            v                  v                  |                    v              rescue.target
      timers.target      paths.target             |             sockets.target
            |                  |                  |                    |
            v                  \_________________ | ___________________/
                                                 \|/
                                                  v
                                            basic.target
                                                  |
             ____________________________________/|                                 emergency.service
            /                  |                  |                                         |
            |                  |                  |                                         v
            v                  v                  v                                 emergency.target
        display-        (various system    (various system
    manager.service         services           services)
            |             required for            |
            |            graphical UIs)           v
            |                  |           multi-user.target
            |                  |                  |
            \_________________ | _________________/
                              \|/
                               v
                     graphical.target

图1:systemd启动图。

满足sysinit.target之后,systemd接下来将启动basic.target ,从而启动实现该目标所需的所有单元。 基本目标通过启动下一个目标所需的单元来提供一些其他功能。 其中包括设置诸如各种可执行目录的路径,通信套接字和计时器之类的内容。

最后,用户级别的目标,multi-user.targetgraphical.target可以初始化。 注意多用户。 目标 必须满足图形目标依赖关系。

图1中带下划线的目标是通常的启动目标。 当达到这些目标之一时,启动就完成了。 如果multi-user.target是默认值,那么您应该在控制台上看到文本模式登录。 如果graphical.target是默认的,那么你应该看到图形化登录; 您看到的特定GUI登录屏幕将取决于您使用的默认显示管理器

问题

最近,我需要在使用GRUB2的Linux计算机上更改默认启动内核。 我发现某些命令似乎不适用于我,或者我没有正确使用它们。 我还不确定是哪种情况,需要做更多的研究。

grub2-set-default命令未在/ etc / default / grub文件中为我正确设置默认内核索引,因此所需的备用内核无法启动。 因此,我手动将/ etc / default / grub GRUB_DEFAULT = saved更改为GRUB_DEFAULT = 2 ,其中2是要引导的已安装内核的索引。 然后,我运行命令grub2-mkconfig > /boot/grub2/grub.cfg来创建新的grub配置文件。 此规避措施按预期工作,并引导至备用内核。

结论

GRUB2和systemd初始化系统是大多数现代Linux发行版的引导和启动阶段的关键组件。 尽管围绕systemd一直存在争议,但是这两个组件可以顺利地协同工作,以首先加载内核,然后启动产生功能性Linux系统所需的所有系统服务。

尽管我确实发现GRUB2和systemd都比它们的前辈更加复杂,但是它们同样易于学习和管理。 手册页包含有关systemd的大量信息,并且freedesktop.org在线提供了完整的systemd手册页集。 请参阅下面的资源以获取更多链接。

额外资源

翻译自: https://opensource.com/article/17/2/linux-boot-and-startup

linux,启动引导过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值