Linux启动流程

流程简介

操作系统启动过程分四阶段:

  1. BIOS启动。CPU通电后PC计数器初始化为一个特定的内存地址,指向ROM中BIOS的起始地址,由BIOS执行硬件的基本初始化,最先找到的设备的最开始的几个扇区将被加载到内存,BIOS执行其中的初始化代码并将系统控制权转交引导加载程序。
  2. 引导加载程序。由BIOS启动,负责将系统内核映像和initrd映像加载到内存并转交控制权。
  3. initrd 或 initramfs 系统。在内存中运行系统内核和根文件系统,init 程序是内存中的根文件系统上执行的第一个程序,这个程序在用户空间把内核初始化,并把控制权交给下一阶段。
  4. 实际系统。根文件系统将由内存切换到实际的硬盘文件系统上,init 程序是系统执行的第一个程序(PID=1),它启动其它各种程序以完成主引导流程。

相关知识

initrd 映像是根文件系统映像:

  • initrd是指一个临时文件系统,它在启动阶段被Linux内核调用
  • initrd主要用于当“根”文件系统被挂载之前,进行准备工作

initramfs是initrd的替代品:

  • initrd是一个被加载的块设备,内部有ext2一类文件系统的存在,于是由于Linux内核的缓存机制,其中的内容还会被缓存到内存上,造成一定的内存空间浪费
  • initramfs本身就是一个tmpfs的RAM disk,拥有最小化的设计,绕过了缓存机制,也消除了多余的内存占用。initramfs的生成方式也远比initrd简单。

PC上运行的Linux系统,它启动后从BIOS开始,进入bootloader,有bootloader加载内核,进入内核初始化。内核启动的最后一步就是创建一个pid为1的init进程。这是系统的第一个进程,它负责生产其他所有用户进程。

init程序流派:

  • SysV:shell脚本控制
  • systemd:目前主流,但饱受争议
  • openrc:容易上手
  • upstart
  • busybox:嵌入式系统上使用

initramfs里有init

rootfs里也有init

initrd、initramfs用来初始化 /dev/proc/sys

类似chroot前三大步骤,格式不同

内核中有三种 chroot

  1. 切换root目录
  2. chroot:换一个用户空间,实际没有切换根目录
  3. 切换进程根目录

switch_chroot是initramfs的最后一个步骤

initramfs和initrd都是在切换根目录

参考