systemd
2019-03-28 13:49:16 0 举报
AI智能生成
systemd 入门
作者其他创作
大纲/内容
Unit 的配置文件
概述
每一个Unit都有一个配置文件,告诉Systemd怎么启动这个Unit
/etc/systemd/system/ ---> /usr/lib/systemd/system/
systemctl enable nginx.server
ln -s '/usr/lib/systemd/system/nginx.service' '/etc/systemd/system/multi-user.target.wants/nginx.service'
systemctl disable nginx.service
撤销符号链接关系,相当于撤销开机启动。
配置文件的状态
systemctl list-unit-files #列出所有的配置文件
systemctl list-unit-files --type=service #列出指定类型的配置文件
配置文件的四种状态
- enabled:已建立启动链接
- disabled:没建立启动链接
- static:该配置文件没有`[Install]`部分(无法执行),只能作为其他配置文件的依赖
- masked:该配置文件被禁止建立启动链接
- disabled:没建立启动链接
- static:该配置文件没有`[Install]`部分(无法执行),只能作为其他配置文件的依赖
- masked:该配置文件被禁止建立启动链接
systemctl status nginx.service #查看nginx状态
systemctl daemon-reload && systemctl restart nginx.service #修改配置文件后,让systemd重新加载配置文件再重新启动
配置文件格式
systemctl cat nginx.service #查看配置文件的内容
$ systemctl cat atd.service
[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target
[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target
配置文件分成几个区块。每个区块的第一行,是用方括号表示的区别名,比如`[Unit]`。注意,配置文件的区块名和字段名,都是大小写敏感的
配置文件的区块
[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 运行必须满足的条件,否则会报启动失败
- `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 运行必须满足的条件,否则会报启动失败
[Install]
通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动
- WantedBy`:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入`/etc/systemd/system`目录下面以 Target 名 + `.wants`后缀构成的子目录中
- `RequiredBy`:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入`/etc/systemd/system`目录下面以 Target 名 + `.required`后缀构成的子目录中
- `Alias`:当前 Unit 可用于启动的别名
- `Also`:当前 Unit 激活(enable)时,会被同时激活的其他 Unit
- `RequiredBy`:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入`/etc/systemd/system`目录下面以 Target 名 + `.required`后缀构成的子目录中
- `Alias`:当前 Unit 可用于启动的别名
- `Also`:当前 Unit 激活(enable)时,会被同时激活的其他 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`:指定环境变量
- `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`:指定环境变量
Target
Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。
传统的`init`启动模式里面,有 RunLevel 的概念,跟 Target 的作用很类似。不同的是,RunLevel 是互斥的,不可能多个 RunLevel 同时启动,但是多个 Target 可以同时启动。
systemctl list-unit-files --type=target #查看当前系统的所有Target
systemctl list-dependencies multi-user.target #查看一个Target包含所有的Unit
systemctl get-default #查看启动的默认Target
systemctl set-default multi-user.target #设置启动的默认Target
切换 Target时,默认不关闭前一个Target启动的进程,systemctl isolate 命令改变这种行为
systemctl isolate multi-user.target #关闭前一个Target里面所有不属于后一个Target的进程
Target 与 传统 RunLevel 的对应关系如下。
Traditional runlevel New target name Symbolically linked to...
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
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 统一管理所有 Unit 的启动日志只用`journalctl`一个命令,查看所有日志(内核日志和应用日志)日志的配置文件是`/etc/systemd/journald.conf
journalctl #查看所有日志
journalctl -k #查看内核日志(不显示应用日志
journalctl -b || journalctl -b -0 #查看系统本地启动日志
journalctl -b -1 #查看上一次启动的日志(需要更改设置)
# 查看指定时间的日志
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"
journalctl -n #显示尾部的最新10行日志
journalctl -f #实时滚动显示最新日志
journalctl /usr/lib/systemd/systemd #指定服务的日志
journalctl _PID=1 #指定进程的日志
journalctl /usr/bin/bash 查看某个路径脚本的日志
journalctl _UID=33 --since today #查看指定用户的日志
journalctl -u nginx.service || journalctl -u nginx.service --since today #查看某个Unit的日志
journalctl -u nginx.service -u php-fpm.service --since today #合并显示多个Unit的日志
journalctl -p err -b #查看指定优先级(及其以上级别)的日志,共有8级
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
journalctl --no-pager #日志默认分页输出 --no-pager 改为正常的标准输出
journalctl -b -u nginx.serviceqq -o json-pretty # 以 JSON 格式(多行)输出,可读性更好
journalctl --disk-usage # 显示日志占据的硬盘空间
journalctl --vacuum-size=1G 指定日志文件占据的最大空间
journalctl --vacuum-time=1years 指定日志文件保存多久
由来
历史上,Linux 的启动一直采用`init`进程。
$ sudo /etc/init.d/apache2 start
$ service apache2 start
$ service apache2 start
缺点
一是启动时间长。`init`进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
二是启动脚本复杂。`init`进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。
Systemd概述
Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。
使用了 Systemd,就不需要再用`init`了。Systemd 取代了`initd`,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。
$ systemctl --version
系统管理
systemctl 管理系统
reboot 重启系统
poseroff #关闭系统,切断电源
halt #cpu 停止工作
suspend #暂停系统
hibernate #让系统进入冬眠状态
hybrid-sleep #让系统进入交互式休眠状态
rescue #启动进入救援状态
systemd-analyze 查看启动耗时。
systemd-analyze #查看启动耗时
systemd-analyze blame #查看每个服务的启动耗时
system-analyze critical-chain #显示瀑布状的启动过程流
systemd-analyze critical-chain csphere-agenet.service #显示指定服务的启动流
hostnamectl 查看当前主机的信息
hostnamectl #显示当前主机的信息
hostnamectl set-hostname rhel7 #设置主机名
localectl 查看本地化设置
localectl #查看本地化设置
localectl set-locale LANG=en_GB.utf8 #设置本地化参数
localectl set-keymap en_GB
timedatectl 查看当前时区设置
timedatectl #查看当前时区设置
timedatectl list-timezones #显示所有可用的时区
timedatectl set-timezone America/New_York #设置当前时区
timedatectl set-time YYY-MM-DD
timedatectl set-time HH:MM:SS
loginctl 查看当前登陆的用户
loginctl list-sessions #列出当前session
loginctl list-users #列出当前登陆的用户
loginctl show-user ckh #列出显示指定用户的信息
Unit
含义
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:定时器
- 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 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
Unit 的状态
systemctl status #显示系统状态
systemctl status bluetooth.service #显示单个Unit的状态
systemctl -H root@node2 status httpd.service #显示远程主机的某个Unit的状态
Unit的管理
systemctl start nginx.service #启动一个服务
systemctl stop nginx.service #停止一个服务
systemctl restart nginx.service #重启一个服务
systemctl kill nginx.service #杀死一个服务的所有进程
systemctl reload nginx.service #重新加载服务的配置文件
systemctl show nginx.service #显示某个Unit的所有底层参数
systemctl show -p CPUShares httpd.service #显示某个Unit的指定属性的值
systemctl set-property httpd.service CPUShares=500 #设定某个 Unit的指定属性
依赖关系
Unit之间存再依赖关系:A依赖于B, 就意味着Systemd再启动Adequate时候,同时会去启动B
systemctl list-dependencies nginx.service #列出一个 Unit 的所有依赖。
systemctl list-dependencies --all nginx.service #包括赖的 Target类型
0 条评论
下一页