centos6:

null

centos7:

null

Linux 的开机启动顺序

Linux 系统启动从你的设备接上电源按下开关开始到你登录系统结束,中间有一个复杂但很连贯的过程:

1.加载 BIOS(Basic Input Output System,基本输入输出系统)。获取 CPU 相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息等信息

2.读取 MBR(Master Boot Record,主引导记录)。MBR 就是磁盘上第 0 磁道的第一个扇区,里面含有 boot loader 的代码。

3.运行 boot loader。Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。

4.加载内核。根据 boot loader 设定的内核映像所在的路径,读取内核映像并进行解压缩操作。

5.运行 init 程序。init 永远是系统启动后运行的的第一个进程,PID(进程编号)为 1。位置在 sbin/init ,之后会按照设置执行一大堆系统启动时要启动的脚本、加载的驱动等功能,我们要设置的开机启动项就是在这一步执行的。

6.执行 /bin/login程序,进入登录状态。

init 系统能够管理和控制 init 进程的行为,并负责组织和运行许多独立的或相关的工作,让系统进入一个用户设定的运行模式中。大多数 Linux 发行版的 init 系统是 system V 相兼容的,因此被称为 sysvinit,sysvinit 主要依赖于 shell 脚本,但是他一次一个串行的启动进程,决定了它最大的弱点:启动太慢。如果是服务器这类极少进行系统开关操作的话还好,但是如果是个人电脑这样需要经常开关机的话,开机时间太长就难以忍受了。

为了能够更快地启动系统,开发者们对 sysvinit 进行了改进,先后出现了 upstart 和 systemd 这两个主要的新一代 init 系统。目前最新的 Ubuntu 系统就是采用的 systemd 来管理系统,不过仍然兼容 init 系统的启动模式。可以看到 Ubuntu20 的 /sbin/init 是软链接到 /lib/systemd/systemd上的。systemd 与 init 虽然启动过程不太一样,但最终的目的是一致的,都是要启动那一堆需要开机运行的脚本文件。

在 init 系统模式下,内核调用 init 进程后会首先获取系统运行级别(run-level)的信息,运行级别在这里不是启动优先级,可以理解为运行模式,运行级别共有 0~6 七种:

  • 0:关机

  • 1:单用户模式

  • 2:多用户模式,没有网络支持

  • 3:多用户模式,有网络支持

  • 4:保留,未使用

  • 5:X11,与运行级别 3 类似,但加载使用 X-windows 支持的图形界面

  • 6:重启

这几种模式有什么用呢?举个例子,在 Ubuntu 的终端下,重启指令除了 reboot 外,使用 init 6 也可以实现重启,6 对应的运行级别就是重启,类似地,运行 init 0 指令对应的就是关机。

知道启动级别后就到 /etc/rc.d文件夹中查找相应的脚本并运行。还会在/etc/modules-load.d/modules.conf文件中查找装载到内核的模块。

rc.d 中含有 rc.sysinit、rcN.d(N=0~6,即不同的运行级别对应的运行文件夹,根据运行级别的不同,系统会运行 rc0.d 到 rc6.d 中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务)、rc.local 等文件及或脚本,目前 Ubuntu 已经没有 rc.d 文件夹了,而是把这个文件夹的大多内容直接放在了 /etc 文件夹下了,另外 rc.local 如果需要用到的话还需要自行创建。rc.local 是在所有 init 脚本执行完之后才会运行的脚本,也就是说留给用户用来做一些拓展功能的脚本。

打开 rcN.d 文件夹可以看到里面的文件都是以 S 或者 K 夹数字开头的脚本,S 待表 Start,K 代表 Kill ,运行脚本时系统会根据这俩前缀符号来确定传入 start 或者 stop 参数。后面的数字代表执行优先级,也就是运行或者停止的执行优先级。

results matching ""

    No results matching ""