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. 6. 19:14

♧ 데비안 패키지를 만드는데 사용되는 .deb 파일을 재빌드하면, 현재 사용하고 있는

소프트웨어를 좀 더 유용하게 활용할 수 있다(md5sum 파일을 포함 등…).

 

① 재빌드 하기위해 피캐지 다운로드

$ aptitude download rsync

Get:1 http://ftp.daum.net/ubuntu/ natty/main rsync i386 3.0.7-2ubuntu3 [285 kB]

Fetched 285 kB in 0초 (1,773 kB/s)

 

② 다운로드 받은 .deb 파일에서 패키지 내용과 제어파일들을 풀어 놓는다.

$ sudo dpkg -x rsync_3.0.7-2ubuntu3_i386.deb /tmp/rsync_$RANDOM

$ sudo dpkg -e rsync_3.0.7-2ubuntu3_i386.deb /tmp/rsync_2752/

$ cd /tmp/rsync_2752/

$ ls -lrt

합계 40

-rwxr-xr-x 1  root root    494      2011-04-08 23:31   prerm

-rwxr-xr-x 1  root root    113      2011-04-08 23:31   postrm

-rwxr-xr-x 1  root root    712     2011-04-08 23:31   postinst

drwxr-xr-x 4 root root    4096   2011-04-08 23:32   usr

drwxr-xr-x 4 root root    4096   2011-04-08 23:32   etc

-rw-r--r-- 1   root root    37        2011-04-08 23:32   conffiles

-rw-r--r-- 1  root root     901      2011-04-08 23:32   control

-rw-r--r-- 1  root root    1676    2011-04-08 23:32   md5sums

$RANDOM 디렉토리는 실행 될 때마다 랜덤한 숫자가 출력되므로 사용자마다 다를 것.

/tmp/rsync_<탭키> 누르면 자동으로 찾을 수 있다.

 

③ 새로운 .deb 파일을 만들기 위해서 dpkg의 포맷에 맞는 패키지 디렉토리 구조 설정.

/* rsync_3.0.7.2cn3/DEBIAN이라는 이름의 하위 디렉토리 생성후 설치 파일들을 이동 */

$ sudo mkdir -p rsync_3.0.7-2cn3/DEBIAN

$ sudo mv con* md5sums post* prerm rsync_3.0.7-2cn3/DEBIAN/

/* 또한 etc/와 usr/ 디렉토리 역시 rsync_3.0.7-2cn3로 옮김 */

$ sudo mv usr etc rsync_3.0.7-2cn3/

 

④ 만약 md5sums 파일이 없을 경우 : 이전 챕터(Chap2 #06)에서

[누락된 md5sum 생성 & 체크]를 참조하여 md5sums 파일을 만들어

DEBIAN 하위 디렉토리에 md5sum이라는 이름으로 이동 시킴.

(이는 debsums 검사에 사용할 수 있도록 md5sum 파일을 패키지에 포함시키는 작업)

$ sudo mv /var/lib/dpkg/info/rsync.md5sums rsync_3.0.7-2cn3/DEBIAN/md5sums

 

⑤ 제어 파일을 편집하여 필요한 정보를 변경

$ sudo vi rsync_3.0.7-2cn3/DEBIAN/control

Package: rsync

Version: 3.0.7-2cn3

Architecture: i386

…[중략]…

Description: Modified by CN 2011-08-06 to include md5sums.

fast remote file copy program (like rcp)

…[중략]…

md5sums 파일이 포함된 새rsync 패키지가 기존 패키지와 동일한 버전으로 설치될 경우,

이들 두 버전을 구분할 수 없게 되는 등의 문제가 발생할 수 있다.

이는 시스템 관리 측면에서 매우 큰 문제이다.

따라서 텍스트 편집기(vi등)를 이용해 제어 파일을 열고 Version필드를 변경하도록 한다.

(Version 단어 다음에 콜론이 붙은 형태는 헤더 필드를 의미하므로 변경되지 않도록 주의)

정보 필드는 이러한 헤더 필드 다음에 따라오는데, 패키지 제어 파일 서식은 매우 까다롭기 때문에

콜론 문자 다음에 불필요한 공백문자나 줄 바꿈 문자가 들어가지 않도록 관리한다.

Description: 필드는 패키지에 대해 좀 더 상세한 정보를 제공하는 필드이다.

(fast remote… 구문 바로 이전의 공백문자에 주의.)

이 공백문자는 dpkg가 여러 라인의 헤더와 설명문을 구분할 수 있도록 알려주는 특별한 의미를 가진 포맷이다.

만약 이 설명문이 여러 라인에 걸쳐 기술된다면 모든 라인 앞에 공백문자를 하나씩 입력.

 

⑥ dpkg -b 옵션을 이용해 새로운 패키지를 빌드

$ sudo dpkg -b rsync_3.0.7-2cn3/

dpkg-deb: 경고: 'rsync_3.0.7-2cn3//DEBIAN/control'에 사용자 정의 필드

`Original-Maintainer'이(가) 들어 있습니다

dpkg-deb: 경고: 컨트롤 파일과 관련된 1개 경고를 무시합니다

 

dpkg-deb: `rsync' 패키지 빌드하는 중입니다 (`rsync_3.0.7-2cn3.deb'에서).

☞ (사용자 정의 필드 관련하여 패키지 담당자에 대한 경고 메시지는 무시해도 무방하다)

 

⑦ dpkg -I 옵션을 이용해 새 패키지에 대한 정보 확인

$ dpkg -I rsync_3.0.7-2cn3.deb

new debian package, version 2.0.

size 284678 bytes: control archive= 2121 bytes.

37 bytes, 2 lines conffiles

944 bytes, 21 lines control

1676 bytes, 23 lines md5sums

712 bytes, 30 lines * postinst #!/bin/sh

113 bytes, 8 lines * postrm #!/bin/sh

494 bytes, 30 lines * prerm #!/bin/sh

Package: rsync

Version: 3.0.7-2cn3

Architecture: i386

…[중략]…

 

⑧ 시스템에 새로 만들어진 rsync 패키지를 설치 & 확인

$ sudo dpkg -i rsync_3.0.7-2cn3.deb

dpkg: 경고: rsync 패키지를 3.0.7-2ubuntu3 버전에서 3.0.7-2cn3 버전으로 다운그레이드.

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

rsync 3.0.7-2ubuntu3 패키지를 대체할 준비하는 중입니다 (rsync_3.0.7-2cn3.deb 사용) ...

대체되는 rsync 패키지를 푸는 중입니다 ...

rsync (3.0.7-2cn3) 설정하는 중입니다 ...

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

ureadahead에 대한 트리거를 처리하는 중입니다 ...

ureadahead will be reprofiled on next reboot

 

/* md5sum 파일들을 바탕으로 패키지 파일 검사*/

$ debsums rsync

/usr/bin/rsync OK

/usr/share/doc/rsync/examples/rsyncd.conf OK

/usr/share/doc/rsync/examples/logrotate.conf.rsync OK

 

/* 새 버전이 정상적으로 설치되었는지 rsync 패키지 정보 확인 */

$ dpkg -l rsync

희망상태=알수없음(U)/설치(I)/지우기(R)/깨끗이(P)/고정(H)

| 상태=아님(N)/설치(I)/설정(C)/풀림(U)/절반설정(F)/일부설치(H)/트리거대기(W)/

|  /     트리거밀림(T)

|/ 오류?=(없음)/다시설치필요(R) (상태, 오류가 대문자=불량)

||/ 이름 버전 설명

+++-=================-=================-==================================================

ii      rsync                              3.0.7-2cn3                     Modified by CN 2011-08-06 to include md5sums.

☞ 이 실습은 사용자 정의 패키지를 만들기 위한 기본적인 부분만을 다룬 것으로,

시스템 해킹을 위해 필요한 실제 작업내용은 포함하지 않았다. 그렇지만, 다음 예제에서 볼 수 있듯이

이렇게 만들어진 패키지도 역시 보통의 데비안 패키지와 같이 설치되고 동작한다.

물론 추가적으로 debsums 작업도 가능해졌다.

(dpkg가 다운그레이드에 대해 말해주므로 주의)

 

 

데비안 바이너리 패키지 만들기 하우투 문서 :

http://www.tldp.org/HOWTO/Debian-Binary-Package-Building-HOWTO

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