Systemd从字面意思上看,应该是系统守护进程的意思,所有的系统服务都是有Systemd来启动的,它的PID是1,取代原来CentOS6的init.d。
Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面,它包括了:systemctl、systemd-analyze、hostnamectl、localectl、 timedatectl、loginctl等多个管理工具。
CentOS7的systemd服务管理方式和centOS6的init的管理方式已经有了很大区别。最大的区别就是systemd是常驻内存的,因此执行速度比较快,并且实现了并发式的服务启动,解决了服务的依赖性问题。
systemctl是 Systemd 的主命令,用于管理系统和服务状态。
systemctl poweroff #系统关机 systemctl reboot #重新开机 systemctl suspend #进入暂停模式 systemctl hibernate #进入休眠模式 systemctl rescue #强制进入救援模式 systemctl emergency #强制进入紧急救援模式
Systemd 可以管理所有系统资源。不同的资源统称为 Unit(单位)。
Unit 一共分成12种类型:
类型 | 含义 |
---|---|
Service unit | 系统服务 |
Target unit | 多个 Unit 构成的一个组 |
Device Unit | 硬件设备 |
Mount Unit | 文件系统的挂载点 |
Automount Unit | 自动挂载点 |
Path Unit | 文件或路径 |
Scope Unit | 不是由 Systemd 启动的外部进程 |
Slice Unit | 进程组 |
Snapshot Unit | Systemd 快照,可以切回某个快照 |
Socket Unit | 进程间通信的 socket |
Swap Unit | swap 文件 |
Timer Unit | 定时器 |
#命令:systemctl [command] [unit] #command主要包含: start:启动unit stop:关闭unit restart:重启unit reload:重载unit的配置 enable:设置下次开机时,unit会被启动 disable:设置下次开机时,unit不会被启动 is-active :目前有没有正在运行中 is-enable :开机时有没有默认要启用这个unit show:显示某个 Unit 的所有底层参数
#命令:systemctl [command] [unit] #command主要包含: status:目前后面接的这个 unit 的状态,会列出有没有正在执行、开机默认执行否、登录等信息等。 is-active :目前有没有正在运行中 is-enable :开机时有没有默认要启用这个unit is-failed:启动失败的unit show:显示某个 Unit 的所有底层参数
#status显示的unit状态类型 #Loaded是下次开机启动的状态,有以下几种基本状态: enabled:这个daemon将在开机时被执行 disabled:这个daemon在开机时不会被执行 static:这个daemon不可以自己启动(enable不可),不过可能会被其他的enabled的服务来唤醒(依赖的服务) mask:这个daemon无论如何都无法被启动,因为已经被强制注销(非删除)。可通过 systemctl unmask 方式改回原本状态。 #Active是当前的状态,有以下几种基本状态: active (running):正有一只或多只程序正在系统中执行的意思,举例来说,正在执行中的vsftpd就是这种模式。 active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。 active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。 inactive:这个服务目前没有运行的意思。
范例一:看看目前 atd 这个服务的状态为何? [root@study ~]# systemctl status atd.service atd.service - Job spooling tools Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled) Active: active (running) since Mon 2015-08-10 19:17:09 CST; 5h 42min ago Main PID: 1350 (atd) CGroup: /system.slice/atd.service └─1350 /usr/sbin/atd -f Aug 10 19:17:09 study.centos.vbird systemd[1]: Started Job spooling tools. # Loaded:这行在说明,开机的时候这个 unit 会不会启动,enabled 为开机启动,disabled 开机不会启动 # Active:现在这个 unit 的状态是正在执行(running)或没有执行 (dead)
systemctl list-units # 列出正在运行的 Unit systemctl list-units --all # 列出所有Unit,包括没有找到配置文件的或者启动失败的 systemctl list-units --all --state=inactive # 列出所有没有运行的 Unit systemctl list-units --failed # 列出所有加载失败的 Unit systemctl list-units --type=service # 列出所有正在运行的、类型为 service 的 Unit
systemctl list-dependencies [unit] #列出unit依赖 systemctl list-dependencies --all [unit] #展开显示依赖关系 systemctl list-dependencies [unit] [--reverse] #反向查询依赖,unit被谁依赖
启动计算机的时候,需要启动大量的 Unit。如果每一次启动,都要一一写明本次启动需要哪些 Unit,显然非常不方便。Systemd 的解决方案就是 Target。
简单说,Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target 这个概念类似于"状态点",启动某个 Target 就好比启动到某种状态。
传统的init启动模式里面,有 RunLevel 的概念,跟 Target 的作用很类似。不同的是,RunLevel 是互斥的,不可能多个 RunLevel 同时启动,但是多个 Target 可以同时启动。例如
默认启动图形tatget,这个target又依赖了multi-user.target等其他target。
$ systemctl list-unit-files --type=target # 查看当前系统的所有 Target $ systemctl list-dependencies multi-user.target # 查看一个 Target 包含的所有 Unit $ systemctl get-default # 查看启动时的默认 Target $ sudo systemctl set-default multi-user.target # 设置启动时的默认 Target $ sudo systemctl isolate multi-user.target #切换 Target
graphical.target:就是文字加上图形界面,这个项目已经包含了下面的 multi-user.target. multi-user.target:纯文本模式. rescue.target:在无法使用root登陆的情况下,systemd在开机时会多加一个额外的暂时系统,与你原本的系统无关。 emergency.target:紧急处理系统的错误,还是需要使用root登陆的情况,在无法使用rescue.target 时,可以尝试使用这种模式. shutdown.target:就是关机的流程。 getty.target:可以设置你需要几个tty之类的,如果想要降低tty的项目,可以修改这个配置文件.
传统Runlevel | target name ->软链接 |
---|---|
Runlevel 0 | runlevel0.target -> poweroff.target |
Runlevel 1 | runlevel1.target -> rescue.target |
Runlevel 2 | runlevel2.target -> multi-user.target |
Runlevel 3 | runlevel3.target -> multi-user.target |
Runlevel 4 | runlevel4.target -> multi-user.target |
Runlevel 5 | runlevel5.target -> graphical.target |
Runlevel 6 | runlevel6.target -> reboot.target |
systemd与init进程的主要差别如下
1.默认的 RunLevel(在/etc/inittab文件设置)现在被默认的 Target 取代,位置是/etc/systemd/system/default.target,通常符号链接到graphical.target(图形界面)或者multi-user.target(多用户命令行)。
2.启动脚本的位置,以前是/etc/init.d目录,符号链接到不同的 RunLevel 目录 (比如/etc/rc3.d、/etc/rc5.d等),现在则存放在/lib/systemd/system和/etc/systemd/system目录。
3.配置文件的位置,以前init进程的配置文件是/etc/inittab,各种服务的配置文件存放在/etc/sysconfig目录。现在的配置文件主要存放在/lib/systemd目录,在/etc/systemd目录里面的修改可以覆盖原始设置。