目录

Systemd基本使用

概述

systemd是一个Linux系统基础组件的集合,提供了一个系统和服务管理器,运行为PID 1并负责启动其它程序。功能包括:

  • 支持并行化任务;
  • 同时采用socket式与D-Bus1总线式激活服务;
  • 按需启动守护进程(daemon);
  • 利用Linuxcgroups监视进程;
  • 支持快照和系统恢复;
  • 维护挂载点和自动挂载点;
  • 各服务间基于依赖关系进行精密控制。

Unit

systemd单元文件的语法来源于XDG桌面项配置文件.desktop文件,最初的源头则是Microsoft Windows的.ini文件。单元文件可以从多个地方加载:

示例:按优先级从低到高显示Unit加载目录
1
2
# 可以按优先级从低到高显示加载目录:
systemctl show --property=UnitPath 

输出结果类似如下:

1
UnitPath=/etc/systemd/system /run/systemd/system /run/systemd/generator /usr/local/lib/systemd/system

有效的Unit名称包含一个名称前缀加上.再加上Unit类型,如:test.service

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 定时器

Unit管理

查看Unit状态

systemctl status命令用于查看系统状态和单个Unit的状态。

以下是常用的查看Unit状态的示例:

1
2
3
4
5
6
7
8
# 显示系统状态
systemctl status

# 显示单个Unit状态
systemctl status nginx  # 显示nginx.service的状态

# 显示远程主机某个Unit的状态
systemctl -H [email protected] status sshd.service
启动服务
1
2
# 启动nginx服务
sudo systemctl start nginx.service
停止服务
1
2
# 停止nginx服务
sudo systemctl stop nginx.service
重启服务
1
2
# 重启nginx服务
sudo systemctl restart nginx.service
重新加载服务的配置文件
1
2
# 重新加载nginx的配置文件
sudo systemctl reload nginx.service

Unit配置

每一个Unit都有一个配置文件,告诉Systemd怎么启动这个Unit。

Unit通过区块来配置对应的信息,常用的区块信息如下:

[unit]

这个部分是用来记录一些与Unit相关的信息的,与Unit的类型无关

[install]

这个部分通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动

[service]

这个块用来Service的配置,只有Service类型的Unit才有这个区块。

systemd-resolve

该服务是systemd包的一部分,默认被安装。

systemd-resolved是一个systemd服务,它通过D-Bus接口、解析NSS 服务(nss-resolve(8) )和127.0.0.53上的本地DNS stub listener为本地应用程序提供DNS解析。

基本概念

NSS

名称服务交换(NSS)工具是GNU C库(glibc)的一部分,支持用于解析域名的getaddrinfoAPI。NSS允许系统数据库由单独的服务提供,其搜索顺序可以由管理员在nsswitch.conf(5) 中配置。负责域名解析的数据库是hosts数据库,glibc为其提供以下服务:

  • files:读取/etc/hosts文件,参见hosts(5)
  • dns:读取/etc/resolv.conf的glibc解析器,参见resolv.conf(5)

systemd为主机名解析提供三种NSS服务:

  • nss-resolve — 缓存DNS存根解析器,在systemd-resolved 中描述
  • nss-myhostname — 无需编辑/etc/hosts即可提供本地主机名解析
  • nss-mymachines — 为本地systemd-machined(8) 容器的名称提供主机名解析

配置

systemd-resolved为域名系统 (DNS)(包括DNSSEC和DNS over TLS)、多播DNS(mDNS)和链路本地多播名称解析(LLMNR)提供解析器服务。

可以通过编辑/etc/systemd/resolved.conf//etc/systemd/resolved.conf.d/中插入.conf文件来配置解析器。

resolvectl常用命令

查询DNS

1
2
3
4
5
6
7
-> resolvectl query www.baidu.com
www.baidu.com: 112.80.248.75                   -- link: eth0
               112.80.248.76                   -- link: eth0
               (www.a.shifen.com)

-- Information acquired via protocol DNS in 2.4ms.
-- Data is authenticated: no

查询DNS状态

1
resolvectl status

systemd-networkd

警告
即便这个服务是处在运行状态,Linux也可能不是由这个进程来管理网络。在ubuntu上,默认通过netplan进行网络管理。

systemd-networkd是一个管理网络配置的系统守护进程。它检测并配置出现的网络设备;它还可以创建虚拟网络设备。此服务对于为由systemd-nspawn管理的容器或虚拟机设置复杂的网络配置特别有用。它也适用于简单的连接。

systemd-journald

Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf

journalctl常用命令

查看所有日志

1
journalctl

查看内核日志

1
sudo journal -k

查看本次系统启动日志

1
journalctl -b

查看指定时间日志

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
journalctl --since="2021-06-30 00:00:00"

journalctl --since "20 min ago"

journalctl --since yesterday

journalctl --since "2015-01-10" --until "2015-01-11 03:00"

journalctl --since 09:00 --until"1 hour ago"

journalctl --since"15:15" --until now

查看指定Unit日志

1
2
3
4
# 查看ssh unit的日志
journalctl -u ssh.service
# 滚动查看ssh unit的日志
journalctl -u ssh.service -f

查看指定优先级日志

1
2
# 查看ssh.service在warning级别以上的日志信息
journalctl -p warning -u ssh.service

优先级可以有以下类别:

优先级 描述 备注
0 emerg
1 alert
2 crit
3 err
4 warning
5 notice
6 info
7 debug

显示日志占据的硬盘空间

1
journalctl --disk-usage

systemd-timesyncd

警告
Centos7.x系列是不支持这个服务的,对于Centos,更推荐使用chrony服务。

该组件用于时间同步。

常用语句

查看状态

1
sudo systemctl status systemd-timesyncd.service

配置

与NTP相关的配置文件在/etc/systemd/timesyncd.conf中,可以在这里面修改对应的ntp服务器。

示例:timesyncd配置文件
1
2
3
4
5
6
[Time]
NTP=ntp.fudan.edu.cn
#FallbackNTP=ntp.ubuntu.com
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

参考文献

Unit配置相关

  1. Unit配置官方文档
  2. systemd.service配置官方文档

systemd-resolve相关

  1. arch wiki
  2. NSS名字服务交换

systemd-networkd相关

  1. arch wiki

  1. D-BUS是一个提供简单的应用程序互相通讯的途径的自由软件项目,它是做为freedesktoporg项目的一部分来开发的,是一个3层架构的进程间通信系统(IPC)。 ↩︎