跳转至

Linux之从加电到shell

Linux启动过程大致分为以下几个阶段:

image-20240326093746386

BIOS引导阶段:

  • 当计算机接通电源或重启时,首先执行主板上的基本输入输出系统(BIOS)统一可扩展固件接口(UEFI)固件。现在的BIOS/UEFI固件通常写在电子式可擦除可编程只读存储器(EEPROM)上,方便用户更新。
  • BIOS/UEFI的主要任务是进行自我检测(POST,Power-On Self Test),测试和初始化CPU、RAM、直接存储器访问控制器(DMA)、芯片组、键盘、软盘、硬盘等设备,并寻找一个可启动的设备,通常按照BIOS设定的启动顺序查找,如硬盘、USB、光驱或网络引导。

MBR/EFI引导加载器阶段:

  • 在现代Linux系统中,硬盘上的主引导记录(MBR)或UEFI固件使用的EFI系统分区中的引导加载程序(对于UEFI引导)会被加载到内存中执行。
  • 对于Linux系统,这个引导加载程序通常是GRUB(Grand Unified Bootloader),它可以加载内核以及传递内核启动参数。

GRUB引导阶段:

  • GRUB提供了菜单界面(如果配置了的话),允许用户选择要启动的操作系统版本、内核版本或进行其他高级设置(如内核命令行参数)。
  • 用户选择或默认超时后,GRUB加载选定的Linux内核(通常是一个名为vmlinuz的压缩内核映像)到内存中,并传递内核启动所需的参数(如根文件系统位置、启动模式等)。

Linux内核启动阶段:

  • 内核开始解压和初始化自身,识别和配置系统硬件资源,建立内存管理、CPU调度机制,并挂载初始根文件系统(可能是一个RAM磁盘,即initrd或initramfs)。
  • 内核继续启动必要的驱动程序,找到并挂载真正的根文件系统。

初始化进程启动阶段:

  • 内核加载完成后,会启动第一个用户空间进程——init(现在在大多数现代Linux发行版中被systemd取代)。
  • systemd或其他init系统开始执行一系列服务和脚本,这些脚本负责进一步的系统设置,包括挂载其它文件系统、启动网络服务、设置主机名等。

系统运行级别和多用户模式:

  • 根据系统配置的运行级别(如runlevel 3表示多用户文本模式,runlevel 5可能表示带图形界面的多用户模式),init/systemd会启动相应的后台服务和守护进程。
  • 如果系统配置为启动到命令行界面,init/systemd会启动getty程序(如mingetty)来监听各个tty终端,准备接受用户的登录请求。

用户登录阶段:

  • 当用户通过键盘在tty终端或图形登录界面输入用户名和密码时,login程序验证用户身份并创建一个新的shell会话。

shell启动阶段:

  • 验证成功后,login程序调用shell,如bash、zsh等,为用户提供一个交互式命令行界面。
  • 用户最终看到shell提示符,这时就可以输入命令并开始与系统交互了。