Grub、Init 与 RunLevel
本章目录
- Grub 简介
- Init 简介
- RunLevel 简介
- 目前进展(init->systemd)
Linux 启动流程
在 Linux 系统下,启动流程如下:

引导程序 - bootloader
bootloader,即引导程序,是开机时,引导操作系统启动的程序。
BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 bootloader 读到系统的 RAM 中,然后将控制权交给 bootloader。
bootoader 的主要任务就是将操作系统内核从硬盘加载到 RAM 中,然后跳转到内核的入口点去执行,即启动操作系统。
常见的 bootloader 有:Grub,isolinux,uboot,openSBl,ntldr(用于启动 Windows 系统),Linuxboot等。
操作系统需要被加载到内存中正确的位置,且需要程序为操作系统提供启动参数,以实现定制化启动,所以需要 bootloader。
Grub 简介
Grub 是 Linux 上最常用的 bootloader。它是一个来自 GNU 项目的启动引导程序。GRUB 允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统,也就是说,我们可以通过 Grub,使用链式引导来引导 Windows 系统。
它支持所有的 Linux 文件系统,也支持 Windows 的 FAT 和 NTFS 文件系统,也支持图形界面,可定制启动菜单和背景图片,支持鼠标。同时,它拥有丰富的终端命令,用户可以查看硬盘分区的细节,修改分区设置,临时重新映射磁盘顺序,从任何用户定义的配置文件启动。
感兴趣的同学们可以去自行深入了解 Grub。
Init 简介
初始化(Init)程序负责操作系统的初始化操作,它基于/etc/inittab(定义了系统默认运行级别)设定的动作来执行脚本。以下是初始化流程的主要步骤:
-
执行
/etc/rc.d/rc.sysinit脚本- 真正的 OS 初始化脚本。
-
激活 udev 和 SELinux
- udev 管理设备节点和它们的符号链接。
- SELinux(如果启用)是 Linux 的一个安全模块。
-
设定内核参数
- 根据
/etc/sysctl.conf文件来设定内核参数。
- 根据
-
设定系统时钟
- 确保系统时间正确。
-
装载硬盘映射
- 加载硬盘相关的映射或配置。
-
启用交换分区
- 激活交换空间以扩展系统内存。
-
设置主机名
- 设置系统在网络中的名称。
-
根文件系统检测与重新挂载
- 以读写方式重新挂载根文件系统,并在挂载前进行检测。
-
激活 RAID 和 LVM 设备
- 如果配置有 RAID 或 LVM,则激活这些设备。
-
启用磁盘配额
- 根据配置,启用文件系统上的磁盘配额。
-
检查并挂载其他文件系统
- 根据
/etc/fstab文件,检查并挂载其他文件系统。
- 根据
-
清理过期的锁和 PID 文件
- 清除在系统启动过程中可能不再需要的锁文件和 PID 文件。
-
执行对应启动级别的脚本
- 根据配置的启动级别,执行对应目录(如
/etc/rcX.d/,其中X是运行级别)下的脚本。
- 根据配置的启动级别,执行对应目录(如
-
执行
/etc/rc.d/rc.local脚本- 这是系统初始化过程中的最后一个通用脚本,用户可以在这里添加自定义的启动命令。
系统启动完成
- 执行完以上步骤后,系统启动完成,等待用户登录或其他进一步的操作。
RunLevel 简介
runlevel,即运行级别,是 Linux 系统中的一个概念。 Linux 的启动级别定义了系统启动时应该运行哪些服务。
运行级别有如下的分类:
- 0: 关机模式
- 1: 单一用户模式(直接以管理员身份进入)
- 2: 多用户模式(无网络)
- 3: 多用户模式(命令行)
- 4: 保留(通常不使用)
- 5: 多用户模式(图形界面)
- 6: 重启
运行级别对应的脚本目录如下所示:
- Run level 0:
/etc/rc.d/rc0.d/ - Run level 1:
/etc/rc.d/rc1.d/ - Run level 2:
/etc/rc.d/rc2.d/ - Run level 3:
/etc/rc.d/rc3.d/ - Run level 4:
/etc/rc.d/rc4.d/ - Run level 5:
/etc/rc.d/rc5.d/ - Run level 6:
/etc/rc.d/rc6.d/
在上述目录中,脚本的命名遵循以下规则:
- K 开头的文件:表示在启动时需要关闭的服务。
- S 开头的文件:表示在启动时需要启动的服务。
目前进展(init->systemd)
对于 Init 阶段来说,它具有一些问题:
- 启动时间长。ini 进程是串行启动,只有前一个进程启动完才会启动下一个进程。
- 启动脚本复杂。脚本需要自己处理各种情况,这往往使得脚本变得很长。
为了解决上述问题,Linux 系统引入了 Systemd 系统。感兴趣的同学们可以自行了解。