데비안 패키지에서 타사 시스템 서비스를 시작하는 방법

데비안 패키지에서 타사 시스템 서비스를 시작하는 방법

systemd-networkd예를 들어 인터페이스 IP를 구성하는 구성이 포함된 데비안 패키지가 있습니다 .

systemd-networkd이는 런타임에만 의미가 있습니다.

그래서 서비스가 활성화되어 실행되고 있는지 확인하고 싶습니다. 그러나 postinst에 넣는 것은 잘못된 것 같습니다.

systemctl enable systemd-networkd
systemctl start systemd-networkd

이 문제를 해결하는 올바른 방법은 무엇입니까?

답변1

일반적으로 패키지가 배포하는 서비스 내에서 이를 사용하는 데 문제가 없습니다 systemctl enable. postinst많은 데비안 패키지는 deb-systemd-helper이를 사용하여 공급업체 기본값을 존중하고 서비스를 명시적으로 비활성화하거나 차단하는 등의 세부 사항을 처리합니다.

systemd-networkd.servicesystemd자체 배포 됩니다 . 를 확인하면 이를 관리하는 데 사용되는 단위를 systemd.postinst볼 수 있습니다 .systemdsystemctl

$ dpkg -S /lib/systemd/system/systemd-networkd.service
systemd: /lib/systemd/system/systemd-networkd.service

$ grep systemd-networkd.service -C3 /var/lib/dpkg/info/systemd.postinst
if [ -n "$2" ]; then
    _systemctl daemon-reexec || true
    ...
    _systemctl try-restart systemd-networkd.service || true
    _systemctl try-restart systemd-journald.service || true
fi

그러나 다른 패키지가 소유한 서비스를 활성화하는 것은 일반적이지 않습니다. 대신 단위 관계 사용을 고려해 보세요.

패키지가 자체 시스템 단위를 배포하는 경우(이 네트워크 구성에 따라) [Unit]섹션에 다음을 추가하기만 하면 됩니다.

[Unit]
Requires=systemd-networkd.service
After=systemd-networkd.service

이렇게 하면 부팅 시 장치가 부팅됩니다. 부팅에 실패하면 systemd-networkd.service장치가 부팅되지 않습니다.systemd-networkd.service

패키지에 유닛이 없으면 간단히 이 작업을 수행하는 대상을 만드는 것을 고려해 보십시오.

# /lib/systemd/system/mypackage.target
[Unit]
Description=MyPackage unit dependency management
Requires=systemd-networkd.service
After=systemd-networkd.service

[Install]
WantedBy=multi-user.target

그런 다음 관리자 스크립트에서 이를 관리합니다.

# postinst
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
        deb-systemd-helper unmask 'mypackage.target' >/dev/null || true

        if deb-systemd-helper --quiet was-enabled 'mypackage.target'; then
                deb-systemd-helper enable 'mypackage.target' >/dev/null || true
        else
                deb-systemd-helper update-state 'mypackage.target' >/dev/null || true
        fi
fi
# prerm
if [ "$1" = remove ] ; then
        deb-systemd-invoke stop 'mypackage.target' >/dev/null || true
fi
# postrm
if [ "$1" = remove ] ; then
        systemctl --system daemon-reload >/dev/null || true
fi
if [ "$1" = "purge" ]; then
        deb-systemd-helper purge 'mypackage.target' >/dev/null || true
fi

debhelper를 사용하여 debian/rules패키지를 생성하는 경우 다음을 사용하는 것을 고려하십시오.dh_installsystemd이렇게 하면 관리자 스크립트의 @DEBHELPER@자리 표시자 에 자동으로 추가됩니다.

관련 정보