17.1 什么是 daemon 与服务 (service)

常驻在记体体中的程序,且可以提 供一些系统或网络功能,那就是服务

系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个 服务就称为 service 。达 成这个 service 的程序我们就称呼他为 daemon

这些服务的名称被创建之后,被挂上 Linux 使用 时,通常在服务的名称之后会加上一个 d

17.1.1 早期 System V 的 init 管理行为中 daemon 的主要分类 (Optional)

Unix 的 system V 版本启动系统服务的管理方式被称为 SysV 的 init 脚本程序的处理方式!亦即系统核 心第一支调用的程序是 init , 然后 init 去唤起所有的系统所需要的服务,不论是本机服务还 是网络服务就是了。

基本上 init 的管理机制有几个特色如下:

  • 服务的启动、关闭与观察等方式: 所有的服务启动脚本通通放置于 /etc/init.d/ 下面,基 本上都是使用 bash shell script 所写成的脚本程序,需要启动、关闭、重新启动、观察状 态时, 可以通过如下的方式来处理:

    • 启动:/etc/init.d/daemon start

    • 关闭:/etc/init.d/daemon stop

    • 重新启动:/etc/init.d/daemon restart

    • 状态观察:/etc/init.d/daemon status

  • 服务启动的分类: init 服务的分类中,依据服务是独立启动或被一只总管程序管理而分为 两大类:

    • 独立启动模式 (stand alone)

    • 总管程序 (super daemon):由特殊的 xinetd 或 inetd 这两个总管程序提供 socket 对应或 port 对应的管理。

  • 服务的相依性问题:init 在管理员自己手动处理这些 服务时,是没有办法协助相依服务的唤醒的!

  • 执行等级的分类:init 是开机后核心主动调用的, 然后 init 可以根据使用者自 订的执行等级 (runlevel) 来唤醒不同的服务,以进入不同的操作界面。基本上 Linux 提供 7 个执行等级,分别是 0, 1, 2…6 , 比较重要的是 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/ 这两个目录内的脚本, 然后启动转换 runlevel 中需要的 服务~就完成整体的 runlevel 切换

CentOS 7 已经不使用 init 来管理服 务了,不过因为考虑到某些脚本没有办法直接塞入 systemd 的处理,因此这些脚本还是被保 留下来

17.1.2 systemd 使用的 unit 分类

从 CentOS 7.x 以后,Red Hat 系列的 distribution 放弃沿用多年的 System V 开机启动服务的 流程,就是前一小节提到的 init 启动脚本的方法, 改用 systemd 这个启动服务管理机制~

systemd 有什么好处呢?

  • 平行处理所有服务,加速开机流程:旧的 init 启动脚本是“一项一项任务依序启动”的模 式

  • 一经要求就回应的 on-demand 启动方式: systemd 全部就是仅有一只 systemd 服务搭 配 systemctl 指令来处理,无须其他额外的指令来支持。不像 systemV 还要 init, chkconfig, service… 等等指令。 此外, systemd 由于常驻内存,因此任何要求 (on- demand) 都可以立即处理后续的 daemon 启动的任务。

  • 服务相依性的自我检查: 由于 systemd 可以自订服务相依性的检查,因此如果 B 服务是 架构在 A 服务上面启动的,那当你在没有启动 A 服务的情况下仅手动启动 B 服务时, systemd 会自动帮你启动 A 服务

  • 依 daemon 功能分类:systemd 先定义所有的服务为一个服务单位 (unit),并将该 unit 归类到不同的服务类型 (type) 去。 旧的 init 仅分为 stand alone 与 super daemon 实在不够看,systemd 将服务单位 (unit) 区分为 service, socket, target, path, snapshot, timer 等多种不同的类型(type)

  • 将多个 daemons 集合成为一个群组:如同 systemV 的 init 里头有个 runlevel 的特色, systemd 亦将许多的功能集合成为一个所谓的 target 项目,这个项目主要在设计操作环 境的创建, 所以是集合了许多的 daemons,亦即是执行某个 target 就是执行好多个 daemon 的意思!

  • 向下相容旧有的 init 服务脚本: 基本上, systemd 是可以相容于 init 的启动脚本的,因 此,旧的 init 启动脚本也能够通过 systemd 来管理,只是更进阶的 systemd 功能就没有 办法支持就是了。

systemd 也是有些地方无法完全取代 init 的!包括:

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

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

  • 如果某个服务启动是管理员自己手动执行启动,而不是使用 systemctl 去启动的 (例如 你自己手动输入 crond 以启动 crond 服务),那么 systemd 将无法侦测到该服务,而无 法进一步管理。

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

systemd 的配置文件放置目录

systemd 将过去所谓的 daemon 执行脚本通通称为一个服务单位 (unit),而每种 服务单位依据功能来区分时,就分类为不同的类型 (type)。 基本的类型有包括系统服务、 数据监听与交换的插槽档服务 (socket)、储存系统状态的快照类型、提供不同类似执行等 级分类的操作环境 (target) 等等

配置文件都放置在下面的目录中:

  • /usr/lib/systemd/system/:每个服务最主要的启动脚本设置,有点类似以前的 /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/ 下面的

systemd 的 unit 类型分类说明

[root@VM-72-146-centos ~]# ll /usr/lib/systemd/system/ | grep -E '(vsftpd|multi|cron)' 
-rw-r--r-- 1 root root  318 Nov  8  2019 crond.service
-rw-r--r-- 1 root root  492 Dec  9  2020 multi-user.target
drwxr-xr-x 2 root root 4096 Jul 29  2021 multi-user.target.wants
lrwxrwxrwx 1 root root   17 Jul 29  2021 runlevel2.target -> multi-user.target
lrwxrwxrwx 1 root root   17 Jul 29  2021 runlevel3.target -> multi-user.target
lrwxrwxrwx 1 root root   17 Jul 29  2021 runlevel4.target -> multi-user.target

系统服务 (service)

multi-user 要算是执行 环境相关的类型 (target type)

几种比较常见 的 systemd 的服务类型如下:

扩展名 主要服务功能
.service 一般服务类型 (service unit):主要是系统服务,包括服务器本身所需要 的本机服务以及网络服务都是!比较经常被使用到的服务大多是这种类 型! 所以,这也是最常见的类型了!
.socket 内部程序数据交换的插槽服务 (socket unit):主要是 IPC (Inter- process communication) 的传输讯息插槽档 (socket file) 功能。 这种 类型的服务通常在监控讯息传递的插槽档,当有通过此插槽档传递讯息来 说要链接服务时,就依据当时的状态将该用户的要求传送到对应的 daemon, 若 daemon 尚未启动,则启动该 daemon 后再传送用户的要 求。使用 socket 类型的服务一般是比较不会被用到的服务,因此在开机时 通常会稍微延迟启动的时间 (因为比较没有这么常用嘛!)。一般用于本 机服务比较多,例如我们的图形界面很多的软件都是通过 socket 来进行本 机程序数据交换的行为。 (这与早期的 xinetd 这个 super daemon 有部份 的相似喔!)
.target 执行环境类型 (target unit):其实是一群 unit 的集合,例如上面表格中 谈到的 multi-user.target 其实就是一堆服务的集合~也就是说, 选择执行 multi-user.target 就是执行一堆其他 .service 或/及 .socket 之类的服务就是 了!
.mount
.automount
文件系统挂载相关的服务 (automount unit / mount unit):例如来自网络 的自动挂载、NFS 文件系统挂载等与文件系统相关性较高的程序管理。
.path 侦测特定文件或目录类型 (path unit):某些服务需要侦测某些特定的目 录来提供伫列服务,例如最常见的打印服务,就是通过侦测打印伫列目录 来启动打印功能! 这时就得要 .path 的服务类型支持了!
.timer 循环执行的服务 (timer unit):这个东西有点类似 anacrontab 喔!不过 是由 systemd 主动提供的,比 anacrontab 更加有弹性!

17.2 通过 systemctl 管理服务

跟以前 systemV 需要 service / chkconfig / setup / init 等指令来协助不同, systemd 就是仅有 systemctl 这个指令来处理

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

systemctl [command] [unit] 

command 主要有: 
start :立刻启动后面接的 unit 
stop :立刻关闭后面接的 unit 
restart :立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思 
reload :不关闭后面接的 unit 的情况下,重新载入配置文件,让设置生效 
enable :设置下次开机时,后面接的 unit 会被启动 
disable :设置下次开机时,后面接的 unit 不会被启动 
status :目前后面接的这个 unit 的状态,会列出有没有正在执行、开机默认执行否、登录等信息等! 
is-active :目前有没有正在运行中 
is-enable :开机时有没有默认要启用这个 unit
# 范例一:看看目前 atd 这个服务的状态为何?
[root@VM-72-146-centos ~]# systemctl status atd.service
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2022-09-26 08:45:21 CST; 54min ago
 Main PID: 1509 (atd)
    Tasks: 1
   Memory: 532.0K
   CGroup: /system.slice/atd.service
           └─1509 /usr/sbin/atd -f

Sep 26 08:45:21 VM-72-146-centos systemd[1]: Started Job spooling tools.


# Loaded:这行在说明,开机的时候这个 unit 会不会启动,enabled 为开机启动,disabled 开机不会启动 
# Active:现在这个 unit 的状态是正在执行 (running) 或没有执行 (dead) 
# 后面几行则是说明这个 unit 程序的 PID 状态以及最后一行显示这个服务的登录文件信息! 
# 登录文件信息格式为:“时间” “讯息发送主机” “哪一个服务的讯息” “实际讯息内容” 
# 所以上面的显示讯息是:这个 atd 默认开机就启动,而且现在正在运行的意思!
范例二:正常关闭这个 atd 服务 
[root@study ~]# systemctl stop atd.service 
[root@study ~]# systemctl status atd.service

常见的 daemon 状态:

  • active (running):正有一只或多只程序正在系统中执行的意思,举例来说,正在执行 中的 vsftpd 就是这种模式

  • active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。举例来说,开机或者是挂载时才会进行一次的 quotaon 功能,就是这种模式! quotaon 不须一直执行~只须执行一次之后,就交给文件系统去自行处理啰!通常用 bash shell 写的小型服务,大多是属于这种类型 (无须常驻内存)。

  • active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。举例来 说,打印的伫列相关服务就是这种状态! 虽然正在启动中,不过,也需要真的有伫列进 来 (打印工作) 这样他才会继续唤醒打印机服务来进行下一步打印的功能。

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

daemon 的默认状态:

  • enabled:这个 daemon 将在开机时被执行

  • disabled:这个 daemon 在开机时不会被执行

  • static:这个 daemon 不可以自己启动 (enable 不可),不过可能会被其他的 enabled 的服务来唤醒 (相依属性的服务)

  • mask:这个 daemon 无论如何都无法被启动!因为已经被强制注销 (非删除)。可通过 systemctl unmask 方式改回原本状态

服务启动/关闭与观察的练习

# 1\. 观察一下状态,确认是否为关闭/未启动呢?
systemctl status chronyd.service

# 2\. 由上面知道目前是启动的,因此立刻将他关闭,同时开机不会启动才行!
systemctl stop chronyd.service
systemctl disable chronyd.service

# 启动服务
systemctl start chronyd.service


# 注销
systemctl mask cups.service

# 取消注销
systemctl unmask cups.service

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 等
# 范例一:列出系统上面有启动的 unit 
systemctl


# 列出的项目中,主要的意义是: 
# UNIT :项目的名称,包括各个 unit 的类别 (看扩展名) 
# LOAD :开机时是否会被载入,默认 systemctl 显示的是有载入的项目而已喔! 
# ACTIVE :目前的状态,须与后续的 SUB 搭配!就是我们用 systemctl status 观察时,active 的项目! 
# DESCRIPTION :详细描述啰 

# 另外,systemctl 都不加参数,其实默认就是 list-units 的意思!
# 范例二:列出所有已经安装的 unit 有哪些?
systemctl list-unit-files
# 只想要知道 service 这种类别的 daemon 而已,而 且不论是否已经启动,通通要列出来
systemctl list-units --type=service --all
# 范例一:查询系统上是否有以 cpu 为名的服务?
systemctl list-units --type=service --all | grep cpu

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

# 列出跟操作界面 比较有关的 target 项目
systemctl list-units --type=target --all

跟操作界面相关性比 较高的 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 的项目,可以修改这个 东西的配置文件!

正常的模式是 multi-user.target 以及 graphical.target 两个,救援方面的模式主要是 rescue.target 以及更严重的 emergency.target。 如果要修改可提供登陆的 tty 数量,则修改 getty.target 项目

systemctl [command] [unit.target] 

选项与参数: 
command: 
    get-default :取得目前的 
    target set-default :设置后面接的 target 成为默认的操作模式 
    isolate :切换到后面接的模式
# 范例一:我们的测试机器默认是图形界面,先观察是否真为图形模式,再将默认模式转为文字界面
systemctl get-default

systemctl set-default multi-user.target
systemctl get-default
# 范例二:在不重新开机的情况下,将目前的操作环境改为纯文本模式,关掉图形界面
systemctl isolate multi-user.target
systemctl isolate graphical.target

在 service 部份 用 start/stop/restart 才对,在 target 项目则请使用 isolate (隔离不同的操作模式) 才对!

systemd 也提供了 数个简单的指令给我们切换操作模式之用

systemctl poweroff 系统关机 
systemctl reboot 重新开机 
systemctl suspend 进入暂停模式 
systemctl hibernate 进入休眠模式 
systemctl rescue 强制进入救援模式 
systemctl emergency 强制进入紧急救援模式

暂停与休眠模式

  • suspend:暂停模式会将系统的状态数据保存到内存中,然后关闭掉大部分的系统硬件, 当然,并没有实际关机喔! 当使用者按下唤醒机器的按钮,系统数据会重内存中回复, 然后重新驱动被大部分关闭的硬件,就开始正常运行!唤醒的速度较快。

  • hibernate:休眠模式则是将系统状态保存到硬盘当中,保存完毕后,将计算机关机。当 使用者尝试唤醒系统时,系统会开始正常运行, 然后将保存在硬盘中的系统状态恢复回 来。因为数据是由硬盘读出,因此唤醒的性能与你的硬盘速度有关。

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

systemctl list-dependencies [unit] [--reverse] 

选项与参数: 
--reverse :反向追踪谁使用这个 unit 的意思!
# 范例一:列出目前的 target 环境下,用到什么特别的 unit
systemctl get-default
systemctl list-dependencies
# 谁还会用到我的服务
systemctl list-dependencies --reverse
# graphical.target 又使用了多少的服务
systemctl list-dependencies graphical.target

# multi-user.target 被哪些服务用到
systemctl list-dependencies --reverse multi-user.target

17.2.5 与 systemd 的 daemon 运行过程相关的目录简介

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

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

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

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

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

  • /run/: 放置了好多 daemon 的暂存盘,包括 lock file 以及 PID file 等等。

# socket file 放置在哪里
systemctl list-sockets

网络服务与端口对应简介

系统所有的功能都是某些程序 所提供的,而程序则是通过触发程序而产生的。同样的,系统提供的网络服务当然也是这样 的! 只是由于网络牵涉到 TCP/IP 的概念,所以显的比较复杂一些就是了。

IP 就是代表你的主机在网 际网络上面的“门牌号码”。主机是如何分辨不同的服 务要求呢?那就是通过埠号 (port number)

  • http://ftp.ksu.edu.tw/

  • ftp://ftp.ksu.edu.tw/

port 与 daemon 的对应

事实上,为了统一整个网际网络的埠号对应服务的功能,好让所有的主机都能够使用相同的 机制来提供服务与要求服务, 所以就有了“通讯协定”这玩意儿。也就是说,有些约定俗成的 服务都放置在同一个埠号上面啦!举例来说, 网址列上面的 http 会让浏览器向 WWW 服务器 的 80 埠号进行连线的要求!而 WWW 服务器也会将 httpd 这个软件启动在 port 80, 这样两 者才能够达成连线的!

让服务与埠号对应在一起的设置 /etc/services

cat /etc/services
# 第一栏为 daemon 的名称、第二栏为该 daemon 所使用的埠号与网络数据封 包协定

17.2.6 关闭网络服务

基本上,会产生一个网络监听端口 (port) 的程序,你就可以称他是个网络 服务了

# 观察网络端口
netstat -tlunp
# 查找 rsync 相关的服务
systemctl list-units --all | grep rsync

# 关闭服务
systemctl stop rsyncd.service
systemctl disable rsyncd.service

17.3 systemctl 针对 service 类型的配置文件

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

服务的管理是通过 systemd,而 systemd 的配置文件大部分放置于 /usr/lib/systemd/system/ 目录内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软 件所提供的设置,建议不要修改!而要修改的位置应该放置于 /etc/systemd/system/ 目录内。 举例来说,如果你想要额外修改 vsftpd.service 的话, 他们建议要放置到哪些地方呢?

  • /usr/lib/systemd/system/vsftpd.service:官方释出的默认配置文件;

  • /etc/systemd/system/vsftpd.service.d/custom.conf:在 /etc/systemd/system 下面创建与 配置文件相同文件名的目录,但是要加上 .d 的扩展名。然后在该目录下创建配置文件即 可。另外,配置文件最好附文件名取名为 .conf 较佳! 在这个目录下的文件会“累加其他 设置”进入 /usr/lib/systemd/system/vsftpd.service 内喔!

  • /etc/systemd/system/vsftpd.service.wants/*:此目录内的文件为链接文件,设置相依服 务的链接。意思是启动了 vsftpd.service 之后,最好再加上这目录下面建议的服务。

  • /etc/systemd/system/vsftpd.service.requires/*:此目录内的文件为链接文件,设置相依 服务的链接。意思是在启动 vsftpd.service 之前,需要事先启动哪些服务的意思。

17.3.2 systemctl 配置文件的设置项目简介

[root@VM-72-146-centos ~]# cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

将整个设置分为三个部份,就是:

  • [Unit]: unit 本身的说明,以及与其他相依 daemon 的设置,包括在什么服务之后才启动 此 unit 之类的设置值;

  • [Service], [Socket], [Timer], [Mount], [Path]..:不同的 unit type 就得要使用相对应的设置 项目。我们拿的是 sshd.service 来当范本,所以这边就使用 [Service] 来设置。 这个项目 内主要在规范服务启动的脚本、环境配置文件文件名、重新启动的方式等等。

  • [Install]:这个项目就是将此 unit 安装到哪个 target 里面去的意思!

有些设置规则还是得要说明一下:

  • 设置项目通常是可以重复的,例如我可以重复设置两个 After 在配置文件中,不过,后面 的设置会取代前面的喔!因此,如果你想要将设置值归零, 可以使用类似“ After= ”的设 置,亦即该项目的等号后面什么都没有,就将该设置归零了 (reset)。

  • 如果设置参数需要有“是/否”的项目 (布林值, boolean),你可以使用 1, yes, true, on 代 表启动,用 0, no, false, off 代表关闭!

  • 空白行、开头为 # 或 ; 的那一行,都代表注解!

[Unit] 部份

设置参数 参数意义说明
Description 就是当我们使用 systemctl list-units 时,会输出给管理员看的简易说 明!当然,使用 systemctl status 输出的此服务的说明,也是这个项 目!
Documentation 这个项目在提供管理员能够进行进一步的文件查询的功能!提供的文 件可以是如下的数据:
Documentation=http://www….
Documentation=man:sshd(8)
Documentation=file:/etc/ssh/sshd_config
After 说明此 unit 是在哪个 daemon 启动之后才启动的意思!基本上仅是说 明服务启动的顺序而已,并没有强制要求里头的服务一定要启动后此 unit 才能启动。 以 sshd.service 的内容为例,该文件提到 After 后面 有 network.target 以及 sshd-keygen.service,但是若这两个 unit 没有 启动而强制启动 sshd.service 的话, 那么 sshd.service 应该还是能够 启动的!这与 Requires 的设置是有差异的喔!
Before 与 After 的意义相反,是在什么服务启动前最好启动这个服务的意思。 不过这仅是规范服务启动的顺序,并非强制要求的意思。
Requires 明确的定义此 unit 需要在哪个 daemon 启动后才能够启动!就是设置 相依服务啦!如果在此项设置的前导服务没有启动,那么此 unit 就不 会被启动!
Wants 与 Requires 刚好相反,规范的是这个 unit 之后最好还要启动什么服务 比较好的意思!不过,并没有明确的规范就是了!主要的目的是希望 创建让使用者比较好操作的环境。 因此,这个 Wants 后面接的服务如 果没有启动,其实不会影响到这个 unit 本身!
Conflicts 代表冲突的服务!亦即这个项目后面接的服务如果有启动,那么我们 这个 unit 本身就不能启动!我们 unit 有启动,则此项目后的服务就不 能启动! 反正就是冲突性的检查啦!

[Service] 部份

设置参数 参数意义说明
Type 说明这个 daemon 启动的方式,会影响到 ExecStart 喔!一般来说, 有下面几种类型
– simple:默认值,这个 daemon 主要由 ExecStart 接 的指令串来启动,启动后常驻于内存中。
– forking:由 ExecStart 启动 的程序通过 spawns 延伸出其他子程序来作为此 daemon 的主要服 务。原生的父程序在启动结束后就会终止运行。 传统的 unit 服务大 多属于这种项目,例如 httpd 这个 WWW 服务,当 httpd 的程序因为 运行过久因此即将终结了,则 systemd 会再重新生出另一个子程序持 续运行后, 再将父程序删除。据说这样的性能比较好!!
– oneshot: 与 simple 类似,不过这个程序在工作完毕后就结束了,不会常驻在 内存中。
– dbus:与 simple 类似,但这个 daemon 必须要在取得一个 D-Bus 的名称后,才会继续运行!因此设置这个项目时,通常也要设 置 BusName= 才行!
– idle:与 simple 类似,意思是,要执行这个 daemon 必须要所有的工作都顺利执行完毕后才会执行。这类的 daemon 通常是开机到最后才执行即可的服务!比较重要的项目大概是 simple, forking 与 oneshot 了!毕竟很多服务需要子程序 (forking),而有更多的动作只需要在开机的时候执行一次 (oneshot),例如文件系统的检查与挂载啊等等的。
EnvironmentFile 可以指定启动脚本的环境配置文件!例如 sshd.service 的配置文件写 入到 /etc/sysconfig/sshd 当中!你也可以使用 Environment= 后面接 多个不同的 Shell 变量来给予设置!
ExecStart 就是实际执行此 daemon 的指令或脚本程序。你也可以使用 ExecStartPre (之前) 以及 ExecStartPost (之后) 两个设置项目 来在实际启动服务前,进行额外的指令行为。 但是你得要特别注意的 是,指令串仅接受“指令 参数 参数…”的格式,不能接受 <, >, >>, |, & 等特殊字符,很多的 bash 语法也不支持喔! 所以,要使用这些特殊 的字符时,最好直接写入到指令脚本里面去!不过,上述的语法也不 是完全不能用,亦即,若要支持比较完整的 bash 语法,那你得要使 用 Type=oneshot 才行喔! 其他的 Type 才不能支持这些字符。
ExecStop 与 systemctl stop 的执行有关,关闭此服务时所进行的指令
ExecReload 与 systemctl reload 有关的指令行为
Restart 当设置 Restart=1 时,则当此 daemon 服务终止后,会再次的启动此 服务。举例来说,如果你在 tty2 使用文字界面登陆,操作完毕后登 出,基本上,这个时候 tty2 就已经结束服务了。 但是你会看到屏幕 又立刻产生一个新的 tty2 的登陆画面等待你的登陆!那就是 Restart 的功能!除非使用 systemctl 强制将此服务关闭,否则这个服务会源 源不绝的一直重复产生!
RemainAfterExit 当设置为 RemainAfterExit=1 时,则当这个 daemon 所属的所有程序 都终止之后,此服务会再尝试启动。这对于 Type=oneshot 的服务很 有帮助!
TimeoutSec 若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利“正常 启动或正常结束”的情况下,则我们要等多久才进入“强制结束”的状 态!
KillMode 可以是 process, control-group, none 的其中一种,如果是 process 则 daemon 终止时,只会终止主要的程序 (ExecStart 接的后面那串 指令),如果是 control-group 时, 则由此 daemon 所产生的其他 control-group 的程序,也都会被关闭。如果是 none 的话,则没有程 序会被关闭喔!
RestartSec 与 Restart 有点相关性,如果这个服务被关闭,然后需要重新启动 时,大概要 sleep 多少时间再重新启动的意思。默认是 100ms (毫 秒)。

[Install] 部份

设置参数 参数意义说明
WantedBy 这个设置后面接的大部分是 *.target unit !意思是,这个 unit 本身是附挂在 哪一个 target unit 下面的!一般来说,大多的服务性质的 unit 都是附挂在 multi-user.target 下面!
Also 当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也请 enable 的意 思!也就是具有相依性的服务可以写在这里呢!
Alias 进行一个链接的别名的意思!当 systemctl enable 相关的服务时,则此服 务会进行链接文件的创建!以 multi-user.target 为例,这个家伙是用来作为 默认操作环境 default.target 的规划, 因此当你设置用成 default.target 时,这个 /etc/systemd/system/default.target 就会链接到 /usr/lib/systemd/system/multi-user.target 啰!

17.3.3 两个 vsftpd 运行的实例

假设是这样:

  • 默认的 port 21:使用 /etc/vsftpd/vsftpd.conf 配置文件,以及 /usr/lib/systemd/system/vsftpd.service 设置脚本;

  • 特殊的 port 555:使用 /etc/vsftpd/vsftpd2.conf 配置文件,以及 /etc/systemd/system/vsftpd2.service 设置脚本。

# 1\. 先创建好所需要的配置文件
[root@study ~]# cd /etc/vsftpd 
[root@study vsftpd]# cp vsftpd.conf vsftpd2.conf 
[root@study vsftpd]# vim vsftpd.conf 
#listen_port=555

# 2\. 开始处理启动脚本设置
[root@study vsftpd]# cd /etc/systemd/system 
[root@study system]# cp /usr/lib/systemd/system/vsftpd.service vsftpd2.service 
[root@study system]# vim vsftpd2.service
[Unit] 
Description=Vsftpd second ftp daemon 
After=network.target 

[Service] 
Type=forking 
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf 

[Install] 
WantedBy=multi-user.target

# 3\. 重新载入 systemd 的脚本配置文件内容 
[root@study system]# systemctl daemon-reload
[root@study system]# systemctl list-unit-files --all | grep vsftpd
[root@study system]# systemctl status vsftpd2.service
[root@study system]# systemctl restart vsftpd.service vsftpd2.service 
[root@study system]# systemctl enable vsftpd.service vsftpd2.service 
[root@study system]# systemctl status vsftpd.service vsftpd2.service

[root@study system]# netstat -tlnp

17.3.4 多重的重复设置方式:以 getty 为例

CentOS 7 开机完成后,不是说有 6 个终端机可以使用吗?就是那个 tty1~tty6 的啊! 那个东西是由 agetty 这个指令达成的。 OK!那么这个终端机的功能又是从哪个项目所提供 的呢?其实,那个东东涉及很多层面,主要管理的是 getty.target 这个 target unit , 不过,实 际产生 tty1~tty6 的则是由 getty@.service 所提供的!

[root@VM-72-146-centos ~]# cat /usr/lib/systemd/system/getty@.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service getty-pre.target
After=rc-local.service

# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes

# On systems without virtual consoles, don't start any getty. Note
# that serial gettys are covered by serial-getty@.service, not this
# unit.
ConditionPathExists=/dev/tty0

[Service]
# the VT is cleared by TTYVTDisallocate
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes

# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=

[Install]
WantedBy=getty.target
DefaultInstance=tty1

注意 ExecStart 项目,-/sbin/agetty --noclear %I $TERM

man agetty 时,发现到它的语法应该是“ agetty –noclear tty1 ”之类的字样, 因此,我们如果要启动六个 tty 的时候,基本上应该要有 六个启动配置文件。亦即是可能会用到 getty1.service, getty2.service…getty6.service 才对! 哇!这样控管很麻烦啊~所以,才会出现这个 @ 的项目

先来看看 getty@.service 的上游,亦即是 getty.target

Wants=getty@tty1.service serial-getty@ttyS0.service
WantedBy=multi-user.target
Conflicts=shutdown.target
Before=multi-user.target
After=getty@tty1.service serial-getty@ttyS0.service

systemd 就会这么作:

  • 先看 /usr/lib/systemd/system/, /etc/systemd/system/ 有没有 getty@tty1.service 的设置, 若有就执行,若没有则执行下一步;

  • 找 getty@.service 的设置,若有则将 @ 后面的数据带入成 %I 的变量,进入 getty@.service 执行!

这也就是说,其实 getty@tty1.service 实际上是不存在的!他主要是通过 getty@.service 来 执行~也就是说, getty@.service 的目的是为了要简化多个执行的启动设置, 他的命名方式 是这样的:

原始文件:执行服务名称@.service 
可执行文件案:执行服务名称@范例名称.service

再回头看看 getty@.service 的启动脚本:

ExecStart=-/sbin/agetty --noclear %I $TERM

%I 指的就是“范例名称”!根据 getty.target 的信息输出来看,getty@tty1.service 的 %I 就是 tty1 啰!因此执行脚本就会变成“ /sbin/agetty –noclear tty1 ”! 所以我们才有办法 以一个配置文件来启动多个 tty1 给用户登陆啰!

将 tty 的数量由 6 个降低到 4 个

6 个 tty 是因为 systemd 的登陆配置文件 /etc/systemd/logind.conf 里面规范的

# 1\. 修改默认的 logind.conf 内容,将原本 6 个虚拟终端机改成 4 个
[root@study ~]# vim /etc/systemd/logind.conf 
[Login] 
NAutoVTs=4 
ReserveVT=0

# 2\. 关闭不小心启动的 tty5, tty6 并重新启动 getty.target 啰!
[root@study ~]# systemctl stop getty@tty5.service 
[root@study ~]# systemctl stop getty@tty6.service 
[root@study ~]# systemctl restart systemd-logind.service
# 暂时需要启动 tty8
systemctl start getty@tty8.service

暂时新增 vsftpd 到 2121 端口

根据前面 getty@.service 的说明,我们知道在启动的脚本设置当中, %i 或 %I 就是代表 @ 后面接的范例文件名的意思! 那我可以创建 vsftpd3.conf 文件,然后通过该文件来启动新 的服务

# 1\. 根据 vsftpd@.service 的建议,于 /etc/vsftpd/ 下面先创建新的配置文件
[root@study ~]# cd /etc/vsftpd 
[root@study vsftpd]# cp vsftpd.conf vsftpd3.conf 
[root@study vsftpd]# vim vsftpd3.conf 
listen_port=2121

# 2\. 暂时启动这个服务,不要永久启动他!
[root@study vsftpd]# systemctl start vsftpd@vsftpd3.service 
[root@study vsftpd]# systemctl status vsftpd@vsftpd3.service

17.3.5 自己的服务自己作

假设我要作一只可以备份自己系统的服务,这只脚本我放在 /backups 下面,内容有点像这样:

[root@study ~]# vim /backups/backup.sh 
#!/bin/bash 
source="/etc /home /root /var/lib /var/spool/{cron,at,mail}" 
target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz" 
[ ! -d /backups ] && mkdir /backups 
tar -zcvf ${target} ${source} &> /backups/backup.log 

[root@study ~]# chmod a+x /backups/backup.sh 
# 记得要有可执行的权限才可以喔!

设计一只名为 backup.service 的启动脚本设置

[root@study ~]# vim /etc/systemd/system/backup.service
[Unit] 
Description=backup my server 
Requires=atd.service 

[Service] 
Type=simple 
ExecStart=/bin/bash -c " echo /backups/backup.sh | at now" 

[Install] 
WantedBy=multi-user.target 
# 因为 ExecStart 里面有用到 at 这个指令,因此, atd.service 就是一定要的服务!
[root@study ~]# systemctl daemon-reload 
[root@study ~]# systemctl start backup.service 
[root@study ~]# systemctl status backup.service
# 为什么 Active 是 inactive 呢?这是因为我们的服务仅是一个简单的 script 啊! 
# 因此执行完毕就完毕了,不会继续存在内存中喔!

17.4 systemctl 针对 timer 的配置文件

在过去,我们大概都是使用 crond 这个服务来定期处理, 不过,既然现在有一直常驻 在内存当中的 systemd 这个好用的东西,加上这 systemd 有个协力服务,名为 timers.target 的家伙,这家伙可以协助定期处理各种任务!

systemd.timer 的优势

优点

  • 由于所有的 systemd 的服务产生的信息都会被纪录 (log),因此比 crond 在 debug 上 面要更清楚方便的多;

  • 各项 timer 的工作可以跟 systemd 的服务相结合;

  • 各项 timer 的工作可以跟 control group (cgroup,用来取代 /etc/secure/limit.conf 的功 能) 结合,来限制该工作的资源利用

  • 相对于 crond 最小的单位到分, systemd 是可以到秒甚至是毫 秒的单位

缺点

  • systemd 的 timer 并没有 email 通知的功能

  • 没有类似 anacron 的一段时间内的随机取样功能 (random_delay)

其他略

17.5 CentOS 7.x 默认启动的服务简易说明

使用 systemctl list-unit-files --type=service 去查询

下面的建议主要是针对 Linux 单机服务器的 角色来说明的,不是桌上型的环境喔!

CentOS 7.x 默认 启动的服务内容

服务名称 功能简介
abrtd (系统)abrtd 服务可以提供使用者一些方式,让使用者可以针对不 同的应用软件去设计错误登录的机制, 当软件产生问题时,使用者 就可以根据 abrtd 的登录文件来进行错误克服的行为。还有其他的 abrt-xxx.service 均是使用这个服务来加强应用程序 debug 任务 的。
accounts-daemon(可关 闭) (系统)使用 accountsservice 计划所提供的一系列 D-Bus 界面来 进行使用者帐号信息的查询。 基本上是与 useradd, usermod, userdel 等软件有关。
alsa-X(可关闭) (系统)开头为 alsa 的服务有不少,这些服务大部分都与音效有 关!一般来说, 服务器且不开图形界面的话,这些服务可以关闭!
atd (系统)单一的例行性工作调度,详细说明请参考第十五章。 抵挡 机制的配置文件在 /etc/at.{allow,deny} 喔!
auditd (系统)还记得前一章的 SELinux 所需服务吧? 这就是其中一项, 可以让系统需 SELinux 稽核的讯息写入 /var/log/audit/audit.log 中。
avahi-daemon(可关闭) (系统)也是一个用户端的服务,可以通过 Zeroconf 自动的分析与 管理网络。 Zeroconf 较常用在笔记本电脑与行动设备上,所以我们 可以先关闭他啦!
brandbot rhel-* (系统)这些服务大多用于开机过程中所需要的各种侦测环境的脚 本,同时也提供网络界面的启动与关闭。 基本上,你不要关闭掉这 些服务比较妥当!
chronyd ntpd ntpdate (系统)都是网络校正时间的服务!一般来说,你可能需要的仅有 chronyd 而已!
cpupower (系统)提供 CPU 的运行规范~可以参考 /etc/sysconfig/cpupower 得到更多的信息! 这家伙与你的 CPU 使 用情况有关喔!
crond (系统)系统配置文件为 /etc/crontab,详细数据可参考第十五章的 说明。
cups(可关闭) (系统/网络)用来管理打印机的服务,可以提供网络连线的功能, 有点类似打印服务器的功能哩! 你可以在 Linux 本机上面以浏览器的 http://localhost:631 来管理打印机喔!由于我们目前没有打印 机,所以可以暂时关闭他。
dbus (系统)使用 D-Bus 的方式在不同的应用程序之间传送讯息, 使 用的方向例如应用程序间的讯息传递、每个使用者登陆时提供的讯 息数据等。
dm-event multipathd (系统)监控设备对应表 (device mapper) 的主要服务,当然不 能关掉啊! 否则就无法让 Linux 使用我们的周边设备与储存设备 了!
dmraid-activation mdmonitor (系统)用来启动 Software RAID 的重要服务!最好不要关闭啦! 虽然你可能没有 RAID。
dracut-shutdown (系统)用来处理 initramfs 的相关行为,这与开机流程相关性较高 ~
ebtables (系统/网络)通过类似 iptables 这种防火墙规则的设置方式,设计 网卡作为桥接时的封包分析政策。 其实就是防火墙。不过与下面谈 到的防火墙应用不太一样。如果没有使用虚拟化,或者启用了 firewalld ,这个服务可以不启动。
emergency rescue (系统)进入紧急模式或者是救援模式的服务
firewalld (系统/网络)就是防火墙!以前有 iptables 与 ip6tables 等防火墙 机制,新的 firewalld 搭配 firewall-cmd 指令,可以快速的创建好你 的防火墙系统喔!因此,从 CentOS 7.1 以后,iptables 服务的启动 脚本已经被忽略了! 请使用 firewalld 来取代 iptables 服务喔!
gdm (系统)GNOME 的登陆管理员,就是图形界面上一个很重要的登 陆管理服务!
getty@ (系统)就是要在本机系统产生几个文字界面 (tty) 登陆的服务 啰!
hyper ksm libvirt* vmtoolsd (系统)跟创建虚拟机有关的许多服务!如果你不玩虚拟机, 那么 这些服务可以先关闭。此外,如果你的 Linux 本来就在虚拟机的环 境下,那这些服务对你就没有用!因为这些服务是让实体机器来创 建虚拟机的!
irqbalance (系统)如果你的系统是多核心的硬件,那么这个服务要启动, 因 为它可以自动的分配系统中断 (IRQ) 之类的硬件资源。
iscsi* (系统)可以挂载来自网络磁盘机的服务!这个服务可以在系统内 仿真好贵的 SAN 网络磁盘。 如果你确定系统上面没有挂载这种网 络磁盘,也可以将他关闭的。
kdump(可关闭) (系统)在安装 CentOS 的章节就谈过这东西,主要是 Linux 核心 如果出错时,用来纪录内存的东西。 鸟哥觉得不需要启动他!除非 你是核心骇客!
lvm2-* (系统)跟 LVM 相关性较高的许多服务,当然也不能关!不然系统 上面的 LVM2 就没人管了!
microcode (系统)Intel 的 CPU 会提供一个外挂的微指令集提供系统运行, 不过,如果你没有下载 Intel 相关的指令集文件,那么这个服务不需 要启动的,也不会影响系统运行。
ModemManager network NetworkManager* (系统/网络)主要就是调制解调器、网络设置等服务!进入 CentOS 7 之后,系统似乎不太希望我们使用 network 服务了, 比 较建议的是使用 NetworkManager 搭配 nmcli 指令来处理网络设置 ~所以,反而是 NetworkManager 要开,而 network 不用开哩!
quotaon (系统)启动 Quota 要用到的服务喔!
rc-local (系统)相容于 /etc/rc.d/rc.local 的调用方式!只是,你必须要让 /etc/rc.d/rc.local 具有 x 的权限后, 这个服务才能真的运行!否 则,你写入 /etc/rc.d/rc.local 的脚本还是不会运行的喔!
rsyslog (系统)这个服务可以记录系统所产生的各项讯息, 包括 /var/log/messages 内的几个重要的登录文件啊。
smartd (系统)这个服务可以自动的侦测硬盘状态,如果硬盘发生问题的 话, 还能够自动的回报给系统管理员,是个非常有帮助的服务喔! 不可关闭他啊!
sysstat (系统)事实上,我们的系统有只名为 sar 的指令会记载某些时间 点下,系统的资源使用情况,包括 CPU/流量/输入输出量等, 当 sysstat 服务启动后,这些纪录的数据才能够写入到纪录档 (log) 里面去!
systemd-* (系统)大概都是属于系统运行过程所需要的服务,没必要都不要 更动它的默认状态!
plymount* upower (系统)与图形界面的使用相关性较高的一些服务!没启动图形界 面时,这些服务可以暂时不管他!

其他服 务的简 易说明

服务名称 功能简介
dovecot (网络)可以设置 POP3/IMAP 等收受信件的服务,如果你的 Linux 主机是 email server 才需要这个服务,否则不需要启动他啦!
httpd (网络)这个服务可以让你的 Linux 服务器成为 www server 喔!
named (网络)这是领域名称服务器 (Domain Name System) 的服务, 这个服务 非常重要,但是设置非常困难!目前应该不需要这个服务啦! nfs nfs-
server (网络)这就是 Network Filesystem,是 Unix-Like 之间互相作为网络磁盘机 的一个功能。 smb
nmb (网络)这个服务可以让 Linux 仿真成为 Windows 上面的网络上的芳邻。 如 果你的 Linux 主机想要做为 Windows 用户端的网络磁盘机服务器,这玩意儿 得要好好玩一玩。
vsftpd (网络)作为文件传输服务器 (FTP) 的服务。
sshd (网络)这个是远端连线服务器的软件功能, 这个通讯协定比 telnet 好的地 方在于 sshd 在传送数据时可以进行加密喔!这个服务不要关闭他啦!
rpcbind (网络)达成 RPC 协定的重要服务!包括 NFS, NIS 等等都需要这东西的协 助!
postfix (网络)寄件的邮件主机~因为系统还是会产生很多 email 讯息!例如 crond / atd 就会传送 email 给本机用户! 所以这个服务千万不能关!即使你不是 mail server 也是要启用这服务才行!

原文地址:http://www.cnblogs.com/huangwenjie/p/16870710.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性