• 검색 결과가 없습니다.

RPM (Redhat Package Manager)

N/A
N/A
Protected

Academic year: 2021

Share "RPM (Redhat Package Manager)"

Copied!
34
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

RPM

Wanho Choi

(2)

RPM: Redhat Package Manager

Redhat Linux 시스템에서 소프트웨어의 설치 및 관리를 해주는 유틸리티

(3)

RPM Mode

설치 (install)

제거 (uninstall)

업그레이드 (upgrade)

질의 (query)

검증 (verify)

(4)

How to install an RPM package

[root@rnd-wanho ~]# ls *.rpm

freeglut-devel-2.8.1-3.el7.x86_64.rpm

[root@rnd-wanho ~]# rpm -ivh freeglut-devel-2.8.1-3.el7.x86_64.rpm

Preparing… ################################# [100%] Updating / installing…

1:freeglut-devel-2.8.1-3.el7 ################################# [100%]

[root@rnd-wanho ~]# rpm -qa | grep freeglut

freeglut-2.8.1-3.el7.x86_64

freeglut-devel-2.8.1-3.el7.x86_64

[root@rnd-wanho ~]# rpm -e freeglut-devel-2.8.1-3.el7.x86_64

[root@rnd-wanho ~]# rpm -qa | grep freeglut

(5)

RPM Setup

[root@rnd-wanho ~]# yum install rpmdevtools rpmlint rpm-build

[root@rnd-wanho ~]# rpm -qa | grep rpm

rpmlint-1.5.4.el7.noarch rpm-python-4.11.1-16.el7.x86_64 perl-srpm-macros-1-8.el7.noarch rpm-4.11.1-16.el7.x86_64 python-deltarpm-3.6-3.el7.x86_64 rpm-build-libs-4.11.1-16.el7.x86_64 rpm-sign-4.11.1-16.el7.x86_64 rpm-devel-4.11.1-16.el7.x86_64 rpmdevtools-8.3-5.el7.noarch rpm-libs-4.11.1-16.el7.x86_64 deltarpm-3.6-3.el.x86_64 rpm-build-4.11.1-16.el7.x86_64 redhat-rpm-config-9.1.0-63.el7.centos.noarch

(6)

Naming Convention

(7)

Architecture

i386: 인텔 80386 계열의 프로세서를 가진 플랫폼에서 컴파일 되었음.

i586: 인텔 80586 계열의 프로세서를 가진 플랫폼에서 컴파일 되었음.

i686: 인텔 80686 계열의 프로세서를 가진 플랫폼에서 컴파일 되었음.

x86: x386, x586, x686 등 모든 플랫폼에서 동작이 가능함.

x86_64: 64비트 플랫폼에서 동작이 가능함.

alpha: 알파칩 계열의 프로세서를 가진 플랫폼에서 컴파일 되었음.

ppc: Power PC 계열의 프로세서를 가진 플랫폼에서 컴파일 되었음.

noarch: 문서나 글꼴처럼 아키텍쳐에 종속되지 않음.

(8)

Binary RPM vs Source RPM

Binary RPM (확장자: .rpm)

: 컴파일된 결과 바이너리 파일과 설정 파일 등을 묶어놓은 패키지

Source RPM (확장자: .src.rpm)

: 바이너리 RPM을 만드는데 재료가 되는 파일들을 묶어놓은 패키지

1) 소스코드 공개 의무 규정이 있는 GPL 라이센스의 경우

2) 각 시스템에 보다 최적화된 RPM 패키지를 만들기 위한 경우

※ 최신 소프트웨어 패키지는 binary RPM이 나오기 전에source RPM만 존재하는 경우가 많음

(9)

Directories for Packaging RPM

BUILD

빌드(압축 풀기 & 컴파일)가 이루어지는 디렉토리

RPMS

binary RPM이 생성되는 디렉토리

SOURCES

소스 파일(*.tar.gz)을 넣어두어야 하는 디렉토리

SPECS

명세 파일(.spec)을 넣어두어야 하는 디렉토리

SRPMS

source RPM이 생성되는 디렉토리

(10)

How to create directories #1

[wanho.choi@rnd-wanho ~]$ mkdir -p ./rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

[wanho.choi@rnd-wanho ~]$ ls -R rpmbuild

rpmbuild:

BUILD RPMS SOURCES SPECS SRPMS rpmbuild/BUILD:

rpmbuild/RPMS:

rpmbuild/SOURCES: rpmbuild/SPECS:

(11)

[wanho.choi@rnd-wanho ~]$ rpmdev-setuptree

[wanho.choi@rnd-wanho ~]$ ls -R rpmbuild

rpmbuild:

BUILD RPMS SOURCES SPECS SRPMS rpmbuild/BUILD:

rpmbuild/RPMS:

rpmbuild/SOURCES: rpmbuild/SPECS:

rpmbuild/SRPMS:

(12)

%_topdir %(echo $HOME)/rpmbuild

%_smp_mflags %( \

[ -z "$RPM_BUILD_NCPUS" ] \\\

&& RPM_BUILD_NCPUS="`/usr/bin/nproc 2>/dev/null || \\\

/usr/bin/getconf _NPROCESSORS_ONLN`"; \\\ if [ "$RPM_BUILD_NCPUS" -gt 16 ]; then \\\

echo "-j16"; \\\

elif [ "$RPM_BUILD_NCPUS" -gt 3 ]; then \\\ echo "-j$RPM_BUILD_NCPUS"; \\\

else \\\

echo "-j3"; \\\ fi )

%__arch_install_post \

[ "%{buildarch}" = "noarch" ] || QA_CHECK_RPATHS=1 ; \

case "${QA_CHECK_RPATHS:-}" in [1yY]*) /usr/lib/rpm/check-rpaths ;; esac \ /usr/lib/rpm/check-buildroot

(13)

~/.rpmmacros

rpmbuild에 필요한 각종 환경 변수를 설정하는 파일이다.

rpmdev-setuptree를 실행하면 실행 위치에 상관없이

$HOME/rpmbuild 디렉토리가 자동으로 만들어지는데

이는 $HOME/.rpmmacros 파일에 있는 %_topdir 설정 때문이다.

$HOME/.rpmmacros 파일에 있는 %_topdir 설정에 따라

rpmbuild 디렉토리가 생성되는 위치가 결정된다.

만약 $HOME/.rpmmacros 파일이 없으면

rpmdev-setuptree 실행시 자동적으로 만들어진다.

(14)

RPM Packaging Process

패키징 하려는 파일을 모아 소스 파일(.tar.gz)을 만든다.

명세 파일(.spec)을 만든다.

(15)

Cautions when Packaging RPM

패키지를 만들 때 root 사용자 계정을 사용하지 말것!

RPM 패키징시 cp, rm, mkdir 등의 시스템 명령어들을 사용하기 때문에

시스템이 엉망이 될 가능성이 있기 때문.

(16)

Compile / Test

[wanho.choi@rnd-wanho ~]$ vi main.cpp

[wanho.choi@rnd-wanho ~]$ g++ -o main main.cpp

[wanho.choi@rnd-wanho ~]$ ./main

Hello RPM

[wanho.choi@rnd-wanho ~]$ rm -f main

#include <iostream> using namespace std;

int main( int argc, char* argv[] ) {

cout << “Hello RPM” << endl; }

(17)

Collect / Compress

[wanho.choi@rnd-wanho ~]$ tar cvfz MyPackage-1.0.0.tar.gz main.cpp

[wanho.choi@rnd-wanho ~]$ ls *.tar.gz

MyPackage-1.0.0.tar.gz

(18)

[wanho.choi@rnd-wanho ~]$ rpmdev-setuptree

[wanho.choi@rnd-wanho ~]$ ls -R rpmbuild

rpmbuild:

BUILD RPMS SOURCES SPECS SRPMS rpmbuild/BUILD:

rpmbuild/RPMS:

rpmbuild/SOURCES: rpmbuild/SPECS:

rpmbuild/SRPMS:

[wanho.choi@rnd-wanho ~]$ mv MyPackage-1.0.0.tar.gz rpmbuild/SOURCES

(19)

[wanho.choi@rnd-wanho ~]$ cd rpmbuild/SPECS

[wanho.choi@rnd-wanho SPECS]$ vi MyPackage.spec

[wanho.choi@rnd-wanho SPECS]$ cd ..

[wanho.choi@rnd-wanho rpmbuild]$ rpmbuild -ba SPECS/MyPackage.spec

Create .spce file / Build RPM

rpmbuild -bb: binary only

rpmbuild -bs: source only

(20)

[wanho.choi@rnd-wanho rpmbuild]$ ls -R

.:

BUILD RPMS SOURCES SPECS SRPMS ./BUILD: main main.cpp ./BUILDROOT: ./RPMS: x86_64 ./RPMS/x86_64: MyPackage-1.0.0-1.el7.centos.x86_64.rpm MyPackage-1.0.0-1.x86_64.rpm ./SRPMS: MyPackage-1.0.0-1.el7.centos.src.rpm MyPackage-1.0.0-1.src.rpm

(21)

MyPackage.spec (1/3)

Name: MyPackage

Version: 1.0.0

Release: 1%{?dist}

Summary: My First RPM Package

License: Copyright 2018 by Wanho Choi

URL: http://WanoChoi.com

Group: Applications/Tools

Packager: Wanho Choi (wano@choi.com)

Source0: %{name}-%{version}.tar.gz

%description

This is a simple example for explaining how to build our own RPM package. Author: Wanho Choi

BuildRequires: gcc >= 4.8.2

Requires:

(22)

MyPackage.spec (2/3)

%prep cp %{_sourcedir}/%{archive_file} %{_builddir} cd %{_builddir} tar xvf %{archive_file} rm %{archive_file} %build g++ -o main main.cpp %install mkdir -p %{buildroot}/home/wanho.choi/zzz cp main %{buildroot}/home/wanho.choi/zzz/ %clean rm -rf %{buildroot} %files /home/wanho.choi/zzz/main

(23)

MyPackage.spec (3/3)

%changelog

* Fri Mar 30 2018 Wanho Choi - 1.0.0 - Initial RPM packaging

(24)

Group

Amusements/Games Amusements/Graphics Applications/Archiving Applications/Communications Applications/Databases Applications/Editors Applications/Emulators Applications/Engineering Applications/File Applications/Internet Applications/Multimedia Applications/Productivity Applications/Publishing Applications/System Applications/Text Development/Debuggers Development/Languages Development/Libraries Development/System Development/Tools Documentation System Environment/Base System Environment/Daemons System Environment/Kernel System Environment/Libraries System Environment/Shells User Interface/Desktops User Interface/X User Interface/X Hardware Support

(25)

Pre-defined Built-in Macros

%_prefix /usr %_exec_prefix %{_prefix} %_bindir %{_exec_prefix}/bin %_sbindir %{_exec_prefix}/sbin %_libexecdir %{_exec_prefix}/libexec %_datadir %{_prefix}/share %_sysconfdir %{_prefix}/etc %_sharedstatedir %{_prefix}/com %_localstatedir %{_prefix}/var %_libdir %{_exec_prefix}/lib %_includedir %{_prefix}/include %_oldincludedir /usr/include %_infodir %{_prefix}/info %_mandir %{_prefix}/man

[wanho.choi@rnd-wanho ~]$ rpm --eval %{_prefix}

(26)

Fields (1/6)

Name: 패키지의 기본 이름. *.spec 파일의 이름과 같아야 함.

Version: 패키징할 소프트웨어의 버전.

Release: 현재 버전의 소프트웨어가 몇 번째로 릴리즈 되었는가를 나타냄.

보통의 경우 1%{?dist}로 적고, 릴리즈할 때마다 하나씩 증가시켜줌. 버전이

바뀌게 되면 다시 1부터 시작.

Summary: 패키징할 소프트웨어에 대한 한 줄의 간단한 설명.

(27)

Fields (2/6)

License: 패키징할 소프트웨어의 라이센스.

URL: 패키징할 소프트웨어의 정보를 얻을 수 있는 인터넷 주소.

Group: 이 패키지가 속하게 될 그룹.

Packager: 이 패키지를 유지/보수하는 담당자.

Source0: 아카이브 파일(*.tar.gz)의 경로. 여러 개의 아카이브 파일을 포함

시킬 수도 있는데, 이 때에는 Source1, Source2, Sourc3, ... 등으로 적어서

추가해주면 됨.

(28)

Fields (3/6)

Description: 패키징할 소프트웨어에 대한 보다 자세한 설명. Summary는

한 줄로만 적어야 하는 반면, Description은 여러 줄로 적어도 되고 여러 문단

으로 기술할 수 있음.

BuildRequires: 빌드할 때 필요한 패키지들. 콤마(,)나 빈칸으로 구분하여

추가해주면 됨.

Requires: 실행할 때 필요한 패키지들. 콤마(,)나 빈칸으로 구분하여 추가해

주면 됨.

%define: 사용자 정의 매크로.

(29)

Fields (4/6)

%pre: 패키지가 install 되기 직전에 실행되는 부분

%post: 패키지가 install 된 직후에 실행되는 부분

%preun: 패키지가 uninstall 되기 직전에 실행되는 부분

%postun: 패키지가 uninstall 된 직후에 실행되는 부분

(30)

Fields (5/6)

%build: 빌드를 하는 명령어들을 적어주는 곳.

%install: 빌드가 완료된 후 결과 파일들을 패키징할 곳으로 옮겨주는 명령어

들을 적어주는 곳. 보통의 경우 ~/rpmbuild/BUILD에서 ~/rpmbuild/

BUILDROOT로 필요한 파일들을 복사하게 되며, 이 때 ~/rpmbuild/

BUILDROOT에 필요한 디렉토리들을 생성해줌. 여기에 적은 명령어들은 패키

징을 할 때 실행될 뿐이며, 최종 사용자가 패키지를 설치할 때 실행되는 것은

아님.

%clean: 설치가 완료된 후에 실행되며, 보통 빌드된 파일들을 지워주는 명령

을 수행하게 됨.

(31)

Fields (6/6)

%files: 최종적으로 패키지에 포함될 파일 또는 디렉토리들을 모두 이곳에 적

어주어야 함. 최종 사용자가 패키지 설치 경로이기도 함. 단, 패키징을 할 때에

는 적어준 경로 앞에 %{buildroot}가 prefix로 붙어서 해석됨.

%changelog: 패키지의 버전이가 릴리즈 번호가 바뀔 때마다 바뀐 사항들

을 적어주는 곳. 쉘(shell)에서 “rpm -q --changelog MyPackage” 명령으

로 확인할 수 있음.

(32)

[root@rnd-wanho rpmbuild]# cd RPMS/x86_64

[root@rnd-wanho x86_64]# ls

MyPackage-1.0.0-1.el7.centos.x86_64.rpm MyPackage-1.0.0-1.x86_64.rpm

[root@rnd-wanho x86_64]# rpm -ivh MyPackage-1.0.0-1.x86_64.rpm

Preparing… ################################# [100%] Updating / installing…

1:MyPackage-1.0.0-1 ################################# [100%]

[root@rnd-wanho x86_64]# /home/wanho.choi/zzz/main

Hello RPM

[root@rnd-wanho x86_64]# rpm -qa | grep MyPackage

MyPackage-1.0.001.x86_64

[root@rnd-wanho x86_64]# rpm -e MyPackage-1.0.001.x86_64

(33)

Reference

https://rogerwelin.github.io/rpm/rpmbuild/2015/04/04/rpmbuild-tutorial-part-1.html

http://dw.hanbit.co.kr/exam/1759/unixlinux_chapter15.pdf

(34)

참조

관련 문서

– 웨이블릿 변환(wavelet transform) 함수 사용하여 신호 (signal)를 시간과 진동수 측면에서 양측 모두 좋은 신호로 분해하여 압축 성능 을 높인

Explain the operation of binary counters, how to build them using F/F and gates

REPLACE OP-AMP BY LINEAR MODEL SOLVE THE RESULTING CIRCUIT WITH DEPENDENT SOURCES... LEARNING

빅데이터 관련 시장이 성장기에 있고, 이를 활용한 다양한 분석 기술, 장비 및 신규 비즈니스 모델이 개발되는 과정에 있으므로 사업유형을 명확히 구분하기 어렵고, 기존

매크로 정의에서 매개 변수 앞에 #가 위치하면 매크로 호출에 의하여 전달되는 실제 인수는 큰따옴표로 감싸지고 문자열로

Object 파일 또는 중간파일 .OBJ 파일을 링커를 통해 실행(exe) 파일로 변환 (보안,호환, 컴파일 시간 절약).. 각종

For more details on how to build an SDK and set up a host machine for building the kernel and U-Boot only outside of the Yocto Project build environment, see Chapter &#34;How

[r]