2019. 8. 16. 16:29

"Debian Package 만들기"



 

    개요

Debian Package란 *.deb 확장자를 가지는 파일로 윈도우의 *.msi 와 같은 프로그램 설치를 위한 파일 이다.

 

데비안 패키지(.deb) dpkg 라는 패키지 관리 도구에 의해 관리 유지 되며,

dpkg 데비안, 우분투, 칼리, 민트 기타 많은 배포판에서 사용되는 패키지 관리 도구이다.

 

.deb 파일은 데비안 패키지이지만 실제로는 표준 유닉스 아카이브(.ar) 파일일 뿐이다.

나중에 다루겠지만 apt역시 dpkg 사용해서 만든 고급 관리도구 이다.

 

 

 

    인스톨된 패키지 확인

현재 자신의 리눅스 장비에 설치된 패키지를 확인해 보자.

dpkg -l       # List installed packages
dpkg -s mypkg # Get status of specific package

apt list --installed # List installed packages
apt list # List *all* packages in available repos

               

 

 

 

    패키지 만들기(Create a package)



1. BASE 디렉토리 만들기

먼저 패키지를 새롭게 만들려면 BASE 디렉토리를 만든다.

디렉토리는 안에는 메타데이터 패키지 내용이 저장 된다.

  • <패키지 이름>_<버전>-<리비전>

Example: devpack_1.0.0-1

$ mkdir devpack_1.0.0-1

 

 


2. DEBIAN/control 파일 만들기

여기서 (DEBIAN) 디렉토리는 하나의 특수 파일로 무조건 있어야 하는 디렉토리 이다.

디렉토리는 안에는 control script 파일이 존재하며, 여기서 만드는 control 파일은 제어파일로

패키지에 대한 중요 정보를 제공하는 파일이다. (Debian control file fields)

Package: devpack
Version: 1.0.0
Maintainer: Your Name <dev@example.com>
Description: My test package
Homepage: http://devanix.tistory.com
Architecture: all

Section:non-free

Priority:optiona
Depends: git, tomcat(>=10.0.1)

  • Package

패키지 이름을 적는다.

소문자로만 이루어 져야하며, (_) 대신 (-) 를 사용한다.

  • Version

패키지의 버전을 명시함.

apt 서버(repository) 및 설치 서버의 내부 DB에서 관리 됨으로 잘 관리 해야함

  • Architecture

amd64/i386 으로 구분됨, 그냥 amd64를 쓰면 됨

  • Maintainer

자식의 이름(닉네임), 연락처 혹은 메일 기입

  • Description

aptcache 나 aptitude 로 패키지 search 를 했을때 Package 이름과 함께 설명으로 출력 되는 부분

  • Depends 필드는 생성할 패키지가 가지는 의존성을 기록한다.

없어도 되는 옵션 필드이지만 자주 사용된다.
기입한 패키지 버전 조건이 맞지 않으면 설치되지 않거나 설치 업데이트를 시도한다.

ex) mysqld ( >= 10.0.0.1) : mysql 패키지가 10.0.0.1 이상이여야 함

ex) tomcat ( = 6.0.0) : tomcat 패키지가 반드시 6.0.0 이여야 함

 

 

DEBIAN/control 파일까지만 만들면 최소한의 패키지 구성이 된다.

# Minimum required structure for a package

devpack-1.0.0/     # Directory
└── DEBIAN/       
# Directory
    └── control   
# File                   

 


3. DEBIAN/conffiles

conffiles 명시된 파일들은(절대경로) 패키지를 제거 (dpkg -r, --remove) 혹은 업데이트 경우

명시된 파일들을 삭제 하거나 덮어쓰지 못하게 합니다.

conffiles 명시된 파일은 dpkg -P, --purge 의해서만 삭제 됩니다.

 

Example :

/etc/myconf.ini
/usr/local/mypack/conf/config.ini
             

 


4. DEBIAN/script 구성

패키지 설치 (preinst), 설치 (postinst), 삭제 (prerm), 삭제 (postrm) 구동 되는
스크립트로 (스크립트 작동 방식 설명) script 이용해 다양하게 구성이 가능하다.


 

 

DEBIAN/preinst

패키지내 포함된 파일을 서버에 설치하기 전에 실행 되는 스크립트

스크립트 아규먼트로 install/upgrade를 받을 수 있다.

 

Example :

#!/bin/bash

############################################################
# preinst script main
############################################################

case "$1" in
install)
  #
최초 설치시 파일 설치 전 수행 되어야 할 내용을 bash 스크립트로 기술
  # EX)
기존 설정 백업, 가동중인 프로세스 down
  ;;

upgrade)
  #
업그레이드시 파일 설치 전 수행 되어야 할 내용을 bash 스크립트로 기술
  ;;

*)
  echo "Unrecognized preinst argument '$1'"

esac

                   

 

 

DEBIAN/postinst

패키지내 포함된 파일을 서버에 설치한 후에 실행 되는 스크립트

스크립트 아규먼트로 configure/upgrade를 받을 수 있다.

 

 

DEBIAN/prerm

패키지 삭제 전 실행 되는 스크립트

스크립트 아규먼트로 upgrade/remove를 받을 수 있다.

 

Example :

#!/bin/bash

############################################################
# prerm script main
############################################################

case "$1" in
upgrade)
  #
업그레이드 전에 해야할 작업 기술
  # EX)
패키지가 업그레이드 될때, 다음 버전 패키지에 의하여 호출 됨.
  ;;

remove)
  #
파일 삭제 전에 해야할 작업 기술
  # EX)
프로세스 중단 등, postinst 에서 했던 작업의 원복으로 생각하면 이해가 편함.
  ;;

*)
  echo "Unrecognized preinst argument '$1'"

esac

                   

 

 

DEBIAN/postrm

패키지 삭제 후 실행 되는 스크립트

스크립트 아규먼트로 remove/purge를 받을 수 있다.

remove - 설정 파일을 제외한 바이너리 파일 삭제.

purge - 설정 파일까지 모두 삭제.

remove 후 재설치를 하면 기존 설정 대로 재사용이 가능 하지만, purge 후 재설치 하면 설정을 다시해야한다.

 

Example :

#!/bin/bash

############################################################
# postrm script main
############################################################

case "$1" in
remove)
  #
파일 삭제 후에 해야할 작업 기술
  # EX) preinst
에서 했던 작업의 원복으로 생각하면 이해가 편함.
  ;;

purge)
  #
파일 삭제 후에 해야할 작업 기술
  # EX) preinst
에서 했던 작업의 원복으로 생각하면 이해가 편함.
  ;;

*)
  echo "Unrecognized preinst argument '$1'"

esac

                   

 


5. 패키지 내용 구성

BASE 디렉토리 밑으로 원하는 패키지 내용을 구성 한다.

일반적으로 패키지 구성으로 라이브러리, 문서, 환경파일, 실행 프로그램, systemd service등으로 구성 있다.

Example:

  • /usr/local/bin
  • /usr/share/man
  • /etc/
  • /usr/local/lib
  • /usr/local/include

 

 

 

 

    패키지 빌드(Build)

패키지 구성을 완료 하였다면 다음과 같이 빌드를 진행해 보자.

자세한 내용은 (dpkg-deb manpage) 참조 한다.

 

dpkg-deb -b ${패키지구성요소디렉토리명} ${패키지명}_{패키지버전}.deb

Example:

# ls -l

total 4

drwxr-xr-x 4 root root 4096 Aug 15 02:51 devpack_1.0.1

 

# dpkg-deb --build devpack_1.0.1 

dpkg-deb: building package `devpack' in `devpack_1.0.1.deb'.


or
 

# dpkg-deb --build devpack_1.0.1 devpack_1.0.1.deb

dpkg-deb: building package `devpack' in `devpack_1.0.1.deb'.

 

 

     



Posted by devanix
2011. 8. 5. 00:23

dpkg 유틸리티는 APT 유틸리티보다 낮은 수준에서 작업을 수행.

APT는 우분투 시스템의 Software를 관리하기 위해 내부적으로는 이 dpkg를 이용한다.

APTdpkg의 관계는 레드햇기반 리눅스 배포판에서 yumrpm의 관계와 유사.

보통은 APT 명령어가 가진 기능만으로도 충분하다. 그러나 시스템에 있는 특정 파일이 어떤

패키지에 포함되어 있는지 확인하는 등의 작업을 수행하기 위해서라면 dpkg 명령이 필요.

 

▶ dpkg 유틸리티의 일반적 사용

dpkg 명령어

설 명

dpkg -c <.deb file>

주어진 .deb 파일이 설치한 파일 목록을 보여줌.

(.deb 파일은 '경로/파일명' 형태로 주어져야 함)

dpkg -I <.deb file>

주어진 .deb 파일에 대한 정보를 보여줌.

dpkg -p <package>

패키지에 대한 정보를 보여줌.

dpkg -S <filename>

주어진 파일명 또는 경로가 포함된 패키지들을 검색.

dpkg -l

설치된 패키지 목록을 보여줌.

이 명령은 좀 더 세부적인 정보를 위해 옵션들을 취할 수 있음.

dpkg -L <package>

주어진 패키지로부터 설치된 모든 파일목록을 보여줌.

(물론 패키지가 먼저 설치되어 있어야만 함)

dpkg -s <package>

주어진 패키지의 상태를 보여줌.

sudo dpkg -i <.deb file>

주어진 .deb 파일을 설치.

sudo dpkg -r <package>

시스템으로부터 주어진 패키지를 삭제.

그러나 파일들은 남겨둔다.

sudo dpkg -P <package>

주어진 패키지와 해당 패키지의 설정파일을 삭제.

sudo dpkg -x <.deb file> <directory>

.deb 파일에 포함되어 있는 파일들을 지정된 디렉토리에 풀어 놓음.

(이 명령은 지정된 디렉토리의 퍼미션을 초기화하므로 주의)

sudo dpkg -e <.debfile> <directory>

.deb 파일 내부의 제어스크립트를 지정된 목표 디렉토리에 추출.

 

 

■ dpkg를 사용하여 패키지 설치 & 삭제

apt-get 명령어가 저장소(Repository)에서 패키지를 찾거나 다운로드하는 등의 세부사항을 다루는데 반해

dpkg 명령어는 패키지 그 자체에 집중한다.

 

▷ 실습 준비를 위해 .deb 파일 다운로드.

# apt-get명령에 -d 옵션을 사용하면 다운로드만 받는다. #

$ sudo apt-get -d install minicom

# /var/cache/apt/archives 디렉토리에 .deb 파일을 다운로드 받음. #

$ ls -l /var/cache/apt/archives

lock lrzsz_0.12.21-5_i386.deb minicom_2.5-1_i386.deb

 

▷ 패키지 설치 & 삭제

## 패키지 설치 ##

$ sudo dpkg -i /var/cache/apt/archives/minicom_2.5-1_i386.deb

Selecting previously deselected package minicom.

…[중략]…

 

## 패키지 삭제 ##

$ sudo dpkg -r minicom

(데이터베이스 읽는중 ...현재 170237개의 파일과 디렉터리가 설치되어 있습니다.)

minicom 패키지를 지우는 중입니다 ...

## 패키지 설정파일 까지 삭제 ##

$ sudo dpkg -P minicom

(데이터베이스 읽는중 ...현재 170237개의 파일과 디렉터리가 설치되어 있습니다.)

minicom 패키지를 지우는 중입니다 ...

minicom의 설정 파일을 깨끗이 지우는 중입니다 ...

Cannot remove /etc/minicom, please do it manually.

man-db에 대한 트리거를 처리하는 중입니다 ...

 

■ dpkg를 사용하여 .deb 파일 풀기

우분투 패키지는 .deb라는 단일 파일로 묶여 있다.

.deb 파일은 그 내부에 빌드된 명령어, 관련 파일, 문서, 그리고 소스코드 등 하나 이상의 파일들을 포함.

기본적으로 .deb 파일은 컴퓨터에 설치하길 원하는 파일들로 묶인 아카이브로,

소프트웨어를 식별하기 위한 헤더정보와 제어정보(설명, 체크섬, 빌드정보 등) 등을 포함하고 있다.

$ sudo dpkg -x minicom_2.5-1_i386.deb /tmp/minicom/contents

$ ls /tmp/minicom_contents/

etc usr

 

■ .deb 패키지 정보 질의

## 패키지 정보 확인 ##

$ dpkg -p minicom

Package: minicom

Priority: optional

Section: comm

Installed-Size: 1164

Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>

Architecture: i386

Version: 2.5-1

…[중략]…

 

## 현재 디렉토리에 있는 .deb 파일 정보 ##

$ dpkg -I minicom_2.5-1_i386.deb

new debian package, version 2.0.

size 285352 bytes: control archive= 3144 bytes.

520 bytes, 13 lines control

4669 bytes, 65 lines md5sums

412 bytes, 20 lines * postinst #!/bin/sh

365 bytes, 20 lines * postrm #!/bin/sh

900 bytes, 39 lines * preinst #!/bin/sh

Package: minicom

…[중략]…

 

## 시스템에 설치되어 있는 모든 패키지 목록 (한 화면씩) 확인 ##

$ dpkg -l | less

…[중략]…

ii abiword-plugin-grammar 2.8.6-0.3build1 grammar checking plugin for AbiWord

ii abiword-plugin-mathview 2.8.6-0.3build1 equation editor plugin for AbiWord

…[중략]…

 

## 시스템에 있는 파일이 어떤 패키지에 포함되어 있는지 확인 ##

$ dpkg -S /usr/bin/rsync

rsync: /usr/bin/rsync

$ dpkg -S /sbin/ifconfig

net-tools: /sbin/ifconfig

 

## 설치된 패키지에 상태 정보 ##

$ dpkg -s rsync

Package: rsync

Status: install ok installed

Priority: optional

Section: net

Installed-Size: 676

Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>

…[중략]…

 

## 로컬 디렉토리에 있는 .deb 파일 내용 ##

$ dpkg -c minicom_2.5-1_i386.deb

drwxr-xr-x root/root 0 2011-02-05 15:31 ./

drwxr-xr-x root/root 0 2011-02-05 15:31 ./usr/

drwxr-xr-x root/root 0 2011-02-05 15:31 ./usr/share/

drwxr-xr-x root/root 0 2011-02-05 15:31 ./usr/share/man/

drwxr-xr-x root/root 0 2011-02-05 15:31 ./usr/share/man/man1/

…[중략]…

 

## 패키지가 시스템에 설치한 파일 목록 ##

$ dpkg -L minicom

/.

/usr

/usr/share

/usr/share/man

…[중략]…

Posted by devanix
2011. 8. 4. 06:15

♧ 우분투는 데비안 기반 시스템의 표준 패키징 방식인 데비안 패키지 포맷(실제로는 ar 아카이브 파일)을 사용.

소프트웨어는 하나 이상의 데비안 패키지(.deb 확장자) 컴포넌트로 분리될 수 있는데,

여기에는 소프트웨어 파일만 저장되어 있는 것이 아니라 패키지에 대한 많은 정보를 포함 시킬 수 있다.

이러한 메타데이터는 소프트웨어의 의존성, 컴퓨터 아키텍처, 벤더, 크기, 라이센스, 설명문 등 다양한 정보를 포함.

 

우분투 시스템을 설치한 후, 시스템의 사용목적에 따라 필요한 .deb 파일을 추가, 삭제, 관리할 수 있다.

우분투를 비롯한 그밖의 데비안 기반 시스템에서는 대부분 소프트웨어 설치를 위해 .deb 파일을 사용.

aptitude 툴은 그때 그때 필요한 소프트웨어를 다루는 데 아주 유용.

그러나 패키지 관리를 위해 매우 다양한 툴이 개발되어 있고 일부는 함께 사용되는 경우도 있다.

 

▶ 패키지 관리 툴

APT

온라인 리포지토리에서 패키지를 다운로드 받고 설치하는 데 사용되는 프로그램.

APT 명령어(apt-get, apt-cache 등)들은 로컬에서 패키지를 설치하는 데 사용할 수도 있지만,

정상적인 사용을 위해서는 온라인 환경에서 사용해야 함.

dpkg 

CD-ROM이나 다른 디스크 저장장치에 있는 .deb 파일을 제어하는 경우 사용.

시스템 소프트웨어에 대한 설정, 설치, 그리고 정보 획득을 위한 옵션들을 가짐.

aptitude 

커맨드라인 명령어로 온라인 리포지토리와의 작업을 위해 사용.

aptitude 도구는 APT나 dpkg를 사용할 경우 사용자가 직접 해주어야 하는 번거로운

작업들을 자동화해주기 때문에 사용자의 첫 번째 패키지툴로써 추천된다.

시냅틱 패키지 관리자(Synaptic Package Manager):

데비안 패키지 관리 시스템인 APT(Advanced Packaging Tool)의 그래픽 유저 인터페이스(GUI) 프론트엔드 프로그램.

일반적으로 deb 패키지를 기반으로 한 시스템에서 이용하지만, RPM을 베이스로 한 시스템에서도 이용할 수 있다.

소프트웨어 패키지의 설치, 삭제 그리고 업그레이드 및 소프트웨어 저장소(software repository)를 추가할 수 있다.

▷ APT 하우투 문서 : http://www.debian.org/doc/manuals/apt-howto

▷ 다른 리눅스 배포판들도 APT와 비슷한 패키징 시스템을 사용.

- 레드햇 기반의 배포판들의 경우 : yum, rpm, urpmi, smart와 같은 소프트웨어 관리 툴을 사용.

 

▶ 우분투(Ubuntu)에서 소프트웨어의 종류.

▷ 사용가능한 전체 패키지 수:

$ apt-cache stats

전체 패키지 이름 : 42450 (849 k)

전체 패키지 구조: 42450 (2,038 k)

일반 패키지: 32601

…[중략]…

앞에서 볼 수 있듯이 우분투에서는 기본적으로 수만 가지가 넘는 소프트웨어 패키지를 사용할 수 있다.

데비안 커뮤니티에서는 이들 패키지에 재배포 가능한 소프트웨어만 포함될 수 있도록 지속적으로 노력하고 있다.

 

비록 데비안이 자유 소프트웨어를 신뢰하고 있지만, 사람들이 자신의 컴퓨터에

독점 소프트웨어를 설치해야 하는 경우도 있다. 따라서 데비안에서는 독점 소프트웨어가

주요 배포판에 포함되지는 않더라도 가능한 한 언제든지 이들을 지원할 것이다.

이러한 소프트웨어는 보통 FTP 사이트의 non-free 디렉토리에서 사용할 수 있다.

우리가 직접 배포할 수는 없기 때문에 개인이 직접 설치하는 독점 소프트웨어의 수가 증가하고 있다.

 

이와 유사하게 Canonical사에서도 우분투 소프트웨어를 다음과 같이 네 개의 카테고리로 나누어 제공.

(http://www.ubuntu.com/community/ubuntustory/licensing)

main

우분투 팀에 의해 지원되며 자유롭게 배포할 수 있는 소프트웨어가 포함.

우분투가 설치될 때 이들 소프트웨어 중 상당수가 설치.

restricted

완전한 자유 라이선스 소프트웨어는 아니지만, 우분투팀에 의해 지원되며

많은 리눅스 시스템에서 일반적으로 사용되고 있는 소프트웨어가 포함

universe

리눅스 세계에서 사용할 수 있는 거의 대부분의 오픈소스 소프트웨어를 포함.

universe 카테고리의 소프트웨어는 자유 라이선스일 수도 있고 아닐 수도 있으며

보안에 대한 수정이나 자원을 보장받을 수는 없다.

multiverse 

우분투의 핵심 라이선스 정책에 준하는 자유 소프트웨어가 아닌 소프트웨어를 포함.

이 카테고리의 소프트웨어는 어떠한 지원도 받지 못하며 라이선스의 적법성도

개인이 스스로 확인해야 한다.

▷ 서버와 같이 안정적인 서비스가 중시되는 시스템인 경우 가급적 universe, multiverse 카테고리 사용을 피한다.

 

 

[ 로케일 에러 메시지 다루기 ]

만약 우분투(Feisty Fawn)의 커맨드라인 환경에서 패키지 설치 작업을 수행하고 있다면,

다음과 유사한 로케일 에러 메시지를 접하게 될 것이다.

perl: warning: Setting locale failed.

perl: warning: Please check that your locale settings:

locale: Cannot set LC_CTYPE to default locale: No such file or directory 

 

이러한 에러는 일반적으로 설치된 언어 설정과 관련된 문제이거나

국제화된 인코딩에 관련된 문제인 경우가 많다. 이 문제에 대한 한 가지 만족할 만한 해결 방법은

LC_ALL 환경변수의 값을 LANG 변수의 값과 동일하게 설정하는 것.

$ export LC_ALL="$LANG"

~/.bashrc 파일에 해당 명령을 입력하면 local 또는 ssh 쉘이 실행될 때마다 자동 실행.

Posted by devanix