参考链接
- Linux引导过程
Linux 系统的运行级别
Linux 系统总共有设置了 7 种运行级别。分别是:
- 0 级:关机;
- 1 级:单用户模式;
- 2 级:无网络的多用户模式;
- 3 级:多用户模式(无图形界面);
- 4 级:未使用;
- 5 级:多用户模式(有图像界面);
- 6 级:重启。
为什么要了解早期系统的启动方式?
- 现在的启动方式是通过早期的启动方式优化而来的,存在很大的关联性;
- 很多老项目,依然使用着早期的启动方式;
- 新的启动方式大概在 2018 年才开始普及。
早期 Linux 的开机方式
大概是如下几个阶段:
- 开机自检:机器开机后,将根据主板 BIOS 中的设置对CPU 、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权,一般移交给本机硬盘;
- 硬件启动 POST:Power-On-Self-Test,加电自检,是 BIOS 功能的一个主要部分。负责完成对 CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测;
- 主板的 ROM:BIOS 保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自检程序等。
- MBR 引导:主引导扇区记录着硬盘本身的相关信息以及硬盘各个分区的大小及位置信息。如果它受到破坏,硬盘上的基本数据结构信息将会丢失,需要用繁琐的方式试探性地重建数据结构信息后,才可能重新访问原先的数据。主引导扇区内的信息可以通过任何一种基于某种操作系统的分区软件写入,但和某种操作系统没有特定的关系,即只要创建了有效的主引导记录就可以引导任意一种操作系统。当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中 MBR(Master Boot Record, 主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据 MBR 记录中的引导信息调用启动菜单(如 GRUB)。
- GRUP 菜单:对于 Linux 操作系统来说,GRUB(GRand Unified Bootloader,统一启动加载器)是 使用最为广泛的多系统引导器程序。系统控制权传递给 GRUB 以后,将会显示启动菜单给用户选择,并根据所选项(或采用默认值)准备加载 Linux 内核文件,然后将系统控制权转交给 内核。需要注意的是,CentOS 7 采用的是 GRUB2 启动引导器。
- 加载 Linux 内核: Linux 内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间, 负责资源分配与调度。内核接过系统控制权以后,将完全掌控整个 Linux 操作系统的运行过 程。总结:把内核和镜像文件系统加载到内存中使用。
- 启动 init 进程:
- 这个进程是 Linux 系统的第一个进程,PID 为 1,又叫超级进程,也叫根进程;
- 负责产生其他所有的用户进程,所有的进程都被挂在这个进程下。**如果这个进程退出了,那么所有进程会被 kill。**如果一个子进程的父进程退出了(子进程成为孤儿进程),那么这个子进程会被挂到这个根进程下面。
- Linux 又是以进程为最小执行单元,也就是说做任何事情都要依靠进程。因此这个进程的重要性不言而喻。
启动 init 进程
- init 进程启动后,会读取
/etc/inittab
,接着根据该配置文件的启动层级和执行项来启动对应的程序。
比如以下的代码就是一个典型的 inittab 文件:
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:
这个文件表示 init 进程要启动的进程将会完成操作系统 5 级的功能。
- 执行系统初始化脚本(
/etc/rc.d/rc.sysinit
):对 Linux 系统一些必备的东西进行初始化,比如时钟、键盘、磁盘、文件系统等。 - 执行启动层级对应的脚本(
/etc/rc*.d
):Linux 系统不同的运行级别有不同的进程,这些进程需要依靠这些脚本来启动。(因此,早期的 Linux 系统中,如果有系统级的进程想要设置为开机启动,就将启动该进程的命令放在该文件中。) - 这一步对于不同的系统运行级别是不同的。对于 3 级就是启动命令行终端,对于 5 级就是启动图形终端。然后执行
rc.local
文件;(如果有系统级的进程需要设置为开机启动,也可以写到这个文件中)。
现在 Linux 的开机方式
第一个启动的进程不再是 /etc/init
进程,而是 /lib/systemd/systemd
。
systemd 系统(system deamon)
默认启动的系统级进程通过系统目录进行配置(代替 /etc/inittab
的配置方式),配置目录为:
/etc/systemd/system
/run/systemd/system
/lib/systemd/system
优先级从高到低,systemd 依次从这些目录中读取配置文件。启动这些配置文件对应的进程。如果同一服务在三个地方都配置了,优先级高的会覆盖优先级低的。
如果想要配置启动自己的进程,只要在 /etc/systemd/system
目录下添加自己编写好的配置文件即可。/run/systemd/system
是系统用来配置服务的,一般不需要管。
读懂配置文件
配置文件分为三部分:
- unit 块:启动顺序与依赖关系;
- service 块:启动行为;
- install 块:定义如何安装这个配置文件,即如何做到开机自启。
systemd 系统比 init 好在哪里
systemd 系统配置非常规范,systemd 系统可以对这些配置文件按照固定的格式优化,比如可以让多个服务同时启动,大幅提高服务启动效率。
而 init 系统仅仅是在配置文件中增加脚本启动命令,具体是什么格式完全由开发人员确定。容易导致整个系统难以优化,各种服务只能线性的依次启动,效率很低。
systemd 系统资源划分
systemd 系统划分为 12 个 unit:
- service unit:服务单元
- target unit:运行级别单元
- device unit:设备单元
- mount unit:文件系统的挂载点单元
- automount unit:自动挂载点单元
- path unit:路径单元
- scope unit:不是由systemd启动的外部进程
- slice unit:进程组单元
- snapshot unit:systemd快照单元
- socket unit:套接字单元
- swap unit:文件交换单元
- timer unit:定时器单元
systemctl 是 systemd 的主要命令,可以用于管理服务单元:
- systemctl enable httpd.service:使某任务开机自启
- systemctl disable httpd.service:使某服务不开机自启
- systemctl status httpd.service:服务详细信息
- systemctl list-units --type=service:显示所有已经启动的服务
- systemctl start httpd.service:启动某服务
- systemctl stop httpd.service:停止某服务
- systemctl restart httpd.service:重启某服务