Alex_McAvoy

想要成为渔夫的猎手

Linux 系统启动过程

【概述】

Linux 系统的启动过程一般分为 4 个阶段:

  • BIOS 启动引导阶段
  • GRUB 启动引导阶段
  • 内核阶段
  • 1 号用户进程初始化阶段

这四个阶段具体过程细化如下图:

【BIOS 启动引导】

当计算机打开电源启动后,首先进行的是 BIOS 开机自检,当设备检测通过后,根据在 BIOS 中设置的启动顺序搜索启动驱动器,并获取第一个启动设备的代号,读取第一个启动设备的 MBR 的引导加载程序的启动信息,从 MBR 中装载启动引导管理器 GRUB 并启动引导管理

MBR 是引导扇区的前 512 字节,由 BIOS 预加载在 ROM 中,其中 446 字节用于存储 Boot Loader 程序,64 字节用于存储分区表信息,最后 2 字节用于 MBR 的有效性检查

【GRUB 启动引导】

大多数 Linux 发行版使用的引导加载程序有三种:GRUB、GRUB2、LILO,其中,GRUB2 是 CentOS 7 默认的引导加载程序

引导加载程序位于 /boot 目录下,用于将内核映像文件加载到内存中

【内核阶段】

内核是 OS 的核心,是系统启动时加载的第一个程序,系统启动内核时,会从 initrd.img 将所有必需驱动模块加载到 Linux 系统中,并运行 1 号程序

initrd.img 是一种基于内存的文件系统,启动过程中,系统在访问真正的根文件系统时,会先访问 initrd 文件系统

【1号用户进程初始化阶段】

init 进程

1 号进程,在 CentOS7 之前被称为 init 进程,在 CentOS7 之后被称为 systemed 进程,其是 Linux 上运行的第一个进程(PID 为 1)

该进程是系统所有进程的起点,其会去读取 /etc/inittab 下的配置文件,以运行 Linux 中的守护进程(daemon)

注:守护进程类似于 Windows 中的服务(service),是需要开机启动的程序

运行级别

不同的场合需要启动不同的程序,Linux 允许为不同的场合,分配不同的开机启动程序,这被称为运行级别(runlevel),即启动时根据运行级别,确定要运行的程序

Linux 系统有 7 个运行级别:

  1. runlevel-0:系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动
  2. runlevel-1:单用户工作状态,root 权限用于系统维护,禁止远程登陆
  3. runlevel-2:多用户状态(没有NFS)
  4. runlevel-3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
  5. runlevel-4:系统未使用,保留
  6. runlevel-5:X11 控制台,登陆后进入图形 GUI 模式
  7. runlevel-6:系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动

系统初始化

在 init 的配置文件中,存在这么一行:si::sysinit:/etc/rc.d/rc.sysinit

它调用执行了 /etc/rc.d/rc.sysinit ,而 rc.sysinit 是一个 bash shell 的脚本,主要用于完成系统初始化的工作,rc.sysinit 是每一个运行级别都要首先运行的重要脚本

它主要完成需要优先执行的任务,比如:激活交换分区、检查磁盘、加载硬件模块等

终端建立

rc.sysinit 执行完毕后,会返回 init,此时基本系统环境已经设置好了,各种守护进程也已启动了,init 接下来会打开 6 个终端,以便用户登录系统

这 6 个终端窗口分别是 tty1~tty6,他们可以通过快捷键 Ctrl+Alt+F1~F6 来进行切换,默认登录的是第一个窗口,即 tty1

如果安装了图形界面,默认情况下是直接进入图形界面,此时可以通过快捷键 Ctrl+Alt+F1~F6 来进行切换进入其中一个命令窗口界面,当进入命令窗口界面后再返回图形界面只要通过快捷键 Ctrl+Alt+F7 即可返回

在 inittab 中通过以下命令定义了 6 个终端:

1
2
3
4
5
6
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

可以看出在 2、3、4、5 的运行级别中都将以 respawn 方式运行 mingetty 程序

该程序能打开终端、设置模式,同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在界面中会提示用户输入用户名,而用户输入的用户将作为参数传给 login 程序来验证用户的身份

用户登录系统

对于运行级别为 5 的图形方式用户来说,登录是通过一个图形化的登录界面,登录成功后可以直接进入 KDE、Gnome 等窗口管理器

对于以文本方式登录的用户来说,当看到 mingetty 的登录界面时,就可以输入用户名和密码来登录系统

Linux 的账号验证程序是 loginlogin 会接收 mingetty 传来的用户名作为用户名参数,然后 login 会对用户名进行分析,如果不是 root 用户,且存在 /etc/nologin 文件,login 将输出 nologin 文件的内容,然后退出

需要说明的是,以文本方式登录通常用于系统维护时防止非 root 用户登录,这使得只有在 /etc/securetty 中登记了的终端才允许 root 用户登录,如果不存在这个文件,则 root 用户可以在任何终端上登录

感谢您对我的支持,让我继续努力分享有用的技术与知识点!