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