systemd入门和使用
systemd入门和使用
水海云 发表于3个月前
systemd入门和使用
  • 发表于 3个月前
  • 阅读 15
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: Linux系统的启动机制从sysvinit以来变革很小,虽然实用但不够简洁统一,而新的systemd机制提供了更友好的操作方式和统一接口,是时候升级改变了。

给 systemd 传达命令的主要工具是systemctl,它是一个命令行程序。该工具在改变配置文件或重新启动后台程序时需要 root 权限,但即使是非 root用户也能下达一些诊断的命令。 如果你在启动该命令时不加任何参数,你会看到一个系统启动时执行任务的“单位(unit)”列表,包括挂载及检测磁盘、启动后台服务及配置硬件。

服务

服务(service)单位是最重要的一类单位之一,因为它们管理着后台服务。挂载(mount)与自动挂载(automount)单位用来挂载文件系统。套接字(socket)单位用来创建套接字,并在访问套接字后,立即利用依赖关系间接地启动另一单位。你可以使用参数让 systemctl 只列出某个类型的单位,如所有的服务单位:

systemctl --type=service

systemd 自动将其输出结果递交给 less显示;你不仅可以使用箭头键来上下滚动,也可以向右滚动,因为有时更多的信息会偶尔“藏”到那里。

  • 第一栏是单位的名字
  • 第二栏则表示该单位的定义是否已由 systemd 正确加载。
  • 第三栏则告诉我们该单位是否正在运行。如果你使用了 -a 参数,那么该程序将仅显示非正在运行的单位,即已安装但并未在启动时使用的单位,同时也包含引导系统未能正常加载的单位文件(原因很可能为该单位文件出现错误)。
  • 第四栏则给出了当前状态:“exited”表示该进程已经无任何错误地完成,这种情况适用于一诸如进程在启动后并不在后台继续运行的情况,例如,在系统启动时由于考虑到兼容性因素执行在 sysvinit 里面常用的 /etc/rc.d/rc.local 文件的服务单位。“Running”表示正在后台运行的服务,如 cron、dbus、sshd 和 udev。不能启动或启动后崩溃的服务在第四栏中用红色标为“failed”(如果终端可以显示彩色)。
  • 第五栏是对该单位的描述。标有“LSB”或“SYSV”的单位已由 systemd 自动创建以管理传统启动脚本。

你可以如下命令来察看该服务是何时崩溃的以及在服务程序结束后提供了什么错误代码:

systemctl status ntpd.service

如果你想要通过挂起 NTPD 服务单位来让系统在启动时不通过 NTP 来同步系统时间,你可以使用下面的方式:

systemctl disable ntpd.service

在这里,systemctl 仅仅是移除了到 Wants 目录下面的服务单位的链接;同理,可用 systemctl enable 命令来创建一个链接以激活一项服务。也可以不使用 systemctl 而以手动创建(移除)链接的方式激活(挂起)单位。

服务的激活与挂起在该服务下一次启动或系统关闭后生效;下面的命令用来立即启动一项服务:

systemctl start ntpd.service

对于使用 sysvinit 的发行版,与之对应的命令是 service ntpd start。在 systemctl 命令之后使用 stop 参数来代替 start 则为停止一项服务。

通过由 systemctl 创建的控制组可以很容易地找出是哪项服务启动了哪些进程。system-cgls 可显示由 systemd 创建的 cgroup 层次(hierarchy)。

单位

创建单位用的系统配置文件位于 /lib/systemd/system/,但 /etc/systemd/system 目录下的同名文件会优先于前者。单位文件的定义通常比传统的 sysvinit 脚本要短得多。例如,用于通过 NTP 来同步网络时间的服务只有短短几行:

[Unit]
Description=Network Time Service
[Service]
ExecStart=/usr/bin/ntpd -g
[Install]
WantedBy=multi-user.target
  • 所有的单位文件都包含由[Unit]开头的一节,其中包含一般设置与简短介绍。
  • [Service]一节含有针对该服务要进行的任务的指定设置——对于 NTP 来说,仅需要启动该服务的命令行。如果需要用一个指定的命令来终止程序,你可以用 ExecStop= 来进行设置。这一步对于 NTP 守护进程是不需要的,因为根据 Unix 传统,它可以用一个简单的“SIGTERM”信号来结束。如果没有指定其他命令,这个命令会告诉 systemd 结束任务。
  • [Install]一节包含了 systemd 在(反)安装时要解释的说明;这里的 NTP 一例中,其内容意为在“多用户”目标激活时应当同步时间。

目标

“目标”单位的概念与 sysvinit 的运行级别相似;实际上,为考虑兼容性,systemd 甚至能够识别与目标对应的运行级别名称。所以你可以在引导装载程序中的 kernel 一行中加入 single 这个参数;systemd 就会激活rescue.target,提供一个相当于单用户模式的最小化界面。 在 systemd 中,多用户模式(即不使用图形化登陆界面就完全启动系统的模式)由 multi-user.target 表示,可以通过下面这个链接来将其设为默认启动目标:

ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

如果此后你确实需要默认启动图形化登陆界面,可用同样的方式来将 graphical.target 设为默认目标。这等同于传统初始化工具的运行级别 5。你也可以在引导装载程序中为 kernel 指定想要启动的目标单位:

systemd.unit=multi-user.target

如果想要在操作过程中激活一个不同的目标单位,你可以使用 systemctl 的 isolate 命令(需要 root 权限):

systemctl isolate rescue.target

切换为 rescue 目标对于管理任务来说很有用,systemd 这时会停止所有的用户登陆与后台服务,只有系统服务在运行,如监视逻辑卷的服务(lvm2-monitor)。有时甚至这些服务也需要停止并重新安装,这时你可以使用 emergency.target 来进入紧急模式(emergency mode),这时只有命令提示符的进程以及内核线程在运行。

依赖

systemctl show 命令提供了一些关于正在运行的单位和它们正在执行的任务的内部信息,以及关于 systemd 依赖于哪些单位来启用多用户模式的信息。

systemctl show -pWants multi-user.target

其他的目标也可能显示在输出中,如 multi-user.target 依赖于 basic.target。而后者又依赖于 sysinit.target,sysinit.target 依赖于 local-fs.target。这三个目标用于管理系统的基本配置,包括挂载文件系统和启动 udev。为指定对于基本目标(basic target)的依赖,单位配置文件 multi-user.target 包含了如下语句:

Requires=basic.target
After=basic.target

在使用 Requires 的同时指定 After 一行,systemd 就会知道它必须不仅启用该目标,而且需等待该目标完全启动后再继续进行其他任务。

Wants 是 Requires 的稍弱形式的替代语句,systemd 也会启用这些单位,但即使这些单位不能启动也会继续启动系统。这一类依赖也可以通过链接到单位文件来指定,单位文件位于含有该单位的路径、名称和一个 .wants的目录下。你可以使用 ls 或 systemctl 的 show 命令:

ls /*/systemd/system/multi-user.target.wants/
systemctl show -pWants multi-user.target

优化

启动故障

如果在启动时出现可能与 systemd 直接或间接相关的问题,请用以下参数启动 kernel:

systemd.log_target=kmsg systemd.log_level=debug

systemd 会识别这些参数并在终端提供全面的故障排除信息。同时,该信息也会保存在由 dmesg 创建的内核通知缓冲存储区(kernel notification buffer)以备过后分析。

命令行程序 poweroff、halt 及 reboot 是 systemd 的一部分,但也可以使用 systemctl 的命令关闭或重新启动系统。也可以这样重启系统:

systemctl kexec

在所有服务被终止后,systemd 告诉正在运行的内核直接启动一个预先配置好的 Linux 内核,这会让系统快速重新启动,因为它会直接跳过BIOS和引导装载程序,如果没有一个配置好的 kexec 内核,systemd 则会执行正常的重新启动过程。

自动挂载

对于其中的挂载任务,systemd 有一个自动挂载功能,可以为 /etc/fstab 中配置的挂载点创建虚拟挂载点(phseudo mount point)。虚拟挂载点直到存取时才真正挂载。在 /etc/fstab 中加入 comment=systemd.automount 一行可把任一挂载点变为自动挂载点。这样可以加快启动过程。这对于读取网络共享很有用,因为 WLAN 连接直到用户使用 NetworkManager 时才被建立。

停止服务

systemctl 可以用来在不知道一服务的 PID 时告诉 systemd 去发出信号。比如,下面的命令会让 rsyslogd 进入调试模式(debug mode),当你再次输入这个命令时,该服务会停止:

systemctl kill--signal=USR1 rsyslogd.service

如果你不指定发送哪一个信号,systemctl 会发送一个标准终止信号,会终止属于一服务的所有进程。

启动时间

systemd-analyze 命令会告诉你系统启动所用时间及其中有多少时间是用在内核、initramfs及由 systemd 控制的用户级配置上。 如果你想更深入地查看后一因素,可使用 systemd-analyze blame 来获知各个单位的启动时间。如需知道关于启动过程的更为详细的信息,该程序可创建一个用图表展示单位启动的 SVG 文件:

systemd-analyze plot<plot.svg

这可以用来寻找过分拖长启动时间的单位。

标签: systemd
共有 人打赏支持
粉丝 49
博文 109
码字总数 92537
×
水海云
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: