SUSE linux的启动过程介绍

引导Linux系统涉及不同的组件和任务。在固件和硬件初始化过程(取决于机器的架构)之后,内核通过引导加载程序GRUB2启动。此后,引导过程完全由操作系统控制并由systemd处理。systemd提供了一组“target”,用于为日常使用、维护或紧急情况启动配置。

1 术语

init

有两种不同的进程会被命名为init:

  • 挂载到根文件系统的initramfs进程
  • 从真正的根文件系统开始执行的所有其他进程的操作系统进程

在这两种情况下,systemd程序都会处理这个任务。它首先从initramfs执行以挂载根文件系统。一旦成功,它将作为初始进程从根文件系统重新执行。为了避免混淆这两个systemd进程,我们在initramfs上将第一个进程称为init,将第二个进程称为systemd。

initrd/initramfs

initrd(初始RAM磁盘)是一个映像文件,其中包含由内核加载并从/dev/ram作为临时根文件系统挂载的根文件系统映像。挂载此文件系统需要文件系统驱动程序。
从内核2.6.13开始,initrd已被initramfs(初始RAM文件系统)取代,它不需要挂载文件系统驱动程序。openSUSELeap专门使用initramfs。但是,由于initramfs被保存为/boot/initrd,因此通常称为“initrd”。

2 系统启动过程

2.1 初始化和引导加载程序阶段

在初始化阶段,设置机器的硬件并准备好设备。 此过程在硬件架构之间存在显着差异。
openSUSE Leap在所有架构上都使用引导加载程序GRUB2。根据架构和固件,启动GRUB2引导加载程序可能是一个多步骤过程。引导加载程序的目的是加载内核和基于RAM的初始文件系统(initramfs)。

AArch64和AMD64/Intel64上的初始化和引导加载程序阶段

电脑启动后,BIOS和UEFI会初始化屏幕和键盘,并测试内存,但是不会访问大容量存储(硬盘)。随后加载CMOS中的日期,时间和外设。识别到启动介质后,系统控制权将会从BIOS/UEFI过度到boot loader。
在具有传统BIOS的机器上,只能加载来自引导盘的第一个物理512字节扇区(主引导记录,MBR)的代码,只有最小的GEUB2适合MBR,它的主要目的是从MBR和第一个分区(MBR分区表)之间的间隙或从BIOS根分区(GPT分区表)加载一个包含文件系统驱动的GRUB2核心镜像。这个景象包含了文件系统的驱动程序,因此能够访问位于根文件系统上的/boot目录。/boot目录包含了用于GRUB2核心一级内核和initramfs景象的附加模块。一旦它可以访问该分区,GRUB2就会将内核和initramfs镜像加载到内存中,并将控制权交给内核。
当从包含一个加密的/boot分区的加密文件系统启动BIOS时,需要输入两次密码,第一次用于GRUB2加密/boot,第二次用于systemd挂载加密卷。
使用UEFI加载就会简单些,固件能够从具有GPT分区表的FAT磁盘分区中读取。这个EFI系统分区(挂载到了/boot/efi)拥有足够的空间来承载由固件直接加载和执行的成熟的GRUB2。
如果BIOS/UEFI支持网络引导,还可以配置一个引导服务器,然后就可以通过PXE引导系统。BIOS/UEFI扮演了boot loader的角色。它从boot server获取boot奖项并启动系统。这是完全独立于本地硬盘的。

2.2 内核阶段

当boot loader通过了系统的控制,所有架构的加载过程就完全相同了。boot loader会加载内核和一个初始化基于RAM的文件系统(initramfs)到内存中,然后内核接管工作。
当内核设置好内存管理并且检测到CPU的类型及特性后,将会初始化硬件并从使用initramfs加载的内存中挂载临时根文件系统。

2.2.1 initramfs文件

initramfs(初始RAM文件系统)是一个小的cpio存档,内核可以将其加载到RAM磁盘中。它位于/boot/initrd。它可以使用名为dracut的工具创建。
initramfs提供了一个最小的Linux环境,可以在安装实际的根文件系统之前执行程序。这个最小的Linux环境由BIOS或UEFI例程加载到内存中,除了足够的内存外,没有特定的硬件要求。initramfs存档必须始终提供一个名为init的可执行文件,该可执行文件在根文件系统上执行systemd守护程序,以便引导过程继续进行。
在挂载根文件系统和启动操作系统之前,内核需要相应的驱动程序来访问根文件系统所在的设备。这些驱动程序可能包括特定类型硬盘的特殊驱动程序,甚至是访问网络文件系统的网络驱动程序。根文件系统所需的模块由initramfs上的init加载。加载模块后,udev为initramfs提供所需的设备。稍后在启动过程中,更改根文件系统后,需要重新生成设备。这是由systemd单元systemd-udev-trigger.service完成的。

重新生成initramfs

由于initramfs包含了驱动,因此在必要时需要进行升级,如果有相关的包,这过程会自动完成,YaST或zypper会提醒你生成新的initramfs,但有些时候需要手工完成这项工作。

  1. 硬件变化时添加驱动

如果变化的硬件需要不同的驱动加载到内核时,必须升级initramfs文件。
打开或创建文件/etc/dracut.conf.d/10-DRIVER.conf,添加如下信息:

force_drivers+="RTL8822BE"		#RTL8822BE为硬件型号,如果有多个硬件,两个硬件型号使用空格隔开
  1. 将系统目录移动到RAID或LVM中

当从一个正在运行的系统中移动交换机文件到RAID或逻辑卷时,需要创建一个包含支持软件RAID或LVM驱动的initramfs。因此需要在/etc/fstab中创建新的挂载条目。

  1. 添加磁盘到包含了根文件系统的LVM组或btrfs RAID

这种情况下需要创建一个包含对扩大卷的支持的initramfs。

  1. 修改内核变量

如果通过sysctl接口修改相关联的文件(/etc/sysctl.conf/etc/sysctl.d/*.conf)来修改内核变量的值,下次重启修改将会丢失,即使在运行时使用sysctl --system加载值,更改也不会保存到initramfs文件中。下面的例子是更新方法:


  1. 运行时生成新的initramfs文件
dracut MY_INITRAMFS

Replace MY_INITRAMFS with a file name of your choice. The new initramfs will be created as /boot/MY_INITRAMFS.

或者使用dracut -f命令强制覆盖现有文件

  1. 创建一个执行initramfs文件的软链接。(执行了dracut -f命令不需要这一步)
(cd /boot && ln -sf MY_INITRAMFS initrd)

2.3 initramfs阶段的init

临时根文件系统是从内核挂载,该内核来自包含了可执行的systemd的initramfs。(在下面的initramfs上称为init)。改程序会执行所有的必要操作来挂载正确的根文件系统。它为使用udev的大容量存储控制器所需的文件系统和设备驱动程序提供内核功能。
initramfs上init的主要目的是准备安装和访问真正的根文件系统。根据系统配置,initramfs上的init负责以下任务。


  1. Loading kernel modules
    取决于你的硬件配置,可能需要特殊的驱动程序来访问计算机的硬件组件(最重要的组件是硬盘)。要访问最终的根文件系统,内核需要加载正确的文件系统驱动程序。

  2. Providing block special files
    内核根据加载的模块生成设备事件。udev处理这些事件并在/dev中的RAM文件系统上生成所需的特殊块文件。如果没有这些特殊文件,文件系统和其他设备将无法访问。

  3. Managing RAID and LVM setups
    如果您将系统配置为在RAID或LVM下保存根文件系统,则initramfs上的init会设置LVM或RAID,以便稍后访问根文件系统。

  4. Managing the network configuration
    如果您将系统配置为使用网络安装的根文件系统(通过NFS安装),则init必须确保加载了正确的网络驱动程序,并且将它们设置为允许访问根文件系统。
    如果文件系统位于iSCSI或SAN等网络块设备上,则initramfs上的init也会建立与存储服务器的连接。如果主要目标不可用,openSUSELeap支持从次要iSCSI目标启动。

如果无法从引导环境中挂载根文件系统,则必须先检查并修复根文件系统,然后才能继续引导。对于Ext3和Ext4文件系统,将会自动启动检查器。XFS和Btrfs文件系统的修复过程不是自动化的,用户会看到描述可用于修复文件系统的选项的信息。文件系统修复成功后,退出引导环境会导致系统重新尝试挂载根文件系统。如果成功,引导将继续正常进行。

2.3.1 安装过程中initramfs阶段的init

作为安装过程的一部分,在初始引导期间调用initramfs上的init时,其任务与上述任务不同。请注意,安装系统也不会从initramfs启动systemd——这些任务由linuxrc执行。


  • Finding the installation medium
    当开始安装,机器会加载安装内核和包含YaST安装器的init。YaST安装器运行在RAM文件系统中,他需要安装介质的地址以用于操作系统的安装。

  • Initiating hardware recognition and loading appropriate kernel modules
    引导过程从用于大多数硬件配置的最小驱动程序集开始。在AArch64、POWER和AMD64/Intel64架构的机器上,linuxrc会进行初始硬件扫描,用于寻找适合的硬件驱动。在IBM Z架构机器上,需要提供驱动程序列表和参数。这些驱动用于生成客户自定义的initramfs,它用于启动系统。如果模块不需要用于启动而是用于冷插拔,则可以使用systemd加载模块。

  • Loading the installation system
    硬件被识别后,就会加载适合的驱动。udev程序会创建指定的设备文件,linuxrc会使用YaST安装器开始安装系统的过程。

  • Starting YaST
    最后,linuxrc会启动YaST,然后开始软件包安装和系统配置。

2.4 系统阶段

找到“真正的”根文件系统后,会检查错误并挂载。如果成功,initramfs将被清除并执行根文件系统上的systemd守护进程。systemd是Linux的系统和服务管理器。它是作为PID 1启动的父进程,并充当启动和维护用户空间服务的init系统。

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-风中叮铃-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值