伺服器無法在啟動時綁定到地址
我正在處理 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.device
,network-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
按預期工作,您需要啟用 serviceNetworkManager-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.target
,systemctl 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 的角度來看),這並沒有說明它正在啟動和配置。所以這也不是一個選擇。