type
status
date
slug
summary
tags
category
icon
password
URL

Q1: 启动的基本流程?

notion image
  1. CPU复位, 加载BIOS
  1. BIOS/UEFI 执行相关固件代码
  1. 加载Bootloader
  1. 加载Linux 内核(vmlinuz/vmlinux) 和 initram/initramfs 文件系统
  1. Linux初始化, 启动 systemd/systemV

Q2: BIOS 是怎么启动的?

notion image
notion image
notion image
计算机加电后,CPU从物理地址0xFFFFFFF0(由初始化的CS:EIP确定,此时CS和IP的值分别是0xF000和0xFFF0))开始执行。在0xFFFFFFF0这里只是存放了一条跳转指令,通过跳转指令跳到BIOS例行程序起始点。BIOS做完计算机硬件自检和初始化后

Q2.1: 0xFFFFFFF0 ?

尽管此时的Intel CPU还只能寻址1MB的内存,但凭借一个奇特的技巧,一个隐藏的基地址(其实就是个偏移量)会与EIP相加,其结果指向第一条将被执行的指令所处的地址0xFFFFFFF0(长16字节,在4GB内存空间的尾部,远高于1MB
📌
在Intel计算机上,有些物理内存范围被映射为设备地址 而不是实际的RAM存储器地址.
notion image
notion image
notion image

Q3: BIOS/UEFI 做了什么?

notion image
📌
BIOS和UEFI的最主要的功能:初始化硬件提供硬件的软件抽象. UEFI带来的独特价值: 标准接口、开放统一和开源
  1. POST 自检
    1. 读取CMOS RAM中的信息识别硬件配置,并对其进行自检测试和初始化
      1. 硬件设备包括CPU、640K基本内存(640K BASE MEMORY)、1MB以上扩展内存(EXTEND MEMORY)、 ROM、主板、CMOS存储器、串口、并口、显卡、软盘子系统、硬盘子系统、键盘等
    2. BIOS 就有了系统所有硬件的信息。它通过几组详细定义好的接口,把这些信息抽象后传递给操作系统,这些信息包括 SMBIOS、ACPI 表(ACPI 与 UEFI),内存映射表(E820 或者 UEFI 运行时)等等。通过这层映射,才能做到做到操作系统完全不改而能够适配到所有机型和硬件
    3. 初始化中断向量表
    4. d. 寻找Bootloader

Q4: CD/ROM vs PXE vs Disk 启动? BIOS 如何找到bootloader?

📌
启动方式的不同本质上就是寻找bootloader方式的不同

Q5: Bootloader做了什么?

📌
内核本质是一个可执行文件, Bootloader主要目的就是将内核代码load到内存, 并跳转到内核代码. 本质上代码执行需要CPU和寄存器配合就行, 但需要一个地方存指令和数据(RAM或ROM)
常用的bootloader: grub2
  • 切换到保护模式,启用分段机制
  • 读磁盘中ELF执行文件格式操作系统到内存
  • 把控制权交给操作系统(并且会传递内核参数)
notion image

Disk/CDROM 启动

MBR概念

notion image
计算机开机后访问硬盘时所必须要读取的首个扇区(一个sector 512 bytes),它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。2字节的结束标志(55AA)

MBR里存放的是什么

bootloader的部分代码. MBR空间太小放不下整个bootloader, 所以mbr里放的代码用于跳转下一个阶段

主引导扇区的读取流程

  • 系统开机或者重启。
      1. POST 结束后, BIOS 发送int 0x19中断
      1. 读取主引导记录(MBR)。当BIOS检查到硬件正常并与CMOS中的设置相符后,按照CMOS中对启动设备的设置顺序检测可用的启动设备。BIOS将相应启动设备的第一个扇区(也就是MBR扇区)读入内存地址为0000:7C00H处。
      1. 检查0000:01FEH-0000:01FFH(MBR的结束标志位)是否等于55AAH,若不等于则转去尝试其他启动设备,如果没有启动设备满足要求则显示"NO ROM BASIC"然后死机。
      1. 当检测到有启动设备满足要求后,BIOS将控制权交给相应启动设备。启动设备的MBR将自己复制到0000:0600H处,然后继续执行。
      1. 根据MBR中的引导代码启动引导程序
  • 事实上,BIOS不仅检查0000:01FEH-0000:01FFH(MBR的结束标志位)是否等于55AAH,往往还对磁盘是否有写保护、主引导扇区中是否存在活动分区等进行检查。如果发现磁盘有写保护,则显示磁盘写保护出错信息;如果发现磁盘中不存在活动分区,则显示类似如下的信息“Remove disk or other media Press any key to restart”。
实模式下中断
notion image

MBR vs GPT

 

PXE启动

notion image

Grub2

notion image
notion image

Stage 1

在BIOS平台下,boot.img是grub启动的第一个img文件,它被写入到MBR中或分区的boot sector中,因为boot sector的大小是512字节,所以该img文件的大小也是512字节。
boot.img唯一的作用是读取属于core.img的第一个扇区并跳转到它身上,将控制权交给该扇区的img。由于体积大小的限制,boot.img无法理解文件系统的结构,因此grub2-install将会把core.img的位置硬编码到boot.img中,这样就一定能找到core.img的位置。

Stage 2

notion image
  1. 初始化本阶段要使用到的硬件设备
  1. 检测系统内存映射( memory map)
  1. 将内核映象和根文件系统映象读到RAM空间中
  1. 为内核设置启动参数
  1. 调用内核
 

Stage 1.5 ?

grub.cfg

initrd / initramfs

为什么不直接挂载根文件系统,需要initrd?

在早期的Linux系统中,一般就只有软盘或者硬盘被用来作为Linux的根文件系统,因此很容易把这些设备的驱动程序集成到内核中。但是现在根文件系统 可能保存在各种存储设备上,包括SCSI, SATA, U盘等等。因此把这些设备驱动程序全部编译到内核中显得不太方便,违背了“内核”的精神。在Linux内核模块自动加载机制中可以利用udevd可以实现内核模块的自动加载,因此我们希望根文件系统的设备驱动程序也能够实现自动加载。但是这里有一个矛盾,udevd是一个可执行文件,在根文件系统被挂载前,是不可能执行udevd的,但是如果udevd没有启动,那就无法自动加载根根据系统设备的驱动程序,同时也无法在/dev目录下建立相应的设备节点。
为了解决这个矛盾,于是出现了initrd(boot loader initialized RAM disk)。initrd是一个被压缩过的小型根目录,这个目录中包含了启动阶段中必须的驱动模块,可执行文件和启动脚本。包括上面提到的udevd,当系统启动的时候,bootload会把内核和initrd文件读到内存中,然后把initrd的起始地址告诉内核。内核在运行过程中会解压initrd,然后把initrd挂载为根目录,然后执行根目录中的/initrc脚本,可以在这个脚本中运行initrd中的udevd,让它来自动加载设备驱动程序以及 在/dev目录下建立必要的设备节点。在udevd自动加载磁盘驱动程序之后,就可以mount真正的根目录,并切换到这个根目录中。

Linux启动一定要用initrd么?

如果把需要的功能全都编译到内核中(非模块方式),只需要一个内核文件即可。initrd 能够减小启动内核的体积并增加灵活性,如果你的内核以模块方式支持某种文件系统(例如ext3, UFS),而启动阶段的驱动模块放在这些文件系统上,内核是无法读取文件系统的,从而只能通过initrd的虚拟文件系统来装载这些模块。这里有些人会问: 既然内核此时不能读取文件系统,那内核的文件是怎么装入内存中的呢?答案很简单,Grub是file-system sensitive的,能够识别常见的文件系统

SystemD / SysV Init

notion image
notion image
notion image

安装?

Anaconda 判断磁盘大小决定使用MBR分区还是GPT分区, 配合zerombr使用

 

Systemd启动

Centos 启动脚本

 

根文件系统切换

安装过程中ipmi的作用

Dracut

📌
Linux内核提供了对tmpfs的内置支持,因此不需要额外的驱动程序

.treeinfo

这是一个.treeinfo文件的示例,它是一个元数据文件,通常位于Linux发行版的安装源目录中。.treeinfo文件提供了有关操作系统和可用镜像的信息。此文件可帮助安装程序找到并加载所需的内核和初始化RAM磁盘(initrd)映像。在这个例子中,操作系统是Kylin Linux Advanced Server V10,它针对x86_64架构。
这个文件包含以下几个部分:
  1. [general]:这部分提供了有关操作系统本身的一般信息,如时间戳、家族、版本、名称、变体和架构。
  1. [stage2]:这部分包含了一个指向安装程序主映像的路径,即images/install.img。安装程序将从这个映像加载所需的文件。
  1. [images-x86_64]:这部分包含了针对x86_64架构的内核和initrd映像路径,以及EFI引导映像和启动ISO映像。在此示例中,内核映像位于images/pxeboot/vmlinuz,initrd映像位于images/pxeboot/initrd.img。此外,还提供了EFI启动映像(images/efiboot.img)和启动ISO映像(images/boot.iso)的路径。
  1. [images-xen]:这部分包含了针对Xen虚拟化环境的内核和initrd映像路径。在此示例中,Xen内核映像位于images/pxeboot/vmlinuz,initrd映像位于images/pxeboot/initrd.img
安装程序在启动时将解析.treeinfo文件,以确定操作系统的版本和架构,以及在哪里找到所需的内核和initrd映像。然后,安装程序会加载这些映像并开始安装过程。
 
CI 调研Kylin x86 ISO UDF安装失败
Loading...