설치된 파일에서 RPM 패키지를 빌드하는 방법은 무엇입니까?

설치된 파일에서 RPM 패키지를 빌드하는 방법은 무엇입니까?

SLES의 버전/아키텍처가 동일한 두 대의 머신이 있습니다.

머신 #A에 "foo" 소프트웨어가 설치되어 있으며 이것이 rpm -qa.

"foo" 소프트웨어는 머신 #B에 설치되어야 합니다.

foo.rpm이 정보는 어떤 소스(예: 인터넷 등)에서도 얻을 수 없습니다 .

질문

패키지가 foo.rpm머신 #A에 이미 설치되어 있으므로 foo.rpm설치된 파일을 기반으로 해당 패키지에 파일을 빌드할 수 있습니까?

rpm에도 사전/사후 스크립트가 있다고 생각합니다. 그래서 foo.rpm(종속성이 있습니까?)을 설치할 수 있습니다.

답변1

이를 올바르게 수행하는 것은 가능하지만 매우 어렵습니다. 절실하다면 새 RPM .spec파일을 만들고 "가짜" 소스 RPM(SRPM) 파일을 만들어서 사용할 수 있습니다 rpmbuild --rebuild.

계속해서 실제 RPM을 찾아보겠습니다. 질문에 구체적인 내용을 명시하지 않으셨지만 제 경험상 검색 방법을 안다면 인터넷에서 무엇이든 찾을 수 있습니다. 나는 Red Hat 배포판용 RPM의 이전 버전이 10년 이상 사용되지 않았음을 발견했기 때문에 이 RPM의 남은 부분이 어디에도 없다는 것을 믿기 어렵습니다.

또한, RPM에 포함된 애플리케이션의 소스 코드로 돌아가서 이를 사용하여 RPM을 다시 빌드할 수도 있는 경우가 많습니다. 일반적으로 소스 애플리케이션에는 .specRPM을 재구축하는 데 필요한 파일이 포함되어 있습니다.

.spec마지막으로 Red Hat 기반 배포용 Koji와 같은 빌드 서비스에서 소스 코드와 파일을 얻을 수 있습니다. SuSE는 유사한 빌드 서비스도 유지하므로 이러한 서비스에서 이전 빌드 아티팩트를 검색할 수 있습니다.

바이너리를 있는 그대로 가져오기

이 방법을 사용하면 한 시스템에서 실제 실행 파일을 추출하고 다른 시스템에 배포하기 위해 패키지할 수 있습니다.

기계 A

$ rpm -ql <packageNameHere> | xargs tar -zcvf /tmp/program.tgz

기계 B

$ tar -zxvf /path/to/your/program.tgz

SLES의 RPM 버전

이 스레드의 게시물에 따르면:Re: 설치된 패키지에서 RPM을 생성하는 방법 rpmSLES에는 이 스위치가 있다고 합니다 --repackage. 이 기능은 Red Hat 에디션(Fedora 또는 CentOS)에는 없습니다. 하지만 게시물에 따르면 다음과 같이 사용할 수 있습니다.

$ rpm -e --repackage <somepackage>

완료되면 여기에서 RPM에 액세스할 수 있습니다.

/var/spool/repackage

rpmerizor 사용

회전 속도소스 파일을 해당 RPM으로 다시 패키징하는 타사 도구/스크립트를 설치할 수 있습니다. 스크립트 사용법은 여기에서 확인할 수 있습니다.rpmerizor의 매뉴얼 페이지.

발췌

Rpmerizor는 설치된 파일에서 RPM 패키지를 생성할 수 있는 스크립트입니다. 명령줄에서 파일을 지정하고 몇 가지 대화형 질문에 답하면 rpm 메타데이터(패키지 이름, 버전...)가 채워집니다. 메타데이터에 대한 명령줄 옵션을 통해 배치 모드에서 사용할 수도 있습니다.

rpm을 사용하여 재구축

빌드 도구와 혼동하지 마십시오 rpmbuild.rpmrebuild설치된 RPM을 다시 패키지하는 데 사용할 수 있는 또 다른 타사 스크립트입니다.

발췌

rpmrebuild는 기본 사용을 위해 설치된 패키지에서 RPM 파일을 빌드하는 도구입니다. rpmrebuild를 사용하려면 rpm 빌드에 대한 지식이 필요하지 않습니다. (Debian에서는 dpkg-repack과 동일합니다).

openssh-server를 다시 패키지하고 싶다고 가정해 보겠습니다.

$ rpm -aq | grep openssh-server
openssh-server-6.2p2-8.fc19.x86_64

이제 패키지하세요:

$ rpmrebuild openssh-server-6.2p2-8.fc19.x86_64
/usr/lib/rpmrebuild/rpmrebuild.sh: WARNING: some files have been modified:
..?......  c /etc/ssh/sshd_config
..?......  c /etc/sysconfig/sshd
Do you want to continue ? (y/N) y
Do you want to change release number ? (y/N) n
result: /root/rpmbuild/RPMS/x86_64/openssh-server-6.2p2-8.fc19.x86_64.rpm

인용하다

답변2

일반적으로 말하면 그렇지 않습니다.

운이 좋다면 패키지의 출처에 대한 정보를 제공 rpm -qi할 수 있을 것입니다 .rpm -q --changelog

실행 중인 시스템에 구축된 경우 실제 rpm을 만드는 데 사용된 사양 파일(둘 다는 아닐 경우)이 여전히 있을 수 있습니다.

일반적으로 파일/바이너리 복사를 권장하지 않지만 대부분의 메타 정보는 RPM 데이터베이스에 있으며 실제 파일이 있습니다.

rpm -q --list <pkg_name>패키지에 의해 배포된 모든 파일을 표시합니다.

rpm -q --scripts <pkg_name> 패키지를 설치(또는 제거)하여 실행된 스크립트를 표시하면 최소한 배포된 파일만큼 해당 목적에 대한 통찰력을 얻을 수 있습니다.

설치해야 하는 모든 종속성은 를 통해 찾을 수 있습니다 rpm -q --requires <pkg_name>.

관련 정보