服务管理与系统启动流程:
操作系统启动时运行的第一个程序:
在 RHEL7 之前,使用 init (pid=1)来初始化系统;
init 是系统的初始化进程,也是整个系统的第一个用户空间进程。它是由内核启动的,负责启动并管理系统中的其他进程。
从 RHEL7 开始,使用 Systemd (pid=1)来初始化系统;
与init类似Systemd 是一种用于启动、管理和控制 Linux 系统上的进程的系统和服务管理器。
systemd 对比 init 的优势:
1、启动速度比init会更快:Systemd 使用的是并行启动的的方式,所以可以同时启动多个服务,从而提高启动速度。但是,传统的 init 启动方式为串行启动,所以从速度上是较低与Systemd。
2、服务依赖关系处理的更好:init 本质上来说是系统初始化的一个脚本文件,系统中所有要运行的程序都会放在这个脚本当中,那么init 在启动的时候都会将脚本文件中的每一行都去执行,所以如果其中需要启动的某项服务出现了问题(init 中某项条目出现了故障),系统就会一直卡在这里,出现开不了机的现象;而systemd 则是通过单元的方式进行管理,可以理解为积木==》按需激活,自动依赖。
3、自动故障恢复:为了保障系统的稳定,Systemd 可以监控系统中的服务和进程,并且在服务启动失败时自动再次重启服务以及其相关依赖。
Systemd 会使用不同的单元来管理不同的类型对象,常见单元类型如下
类型 | 文件扩展名 | 解释 |
Service unit | .service | 定义系统服务 |
Target unit | .target | 模拟运行级别 |
Device unit | .device | 定义内核识别的设备 |
Mount unit | .mount | 定义文件系统挂载点 |
Socket unit | .socket | 用于标识进程间通信 |
Swap unit | .swap | 用于管理swap设备 |
Automount unit | .automount | 用于实现文件系统自动挂载 |
Path unit | .path | 定义文件系统的文件和目录 |
例如查看系统上的设备:
systemctl list-units --type device
使用systemd管理服务:
示例:查看systemd服务解析并加载到内存中的单元,不显示已安装但未启用的服务:
systemctl list-units --type service
#注:在查看的服务列表中 ACTIVE 和 SUB 均为服务的状态;
ACTIVE ==》服务的高级状态 ==》服务的总状态,表示服务是否在系统中运行
SUB ==》服务的低级状态 ==》 服务进程的状态,例如 nfs 服务,进程属于休眠状态,等待被激活的场景,并非时时刻刻在运行
总结:服务的状态是由active来决定的,并非SUB来决定
锁死服务(使用场景:一般在服务之间发生冲突时,为了避免冲突的服务引起故障,将某一个服务彻底屏蔽所使用):
systemctl mask httpd.service
#锁死状态的服务无法启动,也无法被其他服务拉活
解锁:
systemctl unmask httpd.service
注:其实要理解锁死服务与解锁服务很简单,如下图所示
由上图可以看出,通过mask锁定服务其实就是将/etc/systemd/system/httpd.service 软连接指向了linux中的/dev/null(无底洞),使该服务彻底无法启动,而解锁实际就是将这条软连接删除 ;
systemctl 常用命令:
systemctl start NAME.service #启动服务
systemctl stop NAME.service #停止服务
systemctl restart NAME.service #重启服务
systemctl reload NAME.service #重新加载配置文件但是不会重启服务
systemctl reload-or-restart NAME.service #如果你不确定服务是否有重新加载配置文件的功能,可以用 reload-or-restart 如果支持加载就会使用 reload 如果不支持则会 restart
systemctl enable NAME.service #服务开机自启
systemctl disable NAME.service #禁用服务开机自启
systemctl enable --now NAME.service #将服务设置为开机自启,并且当前立即启动;
与其反之的命令则为: systemctl disable --now NAME.service
systemctl list-dependencies NAME.service #列出服务的依赖关系
systemctl status NAME.service #查看服务的状态(开机运行的状态)
systemctl is-enable NAME #查询服务的开机状态
systemctl is-active NAME #查询服务的当前状态
systemd 启动目标:
在Red Hat 7系统中init拥有运行级别的概念:
系统共有7个运行级别:0-6 ,其中较为常见的例如 0级别 关机 ,6级别 重启 ,3级别 带网络的字符界面, 5级别 图形化界面 (需要使用init切换)
runlevel #查看当前运行级别
而在Red Hat 8 系统中则称之为运行目标:
target类型 | 描述 |
graphical.target | 系统支持多用户,图形和基于文本的登陆 |
multi-user.target | 系统支持多用户,基本文本的登陆 |
tescue.target | 系统初始化已完成,需要root账户登陆 |
emergency.target | 只读挂载根文件系统,需要root账户登陆 |
systemctl get-default #查看当前是什么模式
示例开机启动字符界面:
systemctl set-default multi-user.target