systemd 常见问题

journalctl

显示内核日志:

~# journalctl -k
~# journalctl -t kernel

显示当前启动的日志:

~# journalctl -b

如果启动了保存每次启动的日志,还可以列出启动列表:

~# journalctl --list-boots

按照时间范围显示日志:

~# journalctl --since yesterday --until "1 hour ago"

指定 --no-pager 参数可以完整显示日志,而不是分页显示:

~# journalctl --since "2 hour ago" --no-pager

显示最后 20 条日志:

~# journalctl -n 20

跟踪最新日志:

~# journalctl -f

显示设备单元

~# systemctl --all --full -t device

systemd-networkd

使用 networkctlnetworkctl list 命令显示网卡列表:

~# networkctl
IDX LINK TYPE     OPERATIONAL SETUP
  1 lo   loopback carrier     unmanaged
 12 eth0 ether    routable    configured

增加一个 DHCP 的网络配置:

~# cat > /etc/systemd/network/20-wired.network
[Match]
Name=eth0

[Network]
DHCP=yes

[DHCPv4]
UseDNS=no

或者静态地址的网络配置:

~# cat > /etc/systemd/network/20-wired.network
[Match]
Name=eth0

[Network]
Address=10.1.10.9/24
Gateway=10.1.10.1
DNS=10.1.10.1

配置完成之后就可以使用 networkctl reload 命令刷新。

systemd-resolved DNS 服务器

修改 /etc/systemd/resolved.conf 配置 DNS 服务器地址:

~# cat /etc/systemd/resolved.conf
[Resolve]
DNS=114.114.114.114

启动 systemd-resolved DNS 服务器:

~# systemctl start systemd-resolved
~# systemctl enable systemd-resolved

可以使用 resolvectlsystemd-resolve --status 命令确认 DNS 服务器状态。

如果不存在 /etc/resolv.conf 文件,也可以创建链接:

~# ln -sfn /usr/lib/systemd/resolv.conf /etc/resolv.conf

关机处理

关机脚本

systemd 在关机/重启等操作时会运行 /usr/lib/systemd/system-shutdown/ 目录下的所有可执行文件,命令参数为实际执行的操作:

  • poweroff
  • halt
  • reboot
  • kexec

关机服务

增加 systemd 服务,可以先为 [Unit] 指定 Before=shutdown.target,然后为 [Install] 指定 WantedBy=poweroff.target 就可以在关机前运行服务;

改为 WantedBy=reboot.target 可以在重启前运行服务。

运行时启用的服务

某些服务可能被禁用后也会在运行时启用:

~# systemctl is-enabled serial-getty@ttyAMA0.service
enabled-runtime

可以在 Generators 中查找依赖:

~# ls -l /run/systemd/generator/getty.target.wants/serial-getty@ttyAMA0.service
lrwxrwxrwx 1 root root 41 4月   2 01:37 /run/systemd/generator/getty.target.wants/serial-getty@ttyAMA0.service -> /lib/systemd/system/serial-getty@.service

如果需要强制禁用,可以:

~# systemctl mask serial-getty@ttyAMA0.service
Created symlink /etc/systemd/system/serial-getty@ttyAMA0.service → /dev/null.

此时的 is-enabled 状态:

~# systemctl is-enabled serial-getty@ttyAMA0.service
masked

也可以恢复:

~# systemctl unmask serial-getty@ttyAMA0.service
Removed /etc/systemd/system/serial-getty@ttyAMA0.service.