상태
설치 후 및 제거 전 단계에서 semanage
(SELinux 정책 관리 도구) 및 (SELinux 컨텍스트 구성 도구)를 사용하는 RPM이 있습니다.restorecon
안타깝게도 RHEL 6/7과 8 사이에서 이러한 도구가 포함된 패키지 policycoreutils-python
의 이름이 policycoreutils-python-utils
.
RHEL8 RPM의 작업 사양 파일은 다음과 같습니다.
Requires(post): policycoreutils-python-utils
Requires(preun): policycoreutils-python-utils
RHEL6/7 RPM의 작업 사양 파일은 다음과 같습니다.
Requires(post): policycoreutils-python
Requires(preun): policycoreutils-python
내가 달성하려는 것
나할 수 있다두 개의 사양 파일/두 개의 RPM(각 OS 유형당 하나씩)을 사용하고 있지만 게으르고 모든 사람에게 도움이 되는 하나의 사양을 원합니다.
내가 시도한 것
%{rhel}
OS 버전이 포함된 OS 조건에 대해 읽었습니다 . 다음과 같은~해야 한다RPM 매뉴얼에 따라 작동합니다.
%if %{rhel} < 8
Requires(post): policycoreutils-python
Requires(preun): policycoreutils-python
%endif
%if %{rhel} == 8
Requires(post): policycoreutils-python-utils
Requires(preun): policycoreutils-python-utils
%endif
%{rhel}
대상 시스템에서 변수 값을 확인하면 예상한 결과를 얻습니다.
centos7-system» rpm --eval '%{rhel}'
7
centos8-system» rpm --eval '%{rhel}'
8
CentOS 6/7 인스턴스에 이 RPM을 설치하면 제대로 작동합니다. 그러나 CentOS 8 인스턴스에 OS 독립 RPM을 설치한 후 다음과 같은 결과가 나타납니다.
centos8-system» dnf install my-1.26-0.x86_64.rpm
<...>
Error:
Problem: conflicting requests
- nothing provides policycoreutils-python needed by my-1.26-0.x86_64
디버그 출력:
centos8-system» rpm -ivvvh my-1.26-0.x86_64.rpm 2>&1 | grep Requires
D: Requires: /bin/bash YES (db files)
D: Requires: /bin/sh YES (db files)
D: Requires: /bin/sh YES (cached)
D: Requires: /bin/sh YES (cached)
D: Requires: /usr/bin/env YES (db files)
D: Requires: /usr/bin/perl YES (db files)
D: Requires: /usr/bin/php YES (db files)
D: Requires: nagios-plugins NO
D: Requires: perl(Getopt::Long) YES (db provides)
D: Requires: perl(strict) YES (db provides)
D: Requires: policycoreutils-python NO
D: Requires: policycoreutils-python NO (cached)
D: Requires: policycoreutils-python NO
D: Requires: rpmlib(CompressedFileNames) <= 3.0.4-1 YES (rpmlib provides)
D: Requires: rpmlib(FileDigests) <= 4.6.0-1 YES (rpmlib provides)
D: Requires: rpmlib(PayloadFilesHavePrefix) <= 4.0-1 YES (rpmlib provides)
D: Requires: rpmlib(PayloadIsXz) <= 5.2-1 YES (rpmlib provides)
Requires
CentOS 8 시나리오가 아닌 CentOS 6/7 시나리오를 사용한 것으로 보입니다 .
여기서 내가 보지 못하는 것은 무엇입니까? 이것을 디버깅하기 위해 제가 할 수 있는 일이 있나요?
관련 콘텐츠 및 출처
답변1
조건을 생략하고policycoreutils-python 패키지 대신 semanage 실행 파일을 사용할 수 있습니다.
Requires(post): %{_sbindir}/semanage
Requires(post): %{_sbindir}/restorecon
Fedora를 참조하세요dokuwiki.spec예를 들어. 패키지에 따른 예는 다음과 같습니다.bdii 사양.
답변2
SPEC 파일의 조건을 평가하는 중입니다.세워시간. 따라서 SPEC 파일에 다음이 포함되어 있는 경우:
%if %{rhel} < 8
Requires(post): policycoreutils-python
%endif
%if %{rhel} == 8
Requires(post): policycoreutils-python-utils
%endif
그런 다음 RHEL 7에서 패키지를 빌드하면 다음과 같은 결과가 나타납니다.
Requires(post): policycoreutils-python
이 Requires는 RHEL 8에 패키지를 설치하는 경우에도 사용됩니다. 패키지는 빌드된 후에 다시 평가되지 않습니다.
바이너리 패키지만 갖고 싶다면 Andreas가 지적한 것처럼 저장소가 필요합니다. 기업용 솔루션은 다음과 같습니다.
Release: 1%{?dist}
...
%if %{rhel} < 8
Requires(post): policycoreutils-python
Requires(preun): policycoreutils-python
%endif
%if %{rhel} == 8
Requires(post): policycoreutils-python-utils
Requires(preun): policycoreutils-python-utils
%endif
다음을 사용하여 다양한 플랫폼용으로 빌드합니다.
mock -r epel-7-x86_64 my.src.rpm
mock -r epel-8-x86_64 my.src.rpm
첫 번째 명령은 생산 my-1.0-1.el7
하고 요구하는 policycoreutils-python
반면, 두 번째 명령은 생산 my-1.0-1.el8
하고 요구합니다 policycoreutils-python-utils
.
참고로 조건은 다음과 같이 작성되어야 합니다.
%if 0%{?rhel} < 8
매크로가 정의되지 않은 경우 구문 오류를 방지합니다.