일반적으로 애플리케이션 패키지를 통해 업데이트할 때 yum update
rpm은'영리한'나에 대한 존경심은 충분하다 /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 구성 파일만 표시됩니다...
답변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-completion
bash-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