CentOS 7:浅谈系统服务Systemd与System V
浅谈Linux 系统服务Systemd
1. daemon与Service
1.1 早期daemon主要分类
1.1.1 服务的启、停、状态与查看的方式
(1)启动:/etc/init.d/daemon start
(2)关闭:/etc/init.d/daemon stop
(3)重启:/etc/init.d/daemon restart
(4)查看:/etc/init.d/daemon status
1.1.2 服务的启动
(1)独立启动模式(stand alone),该服务不需要其他服务来管理,直接常驻内存,因此运行速度启动速度极快。
(2)超级守护进程(super daemon),也称总管程序(super daemon),它由特殊的xinetd和inetd提供socket对应或port对应的管理,只有当有用户要求该socket或端口时,该服务才会被启动。
1.1.3 服务依赖性问题
简单地说,依赖性就是,想要使用A服务,但是A服务必须在B服务启动后才能使用,而B服务有可能依托于C服务,这样就形成一个条状的服务依懒性,其实还有更复杂的依赖形式,读者可自行查阅。
1.1.4 运行级别的分类
基本上Linux提供7个运行级别,分别是0-6,其中1(单人维护模式)、3(命令行模式,字符界面)、5(图形界面)。各个运行级别的脚本是通过**/etc/rc.d/rc[0~6]/SXXdaemon链接到/etc/init.d/daemon**,链接文件名[SXXdaemon]的功能为:S为启动该服务,XX是数字,为启动顺序,由于SXX的设置,使得服务能够有序执行,并且依懒性问题也能得到解决。
1.1.5 制定运行级别默认启动的服务
通过以下命令处理默认的启动,不启动,查看默认的启动与不启动daemon。
默认要启动:chkconfig daemon on
默认不启动:chkconfig daemon off
查看启动与否:chkconfig –list daemon
1.1.6 运行级别切换
从命令行runlevel 3切换到 runlevel 5(图形界面),直接运行init 5。
1.2 Service相关目录
如下图/etc下的一级目录,我们发现**/etc/init.d -> /etc/rc.d/init.d**,它们之间做了硬链接,事实上,/etc/rc.d/init.d包含了所有的service的控制脚本。
/etc/rc*.d -> /etc/rc.d/rc*.d : /etc/rc.d/rc*.d 下包含了所有的service的自动启动选项的配置
1.3 service的管理工具/sbin/service
可以使用工具/sbin/service来查看和管理系统上所有的service,
查看状态:/sbin/service --status-all
启停某个服务:/sbin/service XXX start/stop/restat
打开/sbin/service脚本,我们可以看到其实service命令实现很简单,就是遍历/etc/init.d (-> /etc/rc.d/init.d)下的所有的service控制脚本,执行相应service控制脚本中的操作。
1.4 service的自动启动控制工具/sbin/chkconfig
使用工具/sbin/chkconfig来简化service启动选项的配置。
用来查看所有服务的启动选项配置:chkconfig --list
用来查看iptables service的启动选项的配置:chkconfig iptables
1.5 xinetd服务
xinetd(eXtended InterNET services daemon),它取代了inetd,并且提供了访问控制、加强的日志和资源管理功能,已经成了Red Hat 7 和 Mandrake 7.2的Internet标准超级守护进程。
2. Systemd系统配置服务
2.1 Systemd优势
(1)并行处理所有服务,加速开机流程。
Init启动脚本是顺序进行的,没有依懒性的服务,也必须排队等待前面的服务执行完,才能启动,而systemd可以同时启动服务,提高用户体验度。
(2)On-demand启动方式
Systemd是搭配systemctl命令来处理的,无需额外的命令来支持。早期的SystemV需要init/chkconfig/service等命令,并且由于systemd常驻内存,响应速度极快。
(3)自我依赖性检查
对于新手来说,这个功能很香,早期的安装一个软件时,有可能依赖几十个包,但是systemd可以自动开启服务依赖性检查,如果需要启动A服务,倘若A服务依赖于B服务,系统会帮你自动开启B服务。
(4)分类明确,易于管理
Systemd下管理的服务居多,因此systemd定义了不同类型的服务单位(Unit),包括“service, socket, target, path, snapshot, timer”等,后续的文章中会讲几个常用和常见的类型。
(5)向下兼容init服务
由于某种原因,systemd事实上并不能完全取代init, 主要表现在以下几点:
1)除了runlevel 1、3、5在systemd的target类型服务单元有对应,其余没有对应。
2)systemctl语法有限制,而/etc/init.d/daemon是纯脚本,可以自定义参数。
3)systemd启动过程中,无法与管理员通过标准的输入传入信息。
4)如果某个服务是管理员手动启动,而非使用systemctl启动,则systemd将服务检测的该服务,从而不能管理。
2.2 systemd的配置文件
(1)/usr/lib/systemd/system/: 每个服务最主要的启动脚本设置,类似于之前的/etc/init.d
(2)/run/systemd/system/: 系统执行过程中所产生的服务脚本,优先级高于(1)
(3)/etc/systemd/system/: 管理员根据主机系统的需求所建立的执行脚本,优先级高于(2)。