17章 认识系统服务(daemons)

发布时间 2023-07-31 11:03:58作者: Evan-whc

17章 认识系统服务(daemons)

17.1 什么是daemon与服务(service)

  简单地说,系统为了某些功能就必须要提供一些服务(不论是系统本身还是网络方面),这个服务就称为service。但是service的提供总是需要程序的运作吧!否则如何执行呢?所以达成这个service的程序我们就称呼他为daemon啰!举例来说,达成循环型例行性工作排程服务(service)的程序为crond这个daemon啦!

17.1.2 systemd使用的unit分类

  从CentOS 7.x之后,RedHat系列的distribution放弃沿用多年的System V开机启动服务的流程,就是前一小节提到的init启动脚本的方法,改用systemd这个启动服务管理机制~那么systemd有什么好处呢?

  • 平行处理所有服务,加速开机流程:
  • 一经要求就响应的on-demand启动方式
  • 服务相依性的自我检查
  • 依daemon功能分类
  • 将多个daemon集合成为一个群组
  • 向下兼容旧有的init服务脚本
  • systemd的配置文件放置目录
      基本上,systemd将过去所谓的daemon执行脚本通通称为一个服务单位(unit),而每种服务单位依据功能来区分时,就分类为不同的类型(type)。基本的类型有包括系统服务、数据监听与交换的插槽档服务(socket)、储存系统状态的快照类型、提供不同类似执行等级分类的操作环境(target)等等。哇!这么多类型,那设定时会不会很麻烦呢?其实还好,因为配置文件都放置在底下的目录中:
    • /usr/lib/systemd/system/:每个服务最主要的启动脚本设定,有点类似以前的/etc/init.d底下的文件
    • /run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要比/usr/lib/systemd/system/高!
    • /etc/systemd/system/:管理员依据主机系统的需求所建立的执行脚本执行优先序又比/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设定:
    ll /usr/lib/systemd/system/ | grep -E '(vsftpd|multi|cron)'
扩展名 主要服务功能
.service 一般服务类型(service unit)
.socket 内部程序数据交换的插槽服务(socket unit)
.target 执行环境类型(target unit),其实是一群unit的集合
.mount .automount 文件系统挂载相关的服务
.path 侦测特定文件或目录类型(path unit)
.timer 循环执行的服务

17.2 透过systemctl管理服务

  基本上,systemctl这个启动服务的机制,主要是透过一只名为systemctl的指令来处理的!

systemctl [command] [unit]
command主要有:
start : 启动
stop : 关闭
restart : 关闭后再启动
reload: 重载配置文件,让设定生效
enable: 设定下次开机时,后接的unit会被启动
disable: 设定下次开机时,后接的unit不会被启动
status: 列出unit目前的状态
is-active: 目前有没有正在运行中
is-enable: 开机时有没有预设要启用这个unit

17.2.2 透过systemctl观察系统上所有的服务

systemctl [command] [--type=TYPE] [--all]
command:
    list-units : 依据unit列出目前有启动的unit。若加上--all都会列出没启动的。
    list-unit-files: 依据/usr/lib/systemd/system/内的文件,将所有文件列表说明。
    --type=TYPE: 就是之前提到的unit type,主要有service,socket,target等

17.2.3 透过systemctl管理不同的操作环境(target unit)

  列出跟操作界面比较有关的target项目:
systemctl list-units --type=target --all
  在CentOS 7.1的预设情况下,就有26个target unit耶!而跟操作界面相关性比较高的target主要有底下几个:

  • graphical.target: 就是文字加上图形界面,这个界面已经包含了底下的multi-user.target项目!
  • multi-user.target:纯文本模式
  • rescue.target: 在无法使用root登入的情况下,systemd在开机时会多加一个额外的暂时系统,与你原本的系统无关。这时你可以取得root的权限来维护你的系统。但是这个额外系统,因此可能需要动到chroot的方式来取得你原有的系统喔!
  • emergency.target: 紧急处理系统的错误,还是需要使用root登入的情况,在无法使用rescue.target时,可以尝试使用这种模式!
  • shutdown.target:关机
  • getty.target: 可以设定你需要几个tty之类的,如果想要降低tty的项目,可以修改这个东西的配置文件
systemctl [command] [unit.target]
选项与参数:
command:
    get-default: 取得目前的target
    set-default: 设定后面接的target成为默认的操作模式
    isolate: 切换到后面接的模式
范例:
systemctl isolate multi-user.target
systemctl isolate graphical.target

17.2.4 透过systemctl分析各服务之间的相依性

systemctl list-dependencies [unit] [--reverse]
选项与参数:
--reverse: 反向追踪谁使用这个unit的意思!

17.2.6 关闭网络服务

  如何观察网络端口?
netstat -tlunp

systemctl list-units --all | grep avahi-daemon
systemctl stop avahi-daemon.service
systemctl stop avahi-daemon.socket
systemctl disable avahi-daemon.service avahi-daemon.socket
netstat -tlunp

17.3.1 systemctl配置文件相关目录简介

  现在我们知道服务的管理是透过systemd,而systemd的配置文件大部分放置于/usr/lib/systemd/system/目录内。但是RedHat官方文件指出,该目录的文件主要是原本软件所提供的设定,建议不要修改!而要修改的位置应该放置于/etc/systemd/system/目录内。