학습자료(~2017)/리눅스

[Linux] RPM package(RPM 만들기 , RPM 패키징) 이모저모

단세포소년 2013. 4. 4. 11:24
반응형


 참고 사이트

ftp://ftp.muug.mb.ca/mirror/redhat/redhat/linux/6.2/en/doc/HOWTOS/translations/ko/html/RPM-HOWTO.html#toc6

http://www.rpm.org/max-rpm/index.html

http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/index.html



아래의 내용은 spec 파일 샘플 , RPM 만들때 필요한 사항들만을 적었다. 내용은 자세하지 않으므로 자세한 사항은 위의 참고 사이트를 통해 확인하기바란다.



 rpm spec 파일 

Name: test
Summary: Test Program
Version: 0.1
Release: 1
Source: test.tar
URL: www.test.com
Vendor: computer solution
License: GNU
ExclusiveOS: linux
Group: Utilities/File System
Provides: %{vendor}
BuildRoot: /var/tmp/test


%description

test program


%prep


%build


%install


%clean


%pre


%post


%preun


%postun



%files

#dir

중요 :

%files 에는 rpm 패키지에 포함될 파일 리스트를 적어준다. 이곳에 명기하지 않으면 포함되지 않는다. 여기에 명시한 파일은 $RPM_BUILD_ROOT 디렉토리 밑에서 찾는다. %install 단락에서 $RPM_BUILD_ROOT 로 파일을 옮기는 작업을 해야한다. 또한 $RPM_BUILD_ROOT 에 있는 파일(%files 에 명시한)은 rpm 패키지로 구성되고 rpm 설치시 '/'를 기점으로 파일이 설치된다.
쉽게 말해 $RPM_BUILD_ROOT/test.txt 가 있고 %files 에 /test.txt 로 지정하면 rpm패키징시 test.txt 파일이 포함되고 만들어진 rpm파일을 설치(rpm -i test.rpm)시 /test.txt 에 설치된다는 것이다.


  꼭 알아야되는 매크로

 $RPM_BUILD_DIR       : BUILD 디렉터리를 뜻한다. 

 $RPM_SOURCE_DIR   : SOURCE 디렉터리 경로를 뜻한다.

 $RPM_BUILD_ROOT  
빌드 ROOT 경로를 뜻한다. 패키지에 포함시킬 파일,디렉터리를 이곳으로 옮겨야한다. 대체로  %install 에서 필요한 파일들을 $RPM_BUILD_ROOT 로 옮기는 작업을 해야한다. 그리고  %files 에 명시되는 파일들의 목록의 root 경로로 사용된다. 예를 들어 %files 에 /test.txt 을 지정했다면 이 파일을 $RPM_BUILD_ROOT/test.txt 로 파일을 찾는다. 



 rpm 디렉토리 설명

 Centos 6 의 경우 /root/rpmbuild 디렉터리에 존재

 디렉터리 구성

 BUILD  : 소스 패키지를 풀어서 컴파일하는 디렉토리이다. RPM 만들때는 특별히 해줄일이 없다.
 RPMS  : RPM 파일이 최종적으로 만들어지는 디렉토리이다.
 SOURCES : RPM 만드는데 사용되는 소스/파일이 있는 디렉터리이다. RPM 파일을 만드는 사람은 이곳에 패키징할 파일을 놔두어야한다.
 SPECS : RPM을 만드는데 사용되는 명세파일이 들어있는 디렉터리이다. spec 명세 파일은 패키징하는 사람이 직접 만들어서 이곳에 두어야한다.(혹은 이곳에 spec 문서를 놔두지 않고 rpmbuild 옵션을 통해 spec 문서를 읽을 수 있다.)
 SRPMS : 소스 RPM이 있는 디렉터리이다. RPM 패키지를 만들면 ~.rpm 과 ~.src.rpm 이 생성되는데 ~.src.rpm 이 이 디렉토리에 만들어진다. 이것의 용도는 rpm 패키지할 때 사용했던 source를 rpm 으로 묶어주어 rpm -i ~.src.rpm 시 SOURCES 디렉터리에 source 파일을 만들어준다. 


 SPEC 문서 헤더 설명

 ummary: 패키지에 대한 간단한 설명을 한 줄로 쓴다.

Name: 여러분이 사용하고자 하는 rpm 파일 이름이 와야 한다.

Version: 여러분이 사용할 파일 이름의 버전 번호가 와야 한다.

Release: 여기에는 같은 버전의 패키지 번호가 온다. (예를 들어 우리가 패 키지를 만들었는데 잘못된 것을 알고 다시 만들었을 때 다음 패키지의 release 번호는 2가 된다.)

Icon: 여기에는 다른 (레드햇의 ``glint;;와 같은) 시각적인 설치 도구 에서 사용할 아이콘 파일의 이름이 온다. 아이콘은 반드시 gif 포맷이어야 하고 SOURCES 디렉토리에 위치하여야 한다.

Source: 이 줄에서는 원래 소스 파일의 위치를 가리킨다. 이것은 여러분이 소스 파일을 다시 얻거나 새로운 버전을 체크하는데 쓰인다. 주의: 이줄에서 파일 이름은 여러분의 시스템에 있는 파일 이름과 일치해야 한다. (예를 들어, 소스 파일을 다운로드 받아서 이름을 바꾸지 말아야 한다.) 여러분은 하나 이상의 소스 파일을 다음과 같은 라인을 사용하여 지정할 수 있다.

 Source0: blah-0.tar.gz

 Source1: blah-1.tar.gz

 Source2: fooblah.tar.gz

이 파일들은 SOURCE 디렉토리에 위치한다(이 디렉토리 구조는 뒤의 "소스 디렉토리 트리" 단락에서 다룰 것이다.)

Patch: 패치를 찾을 수 있는 위치이다. 다시 다운로드 받을 때 필요하다. 주의: 여기서의 파일 이름은 "여러분의" 패치를 만들 때 사용하는 것과 일치하여야 한다. 여러 소스에서 여러 패치 파일을 가지고 있을 때 주목할 필요가 있다.

 Patch0: blah-0.patch

 Patch1: blah-1.patch

 Patch2: fooblah.patch

이 파일들은 SOURCES 디렉토리 안에 있어야 한다.

Copyright: 이 줄에서는 패키지의 저작권을 알려준다. 여러분은 APL, BSD, MIT, 공개(public domain), distributable, 또는 상용 (commercial)과 같이 쓸 수 있다.

BuildRoot: 이 줄에서는 새로운 패키지를 설치하고 만드는 ``root'' 디렉토리를 지정하도록 한다. 여러분은 설치하기 전에 여러분의 패키지를 테스트하는데 이를 사용할 수 있다.

Group: 이 줄은 (레드햇 ``glint''와 같은) 시각적 설치 프로그램에서 특정한 프로그램이 트리 구조에서 어디에 위치하는지 알려준다. 그룹 트리는 현재 이러한 구조를 가지고 있다.

 Applications

  Communications

  Editors

        Emacs

  Engineering

  Spreadsheets

  Databases

  Graphics

  Networking

  Mail

  Math

  News

  Publishing

        TeX

Base

  Kernel

Utilities

  Archiving

  Console

  File

  System

  Terminal

  Text

Daemons

Documentation

X11

  XFree86

        Servers

  Applications

        Graphics

        Networking

  Games

        Strategy

        Video

  Amusements

  Utilities

  Libraries

  Window Managers

Libraries

Networking

  Admin

  Daemons

  News

  Utilities

Development

  Debuggers

  Libraries

        Libc

  Languages

        Fortran

        Tcl

  Building

  Version Control

  Tools

Shells

Games

%description 이것은 헤더 아이템이 아니지만, 여기서 설명해 두어야 한다. 당신의 패키지, 서브 패키지마다 설명을 하나씩 필요로 할 것이다. 이것은 패키지에 대해서 참고적인 설명을 쓰는데 사용하는 것이고 여러 줄에 걸쳐 쓸 수 있다:

%prep

준비 과정으로 소스를 빌드할 준비를 하는데 쓰인다. 여기서 소스 패치, make 실행과 같은 셋업과정을 한다.

쉘 스크립트를 직접 쓰면 된다.

예) 
%prep
mkdir /test/test 

 %build

이 부분은 실제로 압축 풀린 소스를 가지고 컴파일하거나 패치하거나 디렉토리를 만들거나 이동시키는 어떠한 작업이던 포함시키면 된다. 쉘 스크립트를 이용하여 수행한 명령을 써 넣으면 된다.
중요 : build 에서 실행되는 스크립트는 $RPM_BUILD_DIR 에서 진행되는 것이다. 즉 echo "hello" > test.txt 하는 경우 test.txt 파일은 $RPM_BUILD_DIR 밑에 생성된다. $RPM_BUILD_DIR 은 나 같은 경우 /root/rpmbuild/BUILD 로 설정되어있다.
예를 하나더 들면 tar zxvf test.tar.gz 스크립트의 경우 test.tar.gz 의 압축푼 파일은 
$RPM_BUILD_DIR 밑에 생성된다.

예)
%build
make clean
make all
echo "hello" > /etc/test

 %install

이 부분에서는 대부분 make install 등 실제 컴파일된 실행파일을 /sbin 등에 옮기는 작업 명령을 써넣으면 된다. 이곳도 쉘 스크립트를 이용한다.

예)
%install
make install

 %pre
 설치하기 전에 실행되는 스크립트이다.

 %post
 설치한 후에 실행되는 스크립트이다.

 %preun
 제거하기 전에 실행되는 스크립트이다.

 %postun
 제거한 후에 실행되는 스크립트이다.


 spec 명세파일의 스크립트가 실행되는 경로

  
%prep
%install
%build
%clean
의 경우는 $RPM_BUILD_DIR 내에서 스크립트가 실행된다. 즉 현재 경로가 $RPM_BUILD_DIR 로 설정되어있는 것이다.

%pre
%post
%preun
%postun
과 같이 rpm -i ,-e 에서 실행되는 스크립의 경우 ROOT('/') 에서 스크립트가 실행된다.


위의 예를 들어보겠다.
%prep
touch test.txt
의 경우 $RPM_BUILD_DIR/test.txt 로 파일이 만들어 진다. 나의 경우 $RPM_BUILD_DIR 은 '/root/rpmbuild/build' 이다.

%pre
touch test.txt
의 경우 /test.txt 로 파일이 만들어 진다.


 스크립트 실행 순서

  RPM 패키징을 만드는 rpmbuild 를 수행하였을때
  %prep
  %build
  %install
  %clean

  RPM 설치를 하는 rpm -i 를 수행하였을때
  %pre
  %post

  RPM을 제거하는 rpm -e 를 수행하였을때
  %preun
  %postun

결국 RPM 패키징에는 %prep,%build,%install, %clean 부분의 스크립트가 순서적으로 사용되는 것으로 패키지를 만들때 수행되는 코드 들이다.
%pre,%post,%preun,%postun 은 패키징된 상태에서 패키지를 설치/삭제 할때 호출 되는 부분이다.


 RPM 패키징시 만들어지는 파일명 규칙

 패키징은 수행하면 rpm 파일이 RPMS 디렉토리에 생성된다.
 기본 파일명은 {name}-{version}-{release}.{architecture}.rpm 이다.

예를 들어
spec 파일에

Name: test
Version: 0.5
Release: 1

이렇게 써있다면 rpm의 이름은 test-0.5-1.x86_64.rpm 이다. 이때 x86_64 는 빌드 아키텍쳐로 rpm --showrc 를 통해 build arch 값을 따른다.



RPM Build 시 RPM 생성되는 위치 

 RPMS 디렉토리에 아키텍쳐 이름의 디렉토리 밑에 생긴다.

예를 들어 아키텍쳐가 x86_64 라면 RPMS/x86_64/*.rpm 이렇게 생긴다.


RPM 패키지를 시킬 파일을 놓는 위치 

 SOURCES 디렉토리에 놓으면 된다.

spec (명세) 파일에서  source 헤더에 넣은 값들을 이곳에서 찾는다.

예를 들어
source0: test1
source1: test2

라면 SOURCE 디렉토리에 test1 과 test2 가 존재하여야한다.

source 헤더 같이 여러 인자가 들어가야 하는 경우 헤더이름 뒤에 숫자를 붙여준다.



 RPM rebuild

 ~.src.rpm 파일을 가지고 있다면 

 rpmbuild --rebulid ~.src.rpm 명령으로 rpm 패키지를 만들수 있다.

rpm 패키징 작업했던 명세파일과 source 파일이 ~.src.rpm 에 포함되었기 때문에 간단하게 rpm 패키징 작업을 할 수 있다.


반응형