我正在调试systemd shutdown问题。这里的问题是在服务仍在运行时卸载了一些文件系统。
通常,我们希望systemd先关闭服务,然后卸载挂载点。
但是在这里,umount和停止服务正在并行发生。 (见下文)。首先还要卸载根文件系统。
# Unmounting /root...
Unmounting /var/lib/ntp...
Unmounting /etc/cron.d/local...
[ OK ] Stopped Apply Kernel Variables.
Unmounting /proc/fs/nfsd...
Unmounting /tmp/rshell/trace...
Stopping Availability of block devices...
Unmounting /etc/timestamp...
Unmounting /var/lib/nfs/rpc_pipefs...
Unmounting /etc/sysconfig/clock...
[ OK ] Removed slice system-getty.slice.
[ OK ] Stopped Load Kernel Modules.
Unmounting /etc/ssh/ssh_external_host_rsa_key...
[ OK ] Stopped Create Static Device Nodes in /dev.
Unmounting /mnt/log...
[ OK ] Stopped Resets System Activity Logs.
Stopping Crond Periodic Command Scheduler...
[ OK ] Stopped Mount Restricted SFTP Jail Folders.
[ OK ] Stopped Mount Restricted Shell Folders.
Stopping Runs processtat...
Unmounting /etc/ssh/ssh_external_host_ecdsa_key.pub...
[ OK ] Stopped target RPC Port Mapper.
Unmounting /boot...
Unmounting /srv...
Stopping Initializes network console logging...
[ OK ] Stopped Crond Periodic Command Scheduler.
[FAILED] Failed unmounting /root.
[ OK ] Unmounted /var/lib/ntp.
[ OK ] Unmounted /etc/cron.d/local.
**[FAILED] Failed unmounting /mnt/sysimg.**
[ OK ] Unmounted /etc/sysconfig/clock.
[ OK ] Unmounted /usr/share/cracklib.
**[FAILED] Failed unmounting /run/netns.**
[ OK ] Unmounted /tftpboot/state.
**[FAILED] Failed unmounting /tmp/ldap.**
我们如何在systemd中同步它?
通常,systemd-reboot.service依赖于final.target,shutdown.target和umount.target。
这看起来像是,umount.target和shutdown.target是并行执行的。
# cat /usr/lib/systemd/system/systemd-reboot.service
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Reboot
Documentation=man:systemd-halt.service(8)
DefaultDependencies=no
Requires=shutdown.target umount.target final.target
After=shutdown.target umount.target final.target
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl --force reboot
我试过了,umount.target依赖于shutdown.target,但没有帮助。总是这些umount和服务关闭似乎并行发生。如果我的理解有误,请更正。
请先提供一些提示/建议,以便先正确关闭服务,然后卸载挂载点。
答案 0 :(得分:1)
在您的服务部门中,尝试以下操作
BindsTo=mymount.mount
After=mymount.mount
mymount.mount
必须已经存在。就我而言,我让systemd根据/var/run/systemd/generator/mymount.mount
的内容生成/etc/fstab
。
BindsTo=
表示必须启动安装程序才能启动服务,如果停止安装,则必须停止服务。但是两个单元仍然可以(几乎)并行启动和停止。您需要另一个约束。服务启动之前,挂载必须达到活动状态。您将使用After=
实现这一目标。与其他systemd指令一样,After=
在启动过程中的操作在停止过程中会被反转:必须在挂载停止之前完全停止服务。
增加了相关文档。该文档没有提及停止过程中发生的情况,但我确认它可以像我们期望的那样工作。
BindsTo =
配置需求依赖性,样式与Requires =非常相似。但是,这种依赖关系类型更强:此外 达到Requires =的效果,它声明如果绑定到的单元是 停止,该单元也将停止。这意味着绑定到 另一个突然进入非活动状态的单元也将被停止。 单位可能会突然,意外地因各种原因进入非活动状态 原因:服务单元的主要过程可能会自行终止 选择,设备单元的后备设备可能已拔出或 在没有涉及的情况下可以卸载安装单元的安装点 系统和服务经理。
在同一单元上与After =结合使用时, BindsTo =甚至更强大。在这种情况下,单位必须严格遵守 该单元必须同时处于活动状态。 这不仅意味着与另一个单位绑定的单位突然进入 处于非活动状态,但也绑定到另一个单元 由于条件检查失败而被跳过(例如ConditionPathExists =, ConditionPathIsSymbolicLink =,…-参见下文)将被停止,应该 它正在运行。因此,在许多情况下,最好结合BindsTo = 使用After =。
在a.service上使用BindsTo = b.service时,此依赖项将显示 as boundBy = a.service在b.service的财产列表中。 BoundBy = 依赖关系不能直接指定。