当前位置: 首页 > Linux

LinuxBoot、Kernel和Service介绍

时间:2023-04-06 22:35:01 Linux

Linux的启动过程就是初始化系统的过程。它包括从计算机首次开机到用户界面完全可用的所有时间。充分了解引导过程中的步骤可以帮助您解决问题并根据您的需要调整计算机的性能。另一方面,引导过程可能非常技术性,您可以在不了解所有细节的情况下开始使用Linux。第一步:BIOS引导基于x86的Linux系统涉及许多步骤。当计算机开启时,基本输入/输出系统(BIOS)会初始化硬件,包括屏幕和键盘,并测试主内存。此过程也称为POST(开机自检)。BIOS软件存储在主板上的ROM芯片中。之后,其余的引导过程由操作系统(OS)控制。主引导记录(MBR)和引导加载程序POST完成后,系统控制从BIOS传递到引导加载程序。引导加载程序通常存储在系统中的一个硬盘上,或者在引导扇区(对于旧版BIOS/MBR系统)或EFI分区(对于较新的(统一)可扩展固件接口或EFI/UEFI系统)。到这个阶段,机器不访问任何大容量存储媒体。此后,有关日期、时间和最重要外围设备的信息从CMOS值中加载(在使用电池备份内存存储技术后,即使系统断电也可以跟踪日期和时间)。有许多Linux的引导加载程序;最常见的是GRUB(用于GRand统一引导加载程序)、ISOLINUX(用于从可移动媒体引导)和DASU-Boot(用于在嵌入式设备/设备上引导)。大多数Linux引导加载程序可以提供一个用户界面,用于选择引导Linux的替代选项,甚至可能安装其他操作系统。启动Linux时,引导加载程序负责将内核映像和初始RAM磁盘或文件系统(其中包含启动系统所需的一些关键文件和设备驱动程序)加载到内存中。运行中的引导加载程序引导加载程序有两个不同的阶段:对于使用BIOS/MBR方法的系统,引导加载程序位于硬盘的第一个扇区,也称为主引导记录(MBR)。MBR的大小只有512字节。在此阶段,引导加载程序检查分区表并找到可引导分区。一旦找到可引导分区,它就会搜索第二阶段引导加载程序,例如GRUB,并将其加载到RAM(随机存取存储器)中。对于使用EFI/UEFI方法的系统,UEFI固件读取其引导管理器数据以确定启动哪个UEFI应用程序以及从何处启动(即可以从哪个磁盘和分区找到EFI分区)。然后固件启动UEFI应用程序,例如GRUB,如固件引导管理器的引导条目中所定义。这个过程比旧的MBR方法更复杂,但更通用。第二阶段引导加载程序位于/boot下。将显示启动画面,允许我们选择要启动的操作系统(OS)。选择操作系统后,引导加载程序将所选操作系统的内核加载到RAM中并将控制权交给它。内核几乎总是被压缩的,所以它的首要工作就是解压缩自己。之后,它检查和分析系统硬件并初始化内核中内置的任何硬件设备驱动程序。初始RAMDiskinitramfs文件系统映像包含执行安装正确根文件系统所需的一切的程序和二进制文件,例如为大容量存储控制器所需的文件系统和设备驱动程序提供内核功能,使用名为udev的文件系统(用于用户设备)它负责确定存在哪些设备,找到它们正常运行所需的设备驱动程序,并加载它们。找到根文件系统后,检查错误并安装。安装程序向操作系统指示文件系统已准备好使用,并将其与文件系统整体层次结构中的特定点(安装点)相关联。如果成功,initramfs将从RAM刷新并在根文件系统(/sbin/init)上执行init程序。init处理挂载并转向最终的真实根文件系统。如果在访问大容量存储之前需要特殊的硬件驱动程序,它们必须位于initramfs映像中。文本模式登录在引导过程结束时,init启动一些文本模式登录提示。这些使您能够输入用户名,然后输入密码,最后获得命令shell。但是,如果您运行的系统具有图形登录界面,您最初不会看到这些。通常,默认命令shell是bash(GNUBourneAgainShell),但还有许多其他高级命令shell可用。shell打印文本提示,表明它已准备好接受命令;用户输入命令并回车后,命令执行,命令执行完成后显示另一个提示。正如您将在第7章:命令行操作中了解到的,您可以使用ALT键和功能键来访问运行命令shell的终端。大多数发行版以F1或F2开头,有六个文本终端和一个图形终端。在图形环境中,切换到文本控制台需要按CTRL-ALT+相应的功能键(使用F7或F1进入GUI)。Linux内核引导加载程序将内核和基于RAM的初始文件系统(initramfs)加载到内存中,以便内核可以直接使用它。当内核加载到RAM中时,它会立即初始化和配置计算机的内存,并配置连接到系统的所有硬件。这包括所有处理器、I/O子系统、存储设备等。内核还加载一些必要的用户空间应用程序。/sbin/init和服务一旦内核设置了所有硬件并安装了根文件系统,内核就会运行/sbin/init。然后这成为初始进程,然后启动其他进程以保持系统运行。系统上的大多数其他进程最终都会追溯到init;例外包括所谓的内核进程。它们由内核直接启动,它们的工作是管理操作系统内部的细节。除了启动系统,init还负责保持系统运行和干净地关闭系统。它的职责之一是在必要时充当所有非内核进程的管理者;完成后清理,并在用户登录和注销时根据需要重新启动用户登录服务,其他后台系统服务也是如此。传统上,此进程启动是使用可追溯到1980年代的约定和SystemVUNIX版本完成的。这个串行过程使系统通过一系列运行级别,其中包含启动和停止服务的脚本集合。每个运行级别支持系统的不同运行模式。在每个运行级别中,可以将各个服务设置为运行或在运行时关闭。然而,所有最近的主要版本都已经从这种顺序运行级别方法转移到系统初始化,尽管出于兼容性目的它们通常支持SystemV约定。接下来,我们将讨论较新的方法systemd和Upstart。StartupAlternativesSysVinit将事物视为一个连续的过程,分为一系列连续的阶段。每个阶段都需要完成才能进入下一阶段。因此,引导不会轻易利用可以在多个处理器或内核上完成的并行处理。此外,关机和重启被认为是相对罕见的事件;花多长时间并不重要。这不再是事实,尤其是对于移动设备和嵌入式Linux系统。一些现代方法,例如使用容器,可能需要几乎瞬时的启动时间。因此,系统现在需要具有更快和增强功能的方法。最后,旧方法需要相当复杂的启动脚本,这些启动脚本很难在发行版、内核版本、体系结构和系统类型之间保持通用。开发的两个主要替代方案是:Updtart由Ubuntu开发,并于2006年在Fedora9(2008)和RHEL6及其克隆中首次采用。systemdFedora于2011年被RHEL7和SUSE首次采用(在Ubuntu16.04中取代了Upstart而转向systemd有点争议,它已被主要发行版采用,因此我们不会讨论旧的SystemV方法或Upstart,后者已成为死胡同。无论人们对systemd的争议或技术方法有何看法,近乎普遍的采用使得学习如何在Linux系统上工作变得更加容易,因为发行版之间的差异较小。接下来我们列举systemd的特性。systemd特性使用systemd的系统比使用早期init方法的系统启动得更快。这主要是因为它用一种激进的并行化技术取代了一组序列化的步骤,从而允许同时启动多个服务。复杂的启动shell脚本被更简单的配置文件所取代,这些配置文件列举了在服务启动之前必须完成的操作、服务启动的执行方式以及服务在启动完成时应指示的条件。需要注意的一件事是/sbin/init现在只指向/lib/systemd/systemd;即systemd接管了init进程。一个systemd命令(systemctl)用于大多数基本任务。虽然我们没有讨论在命令行上工作,但这里有一个简短的用法列表:在当前运行的系统上启动、停止、重新启动服务(nfs示例):$sudosystemctlstart|stop|restartnfs.service启用或者禁用系统服务在系统启动时启动:$sudosystemctlenable|disablenfs.service在大多数情况下,.service可以省略。与旧方法有许多技术差异,超出了我们的讨论范围。更多Jerry原创文章在这里:《王子熙》: