我们知道,在我们登陆Linux后,系统就为我们提供了很多服务,比如例行工作调度服务crond、打印服务、邮件服务等。那么这些服务是如何被启动的呢?
这个问题先放一下,接下来我们先了解一下Linux的启动过程。
1.Linux系统启动过程
启动过程分为5个阶段:内核引导、运行init进程、系统初始化、建立终端、用户登录系统。
1.内核引导
当计算机打开电源以后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。操作系统接管硬件以后,首先读入/boot目录下的内核文件。
2.运行init
init进程是系统所有进程的起点。如果没有这个进程,系统中的任何进程都不会启动。 init进程首先会去读取配置文件。
init的任务就是运行这些daemon。
init的类型:
运行级别
3.系统初始化
在init的配置文件中调用并执行了/etc/rc.d目录下的rc.sysinit脚本文件。
主要工作是:激活交换分区、检查磁盘、加载硬件模块以及执行一些优先任务。
用户可以通过chkconfig或setup中的“system services”来设定每个运行级别中将运行哪些守护进程daemon(就是服务)。
4.建立终端
5.用户登录
有三种登录方式:命令行登录、ssh登录、图形界面登录。
2.systemd服务管理机制
在centOS7.x之后,Linux放弃了沿用多年的SystemV这个开机启动流程,改用systemd这个启动服务管理机制。
1.systemd的优点
《1》一经要求就立刻响应的on-demand启动方式:systemd服务只有一个与之搭配的指令systemctl。
《2》依daemon功能分类:systemd管理的服务非常多,为了区分各种服务的功能,systemd将每个服务定义为一个服务单位unit,并将unit归类到不同的服务类型(type)当中去。systemd将服务单位(unit)区分为service、socket、target、path、snapshot、timer等,方便管理员分类与记忆。
《3》向下兼容旧的init服务脚本。
2.systemd的配置文件放置目录
服务的启动脚本配置文件:/usr/lib/systemd/system/
系统执行产生的服务脚本:/run/systemd/system/
管理员创建的执行脚本:/etc/systemd/system/
3.服务类型
我们可以通过这些配置文件的扩展名确定服务的类型,每一个文件代表一个服务,文件名(去掉扩展名)就是服务(进程)的名称。
4.管理服务
systemd类型的init进程只有一个指令systemctl管理服务。
服务的启动分为两种类型:开机启动、“当前”启动。
这两种类型的启动是有很大区别的
1.管理单一服务的启动与开机启动和状态观察
由于服务也是一个进程,因此我们可以使用kill来管理这个服务,但是存在弊端,如果使用kill杀死一个服务,那么systemctl将无法继续监控该服务;因此我们这里使用systemctl来管理。
unit由两部分组成:服务名、扩展名。
服务单位unit是有类型区分的,区分的办法就是在服务后面添加格式;比如系统服务atd的unit是atd.service,比如target类型服务multi-user的unit是multi-user.target。
当我们要管理一个服务时,但是我们仅仅知道服务名(通过top查询服务名),却不知道扩展名该怎么办?
我们可以查看systemd的配置文件/usr/lib/systemd/system,通过配置文件的扩展名从而可以确定服务的扩展名。
实例1:
查看atd这个服务的状态
Loaded与Active这两行的信息非常重要,告诉我们该服务是不是开机自启,以及当前状态。
服务默认状态分类(在Loaded行的红线处显示):
daemon的默认状态除了enable和disable之外,还有其他类型:
《1》static:这个服务不可以自己启动,但是可能被其他的enable类型的服务唤醒(相依属性的服务)。
《2》mask:这个服务无论如何都不会被启动!因为已经被强制注销(非删除),可通过systemctl unmask方式改回原本状态。
服务当前状态分类(在Active行冒号后的第一个单词显示):
《1》active (running):表示正有一个或多个程序正在系统中执行。
《2》active (exited):表示仅执行一次就正常结束的服务。
《3》active (waiting):表示正在执行当中,不过还在等待其他的事情才能继续处理。
《4》inactive:表示这个服务目前没有运行。
关闭服务:
实例1.关闭chronyd.service服务
先通过systemctl status chronyd.service查看状态,如果服务未关闭,则使用systemctl stop chronyd.service关闭服务,再使用systemctl disable chronyd.service取消开机时自动启动该服务。
上述关闭有一个问题,就是如果这个服务存在属性相依的服务B,那么服务B有可能会重新唤醒这个服务。
关闭属性相依服务A的正规做法:
如果你关闭的服务A,A有个与其属性相依的服务B,这就表明这个服务A可能被属性相依的服务B自动唤醒;因此当你想要彻底关闭这个服务时,你需要将属性相依的服务B也关闭。
关闭属性相依服务A的不正规做法:
使用systemctl mask A强迫服务注销
格式:
systemctl mask unit //unit由服务名与类型扩展名组成
例如system mask atd.service
当你强迫服务注销之后,你是无法启动这个服务了,除非使用systemctl unmask atd.service取消注销。
2.通过systemctl观察系统上所有服务
上一小节讲述的是单一服务的启动、关闭、观察,以及相依服务要注销的功能。那系统上有多少服务存在呢?这就需要通过list-units与list-unit-files来观察了!详细用法如下:
格式:
systemctl //等同于systemctl list-units,列出系统上面有启动的unit
systemctl --all //列出所有的unit(包含启动的与未启动的)
systemctl list-unit-files //将所有安装的unit列出来,安装的都会在/usr/lib/systemd/system/目录下有相应的文件
其他的格式可以依上图查询。