Debian Gnu/Linux 2
-중간 수준의 패키지 관리 프로그램 dpkg-

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

     

 

들어가기에 앞서

    지난 호에서는 데비안의 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                <.package name>... | -a|-pending

    dbkg -r| -remove |-purge <.package name>... | -a|-pending

    dbkg -get-selection[<pattern>...]            get list of selections to stdout

    dbkg -set-selection                                 set package selections from stdin

    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-name>...        display package status details

    dbkg -print-avail <Package-name>...        display available version details

    dbkg -L|-listfiles <Package-name>...        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>        compare version numbers-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

     -largemem |-smallmem           Optimise 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 <package>

     -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, version 2.0

    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 the "xlib6" package. when a server and the shared libraries 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

    (Reading database ...28592 files and directories currently installed)

    Unpacking inn(from inn_1.5.1-4.deb)...

    Unpaking inewsinn(from inewsinn_1.5.1-4.deb)...

    Setting up inewsinn (1.5.1-4)...

     

    Setting up inn (1.5.1-4)...

    **INN news server configuration

     

    Please enter the 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를 실행시키게 된다. 이때 의존성 여부검사등을 하게 되며, 문제가 발생하면 에러가 발생한다. 주의할 점은 --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 packages 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 dependency version problem into warnings

        depends [!]            Turn all dependency  problem into warnings

        confilcts [!]            Allow installation of conflicting packages

        architecture [!]        Process even packages with wrong architecture

        overwrite-dir [!]    Overwrite one packages 's directory with another's file

        remove- reinstreq [!]  Remove packages which require installation

        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

     

    Return 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 : regarding sendmail_8.8.7-5.deb containing sendmail:

    sendmail conflicts with mail-transport-agent

    smail provides mail-transport-agent and is installed.

    dpkg:warning -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:warning -ignoring conflict, may proceed anyway !

    dpkg:regarding sendmail_8.8.7-5.deb containing sendmail:

     smail conflicts with mail-transport- agent

     sendmail provides mail-transport-agent and is to be installed.

    dpkg:warning -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, -purge, -unpack, -remove만 알아도 사용하는데 아무런 지장은 없다. 좀 고급(?)으로 사용하려다 보면 필요한 것도 많고 하니 조금씩 써보면서 실력을 늘려 나감도 좋을 것 같다.

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




▲ top

home으로...