什么是daemon与服务(service)
在Linux系统中,daemon是指一类在后台运行的服务进程,通常以d结尾。
它们不与用户进行交互,也不接受用户的输入,而是在系统启动时自动启动并一直运行,为操作系统、应用程序和其他服务提供支持,一些常见的daemon包括cron(定时任务守护进程)、sshd(SSH服务守护进程)、httpd(Apache Web服务器守护进程)和mysqld(MySQL服务守护进程)等。
一般来说,当我们以命令行或图形模式进入Linux主机后,操作系统给我们提供了很多服务,比如打印服务、计划任务服务、邮件管理服务等。那么服务是如何被启动的呢?它们的工作状态是怎么样的?
system V 的init管理操作中daemon的主要分类
早期UNIX使用的是System V版本 ,在那个年代启动系统服务的管理放还是被称为 SysV的init脚本程序的处理方式。就是系统内核第一个调用的程序是init,如何init去运行所有系统所需要的服务,不论是本地服务还是网络服务。
init管理机制有如下几个特色
服务的启动、关闭于查看等方式
所有的服务启动脚本放置于/etc/init.d/ 目录,基本上都是使用bash shell所写成的脚本程序,需要启动、关闭、重新启动、查看状态时,可以通过如下的方式来处理
启动:/etc/init.d/daemon start
关闭:/etc/init.d/daemon stop
重新启动:/etc/init.d/daemon restart
查看状态:/etc/init.d/daemon status
服务的启动分类
init服务的分类中,根据服务是独立启动或被一个总管程序管理而分为两大类
独立启动模式:
服务独立启动,该服务直接常驻于内存中,提供本机用户的服务操作,反应速度快
超级守护进程:
由特殊的xinetd或inetd这两个总管理程序提供socket对应或端口对应的管理,当没有用户要求某socket或端口时,所需要服务不会启动,只有当用户要求时,xinetd才会去唤醒相应的服务程序。通过super daemon来执行服务的时程、连接需求等的控制。
服务的依赖性问题
服务依赖性问题就是当一个服务启动或运行需要另一个服务或资源的支持时,如果这个依赖的服务或资源>没有启动或不可用,就会导致这个服务无法启动或运行。
举个例子,如果想要启动网络服务,但是电脑系统没有网络,那么网络服务就无法启动。再比如,如果你>需要连接一个认证服务器,但是这个连接需要依赖于A服务,而A服务没有启动,那么认证服务就无法启动。在传统的init管理下,管理员需要手动处理这些依赖关系,才能启动需要的服务。但是这种方式比较繁琐容易出错。
运行级别的分类
在Linux系统中,init是系统启动后内核主动调用的程序。init可以根据用户自定义的运行级别(runlevel)来唤醒不同的服务,以进入不同的操作界面。Linux提供了7个运行级别,其中比较重要的是1、3、5。
1 是单人维护模式
3 是纯命令行模式
5 是图形界面模式
每个运行级别都有对应的启动脚本,这些脚本通过/etc/rc.d/rc[0-6]/SXXdaemon链接到/etc/init.d/daemon。其中,链接文件名(SXXdaemon)中的S表示启动该服务,XX是数字,表示启动的顺序。通过SXX的设置,启动时可以按顺序执行所有需要的服务,同时也可以解决依赖服务的问题,这点与管理员自己处理不太一样。
制定运行级别默认要启动的服务
若要建立如上提到的SXXdaemon的话,不需要手动建立链接文件,通过如下命令可以处理默认启动、默认不启动、查看默认启动与否的操作
默认要启动:chkconfig daemon on
默认不启动:chkconfig daemon off
查看默认为启动与否:chkconfig --list daemon
运行级别的切换操作
当你想从命令行界面(runlevel 3)切换到图形界面(runlevel 5)时,不需要手动启动或关闭相关服务,只需要执行命令【init 5】即可完成切换。在执行这个命令时,init会主动去分析/etc/rc.d/rc[35].d/这两个目录内的脚本,然后启动转换运行级别中需要的服务,最终完成整个运行级别的切换。这个过程中,init会自动处理服务之间的依赖关系,确保所有需要的服务都能顺利启动。
systemd使用unit分类
从Centos 7.x 以后,Red Hat系列的发行版放弃沿用多年的System V 开机启动服务的流程,就是前面提到的init启动脚本的方法,改用为systemd中启动服务管理机制。那么systemd由上面好处呢?
并行处理所有服务,加速开机流程
旧的init启动脚本是按照一定顺序依次启动各个服务的,即使某些服务不依赖其他服务也要等待前面的服务启动完成。
systemd就是一种可以同时启动所有服务的初始化系统,这样可以大大缩短系统启动时间。因此,使用systemd的操作系统启动速度会更快。
一经要求旧响应的on-demand启动方式
systemd是一种新型的初始化系统,它只需要一个systemd服务和systemctl命令来管理
,不需要其他额外的命令来支持。而旧的System V则需要使用init、chkconfig、service等命令来管理。此外,因为systemd常驻内存,所以可以在任何时候立即启动其他服务,而不需要等待其他服务先启动完成。这使得systemd更加高效和灵活,能够更好地处理任务。
服务依赖性的自我检查
systemd可以自定义服务之间的依赖关系,如果服务B需要在服务A启动后才能启动,但是你手动启动B服务时A服务还没有启动,systemd会自动帮助你启动A服务。这样就
不需要管理员手动一个一个启动服务来满足依赖关系的要求
,减轻了管理员的工作负担。
依daemon功能分类
由于systemd管理的服务非常多,为了方便管理员管理和清理所有的服务,systemd先将所有服务定义为一个服务单位(unit),然后将这些单位归类到不同的服务类型(type)中
。与旧的init只分为standalone和super daemon两种类型不同,systemd将服务单位(unit)分为了多种不同类型,例如service、socket、target、path、snapshot、timer等,方便管理员进行分类和记忆。这样就更加方便管理员进行管理和维护。
将多个daemons集合成为一个群组
就像旧的System V中有多个运行级别一样,
systemd将许多功能集合成一个target项目
。这个项目的主要目的是为了创建操作环境,因此集成了许多daemon,执行一个target就相当于执行多个daemon。换句话说,一个target定义了一组需要启动的服务和资源,执行一个target就会启动这些服务和资源。这样就可以方便地定义和管理不同的操作环境了。
向下兼容旧的init服务脚本
基本上,systemd可以兼容旧的System V中的启动脚本,因此旧的init启动脚本也可以通过systemd来管理,只是一些高级的systemd功能旧的init没有办法支持。
不过,systemd也有一些地方无法完全替换init比如在运行级别的对应上,只有runlevel 1、3、5有对应到systemd的某些target类型,没有全部对应上。
此外,systemd的管理程序systemctl支持的语法有限制,不像旧的/etc/init.d/daemon是纯脚本可以自定义参数,systemctl不支持自定义参数。如果某些服务是管理员手动启动的,而不是使用systemctl启动,那么systemd将无法检测到该服务,也就无法进行管理。
在systemd启动过程中,无法与管理员通过标准输入传入信息,因此自行编写systemd的启动设置时,需要取消交互机制。
systemd的配置文件放置目录
systemd是一个用于Linux操作系统的系统和服务管理器,它将之前被称为“守护进程”的执行脚本统一称为“服务单位”,并按照类型进行分类,例如系统服务、socket文件服务、存储系统状态的快照类型和操作环境。
/usr/lib/systemd/system/是Linux操作系统中的一个目录,用于存储每个服务最主要的启动脚本设置。类似于以前的/etc/init.d目录下的文件。/run/systemd/system/目录中存储的是系统执行过程中产生的服务脚本,这些脚本的优先级比/usr/lib/systemd/system/目录中的脚本要高。
/etc/systemd/system/目录用于存储管理员根据主机系统的需求建立的执行脚本。这个目录类似于以前的/etc/rc.d/rc5.d/Sxx之类的目录,执行优先级比/run/systemd/system/高
也就是说,操作系统启动是否执行某些服务是根据/etc/systemd/system/目录下的设置来决定的。该目录下面是一大堆链接文件,实际执行的systemd启动脚本配置文件都是放在/usr/lib/systemd/system/目录中。因此,如果要修改某个服务的启动设置,应该到/usr/lib/systemd/system/目录中进行修改,而/etc/systemd/system/目录只是用于链接到正确的执行脚本配置文件。所以,想要查看执行脚本设置,应该到/usr/lib/systemd/system/目录下查看。
systemd的unit类型分类说明
/usr/lib/systemd/system/ 以下的数据如何区分上述所谓不同的类型(type)呢?很简单看扩展名。举例来说,我们来看看vsftpd 启动脚本设置,还有crond与命令行模式的multi-user设置:
所以我们知道vsftpd与crond其实算是系统服务(service),而multi-user 要算是执行环境相关的类型(target type)。根据这些扩展名的类型,大概可以找到如下几种比较常见的systemd的服务类型
扩展名 | 主要服务功能 |
---|---|
.service | 代表systemd的标准服务类型,它可以启动和管理系统进程,例如httpd.service、sshd.service等。 |
.socket | 代表systemd的socket服务类型,它可以监听指定的网络端口并转发连接请求到其他服务单元上,例如httpd.socket、sshd.socket等。 |
.target | 代表systemd的目标服务类型,它可以用于定义系统启动时要启动的服务集合,例如multi-user.target、graphical.target等。 |
.mount | 代表systemd的挂载服务类型,它可以用于管理文件系统的挂载和卸载,例如home.mount、tmp.mount等。 |
.automount | 代表systemd的自动挂载服务类型,它可以在需要时自动挂载文件系统,例如media-photos.automount。 |
.path | 代表systemd的路径服务类型,它可以在指定路径上的文件被修改时触发相应操作,例如syslog.service。 |
.timer | 代表systemd的定时器服务类型,它可以在指定的时间间隔内定期运行一个服务,例如logrotate.timer。 |
其中.service的系统服务类型最常见,因为我们一堆网络服务都是使用这种类型来设计的。