Systemd 相关 

Last Update: 2023-10-16

目录

系统进程管理 systemctl

配置文件相关目录

systemd 的作用是管理系统服务,配置文件大部分放置于 /lib/systemd/system 内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设置,不建议修改。

修改后的配置文件应在 /etc/systemd/system 内。

举例,vsftpd.service 这个服务:

尽管直接改 /lib/systemd/system 文件也有效,但 软件升级时,系统会用新软件包内的新配置文件覆盖旧的配置文件

.service 文件中以横线开头的命令

比如 nginx.service 文件中有这么一段配置:

[Service]
...
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
...

可以看到,这个命令以 - 横线开头。

这意味着 systemd 会记录那些标志着命令执行失败的程序的退出代码 (即进程返回值非 0 或由于信号导致的退出),但不会产生进一步的影响。同时,忽略这些标志着命令执行失败的程序的返回值,将命令按照执行成功处理。

挂载硬盘

/etc/systemd/system/<name>.mount 配置硬盘自动挂载。

这里给一个例子 /etc/systemd/system/mnt-hgst8t2nd.mount:

[Install]
WantedBy=multi-user.target

[Mount]
Options=defaults
Type=ext4
What=/dev/disk/by-uuid/cd2949ed-9e14-4a34-a703-6dcbd761e9d3
Where=/mnt/hgst8t2nd

[Unit]
Description=Mount 2nd HGST 8T disk under /mnt/hgst8t2nd.

systemctl enable --now mnt-hgst8t2nd.mount 可以让硬盘开机自动挂载。

注意:

  1. 必须以 .mount 作为文件名结尾。
  2. .mount 文件的名称必须为 where 字段路径的内容。

比如,例子中 Where 字段为 Where=/mnt/hgst8t2nd 则对应的文件名必须是 mnt-hgst8t2nd.mount

网络管理 systemd-networkd

基础配置

systemd-neworkd 在管理多张网卡时,可以使用正则表达式匹配网卡,比如 eth* 匹配 eth0/eth1/... 等等网卡。在 /etc/systemd/network/00-dhcp.network 配置如下:

[Match]
Name=eth*

[Network]
DHCP=ipv4

[DHCP]
ClientIdentifier=duid

相比 networking 服务默认将网卡的 MAC 地址作为 DHCP 的 Client ID ,systemd-networkd 可以有更多的选择:

  1. mac 表示使用网卡 MAC 地址;
  2. duid默认值,表示使用符合 RFC4361 规范的客户端 ID ( 也就是 IAID 与 DUID 的组合 );
  3. duid-only 表示使用 DUID ( 可能与 RFC 规范不兼容,但某些场合需要这样做 )。

虚拟机中的 DHCP 客户端标识

在对使用 systemd-networkd 的 KVM 虚拟机进行复制时,如果不对 systemd-networkd 进行配置,即使生成了新的 MAC 地址,路由器可能依旧会给虚拟机分配上次得到的 IP 地址。

这是因为 systemd-networkd 默认使用 duid 作为 DHCP 客户端标识,而 duid 依赖 /etc/machine-id。

所有虚拟机的都是基于同一个原始 qcow2 镜像,而在复制过程中并没有改变 /etc/machine-id 的内容,相当于所有新的虚拟机使用了同一个 /etc/machine-id。最终 DHCP 服务器收到的所有请求来源于同一个 duid,因此分配同样的IP给客户端。

最终的配置要把

[DHCP]
ClientIdentifier=duid

改为:

[DHCP]
ClientIdentifier=mac

DNS 管理 systemd-resolved

systemd-resolved 服务在本地的 53 端口建立了一个 DNS stub resolver 服务器。

DNS stub resolver 只把查询转发到上游 DNS,自己不做解析,通常用于在本地主机或网络上引入 DNS 缓存。

在 /etc/systemd/resolvd.conf 设定 DNSStubListener=no 以后可以关闭 DNS stub resolver,这个操作可以解放本机的 53 端口。

systemd-resolved 有四种不同的模式来处理域名解析:

使用哪个模式完全取决于 /etc/resolv.conf 是否为软连接,以及该软连接指向的目标。不需要特别的配置。

时间管理 timedatectl

执行 timedatectl 可以看到系统目前的时间设定:

               Local time: Sat 2020-04-18 04:54:50 CST
           Universal time: Fri 2020-04-17 20:54:50 UTC
                 RTC time: Fri 2020-04-17 12:54:52
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
              NTP service: active
          RTC in local TZ: no

timedatectl list-timezones 列出所有的时区,并且找到需要的那个:


Asia/Samarkand
Asia/Seoul
Asia/Shanghai
Asia/Singapore
Asia/Srednekolymsk

最后 timedatectl set-timezone Asia/Shanghai 设定时区,设定完成后会自动对时。

主机名管理 hostnamectl

主机名分 3 类: static (静态主机名), pretty (好看、易读的主机名) 和 transient (临时的)。和主机名有关的文件为 /etc/hostname,它是在系统初始化的时候被读取的,并且内核根据它的内容设置 transient 主机名。

/etc/hostname 文件中的 static 主机名即时、永久生效。修改后执行 hostname 或者 uname -n 可以直接获取到,重启后也按照此文件的主机名进行初始化。

/etc/hostname 文件中没有存储主机名时,系统启动过程中内核会将 transient 主机名初始化为 localhost.localdomain

RedHat 系系统的 /etc/sysconfig/network 文件中设置的主机名不再生效。

查看主机名:

hostnamectl
# 或
hostnamectl status
# 或
hostnamectl [--pretty | --static | --transient] status

设置主机名:

hostnamectl [--pretty | --static | --transient] set-hostname <name>

在修改了 pretty 主机名时,将取 pretty 名的简化部分作为 static 和 transient 主机名。

给设置主机名的命令传递一个空的字符串 hostnamectl set-hostname "" 可以将主机名重设为默认值。