yum 패키지 업데이트가 yum-cron 구성 파일을 대체하는 이유는 무엇입니까?

yum 패키지 업데이트가 yum-cron 구성 파일을 대체하는 이유는 무엇입니까?

일반적으로 애플리케이션 패키지를 통해 업데이트할 때 yum updaterpm은'영리한'나에 대한 존경심은 충분하다 /etc.

(그것원래mtime을 보고 비교한 후 결과에 따라 파일을 새 버전으로 바꾸거나 새 버전을 옆에 놓으십시오. )

그러나 Centos 7의 마지막 yum/yum-cron 업데이트 중 하나로 내 사용자 정의 yum-cron 구성 파일이 대체되었습니다.

/etc/yum/yum-cron.conf
/etc/yum/yum-cron-hourly.conf

이제 왜 이런 일이 발생하는지 알고 싶습니다.

내 말은, 대답은 소스 패키지에 있어야 하지만 거기에서 찾을 수 없다는 뜻입니다.

$ rpm -qi yum-cron | grep src
Source RPM  : yum-3.4.3-132.el7.centos.0.1.src.rpm
$ yumdownloader --source yum-3.4.3-132.el7.centos.0.1
$ grep '%.*yum-cron.*\.conf' yum.spec
%config(noreplace) %{_sysconfdir}/yum/yum-cron.conf
%config(noreplace) %{_sysconfdir}/yum/yum-cron-hourly.conf

사양 파일을 보면 yum-cron 섹션에서 구성 지시문에noreplace지정됨.

반면에 구성 파일의 소유권은 바이너리 패키지 간에 yum공유 되는 것으로 보입니다 yum-cron.

$ rpm -ql yum-cron | grep 'yum-cron.*\.conf'
/etc/yum/yum-cron-hourly.conf
/etc/yum/yum-cron.conf
$ rpm -ql yum | grep 'yum-cron.*\.conf' 
/etc/yum/yum-cron-hourly.conf
/etc/yum/yum-cron.conf

어떻게요?

즉, 사양 파일의 cron 특정 파일 섹션에 언급된 yum-cron 구성 파일만 표시됩니다...

또한보십시오CentOS 문제그리고RHEL 문제이 점에 대해서.

답변1

이는 Red Hat이 패키지를 생성하는 방식에 문제가 있습니다. 파일은 yum-cron.conf구성 파일로 표시되어야 하지만(출력 결과와 반대로) 그렇지 않습니다(설치된 패키지에 대한 구성 파일을 쿼리하면 문서가 나열되지 않음 yum-cron.conf). 실제 답변, 아마도 더 유용한 답변은 RH가 문제를 해결하도록 하는 것입니다 chattr +i. 또한보십시오:https://serverfault.com/questions/744531/secure-yum-cron-conf-configuration-and-prevent-them-from-getting-auto-updated/744535#744535

답변2

%files이는 파일의 기본 섹션에 있는 다음 줄 때문입니다 yum.spec.

%(dirname %{compdir})

이는 rpm이 먼저 대체를 수행 %{compdir}한 다음 dirname그 결과를 쉘의 인수로 실행한다는 것을 의미합니다. 그러면 출력이 파일 목록에 추가됩니다.

compdir 변수는 다음과 같이 정의됩니다.

%define compdir %(pkg-config --variable=completionsdir bash-completion)
%if "%{compdir}" == ""
%define compdir "/etc/bash_completion.d"
%endif

bash-completion빌드 시(빌드 시스템에서) 설치를 가정하면 pkg-config다음이 반환될 수 있습니다.

/usr/share/bash-completion/completions

따라서 추가

dirname /usr/share/bash-completion/completions
-> /usr/share/bash-completion

파일 목록으로 이동하세요(yum 패키지가 도우미 프로그램, 즉 아래도 설치한다면 의미가 있습니다 /usr/share/bash-completion/helpers).

문제가 되는 상황은 bash-completion빌드할 때 패키지가 설치되지 않은 경우입니다. 그 이유는 pkg-config빈 문자열이 반환되기 때문입니다. 즉:

 compdir := /etc/bash_completion.d
 => dirname /etc/bash_completion.d
 -> /etc

/etc따라서 패키지의 빌드 루트에 있는 전체 디렉터리가 파일 목록에 반복적으로 추가됩니다.

분명히 CentOS yum 바이너리 패키지를 빌드한 상자에는 bash-completion이 패키지가 설치되어 있지 않았습니다. 실제로 RHEL(따라서 CentOS)은 패키지도 제공하지 않습니다 bash-completion.

이는 이러한 파일이 왜 있는지 설명합니다.

/etc/yum/yum-cron.conf
/etc/yum/yum-cron-hourly.conf

모두 Hebao 소유 yum입니다 yum-cron.

(그리고 포장에 올바르게 라벨을 붙이기만 하면 됩니다 yum-cron.)

부록

조건문의 동기는 여러 rpm 기반 배포(예: Fedora, RHEL 등의 다른 버전)에 대한 yum 사양 파일을 제공하는 것일 수 있습니다. 따라서 사양 파일은 조건에 따라 빌드에 종속되며 bash-completions비RHEL 시스템에만 적용됩니다.

%if ! 0%{?rhel}
# we don't have this in rhel yet...
BuildRequires: bash-completion
%endif

dirname에 도입된 변경 사항은 다음과 같습니다.yum 메일링 리스트에 대해 토론하세요:

패키지는 $(compdir)의 상위 항목이기도 합니다(만약에 대비해 이유는 확실하지 않음).

소개조건부 논리도 논의됩니다.:

아, 완성 디렉토리를 하드코딩하는 것보다 "pkg-config --variable=completionsdir bash-completion"에서 가져오는 것이 더 좋습니다.

사양 수정

dirname한 가지 해결 방법은 호출을 올바른 조건부 분기로 이동하는 것입니다 . 예를 들면 다음과 같습니다.

--- a/SPECS/yum.spec
+++ b/SPECS/yum.spec
@@ -28,7 +28,7 @@ BuildRequires: bash-completion

 # disable broken /usr/lib/rpm/brp-python-bytecompile
 %define __os_install_post %{nil}
-%define compdir %(pkg-config --variable=completionsdir bash-completion)
+%define compdir %(pkg-config --variable=completionsdir bash-completion | xargs -r dirname)
 %if "%{compdir}" == ""
 %define compdir "/etc/bash_completion.d"
 %endif
@@ -451,7 +451,7 @@ exit 0
 %dir %{_sysconfdir}/yum/fssnap.d
 %dir %{_sysconfdir}/yum/vars
 %config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
-%(dirname %{compdir})
+%{compdir}
 %dir %{_datadir}/yum-cli
 %{_datadir}/yum-cli/*
 %exclude %{_datadir}/yum-cli/completion-helper.py?

답변3

자세한 설명 감사드립니다막스 슐렙치거, 그러나 귀하가 제안한 수정 사항은 올바르지 않습니다. 이로 인해 /usr/share/bash-completionbash-completion이 설치될 때 comdir이 설정됩니다. 거기에 있는 파일은 로드되지 않으며 위치를 찾아야 합니다 . 이로 인해 매크로의 핵심인 /usr/share/bash-completion/completions완료 파일의 설치 경로로 항상 사용되는 기능이 중단됩니다 .%{compdir}

이 문제를 해결하는 가장 안전한 방법은 명시적으로 다음을 수행하는 것입니다.

%if 0%{?fedora} >= 19 || 0%{?rhel} >= 7
%global compdir %{_datadir}/bash-completion/completions
%else
%global compdir %{_sysconfdir}/bash_completion.d
%endif

그런 다음 %files 섹션에서 다음을 수행합니다.

%if 0%{?fedora} >= 19 || 0%{?rhel} >= 7
%(dirname %{compdir})
%else
%{compdir}
%endif

관련 정보