RPM (Red Hat Package Manager)은 리눅스에 사용되는 가장 일반적인 소프트웨어 패키지 방법입니다. 

Debian에서 사용하는 deb방식도 있지만 일반적으로 rpm으로 패키징 되어 배포되고 있습니다. 


rpm을 만드는 내용은 .spec 파일에 정의해 주면 됩니다. 

spec파일은 vim 에디터로 name.spec 과 같이 임의의 파일을 생성하면 자동으로 기본 탬플릿을 채워줍니다. 




rpmbuild 명령어로 spec파일을 인자로 주어 실행하게 되면 패키징을 수행합니다. 


$ rpmbuild -bb name.spec


spec파일에는 수행해야할 명령들이 정의해줘야 합니다. (위에 접혀 있는 'spec 파일 탬플릿 열기'를 펼쳐 보세요.)




spec 파일의 각 파트별 역할에 대해 알아봅시다. 


Preamble(서문)


● Source


RPM을 만들기 위해 사용할 압축 파일(.tar.gz) 지정 해 줄 수 있습니다. 

Source 뒤에 숫자를 붙여 여러 소스파일을 지정 해 줄 수 있습니다. 숫자는 '0' 부터 시작해야 합니다. 


Source0: myrpm.tar.gz



● Requires


이 rpm이 built(설치)되기 이전에 설치 되어 있어야 할 rpm을 지정해줄 수 있습니다. 

기본적으로 이름만 써도 되지만, 버전을 체크 하도록 할 수 있습니다. 

비교 연산자는 ( <, >, =, >=,  <=) 를 지원합니다. 

Requires: gcc >= 4.4.4 


만약 64bit 머신에 32bit rpm을 설치해야 할 일이 있는경우 해당 정보를 지정해 주어야 합니다. 

아래 처럼 괄호안에 지정해 주면 됩니다. 


Requires: libedit(x86-32)

 

 

● BuildRequires 

이 rpm을 build 하기 위해 필요한 rpm을 지정해 줄 수 있습니다.  

빌드에 필요한 rpm이므로 주로 devel 패키지가 될 겁니다. 


BuildRequires: libpcap-devel




- Scriptlets 


실제로 수행할 명령을 지정해주는 섹션으로 bash shell 명령어를 지원합니다. 



● %prep 

Source0에서 지정한 파일을 빌드를 하기 위해 필요한 일들을 지정해 줍니다. 압축을 푸는 작업이 주된 작업이 됩니다.  


-q 옵션을 사용하면 압축을 푸는 과정을 보여주지 않습니다. 진행 과정을 감춘다고 생각하면 됩니다. 

-n 옵션으로는 이름을 지정해 줄 수 있습니다. 


%prep

%setup -q -n myrpm 



● %build

'%prep' 다음에 수행되며, 압축을 푼 소스를 가지고 빌드를 수행합니다. 


주로 './configure'를 실행하여 'Makefile'을 생성하고, 'make'를 수행하여 빌드를 수행합니다. 



● %install

'%build' 다음에 수행되며, 빌드 수행결과 생성된 파일들을 설치 폴더로 복사하는 역할을 수행합니다. 


주로, 'make install'을 수행해서 실행 파일들을 '~/rpmbuild/BUILDROOT' 폴더 아래로 넣는 작업을 수행합니다. 

물론, Makefile에 make install시 수행할 동작에 대해 미리 정의해 주어야 합니다. 

일반적으로 빌드를 통해 생성된 실행 파일을 특정 경로에 넣어주는 작업을 설정해주게 됩니다. 


아래는 'mybin' 이란 파일을 지정한 경로에 설치 하기 위한 Makefile 예제입니다. 


Makefile

install:

test  -z  "$(INSTALLDIR)/"  ||  mkdir  -p  "$(INSTALLDIR)"

install  -m  644  mybin  $(INSTALLDIR)/



물론, Makefile에는 값에 대한 정의가 되어 있어야 겠죠. 


Makefile

INSTALLDIR=$(shell pwd)/myinstall



만약 path를 Makefile에 넘겨줘야 할 상황이 발생하게 되면 아래와 같은 방식으로 지정해 줄 수 있습니다. 


.spec 

%install

make INSTALLDIR=$RPM_BUILD_ROOT install



● %check 


'%install' 다음에 수행되며, 설치 이후에 테스트 케이스 검증같은 작업을 위해 사용합니다. TDD기반의 프로젝트라면 이 위치에 테스트를 수행하도록 설정해주면 됩니다. 



● %clean


빌드 마지막에 수행합니다. 빌드 과정에서 생긴 파일들을 지우도록 설정 할 수 있으며, 주로 설치 폴더를 삭제하도록 설정해줍니다. 

spec파일 기본 탬플릿에 있는 내용을 그대로 사용하시면 됩니다. 



● %files 


rpm 파일에 묶여야(패키징) 하는 파일의 이름을 지정해주게 됩니다. 물론, 폴더 이름을 지정 해주는 것도 가능한데, 하위 폴더를 포함 한 모든 파일을 모두 묶는 의미로 사용됩니다. 

여기서 지정한 파일만 rpm 파일에 묶이게 된다고 생각하면 됩니다. 


파일 리스트를 파일로 입력 받는것도 가능합니다. 


%files -f myfile.list 



패키징 될 파일의 경로(path)정보는 Makefile에서 사용한 값을 사용하게 됩니다. 

다시 말해서.. Makefile에서 install 한 경로 정보와 동일한 값으로 spec 파일에 지정해 주어야 하는 것입니다. 


물론, automake와 같은 툴을 사용한다면 크게 신경쓰지 않아도 되는 부분이기는 하나, Makefile을 직접 만들었다면 절대 경로가 아닌 상대 경로에 설치 하도록 해주어야만 rpmbuild 수행 시 ~/rpmbuild/BUILDROOT/ 아래 설치 하는게 성공 할 수 있습니다. 



파일 리스트 앞에는 Prefix가 붙을 수 있으며, 각각의 의미는 다음과 같습니다. 


◆  [기본] - 아무런 Prefix가 없음 

데이터 파일이라고 생각해서 항상 엎어쓰고 rpm 삭제시에는 제거해줍니다. 혹시 기존에 설치 되었던 파일을 수정했었다 하더라도 신경쓰지 않습니다. 


◆  %config

기존에 설치 된 파일이 수정되었다면 기존 파일을 '.rpmsave' 확장자를 붙여서 백업해놓고 새로운 파일을 설치합니다. 설치 이후에 파일이 수정되었다면 변경된 설정 값을 지우지 않고 백업해 준다는 의미입니다. 


◆  %config(noreplace)

기존에 설치 된 파일이 수정되었다면 기존 파일을 유지하고, 새로 설치될 파일을'.rpmsave' 확장자를 붙여서 설치합니다. 설치 이후에 파일이 수정되었다면 수정된 설정 값을 유지 시키기 위해 사용합니다. 


 옵션 이름

RPM에 포함된 파일 수정?

설치된 파일 편집 안됨 

설치된 파일 편집 됨 

 [기본]

No 

RPM으로 부터 설치 

RPM으로 부터 설치 

 Yes

RPM으로 부터 설치 

RPM으로 부터 설치 

%config 

No 

RPM으로 부터 설치 

기존 파일 유지 

Yes 

RPM으로 부터 설치 

RPM으로 부터 설치 기존 파일은 .rpmsave로 이름수정 

%config(noreplace) 

No 

RPM으로 부터 설치 

기존 파일 유지 

Yes 

RPM으로 부터 설치 

기존 파일 유지. RPM에서 받아온 파일은 .rpmnew로 저장. 



◆  %attr 

설치된 rpm 권한과 소유권을 지정해 줄 수 있습니다. 


%attr (<mode>, <user>, <group>) filename 


예) %attr (600, root, -) /etc/mybin



◆  %defattr 

기본 권한 값을 설정 해 줄 수 있습니다. 


%deattr(<file mode>, <user>, <group>, <dir mode>)


예) %defattr(644, root, root, -)



◆  %dir

패키지에 포함시킬 폴더를 지정해줘서 생성하도록 합니다. 주로 특정 위치에 빈 폴더를 생성 시키기 위해 사용합니다. 




● %package


서브-패키지를 생성하기 위해 사용합니다. 이름은 당연히 'Name' 필드에 지정해준 이름을 사용하며 여기서 지정해준 이름을 이어서 패키지 이름을 지어주게 됩니다. 


Name은 'foo' 이고 '%package bar' 라고 지정하게 된다면 'foo-bar.rpm' 이란 이름의 rpm 파일이 생성될겁니다. (물론 뒤에 버전 정보 같은것도 들어가겠죠.) 


release 번호는 메인-패키지와 별도로 지정이 가능합니다. 



%if - %else - %endif

빌드 환경을 체크해서 환경에 따라 다르게 동작하게 할 수 있습니다. 


%if 의 종류는... 

아키텍쳐(architecture)를 검사하는 %ifarch 와 %ifnarch가 있습니다.  (i386, alpha, sparc, etc.. )

운영체제(operating system)을 검사하는 %ifos 와 %ifnos가 있습니다.  (linux, etc... )


%else와 %endif는 %if와 짝으로 사용하면 됩니다. 이름만으로 어떻게 동작하시는지 아실겁니다. 


%ifarch i386

make RPM_OPT_FLAGS="$RPM_OPT_FLAGS -I ."

%else

make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"

%endif




● %post


 rpm 설치 이후에 뭔가 추가 작업을 해줘야 할때 사용합니다. 

예를 들면.. 설정 파일에서 값을 변경하거나.. chkconfig 와 같은 작업 지정이 가능합니다. 





※ 참고로 rpmbuild시 path 정보는 rpmmacros 파일에 정의해주면 됩니다. 


$ vi ~/.rpmmacros


%_topdir /home/kyungtae/rpmdir

%_builddir %{_topdir}/BUILD

%_rpmdir %{_topdir}/RPMS

%_sourcedir %{_topdir}/SOURCES

%_specdir %{_topdir}/SPECS

%_srcrpmdir %{_topdir}/SRPMS


물론, BUILD, RPMS, SOURCES, SPECS, SRPMS 폴더는 미리 만들어 줘야 합니다. 



참고 링크 : 

http://www.rpm.org/max-rpm-snapshot/ch-rpm-specref.html


Posted by KT한
,