在systemd中停止服务之前卸载filesystem

时间:2018-02-08 13:51:11

标签: linux systemd system-shutdown system-dependent

我正在调试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和服务关闭似乎并行发生。如果我的理解有误,请更正。

请先提供一些提示/建议,以便先正确关闭服务,然后卸载挂载点。

1 个答案:

答案 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 =   依赖关系不能直接指定。