Debian systemd network-online.target không hoạt động?


24

Tôi đang cố gắng tạo một dịch vụ systemd trên Debian Jessie. Tôi cần nó để bắt đầu sau khi network-online.targetđạt được.

Vấn đề là network-online.targetcháy cùng lúc network.targetvà tại thời điểm đó các giao diện của tôi chưa được cấu hình, chỉ bắt đầu truy vấn DHCP.

Có vẻ như vấn đề này là dành riêng cho Debian vì nó sử dụng cấu hình mạng cũ.

Làm thế nào để bỏ qua vấn đề này hoặc làm thế nào để làm network-online.targetviệc?


Đầu ra của systemctl list-dependencies network-online.targetcái gì? Ngoài ra, lưu ý rằng network-online.targetcó thể không cần thiết có nghĩa là có truy cập Internet. Xem này trang để biết thêm.
saiarcot895

Đầu ra của lệnh là: network-online.target ● └─systemd-networkd-wait-online.service Tôi đã đọc trang đó rồi, tôi hiểu khái niệm cơ bản ở đó, nhưng vẫn còn rất lạ khi không có điểm xác định nơi các dịch vụ quan trọng của mạng có thể bắt đầu. Ít nhất là nó có thể chờ phân công DHCP thích hợp.
10robinho

Điều này có nghĩa là network-online.targetchỉ phụ thuộc vào systemd-networkd-wait-online.servicecâu nói rằng nó đã sẵn sàng. Nó không phụ thuộc vào NetworkManager nói rằng nó đã sẵn sàng, cũng không kiểm tra xem ifupđã đưa tất cả các liên kết thành công (nếu bạn sử dụng phương pháp đó để định cấu hình mạng của mình). Mặt khác, Ubuntu phụ thuộc vào ifupvà NetworkManager, nhưng không phải systemd-networkd-wait-online..
saiarcot895

Bạn định cấu hình mạng của mình như thế nào: các tệp /etc/network/interfacessystemd .networkhoặc NetworkManager?
saiarcot895

Bạn đúng, network-online.targetnetwork.targetđược kích hoạt ngay sau đó ifup. Tôi sử dụng debian mặc định, vì vậy /etc/network/interfacesvới địa chỉ dhcp. Có vẻ như Networkd có thể là giải pháp tốt hơn, nhưng nó không đơn giản để thực hiện.
10robinho

Câu trả lời:


18

Vì bạn đang sử dụng /etc/network/interfaces, bạn sẽ cần một dịch vụ systemd để theo dõi trạng thái của từng giao diện. Kiểm tra xem bạn có /lib/systemd/system/ifup-wait-all-auto.service(được cài đặt bởi ifupdowngói trong Ubuntu 15.04). Nếu không, sau đó tạo /etc/systemd/system/ifup-wait-all-auto.servicevà dán vào sau:

[Unit]
Description=Wait for all "auto" /etc/network/interfaces to be up for network-online.target
Documentation=man:interfaces(5) man:ifup(8)
DefaultDependencies=no
After=local-fs.target
Before=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=2min
ExecStart=/bin/sh -ec '\
  for i in $(ifquery --list --exclude lo --allow auto); do INTERFACES="$INTERFACES$i "; done; \
  [ -n "$INTERFACES" ] || exit 0; \
  while ! ifquery --state $INTERFACES >/dev/null; do sleep 1; done; \
  for i in $INTERFACES; do while [ -e /run/network/ifup-$i.pid ]; do sleep 0.2; done; done'

[Install]
WantedBy=network-online.target

Đây là tệp dịch vụ như hiện tại trên hệ thống Ubuntu 15.04, nhưng với [Install]phần được thêm vào để giúp mọi việc dễ dàng hơn một chút. Tôi hy vọng rằng hành vi của ifupUbuntu 15.04 giống như hành vi của ifupDebian Jessie. Nếu không, một số sửa đổi sẽ là cần thiết (đặc biệt là với dòng cuối cùng).

Sau đó, chạy sudo systemctl enable ifup-wait-all-auto.service. Sau khi khởi động lại máy tính của bạn, bạn sẽ thấy rằng network-online.targetđã đạt được sau khi các giao diện được đưa lên (ít nhất là).


Cảm ơn nỗ lực, hãy để tôi thử ngay bây giờ và tôi sẽ cung cấp cho bạn thông tin phản hồi
10robinho

Cuối cùng tôi đã chạy phiên bản sửa đổi một chút ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'. Nó phụ thuộc vào hostnameviệc kiểm tra xem địa chỉ IP đã được chỉ định chưa.
luka5z

Đừng thử quay bác sĩ nó. không phải vì anh ấy đang sử dụng / etc / mạng / giao diện. Đó là bởi vì systemd rất cẩu thả và công việc được giảm tải cho mọi người dùng thay vì giải quyết vấn đề nơi nó được tạo ra.
Florian Heigl

1
fwiw, phiên bản ifup-wait-all-auto.serviceđã bị hủy trong ifupdownphiên bản 0.8.5ubuntu1: Drop Drop ifup-Wait-all-auto.service. Điều này đã được thực hiện tao nhã hơn bằng cách làm cho Cái muốn network-online.target = networking.service trực tiếp “. [Changelog ]
myrdd

0

Chú ý! Chỉ cần tìm ra nó trên một Raspbian Jessie: xóa TẤT CẢ các dòng nhận xét trong / etc / giao diện mạng và nó sẽ hoạt động! Nó có vẻ là một phân tích lỗi =) Trong trường hợp cụ thể của tôi, tôi đã nhận xét trái iface eth0 inet dhcpvà chỉ cần quên về nó kiếp trước, nhưng sau khi nâng cấp lên Raspbian Jessie và xây dựng lại một hạt nhân tôi đã có hành vi rất kỳ quặc: nó được sử dụng DHCP và từ chối thực hiện điều chỉnh từ / etc / mạng / giao diện. Vì vậy, tôi đã loại bỏ nó khỏi bất kỳ bình luận nào - chỉ là các dòng hoạt động, khởi động lại - và nó hoạt động! KHÔNG CẦN PHÙ HỢP / CHỈNH SỬA!


Interestin, tôi cần phải thử điều này. Mặc dù nó không có nhiều ý nghĩa :)
10robinho

2
Bạn có bất kỳ tài liệu tham khảo về điều này? Tôi muốn đọc (các) báo cáo lỗi và xem mã lỗi.
ʇsәɹoɈ

Không, tôi đã không mở một vé lỗi. Để tái tạo nó, chỉ cần thêm một số nhận xét trong /etc/network/interfacestệp của bạn - nó sẽ kích hoạt nếu nó vẫn ở đó.
Alexey Vesnin

0

Mỗi https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ cách đề nghị để bắt đầu một dịch vụ SAU mạng là mức là sử dụng " network-online.target " trong .service file:

 "After=network-online.target"
 "Wants=network-online.target"

Tuy nhiên, sau khi sử dụng " network-online.target " và dịch vụ của tôi không thành công vì mạng không hoàn toàn ở cấp độ, tôi phát hiện ra có một lỗi ( https://github.com/coreos/bugs/issues/1966 ) với nó: không được bảo đảm 100% không thể sai lầm.

Thật vậy, khi các công cụ cấu hình mạng động như "Trình quản lý mạng " được sử dụng như trong trường hợp này, trạng thái của mạng không bao giờ có thể chính xác 100% hoặc có thể dự đoán được. Rõ ràng từ liên kết mô tả lỗi, " network-online.target " có thể hoạt động không nhất quán tùy thuộc vào các ứng dụng khác nhau mà nó được sử dụng.

Giải pháp thay thế :
Bạn cần phân tích thứ tự khởi động của các dịch vụ và sử dụng một dịch vụ bắt đầu muộn hơn " network-online.target ":

 systemd-analyze plot > /home/pi/graph.svg

Đây là một quá trình lặp đi lặp lại thay đổi các mục tiêu tăng dần sang các dịch vụ sau này và sau đó cho đến khi bạn tìm thấy mục tiêu đảm bảo kết nối mạng ở mức độ và dịch vụ của bạn bắt đầu mà không gặp lỗi. Trong trường hợp của riêng tôi, tôi thậm chí đã phải đặt một sleep 10tập lệnh vào dịch vụ SystemD của mình.


0

Có lần tôi đã tìm thấy câu trả lời trên Github đã giải quyết nó bằng cách liên tục cố gắng ping máy chủ. Chỉ khi ping đến, dịch vụ mới tiếp tục:

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=<your command>

Tôi đã thay thế google.combằng máy chủ của riêng mình vì tập lệnh chính của tôi cần kết nối với máy chủ của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.