Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.3. epoch, Scriptlets 및 Triggers

이 섹션에서는 RMP SPEC 파일의 고급 지시문을 나타내는 Epoch,Scriptlets, 및 Trigger 에 대해 설명합니다.

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

4.3.1. Epoch 지시문

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

RPM SPEC 파일에 이 지시문이 나열되지 않으면 Epoch 지시문이 전혀 설정되지 않습니다. 이는 Epoch 를 0으로 설정하지 않는 일반적인 추측 입니다. 그러나 YUM 유틸리티는 해독 목적으로 설정되지 않은 Epoch 를 0의 Epoch 와 동일하게 처리합니다.

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

예 4.2. Epoch 사용

Epoch: 1버전: 1.0 과 함께 foobar 패키지를 설치하고 다른 사람이 버전: 2.0 을 사용하여 foobar 패키지인 경우 Epoch 지시문이 없는 경우 새 버전은 업데이트로 간주되지 않습니다. Epoch 버전이 RPM 패키지에 대한 버전 관리를 나타내는 기존 Name-Version-Release 마커보다 우선하기 때문입니다.

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

4.3.2. scriptlets

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

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

4.3.2.1. scriptlets 지시문

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

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

표 4.2. Scriptlet 지시문

directive정의

%pretrans

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

%pre

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

%post

대상 시스템에 패키지가 설치된 직후에 실행되는 Scriptlet입니다.

%preun

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

%postun

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

%posttrans

트랜잭션 마지막에 실행되는 Scriptlet입니다.

4.3.2.2. scriptlet 실행 끄기

스크립트릿 실행을 끄려면 rpm 명령을 --no_scriptlet_name_ 옵션과 함께 사용합니다.

절차

  • 예를 들어 %pretrans 스크립트릿의 실행을 끄려면 다음을 실행합니다.

    # rpm --nopretrans

    다음과 같은 --noscripts 옵션을 사용할 수도 있습니다.

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

추가 리소스

  • 자세한 내용은 rpm(8) 매뉴얼 페이지를 참조하십시오.

4.3.2.3. scriptlets 매크로

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

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

$ 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

4.3.3. Triggers 지시문

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

주의

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

실행 순서 및 각 기존 Trigger 의 세부 정보는 다음과 같습니다.

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 파일에 있습니다.

4.3.4. 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. 패키지를 설치합니다.

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

    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 스크립트를 사용하려면 install -m 아래에 SPEC 파일에 다음 행을 포함합니다.

%post -p /usr/bin/python3

Lua 스크립트를 사용하려면 install -m 아래에 SPEC 파일에 다음 행을 포함합니다.

%post -p <lua>

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