1.systemctl管理和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 对应的管理。当没有用户要求某 socket 或 port 时, 所要的 服务是不会被启动的。若有用户要求时, xinetd 总管才会去唤醒相对应的服务程 序。当该要求结束时,这个服务也会被结束掉~ 因为通过 xinetd 所总管,因此 这个家伙就被称为 super daemon。好处是可以通过 super daemon来进行服务的时 程、连线需求等的控制,缺点是唤醒服务需要一点时间的延迟。
服务的相依性问题:
服务是可能会有相依性的~例如,你要启动网络服务,但是系统没有网络, 那怎么
可能可以唤醒网络服务呢?如果你需要连线到外部取得认证服务器的连线,但该连线
需要另一个A服务的需求,问题是,A服务没有启动, 因此,你的认证服务就不可能
会成功启动的!这就是所谓的服务相依性问题。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 切换。 基本上 init 主要的功能都写在上头了,重要的指令包括 daemon 本身自己的脚本 (/etc/init.d/daemon) 、xinetd 这个特殊的总管程序 (super daemon)、设置默认开机启 动的 chkconfig, 以及会影响到执行等级的 init N 等。虽然CentOS 7 已经不使用 init 来管 理服务了,不过因为考虑到某些脚本没有办法直接塞入 systemd 的处理,此这些脚本还 是被保留下来,

systemctl管理机制

平行处理所有服务,加速开机流程:
旧的 init 启动脚本是“一项一项任务依序启动”的模式,因此不相依的服务也是得要一 个一个的等待。但目前我们的硬件主机系统与操作系统几乎都支持多核心架构了, 没道理未相依的服务不能同时启动啊!systemd 就是可以让所有的服务同时启动,因 此你会发现到,系统启动的速度变快了!
一经要求就回应的 on-demand 启动方式:
systemd 全部就是仅有一只 systemd 服务搭配 systemctl 指令来处理,无须其他额外的 指令来支持。不像 systemV 还要 init, chkconfig, service… 等等指令。 此外, systemd 由于常驻内存,因此任何要求 (on-demand) 都可以立即处理后续的 daemon 启动的 任务。
服务相依性的自我检查:
由于 systemd 可以自订服务相依性的检查,因此如果 B 服务是架构在 A 服务上面启 动的,那当你在没有启动 A 服务的情况下仅手动启动 B 服务时, systemd 会自动帮 你启动 A 服务喔!这样就可以免去管理员得要一项一项服务去分析的麻烦~(如果 读者不是新手,应该会有印象,当你没有启动网络, 但却启动 NIS/NFS 个开 机时的 timeout 甚至可达到 10~30 分钟…)
依 daemon 功能分类:
systemd 旗下管理的服务非常多,包山包海啦~为了厘清所有服务的功能,因此,首
先 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 的启动设置时,务必要取消互动机制~(连通过启动时传进的标准输入讯息 也要避免!)

2.system的基础知识

1.配置文件放置地点

/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/ 下面的喔!因此如果你想要修改某个服务启动的
设置,应该要去 /usr/lib/systemd/system/ 下面修改才对!
/etc/systemd/system/ 仅是链接到
正确的执行脚本配置文件而已。所以想要看执行脚本设置,应该就得要到
/usr/lib/systemd/system/ 下面去

2.system定义的Unit类型

image.png

3.system的命令

systemctl命令:

  1. [root@study ~]# systemctl [command] [unit]
  2. command 主要有:
  3. start :立刻启动后面接的 unit
  4. stop :立刻关闭后面接的 unit
  5. restart :立刻关闭后启动后面接的 unit,亦即执行 stop start 的意思
  6. reload :不关闭后面接的 unit 的情况下,重新载入配置文件,让设置生效
  7. enable :设置下次开机时,后面接的 unit 会被启动
  8. disable :设置下次开机时,后面接的 unit 不会被启动
  9. status :目前后面接的这个 unit 的状态,会列出有没有正在执行、开机默认执行否、登录等信息等!
  10. is-active :目前有没有正在运行中
  11. is-enable :开机时有没有默认要启用这个 unit
  12. 范例一:看看目前 atd 这个服务的状态为何?
  13. [root@study ~]# systemctl status atd.service
  14. atd.service - Job spooling tools
  15. Loaded: loaded
  16. (/usr/lib/systemd/system/atd.service; enabled
  17. Active: active
  18. running since Mon 2015-08-10 19:17:09 CST; 5h 42min ago
  19. Main PID: 1350 atd
  20. CGroup: /system.slice/atd.service
  21. └─1350 /usr/sbin/atd -f
  22. Aug 10 19:17:09 study.centos.vbird systemd[1]: Started Job spooling tools.
  23. # 重点在第二、三行喔~
  24. # Loaded:这行在说明,开机的时候这个 unit 会不会启动,enabled 为开机启动,disabled 开机不会启动
  25. # Active:现在这个 unit 的状态是正在执行 (
  26. running 或没有执行
  27. dead
  28. # 后面几行则是说明这个 unit 程序的 PID 状态以及最后一行显示这个服务的登录文件信息!
  29. # 登录文件信息格式为:“时间” “讯息发送主机” “哪一个服务的讯息” “实际讯息内容”
  30. # 所以上面的显示讯息是:这个 atd 默认开机就启动,而且现在正在运行的意思!
  31. 范例二:正常关闭这个 atd 服务
  32. [root@study ~]# systemctl stop atd.service
  33. [root@study ~]# systemctl status atd.service
  34. atd.service - Job spooling tools
  35. Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled
  36. Active: inactive dead since Tue 2015-08-11 01:04:55 CST; 4s ago
  37. Process: 1350 ExecStart=/usr/sbin/atd -f $OPTS code=exited, status=0/SUCCESS
  38. Main PID: 1350 code=exited, status=0/SUCCESS
  39. Aug 10 19:17:09 study.centos.vbird systemd[1]: Started Job spooling tools.
  40. Aug 11 01:04:55 study.centos.vbird systemd[1]: Stopping Job spooling tools...
  41. Aug 11 01:04:55 study.centos.vbird systemd[1]: Stopped Job spooling tools.
  42. # 目前这个 unit 下次开机还是会启动,但是现在是没在运行的状态中!同时,
  43. # 最后两行为新增加的登录讯息,告诉我们目前的系统状态喔!

服务的几种状态
active (running):正有一只或多只程序正在系统中执行的意思,举例来说,正在执
行中的 vsftpd 就是这种模式。
active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执 行。 举例来说,开机或者是挂载时才会进行一次的 quotaon 功能,就是这模式! quotaon 不须一直执行~只须执行一次之后,就交给文件系去自行处理啰!通常用
bash shell 写的小型服务,大多是属于这种类型 (无须常驻内存)。
active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。举例来 说,打印的伫列相关服务就是这种状态! 虽然正在启动中,不过,也需要的有伫 列进来 (打印工作) 这样他才会继续唤醒打印机服务来进行下一步打印的能。
inactive:这个服务目前没有运行的意思。
既然 daemon 目前的状态就有这么多种了,那么 daemon 的默认状态有没可能除 了 enable/disable 之外,还有其他的情况呢?当然有!
enabled:这个 daemon 将在开机时被执行
disabled:这个 daemon 在开机时不会被执行
static:这个 daemon 不可以自己启动 (
enable 不可),不过可能会被其他的 enabled
的服务来唤醒 (相依属性的服务)
mask:这个 daemon 无论如何都无法被启动!因为已经被强制注销 (非除)。可 通过 systemctl unmask 方式改回原本状态

注销 服务的练习:

# 1. 保持刚刚的状态,关闭 cups.service,启动 cups.socket,然后注销 cups.servcie 
[root@study ~]# systemctl stop cups.service 
[root@study ~]# systemctl mask cups.service 
ln -s '/dev/null' '/etc/systemd/system/cups.service' 
# 喔耶~其实这个 mask 注销的动作,只是让启动的脚本变成空的设备而已! 
[root@study ~]# systemctl status cups.service 
cups.service 
Loaded: masked (/dev/null) 
Active: inactive (dead) since Tue 2015-08-11 23:14:16 CST; 52s ago 
[root@study ~]# systemctl start cups.service 
Failed to issue method call: Unit cups.service is masked. # 再也无法唤醒!

#########解除
[root@study ~]# systemctl unmask cups.service 
rm '/etc/systemd/system/cups.service'

4.使用systemctl查看所有的服务

1.systemctl命令

[root@study ~]# 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 
[root@study ~]# systemctl 
UNIT LOAD ACTIVE SUB DESCRIPTION 
proc-sys-fs-binfmt_mis... loaded active waiting Arbitrary Executable File Formats File System 
sys-devices-pc...:0:1:... loaded active plugged QEMU_HARDDISK 
sys-devices-pc...0:1-0... loaded active plugged QEMU_HARDDISK 
sys-devices-pc...0:0-1... loaded active plugged QEMU_DVD-ROM 
.....(中间省略)..... 
vsftpd.service loaded active running Vsftpd ftp daemon 
.....(中间省略)..... 
cups.socket loaded failed failed CUPS Printing Service Sockets 
.....(中间省略)..... 
LOAD = Reflects whether the unit definition was properly loaded. 
ACTIVE = The high-level unit activation state, i.e. generalization of SUB. 
SUB = The low-level unit activation state, values depend on unit type. 
141 loaded units listed. Pass --all to see loaded but inactive units, too. 
To show all installed unit files use 'systemctl list-unit-files'. 
# 列出的项目中,主要的意义是: 
# UNIT :项目的名称,包括各个 unit 的类别 (看扩展名) 
# LOAD :开机时是否会被载入,默认 systemctl 显示的是有载入的项目而已喔! 
# ACTIVE :目前的状态,须与后续的 SUB 搭配!就是我们用 systemctl status 观察时,active 的项目! 
# DESCRIPTION :详细描述啰 
# cups 比较有趣,因为刚刚被我们玩过,所以 ACTIVE 竟然是 failed 的喔!被玩死了! ^_^ 
# 另外,systemctl 都不加参数,其实默认就是 list-units 的意思! 
范例二:列出所有已经安装的 unit 有哪些? 
[root@study ~]# systemctl list-unit-files 
UNIT FILE STATE 
proc-sys-fs-binfmt_misc.automount static 
dev-hugepages.mount static 
dev-mqueue.mount static 
proc-fs-nfsd.mount static 
.....(中间省略)..... 
systemd-tmpfiles-clean.timer static 
336 unit files listed.

2.性比较高的 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 项目。基本上,我们最常使用的当然就是 multi-user 以及 graphical相关性比较高的 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 项目。基本上,我们最常使用的当然就是 multi-user 以及 graphical

3.切换到不同的tar.get

[root@study ~]# systemctl [command] [unit.target] 
选项与参数: 
command: 
get-default :取得目前的 target 
set-default :设置后面接的 target 成为默认的操作模式 
isolate :切换到后面接的模式 
范例一:我们的测试机器默认是图形界面,先观察是否真为图形模式,再将默认模式转为文字界面 
[root@study ~]# systemctl get-default graphical.target # 果然是图形界面喔! 
[root@study ~]# systemctl set-default multi-user.target 
[root@study ~]# systemctl get-default 
multi-user.target 
范例二:在不重新开机的情况下,将目前的操作环境改为纯文本模式,关掉图形界面 
[root@study ~]# systemctl isolate multi-user.target 
范例三:若需要重新取得图形界面呢? 
[root@study ~]# systemctl isolate graphical.target

5.systemctl分析各个服务之间的依赖性

正向查看 服务之间的依赖性

[root@study ~]# systemctl list-dependencies [unit] [--reverse] 
选项与参数: 
--reverse :反向追踪谁使用这个 unit 的意思! 
范例一:列出目前的 target 环境下,用到什么特别的 unit 
[root@study ~]# systemctl get-default 
multi-user.target 
[root@study ~]# systemctl list-dependencies 
default.target 
├─abrt-ccpp.service 
├─abrt-oops.service 
├─vsftpd.service 
├─basic.target 
│ ├─alsa-restore.service 
│ ├─alsa-state.service 
.....(中间省略)..... 
│ ├─sockets.target 
│ │ ├─avahi-daemon.socket 
│ │ ├─dbus.socket 
.....(中间省略)..... 
│ ├─sysinit.target 
│ │ ├─dev-hugepages.mount 
│ │ ├─dev-mqueue.mount 
.....(中间省略)..... 
│ └─timers.target 
│ └─systemd-tmpfiles-clean.timer 
├─getty.target 
│ └─getty@tty1.service 
└─remote-fs.target

反向 查看 查看每个target需要依赖的service

[root@study ~]# systemctl list-dependencies graphical.target 
graphical.target├─accounts-daemon.service 
├─gdm.service 
├─network.service 
├─rtkit-daemon.service 
├─systemd-update-utmp-runlevel.service 
└─multi-user.target 
├─abrt-ccpp.service 
├─abrt-oops.service 
.....(下面省略).....

6.查看端口号 和本地的服务对应的文件

[root@study ~]# cat /etc/services
….(前面省略)….
ftp 21/tcp
ftp 21/udp fsp fspd
ssh 22/tcp # The Secure Shell
(SSH) Protocol
ssh 22/udp # The Secure Shell
(SSH) Protocol
….(中间省略)….
http 80/tcp www www-http # WorldWideWeb HTTP
http 80/udp www www-http # HyperText Transfer Protocol
….(下面省略)….
# 这个文件的内容是以下面的方式来编排的:
# <该服务的说明>

7.sysytem配置文件的建立和配置

在鸟哥 P579

8.鸟哥对于本章节的重点

早期的服务管理使用 systemV 的机制,通过 /etc/init.d/*, service, chkconfig, setup 等指
令来管理服务的启动/关闭/默认启动;

从 CentOS 7.x 开始,采用 systemd 的机制,此机制最大功能为平行处理,并采单一指
令管理 (systemctl),开机速度加快!
systemd 将各服务定义为 unit,而 unit 又分类为 service, socket, target, path, timer 不
同的类别,方便管理与维护
启动/关闭/重新启动的方式为: systemctl [start|stop|restart] unit.service
设置默认启动/默认不启动的方式为: systemctl [enable|disable] unit.service
查询系统所有启动的服务用 systemctl list-units —type=service 而查询所有的服务 (含
不启动) 使用 systemctl list-unit-files —type=service
systemd 取消了以前的 runlevel 概念 (虽然还是有相容的 target),转而使用不同的
target 操作环境。常见操作环境为 multi-user.targer 与 graphical.target。 不重新开机而
转不同的操作环境使用 systemctl isolate unit.target,而设置默认环境则使用 systemctl
set-default unit.target
systemctl 系统默认的配置文件主要放在 /usr/lib/systemd/system,管理员若要修改或自
行设计时,则建议放在 /etc/systemd/system/ 目录下。
管理员应使用 man systemd.unit, man systemd.service, man systemd.timer 查询
/etc/systemd/system/ 下面配置文件的语法, 并使用 systemctl daemon-reload 载入后, 才能自行撰写服务与管理服务喔! 除了 atd 与 crond 之外,可以 通过 systemd.timer 亦即 timers.target 的功能,来使用 systemd 的时间管理功能。 一些不需要的服务可以关闭喔!