语境 :
- 截至 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
被转换为*.mount
systemd 单元。这些单元自动依赖于remote-fs.target
哪些依赖于“network-online.target”。
从文档,似乎 network*.target 依赖于网络管理工具来检测网络是否已启动等。这可以是NetworkManager
、systemd-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 守护程序并继续关机过程。
参考 :