searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Linux启动流程

2025-09-11 06:45:07
0
0

1.BIOS/UEFI

首先,计算机一加电,主板中固化的一段程序就会启动,这段程序就是​BIOS​(老机器中常见)或者​UEFI​(新机器中常见)。这段程序首先会检查各个硬件是否正常(CPU、内存、键盘等),这一步叫做自检(​POST​,Power-On Self Test)。然后,这段程序会决定将控制权交给哪个设备里的引导程序。如果是 BIOS,它会去硬盘(涉及​启动顺序​)的开头(MBR 区)找一小段引导代码,将这段引导代码读进内存并运行;如果是 UEFI,它会去硬盘的一个专用分区(EFI System Partition)里找一个 .efi 程序,比如 grubx64.efi,并运行它。BIOS/UEFI的工作由此结束。

1.1 固化是什么意思?

将一段程序写入硬件里边,让这段程序不会随着断电而消失。

1.2 POST

在最小的硬件环境下,运行一些非常基础的小程序,查看各个关键部件是否正常。例如:

  1. CPU:会做简单的寄存器测试、算术测试,确保 CPU 基本没坏。
  2. 内存:BIOS 会尝试往内存写入一些固定的测试数据,再读出来,看看对不对。
  3. 键盘、硬盘:检查键盘是否连接上,扫描硬盘、光驱是否能用。

1.3 启动顺序

主板中有一个启动顺序,比如:

  1. U盘
  2. 硬盘
  3. 网络

BIOS/UEFI会按照这个顺序去检查设备,看他们是否有“可启动”的标记,如果有,BIOS就会从他的第一个扇区读取代码并运行;UEFI会去读启动设备的ESP分区中的.efi文件,并执行它。(所以启动设备不一定是硬盘)

2.引导加载器(bootloader)

引导加载器把内核和启动所需的辅助数据加载进入内存里,然后将控制权交给内核。

更细一点:

  1. 加载内核
    1. 内核是个可执行文件(通常是压缩过的 ELF 格式,比如 /boot/vmlinuz-...)。
    2. 引导加载器会把这个文件读出来,放到内存的合适位置。
  2. 准备启动环境
    1. 内核本身通常需要一些额外的信息,比如“根文件系统在哪里”、“启动参数是什么”、“加密磁盘怎么解锁”。
    2. 这些就通过 ​initrd​/initramfs 提供。bootloader 会把 initramfs 也塞到内存里。
  3. 传递启动参数
    1. 引导加载器会告诉内核:“我已经帮你把东西放好了,你从这里开始执行,参数是这些。”
    2. 常见参数就是 root=/dev/sda2quietro 之类的。可以用 cat /proc/cmdline 查看。
  4. 交出控制权
    1. 最后一步很关键:bootloader 会调用内核的入口点,把 CPU 的执行权交过去。
    2. 之后就不再干涉,接下来就是内核接手,初始化驱动、挂载根文件系统、启动第一个用户态进程(/sbin/init)。

2.1 引导加载器是上一个流程中的引导代码?

  • 在传统BIOS中,BIOS会去设备的第一个扇区(512bytes)读出一小段引导代码,它的任务非常有限:因为 512 字节根本装不下一个完整的bootloader,它只能做点“小动作”,比如:检查自己是不是“可引导”的(最后两个字节要是 0x55AA 标志); 然后再去加载“第二阶段引导加载器”,比如 GRUB 的下一段更大代码。真正完整的bootloader一般分布在磁盘后序的几个扇区中。
  • 在UEFI中,它会直接去EFI分区(ESP)找到那个.efi程序,这个程序就是完成的bootloader。

3.内核

  • Linux 内核存放在 /boot/vmlinuz-xxx 里,其实是个压缩过的镜像。内核启动后,先把自己解压到内存中真正要运行的位置。
  • 然后初始化最基础的环境:CPU 模式、内存管理、页表、堆栈、调度器的基本框架。
  • 之后内核需要加载显卡驱动、磁盘驱动等。
  • 内核会挂载initramfs(临时根文件系统),在这里加载额外驱动、组装RAID、找到真正的根文件系统。
  • 之后内核会挂载真正的根文件系统,挂载成功之后,系统算是有了真正的“家”。
  • 启动第一个用户态进程:内核调用/sbin/systemd服务,从这里开始,用户空间的进程就接管了大部分的工作。(systemd是所有其他进程的父进程 pid=1)

4.systemd

systemd会据目标状态(target)决定启动哪些服务(daemon)。常见的 target 有:

  • multi-user.target —— 纯命令行模式,适合服务器。
  • graphical.target —— 启动图形界面(桌面环境),常见于桌面版 Linux。
  • rescue.target —— 类似单用户模式,用来修复系统。

等这些服务都准备就绪了,系统就会进入登录阶段。你可以在终端里输入用户名密码登录,或者在图形界面输入密码进入桌面环境。至此,Linux 的启动才算完成。

0条评论
作者已关闭评论
陈****然
3文章数
0粉丝数
陈****然
3 文章 | 0 粉丝
陈****然
3文章数
0粉丝数
陈****然
3 文章 | 0 粉丝
原创

Linux启动流程

2025-09-11 06:45:07
0
0

1.BIOS/UEFI

首先,计算机一加电,主板中固化的一段程序就会启动,这段程序就是​BIOS​(老机器中常见)或者​UEFI​(新机器中常见)。这段程序首先会检查各个硬件是否正常(CPU、内存、键盘等),这一步叫做自检(​POST​,Power-On Self Test)。然后,这段程序会决定将控制权交给哪个设备里的引导程序。如果是 BIOS,它会去硬盘(涉及​启动顺序​)的开头(MBR 区)找一小段引导代码,将这段引导代码读进内存并运行;如果是 UEFI,它会去硬盘的一个专用分区(EFI System Partition)里找一个 .efi 程序,比如 grubx64.efi,并运行它。BIOS/UEFI的工作由此结束。

1.1 固化是什么意思?

将一段程序写入硬件里边,让这段程序不会随着断电而消失。

1.2 POST

在最小的硬件环境下,运行一些非常基础的小程序,查看各个关键部件是否正常。例如:

  1. CPU:会做简单的寄存器测试、算术测试,确保 CPU 基本没坏。
  2. 内存:BIOS 会尝试往内存写入一些固定的测试数据,再读出来,看看对不对。
  3. 键盘、硬盘:检查键盘是否连接上,扫描硬盘、光驱是否能用。

1.3 启动顺序

主板中有一个启动顺序,比如:

  1. U盘
  2. 硬盘
  3. 网络

BIOS/UEFI会按照这个顺序去检查设备,看他们是否有“可启动”的标记,如果有,BIOS就会从他的第一个扇区读取代码并运行;UEFI会去读启动设备的ESP分区中的.efi文件,并执行它。(所以启动设备不一定是硬盘)

2.引导加载器(bootloader)

引导加载器把内核和启动所需的辅助数据加载进入内存里,然后将控制权交给内核。

更细一点:

  1. 加载内核
    1. 内核是个可执行文件(通常是压缩过的 ELF 格式,比如 /boot/vmlinuz-...)。
    2. 引导加载器会把这个文件读出来,放到内存的合适位置。
  2. 准备启动环境
    1. 内核本身通常需要一些额外的信息,比如“根文件系统在哪里”、“启动参数是什么”、“加密磁盘怎么解锁”。
    2. 这些就通过 ​initrd​/initramfs 提供。bootloader 会把 initramfs 也塞到内存里。
  3. 传递启动参数
    1. 引导加载器会告诉内核:“我已经帮你把东西放好了,你从这里开始执行,参数是这些。”
    2. 常见参数就是 root=/dev/sda2quietro 之类的。可以用 cat /proc/cmdline 查看。
  4. 交出控制权
    1. 最后一步很关键:bootloader 会调用内核的入口点,把 CPU 的执行权交过去。
    2. 之后就不再干涉,接下来就是内核接手,初始化驱动、挂载根文件系统、启动第一个用户态进程(/sbin/init)。

2.1 引导加载器是上一个流程中的引导代码?

  • 在传统BIOS中,BIOS会去设备的第一个扇区(512bytes)读出一小段引导代码,它的任务非常有限:因为 512 字节根本装不下一个完整的bootloader,它只能做点“小动作”,比如:检查自己是不是“可引导”的(最后两个字节要是 0x55AA 标志); 然后再去加载“第二阶段引导加载器”,比如 GRUB 的下一段更大代码。真正完整的bootloader一般分布在磁盘后序的几个扇区中。
  • 在UEFI中,它会直接去EFI分区(ESP)找到那个.efi程序,这个程序就是完成的bootloader。

3.内核

  • Linux 内核存放在 /boot/vmlinuz-xxx 里,其实是个压缩过的镜像。内核启动后,先把自己解压到内存中真正要运行的位置。
  • 然后初始化最基础的环境:CPU 模式、内存管理、页表、堆栈、调度器的基本框架。
  • 之后内核需要加载显卡驱动、磁盘驱动等。
  • 内核会挂载initramfs(临时根文件系统),在这里加载额外驱动、组装RAID、找到真正的根文件系统。
  • 之后内核会挂载真正的根文件系统,挂载成功之后,系统算是有了真正的“家”。
  • 启动第一个用户态进程:内核调用/sbin/systemd服务,从这里开始,用户空间的进程就接管了大部分的工作。(systemd是所有其他进程的父进程 pid=1)

4.systemd

systemd会据目标状态(target)决定启动哪些服务(daemon)。常见的 target 有:

  • multi-user.target —— 纯命令行模式,适合服务器。
  • graphical.target —— 启动图形界面(桌面环境),常见于桌面版 Linux。
  • rescue.target —— 类似单用户模式,用来修复系统。

等这些服务都准备就绪了,系统就会进入登录阶段。你可以在终端里输入用户名密码登录,或者在图形界面输入密码进入桌面环境。至此,Linux 的启动才算完成。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0