systemd 在停止網路之前不會解除安裝 NFS 共享
語境 :
- 截至 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
被轉換為*.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 單元(包括 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 守護程序並繼續關閉過程。
參考 :