Systemd使用笔记

systemd 是所有进程之母,负责将 Linux 主机启动到可以做生产性任务的状态。

虽然骂他的人挺多,但是依然无法阻挡其与Linux系统的耦合。

与其抵触,不如接受。

systemd服务

d代表daemon,也就是作为守护进程使用。他是系统的一号进程(PID1),在完成init之后,接管系统的启动部分。

systemd 目标

SystemV 运行级别

目标别名

描述

default.target

 

 

此目标总是通过符号连接的方式成为 multi-user.targetgraphical.target 的别名。systemd 始终使用 default.target 来启动系统。default.target 绝不应该设为 halt.targetpoweroff.targetreboot.target 的别名。

graphic.target

5

runlevel5.target

带有 GUI 的 multi-user.target

 

4

runlevel4.target

未用。在 SystemV 中运行级别 4 与运行级别 3 相同。可以创建并自定义此目标以启动本地服务,而无需更改默认的 multi-user.target

multi-user.target

3

runlevel3.target

所有服务在运行,但仅有命令行界面(CLI)。

 

2

runlevel2.target

多用户,没有 NFS,其它所有非 GUI 服务在运行。

rescue.target

1

runlevel1.target

基本系统,包括挂载文件系统,运行最基本的服务和主控制台的恢复 shell。

emergency.target

S

 

单用户模式:没有服务运行;不挂载文件系统。这是最基本的工作级别,只有主控制台上运行的一个紧急 Shell 供用户与系统交互。

halt.target

 

 

停止系统而不关闭电源。

reboot.target

6

runlevel6.target

重启。

poweroff.target

0

runlevel0.target

停止系统并关闭电源。

那么,如何编辑一个systemd Unit 的配置文件呢?

Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。

配置文件就是普通的文本文件,可以用文本编辑器打开。

systemctl cat命令可以查看配置文件的内容。

[Unit]
Description=111

[Service]
Type=forking
ExecStart=11111

[Install]
WantedBy=multi-user.target

配置文件

[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。

  • Description:简短描述

  • Documentation:文档地址

  • Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败

  • Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败

  • BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行

  • Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动

  • After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动

  • Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行

  • Condition...:当前 Unit 运行必须满足的条件,否则不会运行

  • Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败

[Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。

  • Type:定义启动时的进程行为。它有以下几种值。

    • Type=simple:默认值,执行ExecStart指定的命令,启动主进程

    • Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出

    • Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行

    • Type=dbus:当前服务通过D-Bus启动

    • Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行

    • Type=idle:若有其他任务执行完毕,当前服务才会运行

  • ExecStart:启动当前服务的命令

  • ExecStartPre:启动当前服务之前执行的命令

  • ExecStartPost:启动当前服务之后执行的命令

  • ExecReload:重启当前服务时执行的命令

  • ExecStop:停止当前服务时执行的命令

  • ExecStopPost:停止当其服务之后执行的命令

  • RestartSec:自动重启当前服务间隔的秒数

  • Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog

  • TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数

  • Environment:指定环境变量

[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。

  • WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中

  • RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中

  • Alias:当前 Unit 可用于启动的别名

  • Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit

官方文档在此:https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html

系统管理命令

Systemd拥有一组命令,涉及到系统管理的方方面面。

systemctl

systemctl是 Systemd 的主命令

管理系统

# 重启系统
sudo systemctl reboot

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

# CPU停止工作
sudo systemctl halt

# 暂停系统
sudo systemctl suspend

# 让系统进入冬眠状态
sudo systemctl hibernate

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

# 启动进入救援状态(单用户状态)
sudo systemctl rescue

管理UNIT

#启动 
sudo systemctl start xxx.service

#关闭: 
sudo systemctl stop xxx.service

#配置开机自启: 
sudo systemctl enable xxx.service

#取消开机自启: 
sudo systemctl disable xxx.service

#状态: 
sudo systemctl status xxx.service

#重启: 
sudo systemctl restart xxx.service

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

# 重新加载一个服务的配置文件
sudo systemctl reload xxx.service

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

# 显示某个 Unit 的所有底层参数
systemctl show httpd.service

# 显示某个 Unit 的指定属性的值
systemctl show -p CPUShares xxx.service

# 设置某个 Unit 的指定属性
sudo systemctl set-property xxx.service CPUShares=500

systemd-analyze

systemd-analyze命令用于查看启动耗时。

# 查看启动耗时
systemd-analyze                                                                                       

# 查看每个服务的启动耗时
systemd-analyze blame

# 显示瀑布状的启动过程流
systemd-analyze critical-chain

# 显示指定服务的启动流
systemd-analyze critical-chain atd.service

hostnamectl

hostnamectl命令用于查看当前主机的信息。

# 显示当前主机的信息
hostnamectl

timedatectl

timedatectl命令用于查看当前时区设置。

# 查看当前时区设置
timedatectl

# 显示所有可用的时区
timedatectl list-timezones                                                                                   

# 设置当前时区
sudo timedatectl set-timezone America/New_York
sudo timedatectl set-time YYYY-MM-DD
sudo timedatectl set-time HH:MM:SS

一个鸟人罢了