How a Linux System Boots up

This post elaborates the boot process of a Linux system. For details, read the bootup man page or Click here to read it online.

Boot up process

从开机到启动OS的过程为:

  1. BIOS:开机时主动加载,BIOS会通过加载CMOS中的信息,得到主机的硬件配置信息(包括启动设备的查找顺序、硬盘的大小与类型、系统时间...); 得到这些信息后,BIOS会进行启动自我检测( Power-on Self Test, POST ), 然后开始执行硬件的初始化、设置PnP设备,再定义出可启动的设备顺序,接下来开始读取启动设备的MBR,其中安装了boot loader程序

    • 这里的MBR泛指启动扇区,GPT也有MBR扇区
  2. MBR: BIOS读取MBR,注意,每块硬盘的第一个扇区都是MBR扇区,所以如果有多个硬盘,也就是多个启动设备的话,读取的应该是“第一个启动设备的MBR”( 之前已经定义好了启动设备的顺序)

  3. boot loader: BIOS加载MBR的boot loader程序,该程序用于读取kernel,将kernel解压缩到内存中; boot loader同时还会读取initramfs来加载一些必要的驱动,并挂载根目录

    • BIOS通过硬件的INT13中断来读取MBR,因此,只要BIOS能检测到硬盘,就一定能读取MBR(其中的内容就是boot loader)
    • 内核驱动位于根目录的/lib/modules,则内核需要先挂载根目录才能取得这些驱动,但是内核没有驱动又无法读取硬盘、挂载根目录。 因此boot loader除了读取内核,还要读取initramfs,后者会加载必要的驱动,来挂载根目录
  4. kernel + initramfs:kernel先通过initramfs来加载必要的驱动程序,挂载根文件系统,并加载其中的驱动程序,然后测试硬件,获取硬件信息,此时硬件已经准备就绪了

    • kernel使用自己的检测程序测试硬件, 不一定使用BIOS检测到的信息。这意味着内核此时已经接管BIOS的工作
  5. systemd:内核调用第一个程序systemd.