Debian Gnu/Linux 2

-중간 수준의 패키지 관리 프로그램 dpkg-

1997년 11월리눅스 월드 기사

박주연 / 나우누리 리눅스 동호회 시샵

들어가기에 앞서

지난 호에서는 데비안의 dselect 메뉴 시스템을 통해 원하는 패키지를 설치하는 방법에 대하여 살펴보았다 개념상 알아두어야할 부분이 많아서 비교적 어렵게 느껴졌을지도 모르겠다. 이번호에서는 데비안 메뉴 시스템인 dselect 의 뒤에서 패키지의 설치/ 추가 /삭제를 실제적으로 행하는 프로그램인 dpkg와 그 부속 프로그램에 대해서 알아보기로 한다 dpkg는 레드햇 리눅스 배포본의 rpm과 그 역할이 비슷하며 rpm과 그 역할이 비슷하며 rpm과 비교하여 dpkg 는 선택 사항이 많고 유연하며 기능이 매우 다양하다 다른 측면에서 본다면 ,비교적 복잡한 기능들이 많다고도 할 수 있겠다.
필자는 자동 응답 전화기를 산지 2년이 되었는데 아직 자동응답 메시지를 녹음해 본 적도 없고 집 바깥에서 부재중에 온 메시지를 들을 수 있게끔 만들어진 자동 응답 전화기의 기능을 이용해 본적이 없다 전화는 잘 걸리고 잘 받을 수 있으면 전화기라고 생각하는 필자라서 그런지도 모르겠다. 하지만 대부분의 사람들도 전화기를 그렇게 생각하고 있지 않나 생각된다 마찬가지로 dpkg의 다양한 선택 사항에서 필요한 몇 가지의 사항으로 큰 불편없이 데비안 패키지를 설치 ./추가 ./삭제할 수 있을 것이다 이 번호에서는 자주 쓰이는 내용과 그리 많이 쓰이지는 않지만 유용하게 사용되는 선택 사항들을 종합하여 다뤼 볼 것이다 필자도 초기에는 그 많은 명령을 몰라도 될 것이라고 생각했었는데 하나 하나 알아가니 그만큼 편해질 수 있었다. 그러면 dpkg의 기능에 대해서 살펴보도록 하자.

deb 파일의 구조와 형식

deb 파일의 이름은 다음과 같은 형식으로 되어 있다.

foo_VVV-RRR_AAA.deb

foo: File name
VVV: Version number
RRR: Revision number
AAA: Architecture name

foo는 파일명이다 이곳에는 gimp, passwd lpr elm pine smail sendmail 등의 패키지의 성격을 나타내는 이름이 들어간다 파일명은 보통 영문자와 숫자 그리고 특이하지 않은 기호문자('-'나'+') 로 이루어지며 보통 소스 단위로 원 저작자에 의해 배포되는 이름이 사용되나 간혹 커다란 소스일 경우 부분으로 나뉘어져 하나의 소스에서 여러 개의 deb패키지가 생성될 수 있기 때문에 (multiple package로 보통 xfree86이나 emacs pine, teTeX등 ) 이름이 조금씩 다를 수 있다 그러나 패키지의 성격을 잘 나타낼 수 있는 이름으로 만들어지면 나름대로의 'de facto standard' 로 굳어져 있다.

VVV는 버전번호이다. 역시 원 소스 배포자가 만들어낸 버전번호를 따르게 되며 . 커널의 경우 2.0.29, 2.0.30.등의 버전번호 GNU C 컴파일러의 경우 2.7.2.1., 2.7.2.3 등의 버전번호를 볼수 있다 그러나 꼭 숫자로만 이루어지는 것은 아니고 소스배포자가 버전번호를 어떻게 붙이느냐에 달려 있기 때문에 표준적으로 정해 놓은 것은 없다 버전 번호는 숫자가 우선되며 숫자에 추가되어 소스의 패치등에 따라 영문자가 추가될 수 있으며 . Dot('.')이 허용된다.

RRR은 리비 전(Revision) 번호로 원 소스의 버젼업 없이 데비안 패키지의 보안문제 , 쉘 스크립트의 변화 패키지의 의존성변화 혹은 새로운 소스의 컴파일이 이루어졌을 때 변화하게 된다. 1에서부터 시작하여 보통 정수로 변화하며 간혹 소수점이 포함되기도 하나 정수로 변화하는 것이 표준이다.

AAA는 바이너리 파일의 생성 플랫폼을 적어준다 보통 배포될 때에는 binary-{i386, powerpc, sparc, alpha, m68k}등의 디렉토리에 따로 저장되므로 아키텍처의 명을 생략하나 실제 패키지 생성 때는 명시된다 i386, powerpc, sparc, alpha, m68k가 유효한 명이고 플랫폼에 상관없이 패키지(도큐먼트 셀 스크립트 펄 스크립트 등)일 경우 all이 생성 플랫폼으로 기재된다.

예를 들어보자

libc5_5.4.33-7_I386.deb

위의 패키지는 libc5 라는 이름을 가진 패키지로 버전번호는 5.4.3.3.이고 데비안 개정번호 (revision number)는 7 이며 이 패키지가 사용될 수 있는 아키텍처는 i386 계열의 프로세서이다.

manapages_1.17-3_all.deb

위의 패키지는 manapages 라는 이름을 가진 패키지이다 이름에서 알 수 있듯, man 페이지로 동작하는 프로세서와 상관없는 플랫폼에 독립적인 (platform-Independent) 패키지이다 버전번호는 1.17 이고 데비안 개정번호 ( revision number) 는 3이며 어떤 플랫폼에서도 공통으로 설치 가능한 패키지이다.

레드햇 패키지와 비교해 볼 수 있다.

rar-2.00-3beta.i386.rpm

위의 패키지는 레드햇 패키지로 패키지 이름은 rar이고 버전번호는 2.00이며 개정번호는 3beta이다 그리고 이 패키지가 사용될 수 있는 아키텍처는 i386 이다 패키지 명을 부여하는 것은 비슷하다고 할 수 있다.

보통 배포본 패키지에는 아키텍처명이 생략되어 있는 경우가 있다. 따라서 현재 이 패키지가 어떠한 아키텍처에서 돌아가는지 알 수 없을 때도 있다 dpkg는 이에 대한 정보를 볼 수 있게끔 해준다. 그러면 지금부터 dpkg의 옵션을 하나 하나 살펴가며 자세한 사용법을 알아보도록 하자 .

dpkg의 사용법

dpkg에서 많이 사용하는 옵션을 몇 가지 예로 들면서 그 사용법을 익혀 보도록 하자

 dpkg - help

이 옵션은 dbkg에서 사용되는 모든 옵션을 출력해준다. 옵션의 출력 내용은 이러한 형식이 될 것이다.

Usage:
 
 
dbkg -i| -install        <.deb file name>... | -R|-recursive <dir>...
 
 
dbkg -unpack          <.deb file name>... | -R|-recursive <dir>...
 
 
dbkg -A| -record-avail   <.deb file name>... | -R|-recursive <dir>...
 
 
dbkg -configure          <.deb file name>... | -a|-pending
 
 
dbkg -r| -remove |-purge <.deb file name>... | -a|-pending
 
 
dbkg -get-selection[<pattern>..] get list of selections to stdout
 
 
dbkg -set-selection           set package selections from stbin
 
 
dbkg -update-avail <Package-file> replace available package info
 
 
dbkg -merge-avail <Package-file> merge with info from file
 
 
dbkg -clear-avail erase existing available info
 
 
dbkg -forget old unavail forget unistalled unavailable pkgs
 
 
dbkg -s| -status <Package-file> display package status details
 
 
dbkg -print-avail <Package-file> display available version details
 
 
dbkg -L|-listfiles <Package-file> list files owned' by package(s)
 
 
dbkg -I|-list [<pattern>] list packages concisely
 
 
dbkg -S|-search <pattern> find package(s) owning file(s)
 
 
dbkg -C|-audit check for broken package(s)
 
 
dbkg -print-architecture print target architecture(uses GCC)
 
 
dbkg -print-gnu-bulid-arch-architecture print GNU version of target arch
 
 
dbkg -print installation-architecture print host architecture (for inst'n))
 
 
dbkg -compare-versions <a> <rel> <b> compareversion number- see below
 
 
dbkg -help |-version show this help /version number
 
 
dbkg -force -help |-Dh |-debug=help help on forcing resp. debugging
 
 
dbkg -licence print copyright licencing terms
 
 
 
 
Use dpkg -b |-bulit |-c |-contents| -e | -control| -l | -info | -f |-field |
 
 
-x | -extract | -X |-vextract | -fsys-tarfiles on archives (type dpkg-deb-help.)
 
 
For intermal use : dpkg -assert-support-predenpends | predep-package |
 
 
-assert-working-epoch
 
 
Options :
 
 
-admindir =<directory> Use <directoty> instead of /var/lib/dpkg
 
 
-root= <directory> Install on alternative system rooted elsewhere
 
 
-instdir=<directory> Change inst'n root without chageing admin dir
 
 
-O|-selection-only Skip packages not selected for install/upgrade
 
 
-E|-skip-same-version Skip packages whose same version in installed
 
 
-G=-refuse-downgrade Skip packages with earlier version than installed
 
 
-B|-auto-deconfigure Install even if it would break some other package
 
 
--large mem | smallmem Optinise for large (>4Mb) or small (<4Mb) RAM use
 
 
--No-act Just say what we would do - don't do it
 
 
-D | -deug =<octal> Enable debugging- see Dhelp or - debug=help
 
 
--ignore-depends=(packages)... Ignore dependencies involving (pagkage)
 
 
--force-.. Override Problem- see --force-help
 
 
--no-force-,,,|-refuse-..Stop when problem encountered
 
 
Comparison operators for - compare-version are:
 
 
It le eq ne ge gt (treat no version as earlier than any version );
 
 
It-nl le-nl ge-nl gt-nl (treat no version as later than any version );
 
 
< << <==>=>> > (only for compatibility with control file syntax).
 
 
Use dselect for user-friendly package management.
 
 
 

옵션이 너무 많다고 질리지 말자 전화기에 기능이 많아도 다 사용하는 건 아니지 않는가 , 가장 많이 쓰는 몇 가지 만 알면 이용에 큰지장은 없다 (지장이 있다는 이야기도 될 수 있겠다.)
그냥 dpkg만 처 넣으면 어떤 행동을 해야 하는지 친절하게 dpkg가 알려준다.

dpkg : need an auction potion
 
 
 
Type dpkg -help for help about installing and deinstalling
 
 
packages [*];
 
 
Use dselect for user-friendly package management;
 
 
Type dpkg -Dhelp for a list of dpkg debug flag values;
 
 
Type dpkg -force-help for list of forcing options;
 
 
Type dbkg-deb -help for help about manipulating *.deb files
 
 
Type dpkg -licence for copyright licence and lack of warranty
 
 
(GNU GPL) [*]
 
 
 
 
Option marked [produce a lot of output - pipe it through less' or more'!
 
 
 

dpkg를 치면 친절하게 dselect를 사용할 것을 권하고 있다. 이번에 dpkg를 사용하는 방법을 배울 것이기 때문에 dpkg의 권고를 사양하자

dpkg -info foo_VVV-RRR.deb

이 -info 옵션을 주면 특정 패키지의 정보를 볼수 있다.이 패키지의 정보는  패키지 내부의 정보를 담고 있는 debian/control파일을 화면에 출력시켜 주는 것으로 이패키지의 이름 그리고 의존성관계 충돌여부 등 다양한 정보를 기록하게 된다 다음호에 다룰 데비안 패키지 만들기애서 다뤼질 내용이기도하다 출력예를 살펴보자

$dpkg -info xbase_3.3-7.deb
 
new debian package_3.3-7.deb
 
size 2205438 bytes: control archive = 3892 bytes.
 
   476 bytes, 22 lines  conffiles
 
   880 bytes, 19 lines  control
 
 5066 bytes, 227 lines *postinst   #!/bin/sh
 
   136 bytes,   8 lines postrm     #!/bin/sh
 
  4179 bytes, 147 lines preinst #!/bin/sh
 
146 bytes 11 lines prerm    #!/bin/sh
 
Package: xbase
 
Version:3.3-7
 
Architecture: i386
 
Depends: cpp,libc6, ncurses3.4, xlib6g (>=3.3-5)
 
Recommends:xserver-vga16 |xsever
 
Conflicts :xstd. xterm-color
 
Replaces:xstd,xterm-color
 
Install -Size : 5709
 
Maintainer : Mark.W.Eichin <eichin@kitten.gen.ma.us>
 
Source: Xfree86
 
Description : Local clients and configuration repqured by X
 
This package contains the basic X11R6 distribution .It includes the
 
basic clients and configuration files lt does not provide a
 
server-servers for several different video cards are includes in
 
separate packages. This package also does not include the shared libraries ;
 
for these you must install are installed along with this package,
 
it provides a functional X Windows System installation , For a more
 
complete installation you can install the "xcontrib' package.

위에서부터 살펴보면 이 패키지는 설치되지 않은 새로운 데비안 패키지임을 알려주고 있으며, 패키지 관리번호 형식 번호는 2.0 이다. (이 관리 형식번호는 패키지 관리 시스템의 변화에 따라 정하여 지며 현재에는 2.2.0.0이 가장 많이 쓰이며 데비안 v2.0에서는 2.3.0.0이 사용될 것이다 ) 패키지의 크기도 나타난다. 그리고 그 아래에는 conffiles, control. postinst postrm, preinst, prerm 에 대한 정보가 나와있다.

이 파일은 데비안 패키지 내부에서 패키지 설치./추가/삭제에 사용되는 셀 스크립트로 그 역할은 매우 큰데 conffiles는 /etc 디렉토리에 저장되는 이 패키지의 설정파일을 명시하고 있다. 이 파일이 필요한 이유는 추후 패키지의 갱신이나 재설치 혹은 삭제시 설정파일을 지우거나 덮어 씌우지(overwrite) 않고 패키지를 업그레이드 가능하게끔 해주도록 하기 위해서 이다 그리고 postinst는 패키지를 해당 디렉토리에 풀어 놓은 후 에 실행될 스크립트이며 postrm은 패키지를 삭제할 때 해당 디렉토리의 관련파일을 삭제한 후 실행도리 스크립트이다 preinst는 패키지를 해당 디렉토리에 풀기 전에 실행될 스크립트이고 prerm은 패키지를 해당 디렉토리에서 삭제할 때 관련파일을 삭제하기 전 실행되는 스크립트이다 이에 대해서는 다음 호에서 자세히 다루기로 한다.

 Package : 아래에 나타나는 부분은 control 파일 내의 정보로 패키지의 이름 버전번호 아키텍처, 의존관계 , 설명 등의 내용이 나타난다. 이를 확인함으로써 현재 이 패키지가 어느 곳에 사용될 것이고 어떤 패키지와 관련이 있는지 알 수 있게 된다.

dpkg -- install foo_VVV-RRR,deb

이 옵션을 통해 패키지를 설치하게 된다 --install 은 -i와 똑같다 이 옵션은 추후에 설명할 --unpack과 --configure 의 작업을 모두 하게 된다. 패키지의 명은 복수로 사용할 수 있으며, 복수로 사용할 때에는 복수의 패키지를 모두 unpack 한 후 한꺼번에 설정하게 된다 가장 많이 사용하는 옵션이며 가장 당황할 만한 메시지가 많이 나타나는 옵션이기도하다 일반적으로 패키지를 설치할 때에는 이 옵션을 사용하면 된다.

이 옵션을 출력할 때의 출력 예를 살펴보자

$dpkg - install ncfto 2.4.2-1.deb
 
(Reading database...28404 files and directories currently installed.)
 
Unpacking ncftp(from ncftp_2.4.2-1.deb)...
 
Setting up ncftp (2.4.2-1)...
 
$

위는 ncftp의 설치 화면이다. 설치가 시작되면 우선-unpack옵션이 작동하여 패키지를 unpacking하고 그리고 난 후 --configure 옵션을 통해 셋업하게 된다 패키지에 따라 preinst , postinst가 있다면 해당 스크립트가 설정 때에 실행되어 Setting up 때 필요한 사항을 물어 올 수도 있다.

$ dpkg -i inn_1.5.1.4.deb inewsinn_1.5.1-4.deb
 
(Read database ...28592 files and directories currently installed)
 
Unpacking inn(from inn_1.5.1-4.deb)...
 
Unpaking inewsin(1.5.1-4)
 
Setting up inn (1.5.1-4)...
 
**INN news server return mail name's of your system . This is the hostname portion of the address to be shown on outgoing news (not mail) messages.
 
Return mail name [doit.ajou.ac.kr]:
 
이하 생략

위에 예처럼 복수개의 파일을 명시하면 패키지 두 개가 한번에 Unpacking 된후 Setting up 되는 것을 볼 수 있다.이 패키지는 inn 패키지 셋업 때 몇 가지 필요한 사항을 물어오는 것을 볼 수 있다.

dpkg -unpack foo_VVV-RRR.deb

이 옵션은 패키지의 셋업만 하지 않을 뿐 --install 옵션과 같다 그러나 주의할 사항은 패키지 내부의 preinst 는 -unpack 옵션에서 이미 실행된다는 점이다 --unpack 옵션은 의존성 여부 바로 전까지 행하기 때문에 의존성 관계에 있는 패키지를 설치하기 전 우선 unpack 해 놓고 추후에 함께 셋업 절차를 할 때 편리하다.

dpkg --configure foo

이 옵션은 unpack 한 패키지를 셋업한다 엄밀히 말하면 패키지의 postinst 한 패키지를 셋업한다. 엄밀히 말하면 패키지의 postinst를 실행시키게 된다 이때 의존성 여부검사등을 하게 되며 문제가 발생하면 에러가 발생한다. 주의할 점은 --configure다음에 오는 것은 패키지의 풀네임이 아닌 패키지의 단일 이름 이라는 점을 알아두자 즉 inn_1.5.1-4.deb이라면 이 패키지의 단일 이름인 inn만을 기재하여 주면 된다.

dpkg--content foo_VVV-RRR.deb

이 옵션을 통해 패키지 내부의 파일을 출력해 볼 수 있다. 출력 예는 다음과 같다.

drwxr-xr-x root/root            0  1997-10-02 02:02 ./
 
drwxr-xr-x root/root            0  1997-10-02 02:02 usr/
 
drwxr-xr-x root/root            0  1997-10-02 02:02 usr/bin
 
-rwxr-xr-x root/root       184724  1997-10-02 02:02 usr/bin/slrn
 
drwxr-xr-x root/root            0  1997-10-02 02:02 usr/sbin/
 
-rwxr-xr-x root/root        9365  1997-10-02 02:02 usr/sbin/slrnconfig
 
-rwxr-xr-x root/root        483  1997-10-02 02:02 usr/sbin/slrn_getdescs
 
-rwxr-xr-x root/root        41832  1997-10-02 02:02 usr/sbin/slrnpull
 
drwxr-xr-x root/root            0  1997-10-02 02:02 usr/man/
 
drwxr-xr-x root/root            0  1997-10-02 02:02 usr/man/man1
 
-rw-r--r-x root/root        12828  1997-10-02 02:02 usr/man/man1/slrn.1.gz
 
drwxr-xr-x root/root            0  1997-10-02 02:02 usr/doc/
 
drwxr-xr-x root/root            0  1997-10-02 02:02 usr/dos/slrn

이하생략

dpkg -fsys-tarfiles foo_VVV-RRR.deb

이 옵션을 이용하면 패키지 내부의 특정한 파일만을 추출해 낼 때 유용하다 이를 이용하여 설치하지 않고 바이너리만 추출해 낼 수 있으며 테스트 용으로 특정 디렉토리에 풀어낼 수도 있다. 파일명에는 단일한 파일명이나 와일드 카드를 통해 다중의 파일을 추출해 낼 수도 있다. 그러나 주의할 사항은 패키지의 명은 dpkg-contents foo_VVV-RRR.deb를 통하여 볼수 있는 패키지 내부의 파일명을 뜻한다. 다음 예를 보자

$ dpkg -fsys-tarfile slrn_0.9.4.3-1.deb | tar-xf-usr/bin/slrn

이렇게 하면 {현재 디렉토리}/usr/bin 에 slrn파일이 풀려 져 나옴을 볼 수 있다.

dpkg -remove foo

이 옵션은 foo 라는 패키지를 삭제할 때 사용된다 패키지를 삭제하나 설정파일은 삭제하지 않는다.

dpkg -purge foo

이 옵션은 설치된 foo 라는 패키지를 삭제할 때 사용된다 --remove 와 다른 점은 설정파일도 삭제해준다. 추후에 사용할 일이 없는 패키지를 삭제할 때 사용하게 된다.

dpkg--list foo*

이 옵션을 이용하면 foo 라는 이름을 포함한 패키지의 현재 설치상황을 표시하여 준다. 현재 설치된 패키지의 리스트를 뽑아내거나 특정 패키지가 설치되었는지에 여부 그리고 현재 패키지의 설치정도를 파악할 때 유용하게 사용할 수 있다. Sun 사의 Solaris 에서의 pkginfo 프로그램의 역할과 비슷하다.

출력예는 다음과 같다.

$ dpkg--list libc5-* libc6-*
 
Desired=Unknown/Install/Remover/Purge
 
|Status=Not/installed/Config-files/Unpacked/failed-config/Half-installed
 
|/Err?=(none) /Hold/Reinst-required/X=both-problems(Ststus,Err:
 
uppercase=bad)
 
|| / Name       Version       Description
 
pn libc5-altdbg   <none>    (no description available)
 
ii libc5-altdev   5.4.33.7     The Linux C library version 5(alternative d
 
un libc5-dev      <none>     (no description available)
 
un libc5-pic      <none>     (no description available)
 
pn libc5-dbg      <none>     (no description available)
 
ii libc6-dev      2.0.2c-0.1 (The Gnu C library version 2 (development fil
 
ii libc6-dev      2.0.4-1     (The Gnu C library version 2 (documentation f
 
pn libc6-pic      <none>     (no description available)
 
$

위의 출력 예는 libc5와 libc6와 관련된 패키지의 설치여부를 알아보게 된다 화면에서 보면 그 내용을 쉽게 짐작할 수 있으리라 본다.

시스템에 설치된 모든 패키지의 설치상황을 보려면 다음과 같이 하면 된다.

$dpkg --list
 
Desired= UnKnow/Install/Remove/Purge
 
|Status=Not/Install/Config-files/Unpacked/Failed-config/Half-Installed
 
|/Err?=(none)/Hold/Reinst-required/X=both-problems (Status.Err:
 
uppercase=bed)
 
|| /Name         Version    Description
 
+++-===========================================================
 
ii acct           6.3-1      The GNU Accounting untities.
 
ii acroreda       3.0-1      Adobe Portable Document Forment files viewer
 
ii adduser        3.7        Add user and groups to the system.
 
ii adjtimex       1.3-2      utilty to display or set the kernel time va
 
ii ae             962-15   Anthony's Editor - a tiny full-screen edito
 
ii afterstep-i18n 1.0-3     A window manager with the NEXTSTEP look and
 
ii alien          5.18       Install Red Hat ad slackware Package with
 
ii apache         1.2.4-2   Versatile, high-performance HTTP server
 
ii apache-doc     1.2.4-2   Apche documentation
 
ii ascd           0.7-2      AfterStep CD player
 
ii ascdc          0.3.4      AfterStep CD changer
 
ii asmail         0.50-4    AfterStep mail monitor
 
ii asmixer        0.5-3      AfterStep audio mixer
 
ii at             3.1.8-2   Delayed job execution and batch processing
 
ii autoconf       2.12-2   automatic  configure script builder.
 
ii automake       1.2-1      A tool for generating GNU Standards -complian
 
이하생략

dpkg--get-selections foo*

이 옵션은 현재 설치가능한 (available)패키지들의 상태가 어떠한지 출력해준다. .foo* 에는 패턴이 들어 갈수 있으며 , 생략하면 현재 설치되어 있는 패키지들의 상황을 보여준다. x로 시작하는 패키지들의 상황 출력 예는 다음과 같다.      

$ dpkg --get-selection x*
 
x10                 purge
 
x10-automate        purge
 
x3270               purge
 
x3270-htmldoc       purge
 
x48                 purge
 
xabacus             purge
 
xanim               install
 
xarchie             purge
 
xarclock            purge
 
xasteroids          purge
 
xautolock           install
 
xaw-wrappers        install
 
xaw3d               install
 
xaw95               purge
 
xbanner             purge
 
 
xbase               install
 
 
xbattle             purge
 
 
xbill               purge
 
xbl                 purge
 
xblast              purge
 
xblast-sound        purge

dpkg-update-avail<Packages-files>

dpkg-merge-avail<Packages-files>

dpkg-clear-avail

dpkg-forget-old-unavail

이 옵션은 일반적으로 잘 사용하지 않을 것이다 이 파일은 dselect에서 호출하여 사용하는 옵션으로 첫번째 것은 설치 가능한 패키지 목록을 갱신하는 것이고 두번째는 패키지 목록을 합치는 것이며 , 세번째는 지우는 것  네번째는 설치되지 않았고 현재 설치가능하지 않은 패키지 목록을 삭제하는 것이다.

dpkg -print-avail foo

이 옵션을 이용하면 패키지의 foo의 현재 설치 가능한 패키지버전과 설명을 보여준다. dpkg-info foo_VVV-RRR.deb를 이용하는 것이 일반적이다.

dpkg-listfiles foo.dpkg-L foo

패키지 foo가 소유한 파일의 목록을 출력해준다. 패키지내부에 어떤 파일이 속해있는지 확인할 때 유용하다 출력 예는 다음과 같다.

$ dpkg -listfiles bash
 
/.
 
/bin
 
/bin/bash
 
/bin/rbash
 
/bin/sh
 
/etc
 
/etc/skel
 
/etc/skel/.bashrc
 
/etc/skel/.bash_profile
 
/usr
 
/usr/bin
 
/usr/bin/bashbug
 
/usr/doc
 
/usr/doc/bash
 
/usr/doc/bash/CHANGES.gz
 
/usr/doc/bash/FAQ.gz
 
/usr/doc/bash/INTRO.gz
 
이하 생략

위는 bash 패키지에 포함된  파일이 어느 곳에 설치되어 있는지 보여준다.

dpkg- seach filename.dpkg-S filename

이 옵션을 이용하면 특정 파일이 어떠한 패키지에 속해 있는지 출력해준다. 직접 컴파일 을해서 설치하다보면 파일들이 여기 저기에 산적하여 어떤 파일인지 모를 경우가 많다. 정리할 때 패키지에 없는 파일을 삭제할 때 유용하게 사용할 수 있다. 혹은 특정 파일의 역할이 무엇인지 궁금할 때 원하는 패키지를 찾고 찾은 패키지의 설명을 dpkg- print-avail foo를 통해 출력해보면 파일의 역할을 어느 정도 알 수 있게 된다.

dpkg- audit dpkg-C

설치된 패키지가 깨어지지 않았는지 체크해준다. 보통 패키지 설치시 잘못 설치되었다면 그 패키지에 대한 리스트를 출력해준다. 보통 정상적인 설치가 마쳐지지 않았다면 그 에 대한 메시지가 출력된다

inn의 설치가 덜 끝나서 설정이 되지 않은 상태라면 다음과 같은 메시지가 출력된다.

$dpkg - audit
 
The following packgaes have been unpacked but not yet configured/
 
They must be configured using dpkg- configure or the configure
 
menu option in dselect for them to work :
 
inn        News transport system InterNet News' by the ISC and Rich
 
$

dpkg -print-architectuer

dpkg -print-gnu-build-architecture

dpkg -print-installation architecture

이 옵션들의 역할은 간단하다 현재 설치가능한  아키텍처를 출력해준다. i386 에서의 출력은 다음과 같다.

$dpkg - print-architecture
 
i386
 
$dpkg -print-gnu-bulid-architecture
 
i486
 
$dpkg-print-installation- architecture
 
i386
 
$

dpkg - version

dpkg의 버전 번호를 출력해준다. 필자는 1.4.0.19를 사용하기 때문에 다음과 같이 출력되었다.

$ dpkg -version
 
Debian LInux dpkg' package management program version 1.4.0.19 (i386elf)
 
Copyright 1994-1996 lan jackson ,bruce Perens This is free software:
 
see the GNU Public Licence version  2 or later for copying
 
condition . There os NO warranty See dpkg-licence for details.

dpkg-licence

프로그램의 저작권에 대해 표시해준다.

안되면 되게 하라 강제옵션 dpkg--force

dpkg-force

프로그램의 설치, 삭제만큼이나 자주 쓰일 옵션이다 이 옵션은 생각보다 사용하기는 쉽지만 너무 자주 사용하면 프로그램이 동작하지 않는 경우도 있다 그러나 아주 불가피한 경우 이 옵션은 최대한의 편리를 제공해줄 것이다 dpkg -i 가 제대로 동작하지 않는다고 생각되면 강제로라도 해야지 어쩌겠는가. .:-)

dpkg -force-help

막강한 만큼 지원되는 옵션도 꽤 많다. 출력을 해보면 꽤 많은 옵션이 있다는 것을 알 수 있다 다음을 보자.

$dpkg -force-help
 
dpkg forcing options -control bahaviour when problems found :
 
    warm but contiue   :- force -<thing>,<thing>....
 
    stop with error : -refuse -<thing>,<thing>....
 
Forcing things :
 
    auto-select [*]  (De)select packages to install (remove) them
 
    dowgrade [*]     Replace a package with a lower version
 
    configure-any    Configure any package which even when on hold
 
    bad- path          PATH is missing important programs. problems likely
 
    not-root      Try to (de) install things even when not root
 
    overwrite[*]  Overwrite a file from one package with another
 
    overwrite-diverted  Overwrite a diverted files an undiverted version
 
    depends-version  [!] Turn dependecy version problem into warnings
 
    depends [!] Turn all dependency  problem into warnings
 
    confilcts [!] Allow installation of conflicting packages
 
    architeture [!]    Process even packages with wrong architecture
 
    overwrite-dir [!]    Overwrite one packages 's directory with another's file
 
    remove- essential   Remove an essential package
 
WARNING - use of options marked[!] can seriously damage your installation .
 
Forcing options marked[*] are enabled y default.
 
  remove-essential [!] Remove an essential package

우리는  몇가지 마지막의 경고에 주의를 기울일 필요가 잇다 [!]로 된 옵션은 설치에 심각한 영향을 줄 수 가 있다. 즉 부작용이 생길 수 있다는 점을 말해준다. 그리고 [*] 로 된 옵션은 설치시 디폴트로 지정됨을 뜻한다 -force 옵션은 항상 이 옵션과 더불어 사용되는 옵션 뒤에 그에 대한  action (-purge, -install,-remove,-configure등)이 반드시 지정되어야 한다.

dpkg --force-auto-select

이 옵션은 보통 Depends 문제 시 편리함을 가져다 줄 수 있다 필요한 패키지를 선택할 때 의존성 문제에 해당되는 패키지와 다른 해당패키지도 역시 삭제해 준다. (필자주 : 동작하지 않을 때도 있으며 ,dpkg로만 사용할 때에는 안되는 경우도 있다 )

dpkg- forece- downgrade

하위버전으로의 다운 그레이드를 허용한다 이는 디폴트로 지정이 되어 있기 때문에 dpkg-install 로 하면 자동으로 다운 그레이드된다.

dpkg- force-overwrite

패키지 간에 겹치는 파일이 있을 때 dpkg는 설치를 거부한다. 그러나 이 옵션을 이용하면 패키지 간에 겹치는 파일이 있다 하더라고 그대로 덮어쓰기를 시도한다. 그러나 그다지 좋은 방법은 아님을 명심하기 바란다.

dpkg- force-overwrite-diverted

같은 이름을 갖고 같은 역할을 하는 파일들의 경우 원래의 파일을 다른 이름으로 바꾼 후 , 이 사실을 데비안 패키지 관리 시스템에게 알려주고 추후에 업그레이드 시 원래의 파일이 업그레이드 되도록 해야 한다. 이 옵션을 이용하면  관리되고 있는 파일일지라도 무시하고 그대로 덮어쓰기를 한다. 역시 그다지 좋은 옵션은 아니다.

dpkg- force- depends -version

보통 패키지 설치시 버전이 낮아 의존성 문제를 발생하는 경우가 있다. 이런 경우 설치는 중단되지만 버전이 낮아 의존성 문제가 발생하는 것을 무시하고 진행 할 수 있다. 그다지 큰 문제는 발생하지 않겠지만 라이브러리의 심각한 버그나 지원되지 않는 기능으로 인한 버전 체크임에도 이를 무시하면 프로그램은 동작하지 않을수도 있다.

dpkg- force - depends

상당히 많이 쓰이는 옵션이다 의존성 검사에서 실패했다. 하더라고 패키지 관리 시스템의 오동작이 일어나는 경우 이를 해결하기 위해 쓰인다 의존성에 문제가 일어나도 끝내 지 않고 경고메시지를 나타나게 한다 다음의 예는 이 옵션을 사용한 경우이다.

$dpkg- force-depends install inn_1.5.1-4.deb
 
Selecting previously deselected package inn
 
(Reading database...28408 files and directories currently install.)
 
Unpacking inn (from inn_1.5.1-4.deb)...
 
dpkg:inn : dependency problems but configuring anyway as you request:
 
inn depends on inewsinn (>=1.5-1) : however;
 
Package inewsinn is not installed.
 
Setting up inn(1.5.1-4)..
 
**inn news server configuration
 
Please enter the return mail name' of your system . This is the hostname
 
portion of the address to be shown on outgoing news(not mail)messages
 
Rerurn mail name [doit.ajou.ac.kr]:

위의 경우 , inn은 inewsinn패키지에 의존하고 있음에도 무시하고 설치를 한다.

dpkg --force-conflicts

서로 상반된 관계에 있는 패키지를 강제로 무시하고 설치한다 유용하게 사용할 수 있는 옵션이다.

$ dpkg -force-conflicts -install sendmail_8.8.7-5.deb
 
Selecting previously deselect package sendmail
 
dpkg : reqarding sendmail_8.8.7-5.deb containing sendmail:
 
sendmail conflicts with mail-transport-agent
 
smail provides mail-transport-agent and is installed.
 
dpkg:wrronig -ignoring conflict, may proceed anyway !
 
dpkg:regarding sendmail_8.8.7-5.deb containing sendmail:
 
 sendamil conflicts with smail
 
 smail(version 3.2-3) is installed.
 
dpkg:wrronig -ignoring conflict, may proceed anyway !
 
dpkg:regarding sendmail_8.8.7-5.deb containing sendmail:
 
 smail conflicts with mail-transport- agent
 
 sendmail prvides mail-transport-agent and is to be installed.
 
dpkg:wrronig -ignoring conflict, may proceed anyway !
 
dpkg:regarding sendmail_8.8.7-5.deb containing sendmail:
 
 smail conflicts with sendmail
 
 sendmail(version8.8.7-5) is to be installed
 
     (이하생략 )

 위의 예에서 보는 바와 같이 sendmail 은 mail-transport-agent(MTA) 라는 virtual name (저번호에서 설명했다)을 가진 패키지들과 대립관계에 있으나 무시하고 설치하는 경우이다. 이는 심각한 관계에 있으나 무시하고 설치하는 경우이다 이는 심각한 결과를 낳을 수 있으므로 가급적 이런 방식을 택하지 않는데 좋다.

dpkg-force-architecture

이 옵션은 아키텍처가 달라고 무시하고 설치하는 것을 뜻한다. 바이너리가 오동작하거나 심각한 경우 시스템 크래쉬가 될 수도 있으나 가급적 삼가야 할 옵션이다 .

dpkg-force-remove-reinstreq
dpkg-force-remove-essential

이 두 옵션은 꼭 필요한 경우에만 사용하도록 한다. 보통 우선 순위(priority)가 Required 인 경우 혹은 시스템을 동작시키는데 필수적인 패키지들은 삭제가 불가능하도록 되어 있다 그러나 꼭 부득이 한 경우 (부득이 한 경우가 어떤 경우인지는 모르겟지만 ) 삭제해야 할 경우도 생길 수 있다. 그때 이 옵션을 통해 삭제를 하면 된다.

-force옵션은 대부분 'your own risk' 이다 따라서 위험성이 뒤따라는 옵션들이다 꼭 필요한 경우에만 사용하자 나머지 옵션은 일반적으로 사용하는 옵션이 아니므로 논외로 한다.

글을 마치며

rpm 만큼이나 dpkg 프로그램 사용도 어떻게 보면 꽤 까다롭다. 보통 -install -pruge -unpakc - remove 만 알아도 사용하는데 아무런 지장은 없다.좀 고급(?)으로 사용하려다 보면 필요한 것도 많고 하니 조금씩 써보면서 실력을 늘려 나감도 좋을 것 같다.

다음호에서는 지금까지 알아본 dselect dpkg의 사용법에서 직접 데비안 패키지파일을 만들어 내는 방법을 알아보도록 하자 관심이 있는 사람이라면 /usr/doc/dpkg 디렉토리 하부에 위치한 여러 도큐먼트를 꼭 한번 읽어보도록 하자 도큐먼트는 장식품이 아니다 미리미리 알아본 내용은 여러분에게 큰 도움이 될 수 있다.


이글은 리눅스월드 '97년 11월호 기사입니다.