草稿
Linux系统的启动过程是一个复杂而有趣的话题,它涉及到计算机的硬件、软件、操作系统和用户之间的交互。本文将尝试用通俗易懂的语言,详细介绍Linux系统的启动过程,希望能对Linux系统的学习和使用有所帮助。
Linux系统的启动过程可以分为以下几个阶段:
下面我们逐一介绍每个阶段的内容和作用。
BIOS(Basic Input/Output System,基本输入输出系统)是一段存储在主板上(ROM)的固件(firmware),它是计算机加电后执行的第一个程序,负责进行硬件自检(POST,Power-On Self Test),检查CPU、内存、硬盘等设备是否正常工作,以及设置系统的基本参数,如日期、时间、启动顺序等。
不过BIOS已经是一个“古老”的启动方式了,10多年前开始,计算机就开始逐渐使用UEFI
(统一扩展固件接口)方式进行启动。
GPT
)作为磁盘分区方式,可以容纳更多分区和更大的硬盘。(前面的文章详细讲过相关概念)虽然如此,人们现在依然习惯把UEFI的设置界面成为BIOS,常见的一句话是“
xxx笔记本如何进入BIOS
”。如果你有什么特别的需求,使用了MBR分区方案,在BIOS设置界面可以设置成为UEFI的Legacy
模式,它允许引导使用MBR分区方案的操作系统。本文后面的BIOS实际上都指的是UEFI。
使用UEFI启动的电脑,磁盘会专门有一个EFI分区,卷标为:ESP
(EFI System Partition),这个分区所在的磁盘和位置没有特别要求,比如我的电脑:
这个分区会被格式化为FAT32
文件系统,以便操作系统和引导加载程序可以在其上读取和写入文件。
每次安装一个新的操作系统时,该操作系统会将其引导文件安装到EFI系统分区中。这意味着每个安装的操作系统都会在EFI系统分区内创建一个文件夹,其中包含引导加载程序和引导配置文件。不同的操作系统会在分区内的不同文件夹中存储这些文件,以避免冲突。我的电脑:
引导文件是操作系统引导过程中的关键组成部分,它们包含了操作系统的启动所需的信息和指令。这些文件告诉计算机如何加载操作系统内核以及如何初始化硬件和其他必要的步骤。引导文件的内容和用途因操作系统和引导方式而异,以下是一般情况下引导文件的内容和作用:
引导加载程序(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使用特定的引导文件和数据结构来启动操作系统,这个过程涉及多个步骤,从固件初始化到操作系统的最终启动。
启动顺序(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),用于控制内核的行为和功能。例如:
当启动管理器加载完内核后,它会把控制权交给内核,进入下一个阶段。
内核(kernel)是操作系统的核心部分,它负责管理硬件资源,提供系统服务,执行用户程序等功能。内核是一个可执行的二进制文件,通常存储在/boot目录下,文件名为vmlinuz或bzImage。内核启动时,会进行以下几个步骤:
init(/sbin/init或/systemd)是Linux系统中第一个进程(进程号为1),它是系统所有进程的祖先,它负责初始化系统的各项设置,启动各种服务和程序。init有两种主要的实现方式:
当init完成系统的初始化后,它会根据运行级别或target,进入相应的工作模式,进入下一个阶段。
Linux系统有7个运行级别,分别是:
当init进入相应的运行级别后,它会执行该运行级别目录下的初始化脚本或启动相应的target,以启动或停止各种服务和程序。例如:
当init完成运行级别或target的切换后,它会打开终端或图形界面,让用户输入用户名和密码进行登录,进入下一个阶段。
登录(login)是Linux系统中最后一个阶段,它是用户与系统交互的入口。登录可以分为两种方式:
当用户成功登录后,就可以开始使用Linux系统了。这样,Linux系统就完成了启动过程。