Redhat

systemd 在停止網路之前不會解除安裝 NFS 共享

  • October 20, 2016

語境 :

  • 截至 2016 年 10 月的 RHEL 7.2
  • 物理系統
  • 網路管理器已禁用
  • 通過將 2x10G NIC(eth0 和 eth1)組合為 lacp0 配置的網路
  • (不相關)在 VLAN 子介面 lacp0.XXX 和 lacp0.YYY 上配置 IP 地址
  • (也無關緊要)這些系統注定是Oracle 12c節點

網路連接 100% OK,基準測試確認 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 似乎依賴於網路管理工具來檢測網路是否正常等。這可以是NetworkManager,systemd-nerworkd或其他任何東西(但什麼?)。我認為我的問題可能在這裡,因為我們的 jumpstart 模板似乎依賴於舊的 init 腳本來管理介面。而且我懷疑 systemd 是否可以與它互動以獲知網路正在啟動或關閉(儘管被用來停止網路堆棧systemctl stop network

我的第二個假設是即使通過 ifcfg-* 文件使用 libteam/teamd 的網路組合不在 systemd network.target 範圍內。teamd systemd 單元(包括 teamd@lacp0.service)和網路單元之間似乎沒有依賴關係。這可以解釋為什麼顯示此問題的唯一系統是那些啟用了 LACP 的系統,而我們之前在使用典型綁定時沒有遇到此問題。

所以我的問題是:在我的網路堆棧被關閉之前,通常在重新啟動系統時,我必須確保我的 NFS 共享被解除安裝?

PS:如果上述解決方案不是來自創建 NFS 掛載的方式會更好,這樣必須向該伺服器添加共享的人不必被告知要採取的特殊步驟。考慮到我們的生產過程,這似乎幾乎是不可能的。

不幸的是,這個問題的唯一“正確”答案似乎是使用網路管理工具,目前是NetworkManager(紅帽最佳實踐)或systemd-networkd.

為了避免使用 NetworkManager,我們使用的解決方法是:

編輯/etc/systemd/system/teamd@.service.d/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 最多等待 30 秒以解除安裝 NFS 共享,然後再殺死 teamd 守護程序並繼續關閉過程。

參考 :

引用自:https://serverfault.com/questions/808398