一、什么是daemon与服务

系统为了某些功能必须要提供一些服务(无论是系统本身还是网络方面),这个服务就是service。但是service的提供需要通过程序运行,所以这个程序称为daemon。

通常在Linux使用的时候,会在服务的名称后面加上一个d,这就是daemon程序的命名方式。例如例行性命令的建立的at,它的程序文件名就是atd。

1.systemd使用的unit分类

现在,包括Ubuntu在内的多个分支版本开始使用systemd这个启动服务管理机制。那么systemd有什么好处呢?

①平行处理所有服务,加速开机流程;

②已经要求就回应的on-demand启动方式;

③服务相依性的自我检查;

④依daemon功能分类;

⑤将多个daemons集合称为一个群组;

⑥向下兼容旧的init服务脚本

不过,有些地方systemd也无法完全取代init,包括:

①在runlevel的对应上,大概仅有runlevel1,3,5有对应到systemd的某些target类型而已,没有全部对应;

②全部的systemd都用systemctl这个管理程序管理,而systemctl支持的语法有限制,不像/etc/init.d/daemon就是纯脚本可以自定义参数,systemctl不可自定义参数;

③如果某个服务启动是管理员自己手动执行启动,而不是使用systemctl去启动的,那么systemd将无法侦测到该服务,而无法进一步管理;

④systemd启动过程中,无法与管理员通过standard input传入信息,因此自行撰写systemd的启动设定时,务必要取消互动机制。

(1)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/底下去查阅才对。

二、通过systemctl管理服务

1.通过systemctl管理单一服务(service unit)的启动/开机启动与观察状态

一般来说,服务的启动有两个阶段,第一个是开机的时候设置要不要启动这个服务,第二个是现在要不要启动这个服务

systemctl常用的一些方法如下:

[root@study ~]# systemctl [command] [unit]

command主要有:

start:立刻启动后面接的unit;

stop:立刻关闭后面接的unit;

restart:立刻重启后面接的unit;

reload:不关闭后面接的unit的情况下,重载配置文件,让配置生效;

enable:设定下次开机时,后面接的unit会被启动;

disable:设定下次开机时,后面接的unit不会被启动;

status:目前后面接的这个unit的状态,会列出有没有正在执行、开机预设执行否、登录等信息等;

is-active:目前有没有正在运行;

is-enabled:开机时有没有预设要启用这个unit。

不应该使用kill的方式来关掉一个正常的服务,不然的话systemctl会无法继续监控该服务的。

服务的状态,主要有几种:

①active(running):正有一个或多个程序正在系统中执行的意思;

②active(exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行;

③active(waiting):正在执行当中,不过还再等待其他的事件才能继续处理;

④inactive:这个服务目前没有运行的意思。

daemon预置状态主要有以下几种:

①enabled:开机时执行;

②disabled:开机时不会执行;

③static:daemon不可以自己启动,不过可能会被其它的enabled的服务来调用;

④mask:daemon无论如何都无法启动,因为已经强制注销,不过可以通过systemctl unmask改变为原来的状态。

2.通过systemctl观察系统上所有的服务

如果想了解系统中有多少服务存在,那就需要通过list-units以及list-unit-files来观察了。具体用法如下:

[root@study ~]# systemctl [command] [--type=TYPE] [--all]

command:

list-units:依据unit列出目前有启动的unit。若加上--all才会列出没启动的。

list-unit-files:依据/usr/lib/systemd/system/内的文件,将所有文件列表说明。

--type=TYPE:就是之前提到的unittype,主要有service,socket,target等

当我们输入systemctl的时候,其实默认就是输出list-units的结果。输出的内容有多列,分别是以下的意义:

①UNIT:项目的名称,包括各个unit的类别;

②LOAD:开机时候是否会被载入,默认systemctl显示的是会被载入的项目;

③ACTIVE:目前的状态,须与后续的SUB搭配,就是我们用systemctl status观察时,active的项目;

④DESCRIPTION:详细描述。

当我们输入systemctl list-unit-files时,输出的各个列含义如下:

①UNIT FILE:顾名思义,就是unit file的名字。

②STATE:开机是否会载入的状态,分为enabled/disabled/mask/static等。

  1. 通过systemctl管理不同的操作环境(target-unit

在我的Ubuntu中,有29个target unit,而跟操作系统界面相关性比较高的target有以下几个:

①graphical target(我的Ubuntu默认):文字+图形界面,这里面已经包括了下面的multi-user.target。

②multi-user.target:纯文本模式;

③rescue.target:在无法使用root登入的情况下,systemd在开机时会多加一个额外的暂时系统,与你原本的系统无关。这时你可以取得root的权限来维护你的系统。但是这是额外系统,因此可能需要动到chroot的方式来取得你原有的系统。

④emergency.target:紧急处理系统的错误,还是需要使用root登入的情况,在无法使用rescue.target时,可以尝试使用这种模式!

⑤shutdown.target:就是关机的流程。

⑥getty.target:可以设定你需要几个tty之类的,如果想要降低tty的项目,可以修改这个东西的配置文件。

总的来说,正常的模式是multi-user.target和graphical.target两个,而恢复模式则是rescue.target和更严重的emergency.target。如果要修改可以提供登录的tty数量,那就需要修改getty.target。

如何得知当前我们使用target或者如何设置target呢?用法如下

[root@study ~]# systemctl [command] [unit.target]

选项与参数:

command:

get-default:取得目前的target

set-default:设定后面接的target成为默认的操作模式

isolate:切换到后面接的模式。

注意:改变graphical.targetmulti-user.target是通过isolate来处理

system提供了数个简单的指令来给我们切换操作模式使用:

命令解释
systemctl poweroff关机
systemctl reboot重新开机
systemctl suspend进入暂停模式
systemctl hibernate进入休眠模式
systemctl rescue强制进入恢复模式
systemctl emergency强制进入紧急恢复模式

suspend是将系统的状态数据保存到内存中,然后关闭大部分系统硬件,但是并没有实际关机。

hiberna是将系统状态保存到硬盘文件中,保存完毕后,系统关机。当开机的时候,系统开始正常运行,然后把保存在硬盘中的系统状态恢复出来。因为是从硬盘读出,所以速度与你的硬盘性能有关系。

4.通过systemctl分析各服务之间的相依性

[root@study ~]# systemctl list-dependencies [unit] [--reverse]

选项与参数:

--reverse:反向追踪谁使用这个unit。

 

5.systemddaemon运行过程有关的目录介绍

(1)/usr/lib/systemd/system/:使用CentOS官方提供的软件安装后,默认的启动脚本配置文件都放在这里,这里的数据尽量不要修改。要修改时,请到/etc/systemd/system底下修改较佳。

(2)/run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要比/usr/lib/systemd/system/高!

(3)/etc/systemd/system/:管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5.d/Sxx之类的功能,执行优先序又比/run/systemd/system/高。

(4)/etc/sysconfig/*:几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,mandb所要更新的manpage索引中,需要加入的参数就写入到此目录下的man-db当中喔!而网络的设置则写在/etc/sysconfig/network-scripts/这个目录内。所以,这个目录内的文件也是挺重要的。

(5)/var/lib/:一些会产生数据的服务都会将他的数据写入到/var/lib/目录中。举例来说,数据库管理系统Mariadb的数据库默认就是写入/var/lib/mysql/这个目录下。

(6)/run/:放置了好多daemon的缓存文件,包括lockfile以及PIDfile等等。

系统中设置让服务于端口号对应在一起的文件是/etc/services

6.关闭网络服务

如何追踪网络服务的端口呢?可以使用“netstat -tlunp”这个命令,就可以查看到相关信息。例如我的电脑的信息如下:

root@xiaoao-virtual-machine:/home/xiaoao# netstat -tlunp

激活Internet连接 (仅服务器)

Proto Recv-Q Send-Q Local Address      Foreign Address    State     PID/Program name

tcp      0    0 127.0.0.53:53       0.0.0.0:*        LISTEN     528/systemd-resolve

tcp      0    0 0.0.0.0:22          0.0.0.0:*        LISTEN      1573/sshd

tcp    0   0 127.0.0.1:631          0.0.0.0:*        LISTEN      2504/cupsd

tcp6       0      0 :::22      :::*                 LISTEN      1573/sshd

tcp6       0      0 ::1:631      :::*               LISTEN      2504/cupsd

udp  38400   0 127.0.0.53:53      0.0.0.0:*                   528/systemd-resolve

udp  0   0 0.0.0.0:68              0.0.0.0:*                      763/dhclient

udp       0   0 0.0.0.0:59494      0.0.0.0:*                    631/avahi-daemon: r

udp    23936      0 0.0.0.0:5353    0.0.0.0:*                  631/avahi-daemon: r

udp    39104     0 0.0.0.0:45634   0.0.0.0:*              1560/miredo

udp        0      0 0.0.0.0:631     0.0.0.0:*                2506/cups-browsed

udp6   50496      0 :::5353      :::*                  631/avahi-daemon: r

udp6       0      0 :::52641      :::*                   631/avahi-daemon: r

我们用systemctl来观察下,到底有没有avahi-daemon为开头的服务呢?输入命令“systemctl list-units --all | grep avahi-daemon”。

如果我们想停用命令,可以这样:

systemctl stop 名称

这样就完成了停用。如下所示:

[root@study ~]# systemctl stop avahi-daemon.service

[root@study ~]# systemctl stop avahi-daemon.socket

[root@study ~]# systemctl disable avahi-daemon.service avahi-daemon.socket