제가 systemd를 만져본 것은 이번이 처음입니다. 네트워크가 가동된 후 서비스가 시작되도록 관리하는 방법에 대한 해결책을 찾을 수 없습니다. knockd.service
Raspbian 시스템에서 부팅하려고 합니다 .
시작한 후 서비스가 실행 중인지 확인합니다.
systemctl status knockd
Loaded: loaded (/lib/systemd/system/knockd.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2019-06-27 14:36:26 CEST; 7min ago
Docs: man:knockd(1)
Process: 516 ExecStart=/usr/sbin/knockd $KNOCKD_OPTS (code=exited, status=1/FAILURE)
Main PID: 516 (code=exited, status=1/FAILURE)
Jun 27 14:36:26 pins2 systemd[1]: Started Port-Knock Daemon.
Jun 27 14:36:26 pins2 knockd[516]: could not get IP address for eth0
Jun 27 14:36:26 pins2 systemd[1]: knockd.service: Main process exited, code=exited, status=1/FAILURE
Jun 27 14:36:26 pins2 systemd[1]: knockd.service: Unit entered failed state.
Jun 27 14:36:26 pins2 systemd[1]: knockd.service: Failed with result 'exit-code'.
내 생각에 문제는 이렇다.
could not get IP address for eth0
제가 많이 조사한 결과(예를 들어여기그리고거기) 좋은 팁을 찾았지만 안타깝게도 여전히 작동하지 않습니다. 내 .service
파일은 다음과 같습니다.
systemctl cat knockd
# /lib/systemd/system/knockd.service
[Unit]
Description=Port-Knock Daemon
Documentation=man:knockd(1)
#Requires=network-online.target
#Wants=network-online.target
After=network-online.target
[Service]
EnvironmentFile=-/etc/default/knockd
ExecStart=/usr/sbin/knockd $KNOCKD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
SuccessExitStatus=0 2 15
ProtectSystem=full
CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN
[Install]
WantedBy=multi-user.target
Alias=knockd.service
나는 사용했다After=network-online.target
내단위부분. 그렇게 해봤는데 Requires=
또 어떻게 해야 하나요 Wants=
?
부팅한 후 시스템에 IP 주소가 있고 수동으로 서비스를 시작하면 제대로 작동합니다. 더 빠른 네트워크를 갖춘 다른 네트워크에서는 대상이 없어도 문제가 없었습니다 network-online
.
상상할 수 있듯이 노크가 안정적으로 시작되는 것이 매우 중요합니다. 그렇지 않으면 잠길 수 있기 때문입니다.
이것이 안정적으로 작동한다면 부팅 후 얼마 후에 네트워크 케이블이 연결되어 있어도 작동합니까?
그런데, 파일을 편집해서는 안 된다는 것을 알고 있습니다 .service
. /lib/systemd/...
단지 가능한 덮어쓰기 문제를 해결하기 위해 편집하는 것뿐입니다. 모든 것이 잘 작동하면 이 문제를 해결하겠습니다. 당신의 도움을 주셔서 감사합니다.
답변1
Wants=
이 지시어는 기본적으로 종속성 체인에 포함되지 않기 때문에 필요합니다 network-online.target
(systemd.special(7) 맨페이지 참조).
ifupdown-wait-online.service
NetworkManager를 사용하지 않는 경우 활성화해야 할 수도 있습니다(systemctl 활성화 ifupdown-wait-online.service).
답변2
@Bigon은 전반적으로 올바른 아이디어를 가지고 있습니다.
여기서 핵심 문제는 network-online.target
일반적으로 systemd의 종속성 트리에 포함되지 않는다는 것입니다. systemd는 After=network-online.target
유닛의 행을 처리할 때 network-online.target
이런 일이 발생하지 않기 때문에 이를 무시할 수 있다고 결정합니다.
필요한 것은 network::drum Roll::online일 때 network-online.target을 종속성 트리로 끌어들이는 장치입니다. 많은 배포판에서 이러한 단위를 제공합니다. 네트워크 관리자도 종종 이 기능을 제공합니다.
귀하의 배포판을 모르기 때문에 어떤 단위를 활성화해야 하는지 알기가 어렵습니다. 그리고 네트워크 관리자로 전환하면~ 할 것이다Network Manager는 또한 기존 구성과 충돌할 수 있는 시스템 작동 방식에 대한 많은 변경 사항을 적용합니다.
답변3
네트워크 관리자를 설치하면 Rasbian에서 제대로 작동합니다.
NetworkManager는 NetworkManager-wait-online.service를 허용합니다. kockd가 시작될 때 인터페이스가 준비되지 않았기 때문에 네트워크는 인터페이스를 가동할 시간이 있습니다.