草稿
文章目录
- 〇、概述
- 一、固件加载:BIOS / UEFI
- 1.1 BIOS 和 UEFI
- 1.2 UEFI 启动过程
- 1.21
- 1.2
- 1.3
- 二、启动管理器阶段
- 三、内核阶段
- 四、init阶段
- 五、登录阶段
〇、概述
Linux系统的启动过程是一个复杂而有趣的话题,它涉及到计算机的硬件、软件、操作系统和用户之间的交互。本文将尝试用通俗易懂的语言,详细介绍Linux系统的启动过程,希望能对Linux系统的学习和使用有所帮助。
Linux系统的启动过程可以分为以下几个阶段:
- BIOS阶段
- 启动管理器阶段
- 内核阶段
- init阶段
- 运行级别阶段
- 登录阶段
下面我们逐一介绍每个阶段的内容和作用。
一、固件加载:BIOS / UEFI
1.1 BIOS 和 UEFI
BIOS(Basic Input/Output System,基本输入输出系统)是一段存储在主板上(ROM)的固件(firmware),它是计算机加电后执行的第一个程序,负责进行硬件自检(POST,Power-On Self Test),检查CPU、内存、硬盘等设备是否正常工作,以及设置系统的基本参数,如日期、时间、启动顺序等。
不过BIOS已经是一个“古老”的启动方式了,10多年前开始,计算机就开始逐渐使用UEFI
(统一扩展固件接口)方式进行启动。
- UEFI是一种现代的固件标准,用于取代传统BIOS。UEFI不仅可以初始化硬件和引导操作系统,还提供了更多功能,如图形化用户界面、支持网络协议、安全引导等。
- 特点: UEFI支持更大的硬盘容量、更快的引导速度,而且具有更现代化的图形界面。它还能够执行磁盘分区和文件系统检查。
- 引导方式: UEFI使用GUID Partition Table(
GPT
)作为磁盘分区方式,可以容纳更多分区和更大的硬盘。(前面的文章详细讲过相关概念)
虽然如此,人们现在依然习惯把UEFI的设置界面成为BIOS,常见的一句话是“
xxx笔记本如何进入BIOS
”。如果你有什么特别的需求,使用了MBR分区方案,在BIOS设置界面可以设置成为UEFI的Legacy
模式,它允许引导使用MBR分区方案的操作系统。本文后面的BIOS实际上都指的是UEFI。
使用UEFI启动的电脑,磁盘会专门有一个EFI分区,卷标为:ESP
(EFI System Partition),这个分区所在的磁盘和位置没有特别要求,比如我的电脑:
这个分区会被格式化为FAT32
文件系统,以便操作系统和引导加载程序可以在其上读取和写入文件。
每次安装一个新的操作系统时,该操作系统会将其引导文件安装到EFI系统分区中。这意味着每个安装的操作系统都会在EFI系统分区内创建一个文件夹,其中包含引导加载程序和引导配置文件。不同的操作系统会在分区内的不同文件夹中存储这些文件,以避免冲突。我的电脑:
1.2 UEFI 启动过程
1.21
1.2
引导文件是操作系统引导过程中的关键组成部分,它们包含了操作系统的启动所需的信息和指令。这些文件告诉计算机如何加载操作系统内核以及如何初始化硬件和其他必要的步骤。引导文件的内容和用途因操作系统和引导方式而异,以下是一般情况下引导文件的内容和作用:
-
引导加载程序(Boot Loader): 引导加载程序是引导过程的第一阶段,它负责加载操作系统内核到内存中。它通常位于引导分区(如UEFI系统分区、Linux的/boot分区)中。在Windows中,常见的引导加载程序是Windows Boot Manager,而在Linux中,常见的引导加载程序是GRUB(GRand Unified Bootloader)。
-
配置文件: 引导加载程序通常会读取一个配置文件,该文件包含引导选项和操作系统的相关信息。这些信息可能包括操作系统的位置、内核文件名、启动参数等。配置文件的内容可以根据不同的操作系统和需求进行定制。
-
内核文件(Kernel): 内核文件是操作系统的核心,它包含了操作系统的基本功能和驱动程序。引导加载程序负责将内核文件加载到内存中,并启动它以初始化操作系统。
-
初始化 RAM 磁盘(Initramfs、Initrd): 这是一个临时的文件系统,包含了操作系统启动时所需的驱动程序和工具。在启动过程中,内核会加载Initramfs或Initrd,以便在加载真正的根文件系统之前初始化硬件和完成一些必要的任务。
-
根文件系统: 根文件系统是操作系统的根目录,包含了操作系统的文件和目录结构。在引导过程的后期阶段,内核将切换到根文件系统,并将控制权移交给操作系统。
UEFI(统一扩展固件接口)是一种现代的引导方式,它使用特定的引导文件和数据结构来启动操作系统。UEFI引导的过程相对复杂,涉及到以下主要步骤:
-
Firmware初始化: UEFI固件负责初始化硬件,如内存、处理器、设备等。
-
加载UEFI引导程序: UEFI固件会在UEFI系统分区中查找UEFI引导程序。这个引导程序被称为EFI可执行文件(EFI executable),通常是一个UEFI应用程序,它包含了引导选项和操作系统的信息。
-
加载操作系统内核: UEFI引导程序会加载操作系统内核文件,以及其他必要的文件,如引导配置文件、Initramfs等。
-
初始化操作系统: 操作系统内核启动后,它会初始化硬件、加载驱动程序,并最终切换到根文件系统以开始用户空间的初始化。
总之,引导文件是操作系统引导过程中的关键组成部分,它们包含了启动操作系统所需的信息和指令。UEFI使用特定的引导文件和数据结构来启动操作系统,这个过程涉及多个步骤,从固件初始化到操作系统的最终启动。
1.3
启动顺序(Boot Sequence)是BIOS中的一个重要设置,它决定了BIOS从哪个设备中读取启动信息,比如硬盘、光盘、U盘等。通常情况下,BIOS会按照启动顺序依次尝试从不同的设备中读取启动信息,如果成功,则继续执行下一步,如果失败,则尝试下一个设备,直到找到合适的设备或者报错。
当BIOS完成自检和设置后,它会根据启动顺序从指定的设备中读取主引导记录(MBR,Master Boot Record),MBR是一个512字节的数据,位于硬盘的第一个扇区(sector),它包含了启动管理器(Boot Loader)的位置信息和分区表(Partition Table),分区表记录了硬盘上各个分区(partition)的位置和大小。MBR中前446字节存储了启动管理器的代码,后64字节存储了分区表,最后2字节存储了一个标识符(0xAA55),用于验证MBR是否有效。
当BIOS读取到MBR后,它会把控制权交给MBR中的启动管理器代码,进入下一个阶段。
二、启动管理器阶段
启动管理器(Boot Loader)是一个小程序,它可以让用户选择要启动的操作系统,比如Linux或Windows。Linux中常用的启动管理器有GRUB(GRand Unified Bootloader)和LILO(LInux LOader)。GRUB是目前最流行的启动管理器,它支持多种文件系统和操作系统,具有图形化界面和命令行模式,可以动态加载内核和配置文件。LILO是一个较早的启动管理器,它只能识别少数几种文件系统和操作系统,没有图形化界面和命令行模式,需要每次修改配置文件后重新安装才能生效。
当BIOS把控制权交给启动管理器后,启动管理器会根据用户的选择或默认配置,加载相应的操作系统内核(kernel),内核是操作系统的核心部分,它负责管理硬件资源,提供系统服务,执行用户程序等功能。启动管理器还会向内核传递一些参数(kernel parameters),用于控制内核的行为和功能。例如:
- root=/dev/sda1:指定根文件系统所在的设备
- ro:以只读模式挂载根文件系统
- quiet:不显示内核启动过程中的信息
- splash:显示图形化的启动画面
当启动管理器加载完内核后,它会把控制权交给内核,进入下一个阶段。
三、内核阶段
内核(kernel)是操作系统的核心部分,它负责管理硬件资源,提供系统服务,执行用户程序等功能。内核是一个可执行的二进制文件,通常存储在/boot目录下,文件名为vmlinuz或bzImage。内核启动时,会进行以下几个步骤:
- 解压缩:内核文件是经过压缩的,为了节省空间和提高速度,启动管理器会把内核文件加载到内存中,然后解压缩到另一块内存区域。
- 设置:内核会设置自己的环境,包括初始化寄存器、栈、中断、分页等。
- 检测:内核会检测系统的硬件配置,如CPU、内存、显卡、键盘、鼠标等,并加载相应的驱动模块(module),驱动模块是一些可插拔的内核组件,用于支持不同的硬件设备和功能。
- 挂载:内核会根据启动管理器传递的参数,挂载根文件系统(root file system),根文件系统是Linux系统中最重要的文件系统,它包含了系统的基本文件和目录,如/bin、/etc、/lib等。根文件系统可以是一个物理分区,也可以是一个逻辑卷(LVM)或者一个软件磁盘阵列(RAID)。如果根文件系统需要特殊的处理,如加密或压缩,那么内核还需要挂载一个临时的根文件系统(initramfs),用于加载必要的工具和驱动模块。
- 启动:内核会在根文件系统中寻找第一个进程(process),进程是程序的执行实例,它占用一定的内存空间和CPU时间。Linux系统中第一个进程通常是init(/sbin/init或/systemd),它是系统所有进程的祖先,它负责初始化系统的各项设置,启动各种服务和程序。当内核找到init后,它会把控制权交给init,进入下一个阶段。
四、init阶段
init(/sbin/init或/systemd)是Linux系统中第一个进程(进程号为1),它是系统所有进程的祖先,它负责初始化系统的各项设置,启动各种服务和程序。init有两种主要的实现方式:
- SysV init:这是一种传统的init方式,它根据运行级别(runlevel),执行不同的初始化脚本(script),初始化脚本是一些用于控制服务和程序启动和停止的命令行程序,它们通常存储在/etc/init.d目录下,并链接到不同的运行级别目录(/etc/rc.d/rcN.d或/etc/rcN.d),其中N表示运行级别的数字。SysV init使用inittab文件(/etc/inittab)来配置运行级别和初始化脚本。
- systemd:这是一种新型的init方式,它使用单元(unit)来管理服务和程序,单元是一些用于描述服务和程序属性和依赖关系的配置文件,它们通常存储在/usr/lib/systemd/system或/etc/systemd/system目录下。systemd使用target来代替运行级别,target是一组相关联的单元,用于定义系统的工作状态。systemd使用systemctl命令来控制单元和target。
当init完成系统的初始化后,它会根据运行级别或target,进入相应的工作模式,进入下一个阶段。
Linux系统有7个运行级别,分别是:
- 运行级别0:系统停机状态,不能正常启动
- 运行级别1:单用户工作状态,只有root用户可以登录,用于系统维护和修复
- 运行级别2:多用户状态,没有网络服务和图形界面
- 运行级别3:完全的多用户状态,有网络服务和命令行界面
- 运行级别4:系统未使用,保留
- 运行级别5:图形化多用户状态,有网络服务和图形界面
- 运行级别6:系统重启状态
当init进入相应的运行级别后,它会执行该运行级别目录下的初始化脚本或启动相应的target,以启动或停止各种服务和程序。例如:
- 在运行级别3下,init会执行/etc/rc.d/rc3.d目录下的初始化脚本,或者启动multi-user.target,以启动网络服务、登录服务、日志服务等。
- 在运行级别5下,init会执行/etc/rc.d/rc5.d目录下的初始化脚本,或者启动graphical.target,以启动图形界面、显示管理器、桌面环境等。
当init完成运行级别或target的切换后,它会打开终端或图形界面,让用户输入用户名和密码进行登录,进入下一个阶段。
五、登录阶段
登录(login)是Linux系统中最后一个阶段,它是用户与系统交互的入口。登录可以分为两种方式:
- 文本模式登录:这是一种基于命令行的登录方式,用户需要在终端(terminal)上输入用户名和密码,然后进入shell(/bin/bash或/bin/sh),shell是一种命令解释器,它可以接收用户输入的命令,并执行相应的操作。文本模式登录通常用于服务器或嵌入式设备等不需要图形界面的场合。
- 图形模式登录:这是一种基于图形界面的登录方式,用户需要在显示管理器(display manager)上输入用户名和密码,然后进入桌面环境(desktop environment),桌面环境是一种图形化的用户界面,它提供了窗口、菜单、图标、工具栏等元素,以方便用户操作系统。图形模式登录通常用于个人电脑或笔记本等需要图形界面的场合。
当用户成功登录后,就可以开始使用Linux系统了。这样,Linux系统就完成了启动过程。