systemd 在停止网络之前不会卸载 NFS 共享

systemd 在停止网络之前不会卸载 NFS 共享

语境 :

  • 截至 2016 年 10 月为止的 RHEL 7.2
  • 物理系统
  • NetworkManager 已禁用
  • 通过将 2x10G NIC(eth0 和 eth1)组合配置为 lacp0 的网络
  • (不相关)在 VLAN 子接口 lacp0.XXX 和 lacp0.YYY 上配置 IP 地址
  • (同样不相关)这些系统注定是 Oracle 12c 节点

网络连接 100% 正常,基准测试确认 LACP 完全正常运行且接近 20 GBps 的理论最大值。

问题 :

systemd 没有检测到关机期间网络堆栈是否停止,并等到为时已晚才卸载 NFS 共享,因此无法卸载它们,这导致它无限期挂起以等待 NFS 服务器响应。

症状) :

运行“systemctl stop network.service”后,network.target 和 network-online.target 仍然被视为积极的

我目前所取得的进展是:

通过文件添加的 NFS 挂载/etc/fstab被转换为*.mountsystemd 单元。这些单元自动依赖于remote-fs.target哪些依赖于“network-online.target”。

文档,似乎 network*.target 依赖于网络管理工具来检测网络是否已启动等。这可以是NetworkManagersystemd-nerworkd或其他任何东西(但是什么?)。我认为我的问题可能出在这里,因为我们的 jumpstart 模板似乎依赖于旧的 init 脚本来管理接口。而且我怀疑 systemd 能否与它交互以获知网络是启动还是关闭(尽管它被用来停止网络堆栈systemctl stop network

我的第二个假设是,即使通过 ifcfg-* 文件使用 libteam/teamd 进行网络协作也超出了 systemd network.target 的范围。teamd systemd 单元(包括[电子邮件保护]) 和网络单元。这可以解释为什么只有启用了 LACP 的系统才会显示此问题,而我们之前使用典型绑定时没有遇到此问题。

所以我的问题是:我有什么解决方案来确保在我的网络堆栈关闭之前(通常是在重新启动系统时)卸载我的 NFS 共享?

附言:如果上述解决方案不是通过创建 NFS 挂载的方式实现的,那就更好了,这样需要向此服务器添加共享的人就不必被告知要采取的特殊步骤。考虑到我们的生产流程,这似乎几乎是不可能的。

答案1

不幸的是,这个问题的唯一“正确”答案似乎是使用网络管理工具,目前要么是NetworkManager(Red Hat 最佳实践),要么是systemd-networkd

为了避免使用 NetworkManager,我们使用的解决方法是:

编辑/etc/systemd/system/[email protected]/override.conf

[Unit]
Before=remote-fs.target

[Install]
WantedBy=network-online.target

[Service]
ExecStop=/bin/bash -c "while grep ' nfs ' /proc/mounts; do sleep 5; done"
TimeoutStopSec=30

此文件将连接到任何文件优先于teamd@<teamname>.service的系统模板/etc/systemd/system/*/usr/lib/systemd/system/

在停止时,systemd 将首先启动 NFS 卸载,但默认情况下不会等待它们完成。然后我们强制[电子邮件保护]负责网络连接,最多等待 30 秒以卸载 NFS 共享,然后再终止 teamd 守护程序并继续关机过程。

参考 :

相关内容