특정 조건이 충족되면 YUM 트랜잭션이 실패하는 RPM 패키지를 만드는 방법

특정 조건이 충족되면 YUM 트랜잭션이 실패하는 RPM 패키지를 만드는 방법

여러 개의 패키지로 구성된 제품을 포장하려고 합니다.

모든 사양 파일, 패키지 간의 종속성 등을 성공적으로 작성했습니다. 모두 설치되어 잘 작동하고 있습니다.

내가 성공적으로 수행하지 못한 한 가지는 사전 응용 프로그램 테스트를 실행하는 것입니다. 어떤 경우에는 패키지가 전혀 설치되지 않기를 원하며 사용자는 패키지 설치를 실행하기 전에 먼저 수정해야 할 사항을 설명하는 오류를 받습니다. .

예: 사용자가 런레벨 3에서 실행 중인지 확인하고 그렇지 않은 경우 전체 설치를 중단하고 사용자에게 "최소" 프로필로 CentOS를 다시 설치하도록 요청하고 싶습니다. 왜냐하면 추가 패키지가 모두 필요하지 않기 때문입니다. "데스크탑" 공급. (이것은 단지 예일 뿐이며 실행할 테스트가 몇 가지 있습니다.)

제가 이 문제를 다루는 방식은 다음과 같습니다.

다른 모든 패키지의 "Requires:" 지시문에 이름이 나타나는 일종의 "메타 패키지"를 만들었으므로 먼저 YUM에 의해 설치되고 패키지 사양 파일 섹션에서 %pre원하는 대로 수행했습니다. 다양한 테스트 수행되고 해당하는 경우 테스트 오류가 출력되고 그 뒤에 " exit 1"이 표시됩니다.

내가 이 접근 방식을 선택한 이유는 다음과 같습니다. "모든 패키지가 이 패키지에 종속되어 있고 이 패키지가 설치에 실패하는 경우 패키지 관리자가 설치에 실패한 패키지에 종속된 패키지를 설치하려고 하면 즉시 트랜잭션이 실패해야 합니다. .. 결국 의존성은 아직 충족되지 않았습니다.” 예를 들어, 젠투에서 어떤 이유로 패키지 설치에 실패하면 이머지는 완전히 중지됩니다. 이는 종속성 문제가 아니더라도 패키지 중 하나가 오류를 반환하더라도 이머지를 계속하도록 지시하는 특수 플래그가 있는 경우에도 마찬가지입니다. .

문제는 테스트가 실패하면 패키지가 실패한다는 것입니다(RPM은 구체적으로 코드 1을 반환했다고 말합니다). 하지만... YUM은 이런 일이 발생하는 것을 실제로 신경 쓰지 않는 것 같습니다. 그리고 다음 패키지를 포함하여 다른 모든 것을 계속 설치합니다. 제거된 패키지(!)에 따라 다릅니다. 결국 의도적으로 실패한 패키지를 제외하고 모든 패키지가 성공적으로 설치되었다고 보고됩니다.

그 이유는 트랜잭션이 시작되기 전에 종속성 검사가 발생하고 YUM이 사용할 수 있는 다양한 저장소에서 종속성이 실제로 충족되기 때문인 것 같습니다. 그럼에도 불구하고 종속성이 결국 실패하면 종속 패키지 설치가 계속된다는 것은 나에게는 이해가 되지 않습니다.

내 논리에 문제가 있는 걸까요? 나는 이것이 버그라고 생각합니다. 누군가가 지금까지 이 버그를 발견했기 때문입니다(중요하다면 CentOS 6.3에 있었습니다...). 그러나 모든 Google-foo에서는 결과가 나오지 않았습니다. 같은 질문을 하는 사람도 없었는데... 키워드를 잘못 사용한 건 아닐까요?

내가 뭘 잘못하고 있는 걸까? 다른 아이디어(RPM 사양 또는 기타 YUM 저장소 매직 또는 YUM .repo 파일 내에 적합하지만... 모두 YUM 인프라 내에 포함되어 있으므로 "yum 설치" 전에 외부 스크립트를 실행할 필요가 없음)는 다음과 같습니다. 대단히 감사합니다!

답변1

패키지 사양 파일의 %pre 섹션에서 수행하려는 다양한 테스트를 수행하고 해당하는 경우 테스트 오류를 ​​출력한 다음 "exit 1"을 수행합니다.

이것은 작동하지 않습니다. %pre 스크립트가 실패할 때 rpm은 트랜잭션을 중지/언롤링하지 않습니다. rpm이 ACID 트랜잭션을 처리할 수 없는 방법은 여러 가지가 있으며 이것이 그 중 하나입니다. 해결 단계 중에 트랜잭션을 중지하려면 충돌을 추가해야 합니다.

답변2

기본적으로 yum을 수행하려면 매직 플래그가 필요하지 않지만 요구 사항을 확인하려면 %pretrans 스크립트 형식이 필요합니다. 그렇죠? %pretrans는 rpm 4.4부터 사용할 수 있습니다. 확인하다http://fedoraproject.org/wiki/Packaging:ScriptletSnippets#Syntax아니면 어쩌면http://wiki.networksecuritytoolkit.org/nstwiki/index.php/RPM_Quick_Reference#Secret_.25pretrans_and_.25posttrans_RPM_Scriptlets

자세한 내용은 다음 토론 및 단점을 참조하세요.https://fedorahosted.org/fpc/ticket/22

따라서 거기에 모든 테스트(런레벨, 호스트 이름)와 그 밖의 테스트를 스택하는 %pretrans 스크립틀릿을 생성하고 총 비용은 언제 발생합니까? 0과 같으면 트랜잭션이 시작되고, 그렇지 않으면 트랜잭션이 실패합니다.

이 접근 방식은 확실히 논리적 결함처럼 들리지만.


귀하의 질문에 따르면 첫 번째 패키지가 실패할 때 yum이 멈추지 않는 이유는 기본적으로 12개의 패키지를 설치하라고 지시하기 때문입니다. 그 중 하나는 실패하지만 나머지는 해당 항목에 의존하지 않으므로(그렇지 않으면 순환 종속성이 발생하여 까다로울 수 있음) 다른 항목이 설치됩니다. 이는 정상적인 동작입니다. 모든 종속 패키지를 다음으로 변경할 수 있습니다.Requires(pre): yourmetapackagehere >= some.version

모든 종속성의 설치 순서를 변경하려면 "컨텍스트 태그가 지정된 종속성" 검사를 사용할 수 있습니다.이 리소스

관련 정보