background

Linux 的启动一直采用init进程。

$ sudo /etc/init.d/apache2 start
# 或者
$ service apache2 start

这种方法有两个缺点。

  • 启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。

  • 启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

Systemd

Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。 作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动

核心概念

Unit 表示不同的资源

表示不同类型的sytemd对象,通过配置文件进行标识和配置,文件中主要包含了系统服务,监听socket、保存的系统快照以及其他与init相关的信息
查看unitlei类型 systemctl -t help
unit 一共分为12种

  • Service unit:系统服务 文件后缀为 .service
  • Target unit:多个 Unit 构成的一个组 文件后缀为 .target 用于模拟实现运行级别
  • Device Unit:硬件设备 文件后缀为 .device
  • Mount Unit:文件系统的挂载点 文件后缀为 .mount
  • Automount Unit:自动挂载点 文件后缀为 .automount
  • Path Unit:文件或路径 文件后缀为 .path
  • Scope Unit:不是由 Systemd 启动的外部进程
  • Slice Unit:进程组
  • Snapshot Unit:Systemd 快照,可以切回某个快照 文件后缀为 .snapshot
  • Socket Unit:进程间通信的 socket 文件后缀为 .socket
  • Swap Unit:swap 文件 文件后缀为 .swap
  • Timer Unit:定时器 文件后缀为 .timer

使用systemctl控制单元时,通常需要使用单元文件的全名,包括扩展名,但是有些单元可以在systemctl中使用简写方式,如果无扩展名,systemctl默认把扩展名当做.service

查看unit

  • 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

Target

启动计算机的时候,需要启动大量的 Unit。如果每一次启动,都要一一写明本次启动需要哪些 Unit,显然非常不方便。Systemd 的解决方案就是 Target。

init运行级别与 target

传统的init启动模式里面,有 RunLevel 的概念,跟 Target 的作用很类似。不同的是,RunLevel 是互斥的,不可能多个 RunLevel 同时启动,但是多个 Target 可以同时启动。
/etc/inittab中的说明:systemd 使用 targets 代替了 runlevels

[root@iz2zecj7a5r32f2axsctb9z system]# cat cat /etc/inittab 
cat: cat: No such file or directory
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target

target 对应的runlevel

init 级别 target
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

与init进程的主要差别如下:

  • 默认的 RunLevel(在/etc/inittab文件设置)现在被默认的 Target 取代,位置是/etc/systemd/system/default.target,通常符号链接到graphical.target(图形界面)或者multi-user.target(多用户命令行)。

  • 启动脚本的位置,以前是/etc/init.d目录,符号链接到不同的 RunLevel 目录 (比如/etc/rc3.d、/etc/rc5.d等),现在则存放在/lib/systemd/system和/etc/systemd/system目录。

  • 配置文件的位置,以前init进程的配置文件是/etc/inittab,各种服务的配置文件存放在/etc/sysconfig目录。现在的配置文件主要存放在/lib/systemd目录,在/etc/systemd目录里面的修改可以覆盖原始设置。

# 查看当前系统所有的target
systemctl list-unit-files -t target
# 查看当前默认的 target
systemctl get-default
# 设置到其他的target
systemctl set-default TARGET.target

配置

Systemd 默认从目录/etc/systemd/system/读取配置文件。

  • /usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/initd.d
  • /run/system/system:系统执行过程中所产生的服务脚本,比上面的目录优先运行
  • /etc/system/system:管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行,在三者之中,此目录优先级最高

systemctl enable命令将/usr/lib/systemd/sytem 中的文件 与 /etc/systemd/system中文件建立软链接

systemctl enable nginx.service
#等同于
ln -s /usr/lib/systemd/system/nginx.service  /etc/systemd/system/multi-user.target.wants/nginx.service

配置文件

以iptables.service 为例

[Unit]    
Description=IPv4 firewall with iptables  # 描述信息
Before=network-pre.target   # 定义unit的启动顺序 表示当前unit应该在早于哪些unit启动
Wants=network-pre.target   # 依赖到的其他unit, 弱依赖
Before=ip6tables.service
After=syslog.target    # 表示当前unit应该在晚于哪些unit启动
AssertPathExists=/etc/sysconfig/iptables   # 当前 Unit 运行必须满足的条件,否则会报启动失败

[Service]  # 与特定类型相关的专用选项;此处为Service类型
Type=oneshot   # 定义影响ExecStart及相关参数的功能的unit进程启动类型
RemainAfterExit=yes   
ExecStart=/usr/libexec/iptables/iptables.init start  #启动当前服务的命令 
ExecReload=/usr/libexec/iptables/iptables.init reload  # 重启当前服务的命令
ExecStop=/usr/libexec/iptables/iptables.init stop  # 停止当前服务执行的命令
Environment=BOOTUP=serial   # 环境变量
Environment=CONSOLETYPE=serial 
StandardOutput=syslog   #标准输出
StandardError=syslog   # 错误输出
TimeoutSec=2  # 定义sytemd停止当前服务之前等待的秒数
RestartSec=2  # 自动重启当前服务间隔的秒数
Restart=always  # 定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog

[Install]
WantedBy=basic.target  # 被哪些units所依赖,弱依赖

Type 说明:

  • Type=simple:默认值,执行ExecStart指定的命令,启动主进程
  • Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
  • Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
  • Type=dbus:当前服务通过D-Bus启动
  • Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
  • Type=idle:若有其他任务执行完毕,当前服务才会运行

命令

Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

systemctl 系统管理

# 重启系统
systemctl reboot

# 关闭系统,切断电源
systemctl poweroff

# cpu停止工作
systemctl halt

# 暂停系统
systemctl suspend

# 系统进入冬眠状态
systemctl hibernate

# 系统进入交互式休眠状态
systemctl hybrid-sleep

# 启动救援模式
systemctl rescue

systemctl 服务管理

# 查看所有的单元
systemctl list-units

# 查看所有的配置文件
systemctl list-unit-files

# 显示单个unit的所有底层参数
systemctl show nginx.service

# 启动服务
systemctl start nginx.service

# 停止服务
systemctl stop nginx.service

# 重启服务
systemctl restart nginx.service

# 查看服务状态
systemctl status nginx.service

# 重载单个服务的配置文件
systemctl reload nginx.service

# 杀死一个服务的所有子进程
systemctl kill nginx.service

# 重载所有修改过的配置文件
systemctl daemon-reload

# 禁止自动和手动启动
systemctl mask nginx.service

# 取消禁止
systemctl unmask nginx.service

# 查看服务是否激活
systemctl is-active nginx.service

# 查看服务是否处于启动失败状态
systemctl is-failed nginx.service

# 查看服务是否建立了启动链接
systemctl is-enabled nginx.service

# 查看所有已经激活的服务
systemctl list-units -t (--type)  service

# 查看所有服务 包括开启和关闭的
systemctl list-units -t servcie -a

# 查看服务的状态
systemctl list-unit-files -t service -a

# 查看依赖关系
systemctl list-dependencies nginx.service

[root@iz2zecj7a5r32f2axsctb9z ~]# systemctl list-unit-files -t service
UNIT FILE STATE
aliyun-util.service enabled 表示开机启动
arp-ethers.service disabled 表示开启不启动
brandbot.service static 开机不启动,但可被另一个启用的服务激活

文档更新时间: 2021-01-16 04:40   作者:admin