5.3. epoch, Scriptlets 및 Triggers

이 섹션에서는 RMP SPEC파일의 고급 지시문을 나타내는 스크립트릿, 트리거 및 트리거에 대해 설명합니다.

이러한 모든 지시문은 SPEC 파일뿐만 아니라 결과 RPM이 설치된 최종 시스템에도 영향을 미칩니다.

5.3.1. Epoch 지시문

Epoch 지시문을 사용하면 버전 번호에 따라 가중치 종속 항목을 정의할 수 있습니다.

이 지시문이 RPM SPEC 파일에 나열되지 않으면 Epoch 지시문이 전혀 설정되지 않습니다. 이는 Epoch를 설정하지 않으면 0의 Epoch 가 되는 일반적인 신뢰와 다릅니다. 그러나 dnf 유틸리티는 설정되지 않은 Epoch 를 분리하기 위해 0의 Epoch 와 동일하게 처리합니다.

그러나 SPEC 파일에 Epoch 를 나열하는 것은 일반적으로 생략됩니다. 대부분의 경우 패키지 버전을 비교할 때 Epoch 값이 예상되는 RPM 동작을 유발하기 때문입니다.

예 5.2. Epoch 사용

Epoch를 사용하여 foobar 패키지를 설치하는 경우: 1Version: 1.0, 및 다른 사용자가 Version을 사용하여 foobar 를 패키징합니다. 2.0 하지만 Epoch 지시문이 없으면 새 버전이 업데이트되지 않습니다. Epoch 버전이 RPM 패키지에 대한 버전 관리를 나타내는 기존 Name-Version-Release 마커보다 우선하기 때문입니다.

따라서 Epoch 를 사용하는 것은 매우 드물다. 그러나 Epoch 는 일반적으로 업그레이드 순서 문제를 해결하는 데 사용됩니다. 이 문제는 인코딩에 따라 항상 안정적으로 비교할 수 없는 알파벳 문자를 포함하는 소프트웨어 버전 번호 체계 또는 버전의 업스트림 변경의 측면으로 나타날 수 있습니다.

5.3.2. scriptlets 지시문

scriptlets 는 패키지 설치 또는 삭제 전이나 후에 실행되는 일련의 RPM 지시문입니다.

빌드 시 또는 시작 스크립트에서 수행할 수 없는 작업에만 Scriptlets 를 사용합니다.

공통 scriptlet 지시문 세트가 있습니다. SPEC 파일 섹션 헤더(예: %build 또는 %install )와 유사합니다. 이는 종종 표준 POSIX 쉘 스크립트로 작성되는 코드의 여러 줄 세그먼트에 의해 정의됩니다. 그러나 대상 시스템의 배포를 위해 RPM이 허용하는 다른 프로그래밍 언어로도 작성할 수 있습니다. RPM 문서에는 사용 가능한 언어의 전체 목록이 포함되어 있습니다.

다음 표에는 실행 순서에 나열된 Scriptlet 지시문이 포함되어 있습니다. 스크립트가 포함된 패키지가 %pre%post un 지시문 사이에 설치되고 %preun%postun 지시문 사이에 제거됩니다.

표 5.2. Scriptlet 지시문

directive정의

%pretrans

Scriptlet은 패키지를 설치하거나 제거하기 직전에 실행됩니다.

%pre

대상 시스템에 패키지를 설치하기 직전에 실행되는 Scriptlet입니다.

%post

대상 시스템에 패키지를 설치한 후에만 실행되는 Scriptlet입니다.

%preun

대상 시스템에서 패키지를 설치 제거하기 직전에 실행되는 Scriptlet입니다.

%postun

대상 시스템에서 패키지를 제거한 후에 실행되는 Scriptlet입니다.

%posttrans

트랜잭션 종료 시 실행되는 Scriptlet입니다.

5.3.3. scriptlet 실행 비활성화

다음 절차에서는 rpm 명령을 --no_scriptlet_name_ 옵션과 함께 사용하여 스크립트 파일의 실행을 끄는 방법을 설명합니다.

절차

  • 예를 들어 %pretrans scriptlet의 실행을 끄려면 다음을 실행합니다.

    # rpm --nopretrans

    다음 모든 항목과 동일한 --noscripts 옵션을 사용할 수도 있습니다.

    • --nopre
    • --nopost
    • --nopreun
    • --nopostun
    • --nopretrans
    • --noposttrans

추가 리소스

  • RPM(8) 도움말 페이지.

5.3.4. scriptlets 매크로

Scriptlets 지시문도 RPM 매크로에서 작동합니다.

다음 예제에서는 systemd에 새 장치 파일에 대해 알림을 받는 systemd scriptlet 매크로를 사용하는 방법을 보여줍니다.

$ rpm --showrc | grep systemd
-14: __transaction_systemd_inhibit      %{__plugindir}/systemd_inhibit.so
-14: _journalcatalogdir /usr/lib/systemd/catalog
-14: _presetdir /usr/lib/systemd/system-preset
-14: _unitdir   /usr/lib/systemd/system
-14: _userunitdir       /usr/lib/systemd/user
/usr/lib/systemd/systemd-binfmt %{?*} >/dev/null 2>&1 || :
/usr/lib/systemd/systemd-sysctl %{?*} >/dev/null 2>&1 || :
-14: systemd_post
-14: systemd_postun
-14: systemd_postun_with_restart
-14: systemd_preun
-14: systemd_requires
Requires(post): systemd
Requires(preun): systemd
Requires(postun): systemd
-14: systemd_user_post  %systemd_post --user --global %{?*}
-14: systemd_user_postun        %{nil}
-14: systemd_user_postun_with_restart   %{nil}
-14: systemd_user_preun
systemd-sysusers %{?*} >/dev/null 2>&1 || :
echo %{?*} | systemd-sysusers - >/dev/null 2>&1 || :
systemd-tmpfiles --create %{?*} >/dev/null 2>&1 || :

$ rpm --eval %{systemd_post}

if [ $1 -eq 1 ] ; then
        # Initial installation
        systemctl preset  >/dev/null 2>&1 || :
fi

$ rpm --eval %{systemd_postun}

systemctl daemon-reload >/dev/null 2>&1 || :

$ rpm --eval %{systemd_preun}

if [ $1 -eq 0 ] ; then
        # Package removal, not upgrade
        systemctl --no-reload disable  > /dev/null 2>&1 || :
        systemctl stop  > /dev/null 2>&1 || :
fi

5.3.5. Triggers 지시문

Trigger 는 패키지 설치 및 제거 중에 상호 작용 방법을 제공하는 RPM 지시문입니다.

주의

트리거 는 예기치 않은 시간에 실행될 수 있습니다(예: 포함된 패키지의 업데이트). 트리거 는 디버그하기 어렵기 때문에 예기치 않게 실행될 때 아무 것도 손상시키지 않도록 강력한 방식으로 구현해야 합니다. 이러한 이유로 Red Hat은 트리거 사용을 최소화할 것을 권장합니다.

단일 패키지 업그레이드에 대한 실행 순서와 각 기존 트리거에 대한 세부 정보는 다음과 같습니다.

all-%pretrans
…​
any-%triggerprein (%triggerprein from other packages set off by new install)
new-%triggerprein
new-%pre      for new version of package being installed
…​           (all new files are installed)
new-%post     for new version of package being installed

any-%triggerin (%triggerin from other packages set off by new install)
new-%triggerin
old-%triggerun
any-%triggerun (%triggerun from other packages set off by old uninstall)

old-%preun    for old version of package being removed
…​           (all old files are removed)
old-%postun   for old version of package being removed

old-%triggerpostun
any-%triggerpostun (%triggerpostun from other packages set off by old un
            install)
…​
all-%posttrans

위의 항목은 /usr/share/doc/rpm-4.*/triggers 파일에서 찾을 수 있습니다.

5.3.6. SPEC 파일에서 쉘이 아닌 스크립트 사용

SPEC 파일의 -p scriptlet 옵션을 사용하면 사용자가 기본 쉘 스크립트 인터프리터(-p /bin/sh) 대신 특정 인터프리터를 호출할 수 있습니다.

다음 절차에서는 pello.py 프로그램 설치 후 메시지를 출력하는 스크립트를 생성하는 방법을 설명합니다.

절차

  1. pello.spec 파일을 엽니다.
  2. 다음 행을 찾으십시오.

    install -m 0644 %{name}.py* %{buildroot}/usr/lib/%{name}/
  3. 위 줄 아래에 다음을 삽입합니다.

    %post -p /usr/bin/python3
    print("This is {} code".format("python"))
  4. RPM 빌드에 설명된 대로 패키지를 빌드합니다.
  5. 패키지를 설치합니다.

    # dnf install /home/<username>/rpmbuild/RPMS/noarch/pello-0.1.2-1.el8.noarch.rpm
  6. 설치 후 출력 메시지를 확인합니다.

    Installing       : pello-0.1.2-1.el8.noarch                              1/1
    Running scriptlet: pello-0.1.2-1.el8.noarch                              1/1
    This is python code
참고

Python 3 스크립트를 사용하려면 SPEC 파일에 install -m 아래에 다음 행을 추가하십시오.

%post -p /usr/bin/python3

Lua 스크립트를 사용하려면 SPEC 파일에 install -m 아래에 다음 행을 추가하십시오.

%post -p <lua>

이렇게 하면 SPEC 파일에서 인터프리터를 지정할 수 있습니다.