시스템 네트워크 구성 종속성 정보

시스템 네트워크 구성 종속성 정보

저는 systemd를 처음 접했고 그 아키텍처를 배우고 있습니다.

이제 사용자 정의 쉘 스크립트를 실행하는 방법을 알아내려고 합니다. 이 스크립트를 실행해야 합니다.뒤쪽에네트워크 계층이 시작되었습니다.

저는 systemd와 netctl을 사용하여 Arch를 실행하고 있습니다.

테스트를 위해 ip addr list > /tmp/ip.txt.

(/etc/systemd/system/test.service)
[Unit]
Description=test service

[Service]
ExecStart=/root/test.script

[Install]
WantedBy=multi-user.target

그런 다음 스크립트를 활성화했습니다.

systemctl enable test

재부팅 후 스크립트가 실행되지만 네트워크가 작동하기 전에 실행됩니다. 즉, 출력에는 ip.txt기본 인터페이스에 할당된 IPv4 주소가 없다고 표시됩니다. 로그인하면 실제로 IPv4 주소가 할당되고 네트워크가 작동됩니다.

매개변수를 조작하여 스크립트가 실행되는 지점을 변경할 수 있을 것 같지만 WantedBy방법을 모르겠습니다.

누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

답변1

시스템 네트워크 구성 종속성 정보

systemd의 단위 순서에 영향을 미치기 쉽습니다. 반면, 완성된 유닛이 무엇을 보장하는지 주목해야 합니다.

서비스 구성

현재 시스템에서 정렬은 network.target실제 구성이 아닌 네트워크 서비스 시작만을 보장합니다. network-online.target이를 위해서는 나중에 주문하고 가져와야 합니다 .

[Unit]
Wants=network-online.target
After=network-online.target

이전 시스템과의 호환성을 위해 network.target 이후에 주문해야 할 수도 있습니다.

[Unit]
Wants=network-online.target
After=network.target network-online.target

이는 귀하의 서비스 및 시스템에 대한 단위 파일입니다.

현재 버전의 소프트웨어 구현

이제 예상대로 작동하는지 확인해야 합니다 network-online.target(또는 최소한 사용할 수 있음 network.target).

현재 버전네트워크 관리자귀하의 서비스에 관심을 끌 NetworkManager-wait-online.service수 있는 무언가를 제공하십시오 . network-online.target이 특별한 서비스는 자동으로 시작되도록 구성된 모든 연결이 성공, 실패 또는 시간 초과될 때까지 서비스가 대기하도록 보장합니다.

현재 버전시스템 네트워크모든 장치가 필요에 따라 구성될 때까지 서비스를 차단합니다. 현재는 시작 시 적용되는 구성(보다 구체적으로 "systemd-networkd.service의 시작 시간")만 지원하기 때문에 더 쉽습니다.

완전성을 위해 /etc/init.d/networkFedora의 서비스(현재 버전의 systemd로 해석됨)는 차단하여 network.target간접적으로 network-online.target서비스를 차단합니다. 이는 스크립트 기반 구현의 예입니다.

구현(데몬 기반이든 스크립트 기반이든)이 위의 네트워크 관리 서비스 중 하나로 작동하는 경우 네트워크 구성이 성공적으로 완료되거나 합당한 이유로 실패하거나 시간 초과 프레임이 경과할 때까지 서비스 시작이 지연됩니다. 완료하는 데 적당한 시간이 걸립니다.

다음 사항을 확인하고 싶을 수도 있습니다.네트워크 제어동일한 방식으로 작업하면 이 정보는 이 답변에 귀중한 추가 정보가 될 것입니다.

이전 버전의 소프트웨어에서 구현

나는 그것이 잘 작동할 만큼 오래된 버전의 systemd를 볼 수 없을 것이라고 생각합니다. 하지만 적어도 network-online.target존재하는지, 나중에 정렬되는지 확인할 수 있습니다 network.target.

전에네트워크 관리자최소한 하나의 연결이 사용된다는 것만 보장됩니다. 이것이 작동하려면 NetworkManager-wait-online.service명시적으로 활성화해야 합니다. 이 문제는 Fedora에서 오랫동안 수정되었지만 최근에야 업스트림으로 구현되었습니다.

systemctl enable NetworkManager-wait-online.service

network.target 및 network-online.target 구현에 대한 참고 사항

NetworkManager.service소프트웨어를 다른 특정 서비스 에 종속되게 만들 필요는 없습니다 NetworkManager-wait-online.service. 대신, 모든 네트워크 관리 서비스가 선행되어야 하며 network.target선택적으로 순서가 지정 되어야 합니다 network-online.target.

간단한 스크립트 기반 네트워크 관리 서비스는 종료하기 전에 네트워크 구성을 완료해야 하며 종료하기 전에 스스로 정렬해야 하므로 network.target간접적으로 종료해야 합니다 network-online.target.

[Unit]
Before=network.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

데몬 기반 네트워크 관리 서비스는 network.target별로 유용하지 않더라도 먼저 스스로 정렬해야 합니다.

[Unit]
Before=network.target

[Service]
Type=simple
ExecStart=...

데몬이 완료되기를 기다리는 서비스는 특정 서비스 이후와 이전에 주문해야 합니다 network-online.target. Requisite해당 네트워크 관리 서비스를 사용하지 않는 경우 즉시 실패하도록 데몬 서비스에서 사용해야 합니다 .

[Unit]
Requisite=...
After=...
Before=network-online.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

wantsnetwork-online.target패키지는 네트워크가 구성될 때까지 기다리려는 서비스에서 끌어올 수 있도록 디렉터리에 대기 중인 서비스에 대한 심볼릭 링크를 설치해야 합니다 .

ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/

관련된 문서

최종 메모

나는 귀하가 질문했을 때 귀하의 질문에 답변하는 데 도움이 되었을 뿐만 아니라 업스트림 및 Linux 배포판의 상황을 개선하여 원래 질문을 작성했을 때보다 지금 더 나은 답변을 제공할 수 있기를 바랍니다.

답변2

귀하의 서비스가 누군가가 연결될 때까지 수동적으로 기다리는 서버를 제공하는 경우 다음 명령을 사용하십시오.

[Unit]
After=network.target

서비스는 와일드카드 인터페이스에 바인딩되어야 합니다. 소켓 활성화(권장)를 사용하거나 로컬 전용인 경우 네트워크 대상을 완전히 무시할 수 있습니다.

서비스가 클라이언트 역할을 하거나 P2P인 경우 다음이 더 적합합니다.

[Unit]
After=network-online.target
Requires=network-online.target

전에시스템 213, network-online.target에는 Pavel이 언급한 해결 방법이 필요합니다(네트워크 시작을 기다리는 서비스를 수동으로 활성화해야 함). systemd 213부터 이 작업은 기본적으로 수행됩니다. systemd-networkd-wait-online비루프백 인터페이스에 하나 이상의 주소(라우팅 가능 또는 링크 로컬)가 구성될 때까지 기다립니다.

systemd-networkd, NetworkManager 또는 이에 상응하는 구성은 별도의 작업입니다. DHCP(IPv4용) 및 NDP(IPv6용)는 기본적으로 작동하는 경향이 있지만 "네트워크 연결"의 정확한 정의가 트리거되도록 구성해야 합니다 network-online.target.

문서:

답변3

Afterin 섹션을 사용하여 [Unit]서비스가 시작되기 전에 시작되어야 하는 서비스를 정의할 수 있습니다. 예를 들어 NetworkManager를 사용하는 경우 NetworkManager가 시작된 후에 서비스가 시작되도록 할 수 있습니다.

[Unit]
Description=test service
After=NetworkManager.service

답변4

After섹션에서 사용하여 [Unit]서비스 전에 시작해야 할 작업을 지정하세요. (이전 답변은 대부분 정확합니다.)

네트워크가 가동된 후 서비스를 시작하려면 NetworkManager, Arch의 conf.d/netctl 시스템 또는 systemd가 인식하는 다른 서비스를 사용하든 작동해야 하는 네트워크 대상을 사용하십시오.

[Unit]
#.....
After=network.target

간단한 표정으로 각각 확인할 수 있습니다다른네트워크 연결에 의존하는 시스템의 서비스에는 이 지시문이 포함됩니다.

또한 systemd를 사용하여 모든 배포판으로 이식 가능합니다. 유닛 파일은 Arch, Fedora, RHEL 7, Debian...의 향후 버전에서도 동일합니다.


서비스는 무엇입니까?시작Arch의 스크립트나 자신의 스크립트와 같은 네트워크 연결은 다음 위치에 있어야 합니다.그들만의유닛 파일.

[Unit]
Wants=network.target
Before=network.target

관련 정보