데비안 systemd network-online.target이 작동하지 않습니까?


24

데비안 Jessie에서 시스템 서비스를 만들려고합니다. network-online.target도달 한 후에 시작해야합니다 .

문제는 인터페이스가 아직 구성되지 않은 동시에 DHCP 쿼리를 시작한 시점과 network-online.target동시에 발생 network.target합니다.

이 문제는 레거시 네트워크 구성을 사용하기 때문에 데비안에만 해당되는 것 같습니다.

이 문제를 우회하거나 어떻게 network-online.target작동 시키는가?


출력은 systemctl list-dependencies network-online.target무엇입니까? 또한 network-online.target인터넷 액세스가 필요하지 않을 수도 있습니다. 자세한 내용은 페이지를 참조하십시오.
saiarcot895

명령의 출력은 다음과 같습니다. network-online.target ● └─systemd-networkd-wait-online.service 나는 이미 그 페이지를 읽었으며 거기에서 기본 개념을 이해하고 있지만 여전히 네트워크 크리티컬 서비스를 시작할 수있는 지점을 정의하지 않은 것은 매우 이상합니다. 적어도 적절한 DHCP 할당을 기다릴 수 있습니다.
10robinho

이것은 준비가 완료되었다는 말 network-online.target에만 의존 한다는 것을 의미합니다 systemd-networkd-wait-online.service. 네트워크 관리자가 준비되었다고 말하거나 ifup모든 링크를 성공적으로 가져 왔는지 확인하지 않습니다 (해당 방법을 사용하여 네트워크를 구성하는 경우). 반면 우분투는 ifup및 NetworkManager에 의존 하지만에 대한 것은 아닙니다 systemd-networkd-wait-online..
saiarcot895

네트워크 /etc/network/interfaces, 시스템 .network파일 또는 NetworkManager를 어떻게 구성하고 있습니까?
saiarcot895

당신 말이 맞아, network-online.target그리고 network.target직후에 트리거됩니다 ifup. /etc/network/interfacesdhcp 주소와 함께 데비안 기본값을 사용 합니다. 네트워크화 된 솔루션이 더 나은 것처럼 보이지만 구현하기가 쉽지 않습니다.
10robinho

답변:


18

를 사용하고 있으므로 /etc/network/interfaces각 인터페이스의 상태를 모니터링하려면 시스템 서비스가 필요합니다. /lib/systemd/system/ifup-wait-all-auto.service( ifupdownUbuntu 15.04 의 패키지로 설치되어 있는지) 확인하십시오 . 그렇지 않은 경우을 만들고 /etc/systemd/system/ifup-wait-all-auto.service다음을 붙여 넣습니다.

[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

이것은 Ubuntu 15.04 시스템에있는 서비스 파일이지만 [Install]조금 더 쉽게하기 위해 섹션이 추가되었습니다. 나는의 동작 바라고 ifup우분투 15.04에가의 동작과 동일 ifup데비안 제시한다. 그렇지 않은 경우, 특히 마지막 줄을 수정해야합니다.

그런 다음을 실행하십시오 sudo systemctl enable ifup-wait-all-auto.service. 컴퓨터를 다시 부팅 한 후 network-online.target인터페이스가 시작된 후에 도달 한 것을 확인할 수 있습니다 (적어도).


노력해 주셔서 감사합니다. 지금 사용해 봅시다. 피드백을 보내 드리겠습니다.
10robinho

약간 수정 된 버전을 실행했습니다 ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'. 이에 따라 hostnameIP 주소가 할당되어 있는지 확인합니다.
luka5z

그것을 스핀 닥터 시도하지 마십시오. 그가 / etc / network / interfaces를 사용하고 있기 때문이 아닙니다. systemd가 너무 조잡하고 작업이 생성 된 문제를 해결하는 대신 모든 사용자에게 작업이 오프로드되기 때문입니다.
Florian Heigl

1
fwiw, 버전 ifup-wait-all-auto.service에서 삭제되었습니다 : ”drop ifup-wait-all-auto.service. 이것은 network-online.target Wants = networking.service를 직접 만들어 더욱 우아하게 구현되었습니다.” [changelog ]ifupdown0.8.5ubuntu1
myrdd

0

주의! Raspbian Jessie에서 알아 냈습니다 : / etc / network 인터페이스에서 주석 처리 된 모든 줄을 제거하면 작동합니다! 파싱 ​​버그 인 것 같습니다. =) 특정 경우에는 코멘트를 남기고 iface eth0 inet dhcp방금 전에 잊어 버렸습니다. 그러나 Raspbian Jessie로 업그레이드하고 커널을 다시 빌드 한 후 매우 이상한 동작이 발생했습니다 .DHCP를 사용하고 거부했습니다. / etc / network / interfaces에서 조정하십시오. 그래서 나는 작업 라인, 재부팅 만하면 주석에서 그것을 제거했습니다. 스크립트 패치 / 편집이 필요하지 않습니다!


흥미롭게도 나는 이것을 시도해야한다. 이해가되지 않지만 :)
10robinho

2
이것에 대한 언급이 있습니까? 버그 보고서를 읽고 버그가있는 코드를보고 싶습니다.
ʇsәɹoɈ

아니요, 버그 티켓을 열지 않았습니다. 그것을 재현하려면 /etc/network/interfaces파일에 주석을 추가하십시오 . 여전히 주석이 있으면 실행 됩니다.
Alexey Vesnin

0

https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ 서비스를 시작하기 위해 권장되는 방법 후에 네트워크가 수평는 "사용하는 것입니다 network-online.target 에서" .service의 파일 :

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

그러나 " network-online.target "을 사용하고 네트워킹이 완전히 수평이 아니기 때문에 서비스가 실패한 후 버그 ( https://github.com/coreos/bugs/issues/1966 )가 있음을 발견 했습니다. 100 % 오류가 없습니다.

실제로 " NetworkManager " 와 같은 동적 네트워킹 구성 도구 가이 경우와 같이 사용되는 경우 네트워킹 상태는 100 % 정확하거나 예측할 수 없습니다. 버그를 설명하는 링크에서 " network-online.target "은 사용되는 다른 응용 프로그램에 따라 일관되지 않게 작동 할 수 있습니다.

해결 방법 :
서비스의 시작 순서를 분석하고 " network-online.target " 이후에 시작되는 순서를 사용해야합니다 .

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

이는 네트워킹 수준이 유지되고 오류없이 서비스가 시작될 수있는 서비스를 찾을 때까지 대상을 이후 및 이후 서비스로 점진적으로 변경하는 반복적 인 프로세스입니다. 제 경우 sleep 10에는 SystemD 서비스가 호출 한 스크립트를 스크립트에 넣어야했습니다.


0

한 번 Github 에서 지속적으로 서버를 핑하려고 시도하여 해결 한 답변을 찾았습니다 . Ping을 통과 한 경우에만 서비스가 계속됩니다.

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

google.com주 스크립트가 서버에 연결해야했기 때문에 자체 서버 로 교체 했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.