systemd-networkd를 사용하여 "가상" 네트워크 인터페이스를 설정했습니다. 기본적으로 인터페이스는 "다운" 상태로 유지됩니다.
해당 인터페이스의 주소에 바인딩하는 애플리케이션을 실행하는 서비스 단위가 있습니다(인터페이스가 다운된 경우에도 바인딩할 수 있도록 비로컬 바인딩 사용). 서비스가 실행 중인 경우에만 네트워크 인터페이스가 "작동" 상태여야 합니다.
내가 원하는 결과는 서비스가 다시 시작되거나 충돌하여 복구할 수 없는 경우 인터페이스가 "다운" 상태로 유지되고 시스템의 라우팅 데몬(OSPF를 사용하는 Bird2)이 해당 주소에 대한 경로 광고를 중지하는 것입니다. 서비스는 사용 가능한 다른 인스턴스로 라우팅됩니다.
및를 사용하여 "ip link set up/down" 또는 "networkctl up/down" 명령을 실행할 수 있지만 ExecStartPost
( ExecStopPost
사실 이것이 첫 번째 시도입니다) 서비스의 단위 파일은 매우 엄격한 샌드박스 환경에서 실행됩니다. 사용자이므로 이러한 명령은 CAP_NET_ADMIN이 없는 환경에서 실행되므로 실행할 수 없습니다. 서비스 단위 파일의 예는 다음과 같습니다.여기.
또한 이러한 명령을 실행하기 위해 별도의 서비스를 생성해 보았습니다. 이 서비스는 "루트"로 잘 실행되고 이런 방식으로 제한되지 않습니다. 그러나 두 번째 서비스에 대한 종속성 사양이 발생하는 조합을 찾지 못했습니다.따르다첫 번째 서비스 상태입니다.
서비스 B에서 After=
및 BindsTo=
서비스 A를 가리키는 경우 시스템 시작 중에 서비스 A 후에 서비스 B가 올바르게 시작됩니다. 서비스 A가 중지되면 서비스 B도 중지됩니다. systemd가 서비스 A를 다시 시작하면 서비스 B도 다시 시작됩니다.
그러나 A 서비스가 중지되었다가 다시 시작되면 서비스 B는아니요여기요.
내가 생각할 수 있는 유일한 다른 옵션은 두 서비스를 결합하는 새 대상을 생성하고 서비스 A를 수동으로 시작할 수 없도록 제한하는 것입니다. 이런 방식으로 관리자에게 서비스가 아닌 대상을 시작해야 함을 경고합니다. . 하지만 이 새로운 대상을 자동으로 종속되게 만드는 방법은 명확하지 않습니다 multi-user.target
.
답변1
좋아, 다른 답변의 비트를 사용하여 이것이 내가 끝낸 것입니다.
시스템 버전 248 이하의 경우
anycast-dns.target(애니캐스트 DNS 대상):
[Unit]
Description=Manage anycast DNS resolver and its network link
[Install]
WantedBy=multi-user.target
dns-링크-manager.service:
[Unit]
BindsTo=pdns-recursor.service
After=pdns-recursor.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/networkctl up dns
ExecStop=/usr/bin/networkctl down dns
[Install]
WantedBy=anycast-dns.target
pdns-recursor.service.d/anycast-dns.conf:
[Unit]
RefuseManualStart=yes
[Install]
WantedBy=
RequiredBy=anycast-dns.target
systemctl enable
그들 각각을 위해 달려라.
이로써 원하는 결과를 얻었습니다.
시작 시 anycast-dns.target은 pdns-recursor.service를 시작합니다. 성공하면 dns-link-manager.service가 네트워크 링크를 엽니다.
pdns-recursor.service가 중지되면(수동으로 또는 충돌하여 다시 시작할 수 없음) dns-link-manager.service가 네트워크 링크를 끊습니다.
관리자는 pdns-recursor.service를 수동으로 시작(또는 다시 시작)할 수 없으며, 네트워크 링크도 작동하는지 확인하기 위해 anycast-dns.target을 프록시로 시작해야 합니다.
시스템 버전 249 이상
dns-링크-manager.service:
[Unit]
Requisite=pdns-recursor.service
After=pdns-recursor.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/networkctl up dns
ExecStop=/usr/bin/networkctl down dns
pdns-recursor.service.d/anycast-dns.conf:
[Unit]
Upholds=dns-link-manager.service
PropagatesStopTo=dns-link-manager.service
이로써 원하는 결과를 얻었습니다.
시작 시 multi-user.target은 pdns-recursor.service를 시작합니다. 성공하면 dns-link-manager.service가 네트워크 링크를 엽니다(종속성으로 인해
Upholds
).pdns-recursor.service가 중지된 경우(수동으로 또는 충돌하여 다시 시작할 수 없음), dns-link-manager.service는 네트워크 링크를 끊습니다(종속성으로 인해
PropagatesStopTo
).pdns-recursor.service가 실행 중이 아니면 관리자는 dns-link-manager.service를 수동으로 시작할 수 없습니다(이 경우 dns-link-manager.service는 이미 실행 중임).