【概述】
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 个运行级别:
- runlevel-0:系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动
- runlevel-1:单用户工作状态,root 权限用于系统维护,禁止远程登陆
- runlevel-2:多用户状态(没有NFS)
- runlevel-3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
- runlevel-4:系统未使用,保留
- runlevel-5:X11 控制台,登陆后进入图形 GUI 模式
- 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 | 1:2345:respawn:/sbin/mingetty tty1 |
可以看出在 2、3、4、5 的运行级别中都将以 respawn
方式运行 mingetty
程序
该程序能打开终端、设置模式,同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在界面中会提示用户输入用户名,而用户输入的用户将作为参数传给 login
程序来验证用户的身份
用户登录系统
对于运行级别为 5 的图形方式用户来说,登录是通过一个图形化的登录界面,登录成功后可以直接进入 KDE、Gnome 等窗口管理器
对于以文本方式登录的用户来说,当看到 mingetty
的登录界面时,就可以输入用户名和密码来登录系统
Linux 的账号验证程序是 login
,login
会接收 mingetty
传来的用户名作为用户名参数,然后 login
会对用户名进行分析,如果不是 root 用户,且存在 /etc/nologin
文件,login
将输出 nologin
文件的内容,然后退出
需要说明的是,以文本方式登录通常用于系统维护时防止非 root 用户登录,这使得只有在 /etc/securetty
中登记了的终端才允许 root 用户登录,如果不存在这个文件,则 root 用户可以在任何终端上登录