Systemd

伺服器無法在啟動時綁定到地址

  • November 27, 2018

我正在處理 RHEL 7 中的一個已知 問題,即指定要綁定到的地址的服務將無法正確啟動。我發現了許多類似的報告,許多人說它們已經通過更新 systemd 得到解決,但我仍然面臨這個問題。這會影響我盒子上的所有服務(sshd、sshd、vsftpd、nginx),這些服務不僅僅綁定到 0.0.0.0。

我找到了各種假設的解決方法,但沒有一個能始終如一地為我工作。以 sshd 為例,config 如下所示:

Port 22
ListenAddress 192.168.242.225
...

這是我嘗試過的,單獨的和組合的:

來自https://bugzilla.redhat.com/show_bug.cgi?id=1352214#c4(我也嘗試過sys-subsystem-net-devices-eth1.devicenetwork-online.target但我懷疑這不會等待定址發生。)

mkdir /etc/systemd/system/sshd.service.d
tee /etc/systemd/system/sshd.service.d/wait.conf << 'EOF'
[Unit]
After=network-online.target
EOF

來自https://bugzilla.redhat.com/show_bug.cgi?id=1352214#c11

mkdir /etc/systemd/system/sshd.service.d
tee /etc/systemd/system/sshd.service.d/wait.conf << 'EOF'
[Unit]
Wants=network-online.target
After=network-online.target
EOF

來自https://bugzilla.redhat.com/show_bug.cgi?id=1438749#c0

systemctl add-wants multi-user.target network.target

從某處

mkdir /etc/systemd/system/sshd.service.requires
ln -s /usr/lib/systemd/system/network-online.target /etc/systemd/system/sshd.service.requires/

無論我嘗試什麼,我通常都會以“錯誤:綁定到 192.168.242.125 上的埠 22 失敗:無法分配請求的地址”結束。有時,一切都開始完美,我猜這是時間問題。

執行 Scientific Linux (RHEL) 7.5 並啟用網路管理器,所有 IP 定址都是靜態的。如果還有其他可能有幫助的細節,請告訴我。journalctl是啟動失敗後的輸出,After=network-online.target在 sshd 單元文件中。相關內容從第 1700 行開始。希望有人遇到此問題並成功解決!

如果您使用的是 NetworkManager,那麼為了network-online.target按預期工作,您需要啟用 service NetworkManager-wait-online.service,它實際上是等待網路上線以滿足該目標的服務。

需要將network-online.target其“掛鉤”到您的網路管理器中(由於 NetworkManager 不是唯一的選擇,因此還有 systemd-networkd 可用於管理網路。)

network-online.target使用 NetworkManager,您需要有一個/etc/systemd/system/network-online.target.wants/指向/usr/lib/systemd/system/NetworkManager-wait-online.service.

您可以通過啟用該服務來實際創建:

$ sudo systemctl enable NetworkManager-wait-online.service
Created symlink from /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service to /usr/lib/systemd/system/NetworkManager-wait-online.service.

一旦到位,依賴network-online.target應該開始工作,等到 NetworkManager 完成啟動它應該在啟動時啟動的所有介面。

為了幫助診斷該設置的任何問題,您可能還需要查看 和 的輸出systemctl status network-online.targetsystemctl status NetworkManager-wait-online.service因為它們可能對正在發生的事情有更多的線索。(特別是時間戳可能會有所幫助,如果依賴的守護程序在完成之前network-online.target啟動,那麼您的配置可能存在問題。) NetworkManager-wait-online.service


在您列出的解決方案中,我推薦這個:

# mkdir /etc/systemd/system/sshd.service.d
# tee /etc/systemd/system/sshd.service.d/wait.conf << 'EOF'
[Unit]
Wants=network-online.target
After=network-online.target
EOF

因為network-online.target是您真正想要的(以確保所有 IP 都已啟動等),並且包括Wants=確保將請求其啟動。

從其他方法來看,這個方法不起作用:systemctl add-wants multi-user.target network.target,因為它不會在服務本身(SSH 守護程序等)和完全啟動的網路之間創建任何依賴關係。這只是說您希望網路正常執行…

並且涉及/etc/systemd/system/sshd.service.requires/目錄的那個缺少After=依賴項(我認為這是必不可少的,而不是僅僅通過它來暗示.requires/。)如果您認為Requires=Wants=(它更強大,如果依賴項失敗會導致單元失敗),那麼我建議只使用它/etc/systemd/system/sshd.service.d/wait.conf,覆蓋文件絕對是管理此配置的更靈活的方式。

添加對 的依賴sys-subsystem-net-devices-eth1.device也無濟於事,因為這僅表明設備存在(從 udev 的角度來看),這並沒有說明它正在啟動和配置。所以這也不是一個選擇。

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