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

背景:

  • RHEL 7.2截至2016年10月
  • 物理系统
  • NetworkManager已禁用
  • 通过将2x10G网卡(eth0和eth1)组合为lacp0来configurationnetworking
  • (不相关的)IP地址在VLAN子接口lacp0.XXX和lacp0.YYY上configuration
  • (也无关紧要)这些系统注定要成为Oracle 12c节点

networking连接是100%OK,基准testing证实LACPfunction完全正常,接近20 GBps理论最大值。

问题:

systemd在关机期间没有检测到networking堆栈已经停止,并且等到为时已经太晚才能卸载NFS共享,从而无法卸载它们,从而导致NFS服务器无限期地挂起以供NFS服务器响应。

症状:

运行“systemctl stop network.service”之后,network.target和network-online.target仍被视为活动的

我到目前为止:

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

从文档看来,networking* .target依赖于networkingpipe理工具来检测networking是否启动等。 这可以是NetworkManagersystemd-nerworkd ,或其他任何东西(但什么?)。 我想我的问题可能在这里,因为看起来我们的jumpstart模板依赖于旧的init脚本来pipe理接口。 我怀疑systemd可以与它交互,以获知networking正在启动或closures(尽pipe用于停止与systemctl stop network的networking堆栈)

我的第二个假设是,即使通过ifcfg- *文件使用libteam / teamd的networking组合也超出了systemd的network.target范围。 团队系统单元(包括[email protected])和networking单元似乎没有依赖关系。 这就解释了为什么唯一显示这个问题的系统是那些LACP支持的系统,而我们在使用典型的绑定之前没有这个问题。

所以我的问题:我有什么解决scheme,以确保我的NFS共享被卸载之前,我的networking堆栈被closures,通常是在重新启动系统?

PS:如果上述解决scheme不是来自创buildNFS挂载的方式,那么会更好,因此必须向此服务器添加共享的人员不必知道要采取的特殊步骤。 考虑到我们的生产stream程,这似乎几乎不可能

不幸的是,对这个问题唯一的“正确的”答案似乎是使用networkingpipe理工具,现在是NetworkManager (红帽最佳实践)或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卸载,但默认情况下不会等待它们完成。 然后,我们强制teamd @ .service(负责networking连接)等待最多30秒,以便卸载NFS共享,然后杀死teamd守护进程并继续closures进程。

参考文献

  • 红帽文档
  • systemd.unit手册页