본문 바로가기

카테고리 없음

rpm build


  1. rpm build 를 위한 gpg key 생성
    1. gpg 공개 키 개인 키 생성
    2. root 에서 gpg --gen-key를 이용하여 진행
    3. gpg --fingerprint 로 생성된 키를 확인
      1. pub   2048R/B8D98668 2017-11-21
              Key fingerprint = E4CE FBBB 45C7 1265 A56D  8A08 32F4 4E8C B8D9 8668
        uid                  giilkwon (NFRI-KSTAR) <giilkwon@nfri.re.kr>
        sub   2048R/DE9213E8 2017-11-21

    4. gpg -a -o RPM-GPG-KEY-BUILDUSER --export B8D98668 명령으로 파일로 내보내줌

  2. rpm spec 파일 작성
    • test를 위해 test 라는 파일을 만들었다.

#! /bin/bash
echo "hello world"

    • 그리고 rpm이 이 실행 파일을 설치 자리에 옮기고 설치를 위해 실행시킬 스크립트 파일을 만들었다.

#! /bin/bash
echo script running!!

    • 이 파일들을 아래와 같이 test-1.0.0 폴더에 넣어두었다.

[builduser@sl7dev test-1.0.0]$ ls
test  test.sh

    • 그리고 이것을 압축을 해준다.

[builduser@sl7dev test-1.0.0]$ tar czvf test-1.0.0.tar.gz test-1.0.0/

    • rpmbuild를 위한 기본 디렉토리 구조를 만들기 위해 rpmdev-setuptree 명령어를 실행한다.

[builduser@sl7dev ~]$ rpmdev-setuptree
[builduser@sl7dev ~]$ cd rpmbuild
[builduser@sl7dev rpmbuild]$ ls
BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS

    • 그러면 위와 같이 BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS 폴더를 가진 구조가 생성된다. 아래 구조 설명은 http://ftp.rpm.org/max-rpm/ch-rpm-build.html에서 발췌 했다.
      • /home/builduser/rpmbuild/SOURCES — Contains the original sources, patches, and icon files.

      • /home/builduser/rpmbuild/SPECS — Contains the spec files used to control the build process.

      • /home/builduser/rpmbuild/BUILD — The directory in which the sources are unpacked, and the software is built.

      • /home/builduser/rpmbuild/RPMS — Contains the binary package files created by the build process.

      • /home/builduser/rpmbuild/SRPMS — Contains the source package files created by the build process.

    • 이제 위에 압축한 파일(test-1.0.0.tar.gz)은 SOURCES에 옮겨 줍니다.

[builduser@sl7dev ~]$ cp test-1.0.0.tar.gz rpmbuild/SOURCES

    • 이제 SPEC 파일(test.spec)을 작성해야합니다.

[builduser@sl7dev ~]$cd rpmbuild/SPECS

[builduser@sl7dev SPECS]$vim test.spec

    • 이제 SPECS 문서의 각 항목을 살펴 보자
      • Name : rpm package의 이름을 정의한다. ex) test
      • Version : rpm으로 패키징된 프로그램의 버젼을 적어주자 ex) 1.0.0
      • Licence : 라이센스관련 ex) GPL(GNU General Public License)
      • Release : 현재 version에서 소프트웨어가 나온 횟수를 나타낸다.현재버전  패키지의 버젼이라 보면 된다. ex) 1%{?dist} //%{?dist} 는 파일이름에 .el(5,6,7) 을 붙여준다.
      • Group : 패키지화된 소프트웨어를 다른 소프트웨어와 그룹화 해주기 위한 스트링들로 구성된다. 각 스트링은 slash(/)로 나누어진다. ex) Application/Editor
      • Source : RPM을 만들기위해 사용한 압축파일(.tar.gz)를 지정할 수 있다. Source 뒤에 숫자를 붙여 여러소스파일을 지정해 줄수있다. 숫자는 0부터 시작해야한다. ex) Source0: test-1.0.0.tar.gz
      • URL : URL은 URL을 표기할 수있게 해준다. 패키지화된 소프트웨어의 문서를 가리키는 URL을 표기해주기도 한다.
      • Requires : rpm이 설치되기 전에 설치되 있어야할  rpm을 지정해 줄수있다.기본 이름만 써도 되지만 버전을 체크할 수있도록 할 수있다. ex) Requires: gcc >= 1.1.1
      • BuildRequires : 이 rpm을 build하기 위해 필요한 rpm을 지정해 줄 수있다. 빌드에 필요한 rpm이므로 주로 devel 패키지가 될 거이다. ex) BuildRequires: libxxx-devel
      • %prep : Source 에서 지정한 파일을 빌드하기위해 필요한 일들을 지정해 줌. 이경우 재귀적으로 이전 오래된 빌드를 지워주고 Source에서 지정된 파일을 gzip을 build 디렉토리에 풀어준다. 여기 부분에서 하는 일은 보통 공통적으로 정의 될 수있기 때문에 RPM에서는 공통적으로 정의되는 일들을 정의할 수있는 macro를 정의해두었다. %setup macro의 경우 위에 말한 것과 같이 오래된 빌드를 지우고 새로운 파일을 압축을 build 디렉토리에 풀어주는 루틴을 정의해 두었습니다. 아래와 같이 spec 파일에 %prep을 작성할 경우 사용할 경우

            %prep

            %setup
        아래와 같이 동작한다.
        ( %setup의 경우 옵션을 줄 수있다. -q 옵션을 사용하면 압축을 푸는 과정을 보여주지 않는다. -n 옵션을 사용하며 이름을 지정해 줄수있다. 이옵션을 사용하지 않을 경우 압출이 풀어진 폴더는 <name>-<version>의 형식을 가진다. 하지만 -n옵션을 쓰게 되면 그 이후에 나온 이름으로 폴더 명이 지정된다.)
        ref :http://ftp.rpm.org/max-rpm/s1-rpm-inside-macros.html


+ cd /home/builduser/rpmbuild/BUILD
+ rm -rf test-1.0.0
+ /usr/bin/gzip -dc /home/builduser/rpmbuild/SOURCES/test-1.0.0.tar.gz
+ /usr/bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd test-1.0.0
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0

      • %build : %prep다음에 수행되며 압축을 푼 소스를 가지고 빌드를 수행한다. 주로 './configure' 를 실행하여 'Makefile'을 생성하고 'make'를 수행하여 빌드를 수행한다.
      • %install : %build 다음에 수행되며 빌드 다음에 생성된 파일들을 설치 폴더로 복사하는 역할을 수행한다.  여기서는 BUILDROOT를 지정하지 않았다. 이럴경우 rpmbuild/BUILDROOT를 사용한다. 위에 예제에서는 이전 빌드에 생성된 BUILDROOT폴더를 지우고 새로 만든다 그리고 빌드된 파일들을 이곳에 복사해온다.
        • ex)%install
          rm -rf $RPM_BUILD_ROOT
          mkdir -p $RPM_BUILD_ROOT/usr/local/test
          cp -R -f * $RPM_BUILD_ROOT/usr/local/test
        • 위와 같이 할 경우 아래와 같은 동작을 한다.

+ cd /home/builduser/rpmbuild/BUILD
+ '[' /home/builduser/rpmbuild/BUILDROOT/test-1.0.0-1.el7.x86_64 '!=' / ']'
+ rm -rf /home/builduser/rpmbuild/BUILDROOT/test-1.0.0-1.el7.x86_64
++ dirname /home/builduser/rpmbuild/BUILDROOT/test-1.0.0-1.el7.x86_64
+ mkdir -p /home/builduser/rpmbuild/BUILDROOT
+ mkdir /home/builduser/rpmbuild/BUILDROOT/test-1.0.0-1.el7.x86_64

+ cd test-1.0.0
+ rm -rf /home/builduser/rpmbuild/BUILDROOT/test-1.0.0-1.el7.x86_64
+ mkdir -p /home/builduser/rpmbuild/BUILDROOT/test-1.0.0-1.el7.x86_64/usr/local/test
+ cp -R -f test test.sh /home/builduser/rpmbuild/BUILDROOT/test-1.0.0-1.el7.x86_64/usr/local/test

        • %clean : 빌드 환경을 정리해줍니다.
          ex) %clean
              rm -rf $RFM_BUILD_ROOT
        • %files : 최종 애플리케이션의 위치를 지정해준다. 여러 파일의 리스트를 적는 것이 가능하다.파일 리스트를 파일로 입력 받는 것도 가능하다.
          ex) %files
          %defattr(777,root,root,-)
          /usr/local/test
          /usr/local/test.sh
          위와 같이 할경우 /usr/local/test 폴더에 777 권한을 가진채 root group, root 소유자의 파일로 설치된다.
        • %attr : 설치된 rpm의 권한과 소유권을 지정해 줄 수있다.
          %attr(<mode>,<user>,<group>) filename
          ex) %attr(644,root,root) /usr/local/test
        • %defattr : 기본 권한 값을 설정해 줄 수있다.
          %defattr(<mode>,<user>,<group>,<dir mode>)
          ex) %defattr(644,root,root,-)
        • %post : rpm 설치 이후에 추가 작업을 설정해줄 수있다.
          ex) %post
              /usr/local/test/test.sh
          위의 경우 rpm을 설치한 후  /usr/local/test/test.sh 스크립트를 실천한다.
        • %postun : rpm을 uninstall 한 후 수행되어야할 추가작업을 지정해 줄 수있다.
          ex) postun
              if["$1"=0];then
              rm -f /usr/local/test 2>/dev/null;true
              fi
    • spec 파일 빌드하기
      • spec 파일은 ~/rpmbuild/SPECS 폴더에 있다. 이곳으로 이동해서 이것을 빌드해주자.
      • ba 옵션은 바이너리와 소스패키지를 빌드해준다.

[builduser@sl7dev ~]$cd rpmbuild/SPECS

[builduser@sl7dev SPECS]$rpmbuild -ba test.spec
      • 빌드결과는 아래와 같다.
      • rpm은 ~/rpmbuild/RPMS에 생성된다.