Trên phụ thuộc cấu hình mạng systemd
Nó rất dễ ảnh hưởng đến đơn đặt hàng của systemd. Mặt khác, bạn cần cẩn thận về những gì một đơn vị hoàn thành đảm bảo.
Định cấu hình dịch vụ của bạn
Trên các hệ thống hiện tại, việc đặt hàng sau khi network.target
chỉ đảm bảo rằng dịch vụ mạng đã được bắt đầu, không phải là một số cấu hình thực tế. Bạn cần phải đặt hàng sau network-online.target
và kéo nó vào để đạt được điều đó.
[Unit]
Wants=network-online.target
After=network-online.target
Để tương thích với các hệ thống cũ hơn, bạn cũng có thể cần phải đặt hàng sau network.target.
[Unit]
Wants=network-online.target
After=network.target network-online.target
Đó là cho tập tin đơn vị dịch vụ của bạn và cho systemd.
Triển khai trong các phiên bản hiện tại của phần mềm
Bây giờ bạn cần đảm bảo rằng nó network-online.target
hoạt động như mong đợi (hoặc ít nhất là bạn có thể sử dụng network.target
).
Phiên bản hiện tại của NetworkManager cung cấp dịch vụ NetworkManager-wait-online.service
được kéo vào network-online.target
và do đó bởi dịch vụ của bạn. Dịch vụ đặc biệt này đảm bảo rằng dịch vụ của bạn sẽ đợi cho đến khi tất cả các kết nối được định cấu hình tự động bắt đầu thành công, không thành công hoặc hết thời gian.
Phiên bản hiện tại của systemd-networkd chặn dịch vụ của bạn cho đến khi tất cả các thiết bị được cấu hình theo yêu cầu. Điều dễ dàng hơn là hiện tại nó chỉ hỗ trợ các cấu hình được áp dụng khi khởi động (cụ thể hơn là thời gian khởi động của `systemd-networkd.service).
Để hoàn thiện, /etc/init.d/network
dịch vụ trong Fedora, như được giải thích bởi các phiên bản hiện tại của systemd, các khối network.target
và do đó gián tiếp chặn network-online.target
và dịch vụ của bạn. Đó là một ví dụ về việc thực hiện dựa trên kịch bản.
Nếu việc triển khai của bạn, dù dựa trên daemon hoặc dựa trên tập lệnh, hoạt động như một trong các dịch vụ quản lý mạng ở trên, nó sẽ trì hoãn việc bắt đầu dịch vụ của bạn cho đến khi cấu hình mạng được hoàn thành thành công, vì lý do chính đáng hoặc hết thời gian sau một thời gian hợp lý Khung để hoàn thành.
Bạn có thể muốn kiểm tra xem netctl có hoạt động theo cùng một cách không và thông tin đó sẽ là một bổ sung có giá trị cho câu trả lời này.
Triển khai trong các phiên bản cũ hơn của phần mềm
Tôi không nghĩ rằng bạn sẽ thấy một phiên bản systemd đủ cũ, nơi nó sẽ không hoạt động tốt. Nhưng bạn có thể kiểm tra rằng ít nhất là network-online.target
tồn tại và nó sẽ được đặt hàng sau network.target
.
NetworkManager trước đây chỉ đảm bảo rằng ít nhất một kết nối sẽ được áp dụng. Và ngay cả để điều đó hoạt động, bạn sẽ phải kích hoạt một NetworkManager-wait-online.service
cách rõ ràng. Điều này đã được cố định từ lâu ở Fedora nhưng chỉ mới được áp dụng gần đây.
systemctl enable NetworkManager-wait-online.service
Ghi chú về việc triển khai network.target và network-online.target
Bạn không cần phải làm cho phần mềm của mình phụ thuộc vào NetworkManager.service
hoặc NetworkManager-wait-online.service
bất kỳ dịch vụ cụ thể nào khác. Thay vào đó, tất cả các dịch vụ quản lý mạng nên tự đặt hàng trước network.target
và tùy chọn network-online.target
.
Một dịch vụ quản lý mạng dựa trên tập lệnh đơn giản sẽ hoàn tất cấu hình mạng trước khi thoát và nên tự đặt hàng trước network.target
và do đó gián tiếp trước network-online.target
.
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Một dịch vụ quản lý mạng dựa trên daemon cũng nên tự đặt hàng trước network.target
mặc dù nó không hữu ích lắm.
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
Một dịch vụ chờ daemon kết thúc sẽ tự đặt hàng sau dịch vụ cụ thể và trước đó network-online.target
. Nó nên được sử dụng Requisite
trên dịch vụ daemon để nó bị lỗi ngay lập tức nếu dịch vụ quản lý mạng tương ứng không được sử dụng.
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Gói nên cài đặt một liên kết tượng trưng đến dịch vụ chờ trong wants
thư mục network-online.target
để nó được kéo bởi các dịch vụ muốn chờ mạng được cấu hình.
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
Tài liệu liên quan
Ghi chú cuối cùng
Tôi hy vọng tôi không chỉ giúp trả lời câu hỏi của bạn tại thời điểm bạn hỏi mà còn góp phần cải thiện tình hình trong các bản phân phối ngược dòng và Linux, để bây giờ tôi có thể đưa ra câu trả lời tốt hơn có thể tại thời điểm viết bản gốc .