· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Docbook Sgml/Debian-Binary-Package-Building-HOWTO

Debian Binary Package Building HOWTO

Debian Binary Package Building HOWTO

LeeChr. Clemens

ParkM.W.

2002-11-30, $Date: 2007/10/16 13:14:27 $

이 미니 하우투는 최소한의 데비안 .deb 패키지를 만드는 방법을 보여준다.

고친 과정
고침 4.02005-08-09고친이 ccl
updated email address and added link to Turkish translation by Oguz Yarimtepe
고침 3.02003-12-19고친이 ccl
fixed two typos reported by Claudio Cattazzo
고침 2.02003-12-13고친이 ccl
applying Frank Lichtenheld's feedback
고침 1.02003-11-08고친이 ccl
first version

1. 소개

새로 만들어진 아카이브의 적절한 사용방법은 공식적인 데비안 배포판에서 사용하지는 말고, 자신의 박스에서만 설치하는 것이 바람직하다. '공식적인' 과정을 따르고 싶다면, Debian New Maintainers' Guide를 참조하기 바란다.

일반적인 데비안 패키지들은 debian/rules 파일을 포함해서 바이너리 패키지를 만들기위한 과정들을 자동화해주는 소스 패키지를 가진다. 여기서 우리는 간단한 쉘 스크립트나 바이너리 실행 파일을 작은 바이너리 패키지로 묶는 방법을 보일 것이다.

그런데, 나는 독자가 'tar', 'man'의 사용법 그리고 '.tar.gz' 파일과 데비안 이 무엇인지를 알고 있다고 가정할 것이지만, 'ar'이나 'dpkg'같은 프로그램을 다룬 적은 없다고 생각할 것이다.


1.1. 웹상의 자료들

The Debian Reference는 훌륭한 개괄과 함께 데비안에 특화된 모든 정보를 제공한다.

자신만의 데비안 패키지를 만드는 것에 관한 공식적인 문서는 Debian New Maintainers' Guide이다.


2. 시작하기

데비안 참조문서 2.2.2 2002-11-30에는 "데비안 바이너리 형식의 내부구조가 deb(5) 메뉴얼 페이지에서 설명된다. 이 내부 형식은 (데비안의 메이저 릴리즈 사이에) 변경되기 쉽기 때문에, .deb 파일을 다룰때는 항상 dpkg-deb(8)을 사용하라."라는 문구가 있다.

dpkg-deb man 페이지에는 "dpkg-deb는 데비안 아카이브를 묶고, 풀고 관련 정보를 제공한다. .deb 파일은 필요에 따라 artar만으로도 조작 가능하다. 패키지들을 시스템에 설치하거나 삭제하기위해서는 dpkg를 사용하라."라는 문구가 있다.

아마 독자는 디렉토리 '/var/cache/apt/archives/'에서 많은 .deb 파일 예제를 찾을 수 있을 것이다. 'dpkg-deb -I somepackage.deb' 명령으로 패키지가 제공하는 기능이 무엇인지 일반적인 설명을 볼 수 있다. 'dpkg-deb -c somepackage.deb'는 설치될 파일들의 리스트를 보여준다.

.deb 파일의 내용을 보려면 'ar tv somepackage.deb' 명령을 사용한다. 'x' 옵션을 사용하면 압축을 푼다.


3. 패키지 구조

예제 패키지 하나를 좀더 자세히 살펴보자. 'parted_1.4.24-4_i386.deb' 파일은 다음의 세 파일들을 포함하고 있다:

      $ ar tv parted_1.4.24-4_i386.deb
      rw-r--r-- 0/0      4 Mar 28 13:46 2002 debian-binary
      rw-r--r-- 0/0   1386 Mar 28 13:46 2002 control.tar.gz
      rw-r--r-- 0/0  39772 Mar 28 13:46 2002 data.tar.gz
      

이제 우리는 tar 파일들의 내용까지 포함해서 압축을 풀 수 있다.


3.1. debian-binary

이 파일의 내용은 "2.0\n"이다. 이것은 deb 파일 형식의 버전을 알려준다. 2.0에서는 다른 모든 라인은 무시된다.


3.2. data.tar.gz

'data.tar.gz' 파일은 특정 경로에 설치될 모든 파일들을 포함한다:

      drwxr-xr-x root/root         0 2002-03-28 13:44:57 ./
      drwxr-xr-x root/root         0 2002-03-28 13:44:49 ./sbin/
      -rwxr-xr-x root/root     31656 2002-03-28 13:44:49 ./sbin/parted
      drwxr-xr-x root/root         0 2002-03-28 13:44:38 ./usr/
      drwxr-xr-x root/root         0 2002-03-28 13:44:41 ./usr/share/
      drwxr-xr-x root/root         0 2002-03-28 13:44:38 ./usr/share/man/
      drwxr-xr-x root/root         0 2002-03-28 13:44:52 ./usr/share/man/man8/
      -rw-r--r-- root/root      1608 2002-03-28 13:44:37 ./usr/share/man/man8/parted.8.gz
      drwxr-xr-x root/root         0 2002-03-28 13:44:41 ./usr/share/doc/
      drwxr-xr-x root/root         0 2002-03-28 13:44:52 ./usr/share/doc/parted/
      -rw-r--r-- root/root      1880 2002-03-07 14:20:08 ./usr/share/doc/parted/README.Debian
      -rw-r--r-- root/root      1347 2002-02-27 01:40:50 ./usr/share/doc/parted/copyright
      -rw-r--r-- root/root      6444 2002-03-28 13:37:33 ./usr/share/doc/parted/changelog.Debian.gz
      -rw-r--r-- root/root     15523 2002-03-28 02:36:43 ./usr/share/doc/parted/changelog.gz
      

이 파일은 deb 아카이브내의 마지막 파일이어야만 한다.


3.3. control.tar.gz

우리의 예제에서는 이 파일은 다음과같은 내용을 가지고 있다:

      -rw-r--r--    1 root     root         1336 Mar 28  2002 control
      -rw-r--r--    1 root     root          388 Mar 28  2002 md5sums
      -rwxr-xr-x    1 root     root          253 Mar 28  2002 postinst
      -rwxr-xr-x    1 root     root          194 Mar 28  2002 prerm
      

'md5sums'의 내용은 data.tar.gz 파일안에 있는 각각의 파일의 md5sum이다. 우리의 예제에서는 다음과같은 내용이다:

      1d15dcfb6bb23751f76a2b7b844d3c57  sbin/parted
      4eb9cc2e192f1b997cf13ff0b921af74  usr/share/man/man8/parted.8.gz
      2f356768104a09092e26a6abb012c95e  usr/share/doc/parted/README.Debian
      a6259bd193f8f150c171c88df2158e3e  usr/share/doc/parted/copyright
      7f8078127a689d647586420184fc3953  usr/share/doc/parted/changelog.Debian.gz
      98f217a3bf8a7407d66fd6ac8c5589b7  usr/share/doc/parted/changelog.gz
      

걱정마라. 'md5sum' 및 'postinst'와 'prerm' 파일들은 독자의 처녀작 패키지를 만들기에서 필수적이지는 않다. 그렇지만 그것들의 존재에 관해서는 유념해야한다. 모든 공식적인 데비안 패키지들은 여러 이유로해서 이것들을 가지고 있다.

'prerm'과 'postinst'는 예전 문서 파일들을 지우고 doc에서 share/doc으로의 링크를 생성하는 것으로 보인다.

>$ cat postinst
      #!/bin/sh
      set -e
      # Automatically added by dh_installdocs
      if [ "$1" = "configure" ]; then
      if [ -d /usr/doc -a ! -e /usr/doc/parted -a -d /usr/share/doc/parted ]; then
      ln -sf ../share/doc/parted /usr/doc/parted
      fi
      fi
      # End automatically added section

      $ cat prerm
      #!/bin/sh
      set -e
      # Automatically added by dh_installdocs
      if [ \( "$1" = "upgrade" -o "$1" = "remove" \) -a -L /usr/doc/parted ]; then
      rm -f /usr/doc/parted
      fi
      # End automatically added section
      

그리고 마지막으로 제일 흥미있는 파일:

      $ cat control
      Package: parted
      Version: 1.4.24-4
      Section: admin
      Priority: optional
      Architecture: i386
      Depends: e2fsprogs (>= 1.27-2), libc6 (>= 2.2.4-4), libncurses5 (>= \
      5.2.20020112a-1), libparted1.4 (>= 1.4.13+14pre1), libreadline4 (>= \
      4.2a-4), libuuid1
      Suggests: parted-doc
      Conflicts: fsresize
      Replaces: fsresize
      Installed-Size: 76
      Maintainer: Timshel Knoll <timshel@debian.org>
      Description: The GNU Parted disk partition resizing program
      GNU Parted is a program that allows you to create, destroy,
      resize, move and copy hard disk partitions. This is useful
      for creating space for new operating systems, reorganizing
      disk usage, and copying data to new hard disks.
      .
      This package contains the Parted binary and manual page.
      .
      Parted currently supports DOS, Mac, Sun, BSD, GPT and PC98
      disklabels/partition tables, as well as a 'loop' (raw disk)
      type which allows use on RAID/LVM. Filesystems supported are
      ext2, ext3, FAT (FAT16 and FAT32) and linux-swap. Parted can
      also detect HFS (Mac OS), JFS, NTFS, ReiserFS, UFS and XFS
      filesystems, but cannot create/remove/resize/check these
      filesystems yet.
      .
      The nature of this software means that any bugs could cause
      massive data loss. While there are no known bugs at the moment,
      they could exist, so please back up all important files before
      running it, and do so at your own risk.
      

'man 5 deb-control'에서 control 파일에 대한 더 많은 정보를 얻을 수 있다.


4. 실제

이제 우리들이 실제로 만들어볼 시간이다. 나는 'linuxstatus'라는 이름의 간단한 스크립트를 '/usr/bin/linuxstatus'로 설치하고자한다. 그래서 일단 'linuxstatus' 파일 다음으로 'debian'이라는 이름의 디렉토리를 만든다.

      $ mkdir -p ./debian/usr/bin
      $ cp linuxstatus ./debian/usr/bin
      

4.1. control

control 파일부터 시작하자. 버전 번호는 데시와 함께 부가적인 데비안 패키지 버전 번호를 가져야만한다. 예, '1.1-1'. 프로그램이 이식성있는 쉘 스크립트들로만 구성되어있다면, 'Architecture'를 'all'로 지정한다.

설치될 새로운 패키지가 의존하는 파일이나 프로그램을 포함하는 패키지가 설치되어있는지 알아볼 수 있도록 'Depends'를 설정해야할 수도 있다. 이것을 위해 'dpkg -S <file>'를 실행해 볼 수 있다. 예:

      $ dkpg -S /bin/cat
      coreutils: /bin/cat
      

'coreutils' 패키지에 대해 좀더 알아보고 싶다면, 'apt-cache showpkg coreutils' 명령을 사용해서 현재 시스템에 설치된 버전 및 다른 부가정보를 볼 수도 있다.

좀더 첨언하자면, 동일한 정보를 찾는데 두가지 방법이 더 있다. 데비안 파일들을 찾을 수 있는 웹 페이지가 있다: http://www.debian.org/distrib/packages. 페이지의 맨 아래쪽으로 가서 양식을 채우면 된다.

마지막으로 'kpackage'라는 간편한 패키지 브라우징 옵션과 개별 파일 이름을 입력하면 패키지를 찾아주는 좋은 GUI 응용 프로그램이있다.

'Suggests', 'Conflicts'와 'Replaces' 등은 필요하지 않으면 비워둘 수 있다.

그래서 이것이 우리의 첫 'control' 파일의 결과이다:

Package: linuxstatus
      Version: 1.1-1
      Section: base
      Priority: optional
      Architecture: all
      Depends: bash (>= 2.05a-11), textutils (>= 2.0-12), awk, procps (>= \
      1:2.0.7-8), sed (>= 3.02-8), grep (>= 2.4.2-3), coreutils (>= 5.0-5)
      Maintainer: Chr. Clemens Lee <clemens@kclee.de>
      Description: Linux system information
      This script provides a broad overview of different
      system aspects.

'control' 파일은 다른 'debian' 디렉토리내의 'DEBIAN'이라는 이름의 디렉토리로 복사된다.

      $ mkdir -p debian/DEBIAN
      $ find ./debian -type d | xargs chmod 755   # this is necessary on Debian Woody, don't ask me why
      $ cp control debian/DEBIAN
      

만들고 있는 패키지가 미래에 많은 사람들이 사용할것으로 예상된다면 Writing Debian package descriptions를 읽어보는 것이 도움이 될것이다.


4.2. dpkg-deb

이제 거의 다 됐다. 다음과 같이 입력한다:

      $ dpkg-deb --build debian
      dpkg-deb: building package `linuxstatus' in `debian.deb'.
      $ mv debian.deb linuxstatus_1.1-1_all.deb
      

흠, 생각했던 것 보다 훨씬 쉽다. 이젠 이 패키지를 우리의 박스에 설치하면 다 되는 것이다:

      root# dpkg -i ./linuxstatus_1.1-1_all.deb
      

'linuxstatus' 또는 'ls -l /usr/bin/linuxstatus'를 입력해서 제대로 동작하는지 확인한다. 패키지가 더이상 필요없다면, 'dpkg -r linuxstatus'를 입력하고 패키지가 제거되었는지 확인한다. 새로운 버전을 설치한다면 옛 버전을 먼저 지워야할 필요는 없다.

데비안 패키지의 버전 숫자 체계 및 이름 짓기에관해 알고 싶다면, The Debian Reference이 절을 읽어보길 권한다.


5. 반복 확인

지금까지 첫인상을 받고 자신만의 바이너리 패키지를 만들었다. 이제는 좀더 깊게 들어가서 우리가 만든 패키지의 품질에관해 알아보자.


5.1. lintian

다행스럽게도 데비안 프로젝트는 'lintian'이라는 이름의, 'lint'와 비슷한 데비안 패키지 검사도구를 제공한다. 아직 이 도구를 설치하지 않았다면, 지금이 설치할 때다 (apt-get install lintian).

이제 이 작고 소중한 도구를 우리의 새 패키지 파일에 사용해 보자:

$ lintian linuxstatus_1.1-1_all.deb
      E: linuxstatus: binary-without-manpage linuxstatus
      E: linuxstatus: no-copyright-file
      W: linuxstatus: prerm-does-not-remove-usr-doc-link
      W: linuxstatus: postinst-does-not-set-usr-doc-link

흠, 그리 완벽해 보이지는 않는다. man page, copyright 파일이 없고, 또 'prerm'과 'postinst' 스크립트도 없다.


5.2. 최소한의 문서화

여기에서 man page 쓰기와 만들기에관해서 길게 이야기 하기에는 무리가 있다. 이 주제에 관해서는 한두 장을 할애한 많은 책들이 있고 온라인 문서로는 The Linux MAN-PAGE-HOWTO이 있다. 이제 조금만 미래로 시간 여행을 했다고 가정하고, 독자의 스크립트에 관한 완벽한 man page가 ./man/man1/linuxstatus.1에 있다고 치자.

'copyright' 파일도 마찬가지이다. /usr/share/doc 디렉토리내에서 충분한 예제들을 얻을 수 있다. 이 명령을 실행하라: find /usr/share/doc -name "copyright"

여기 우리의 'copyright' 파일 예제를 보인다:

linuxstatus

      Copyright: Chr. Clemens Lee <clemens@kclee.de>

      2002-12-07

      The home page of linuxstatus is at: 
      http://www.kclee.de/clemens/unix/index.html#linuxstatus

      The entire code base may be distributed under the terms of the GNU General
      Public License (GPL), which appears immediately below.  Alternatively, all
      of the source code as any code derived from that code may instead be
      distributed under the GNU Lesser General Public License (LGPL), at the
      choice of the distributor. The complete text of the LGPL appears at the
      bottom of this file.

      See /usr/share/common-licenses/(GPL|LGPL)

'prerm'과 'postinst' 스크립트는 위에 나왔던 'parted' 패키지에서 사용했던 예제들에서 우리의 프로젝트 디렉토리로 하나씩 복사해서 쓴다. 이 파일들은 우리의 프로젝트에서도 제대로 동작해야한다.

이제 데비안 패키지를 다시 한번 만든다. 먼저 'control' 파일에서 버전 번호를 1.1-1에서 1.2-1로 올린다(우리는 새로운 man page를 작성했으므로 내부 릴리즈 번호를 올린다). 또한 새로운 파일들을 적당한 곳에 복사하는 작업도 필요하다:

$ mkdir -p ./debian/usr/share/man/man1
      $ mkdir -p ./debian/usr/share/doc/linuxstatus
      $ find ./debian -type d | xargs chmod 755
      $ cp ./man/man1/linuxstatus.1 ./debian/usr/share/man/man1
      $ cp ./copyright ./debian/usr/share/doc/linuxstatus
      $ cp ./prerm ./postinst ./debian/DEBIAN
      $ gzip --best ./debian/usr/share/man/man1/linuxstatus.1
      $
      $ dpkg-deb --build debian
      dpkg-deb: building package `linuxstatus' in `debian.deb'.
      $ mv debian.deb linuxstatus_1.2-1_all.deb

Gzip이 필효한 이유는 lintian은 man page 파일들이 가능한 작은 크기로 압축되기를 원하기 때문이다.


5.3. fakeroot

이제 우리의 패키지가 좀 더 나은 데비안 구성원이 되었는지 알아보자:

$ lintian linuxstatus_1.2-1_all.deb
      E: linuxstatus: control-file-has-bad-owner prerm clemens/clemens != root/root
      E: linuxstatus: control-file-has-bad-owner postinst clemens/clemens != root/root
      E: linuxstatus: bad-owner-for-doc-file usr/share/doc/linuxstatus/ clemens/clemens != root/root
      E: linuxstatus: bad-owner-for-doc-file usr/share/doc/linuxstatus/copyright clemens/clemens != root/root
      E: linuxstatus: debian-changelog-file-missing

으흠, 새로운 불평들이다. 좋다, 우리는 포기하지 않을것이다. 실제로 대부분의 오류들은 같은 문제로 보인다. 나는 대부분의 사람들이 'root/root'로 설치되는 것을 더 선호한다고 생각하지만, 우리의 모든 파일은 사용자와 그룹이 모두 'clemens'로 패키징되었다. 이것은 'fakeroot' 도구를 사용하면 쉽게 해결된다. 고치고 나서 재빨리 확인해보자 (changelog 문제는 잠시 무시하자):

$ fakeroot dpkg-deb --build debian
      dpkg-deb: building package `linuxstatus' in `debian.deb'.
      $ mv debian.deb linuxstatus_1.2-1_all.deb
      $ lintian linuxstatus_1.2-1_all.deb
      E: linuxstatus: debian-changelog-file-missing

좋다, 그래도 아직 패키지에 다른 파일을 추가할 것이 남았다.


5.4. 더 많은 문서화

'doc/linuxstatus' 디렉토리 내의 'changelog' 파일 다음으로 'changelog.Debian' 파일도 필요하다. 또한 둘다 gzip으로 압축되어야한다.

여기 두 파일의 예제가 있다, 'changelog':

linuxstatus (1.2-1)

      * Made Debian package lintian clean.

      -- Chr. Clemens Lee <clemens@kclee.de>  2002-12-13

그리고 'changelog.Debian':

linuxstatus Debian maintainer and upstream author are identical.
      Therefore see also normal changelog file for Debian changes.

The Debian Policy file has more details regarding the format of the changelog file.

이제 우리의 마지막 단계는 다음과 같다:

$ cp ./changelog ./changelog.Debian ./debian/usr/share/doc/linuxstatus
      $ gzip --best ./debian/usr/share/doc/linuxstatus/changelog 
      $ gzip --best ./debian/usr/share/doc/linuxstatus/changelog.Debian
      $ fakeroot dpkg-deb --build ./debian
      dpkg-deb: building package `linuxstatus' in `debian.deb'.
      $ mv debian.deb linuxstatus_1.2-1_all.deb
      $ lintian linuxstatus_1.2-1_all.deb

아, 이제 더이상의 불평이 없다 :-). 루트 권한으로 'dpkg -i' 표준 명령을 내려서 예전 패키지를 새 것으로 대치할 수 있다.

root# dpkg -i ./linuxstatus_1.2-1_all.deb
      (Reading database ... 97124 files and directories currently installed.)
      Preparing to replace linuxstatus 1.1-1 (using linuxstatus_1.2-1_all.deb) ...
      Unpacking replacement linuxstatus ...
      Setting up linuxstatus (1.2-1) ...

6. 요약

혼란에 빠지지않기위해, 바이너리 데비안 패키지를 만드는 단계들을 되짚어보자.

미리 만들어야하는 파일들:

  1. 하나 이상의 바이너리 실행 파일 또는 쉘 스크립트 파일

  2. 각각의 실행 파일에 대응되는 man page

  3. 'control' 파일 하나

  4. 'copyright' 파일 하나

  5. 'changelog'와 'changelog.Debian' 파일

임시 'debian' 디렉토리 설정:

  1. 'debian/usr/bin' 디렉토리(또는 실행파일들을 넣을 디렉토리) 생성

  2. 'debian/usr/share/man/man1'(또는 man page가 속할 섹션) 생성

  3. 'debian/DEBIAN' 디렉토리 생성

  4. 'debian/usr/share/doc/<패키지_이름>' 생성

  5. 'debian' 디렉토리의 모든 하위 디렉토리들이 0755 퍼미션을 가지게 한다.

임시 'debian' 트리로 파일들을 복사:

  1. 실행 파일을 'debian/usr/bin' 디렉토리(또는 실행파일들을 넣을 디렉토리)로 복사

  2. man page 파일을 'debian/usr/share/man/man1' 디렉토리로 복사

  3. 'control' 파일을 'debian/DEBIAN' 디렉토리로 복사

  4. 'copyright', 'changelog', 'changelog.Debian' 파일들을 'debian/usr/share/doc/<패키지_이름>' 디렉토리로 복사

  5. 임시 'debian' 트리 안에서 gzip으로 man page, 'copyright', 'changelog', 'changelog.Debian' 파일들을 '--best' 옵션으로 압축

데비안 패키지를 빌드하고 검사:

  1. 'debian' 디렉토리를 대상으로 'fakeroot'를 이용하여 'dpkg-deb --build'를 실행

  2. 결과로 나오는 'debian.deb' 파일을 버전과 아키텍쳐 정보를 포함하는 최종 패키지 이름으로 변경

  3. 결과 .deb 패키지 파일을 'lintian'을 사용하여 데비안 정책을 준수하는지 검사


7. 그밖의 것들

유닉스 데몬이나 설정 파일들을 배포하는 방법 등 여기서 다루지 않은 아주 많은 상세한 것들이 있다.

그러나 가장 중요한, 내가 데비안 메인테이너들에게 다시한번 강조하고 싶은 것은, 패키지는 바이너리 패키지가 아니라, 소스 패키지들이다. 바이너리 패키지의 내부적인 것들과는 아무 상관이 없다. 사실 'dpkg-deb' 및 'dpkg' 개발자들만 그것을 알 필요가 있다. 실은 이렇게 하는 것은 권장되지 않는다.

만약 개발자가 다른 사람에게 데비안 패키지를 만드는 방법에관해 설명해야한다면, 그는 틀림없이 소스 패키지를 만드는 방법과 그것을 빌드하는 방법에 관해서 설명할 것이다.

다른 측면에서 보자면, 모든 개발자들이 자신의 소프트웨어를 데비안에 (아직은) 제출하기를 원하는 것은 아니지만, 패키지 소스 코드를 배포하지 않으면서 'dpkg' 같은 패키징 시스템이 제공하는 이점들을 취하고 싶어한다. 개인적으로 나는 아직도 모든 종류의 플랫폼을 위해 나의 프리웨어 프로젝트들을 소스 코드등을 포함한 tar.gz 파일들로 배포하는 반면에, 내 소프트웨어를 그냥 간단히 설치해서 사용하기를 원하는 데비안 사용자들을 위해 더 많은 '.deb' 파일들을 제공할 것을 계획하고 있다.

만일 소프트웨어 패키지를 데비안에 제출하기위한 다음 단계를 밟기원한다면, Debian New Maintainers' Guide 및 Debian Policy Manual을 먼저 보길 권한다. 데비안 소스 패키지 작성에 관해서는, 경험 많은 개발자와 초보 개발자들이 서로 상호작용하며 당신이 만나게 될지도 모를 비슷한 문제에 관해 토론하는 debian-mentors 메일링 리스트를 한번 볼것을 권한다.


8. Credits

Thanks to

  • Colin Watson for contributing a sentence in the abstract and giving feedback regarding structure, focus and title of this HowTo,

  • Bill Allombert for contributing a sentence in the 'What Else' section and giving feedback reinforcing what Colin had said as well,

  • Santiago Vila for pointing out that 'md' is a local alias and the (Unix) world has standardized on 'mkdir',

  • Tabatha Marshall from the TLDP project for general support,

  • Joey Hess, Carlo Perassi, and Joe Riel for minor corrections,

  • Claudio Cattazzo for conversion of my private xml document to standard docbook format together which resulted also in a number of minor corrections and improvements [2003-10-04],

  • Frank Lichtenheld for finding errors introduced when the HTML pages get generated and for suggesting to use 'dpkg -S <file>' when looking for a package containing a certain file [2003-12-13],

  • Hugh Hartmann for translating this HOWTO to Italian and Claudio Cattazzo for revising the translation [2003-12-13], and

  • Oguz Yarimtepe for translating this HOWTO to Turkish [2005-08-09].




sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2007-10-16 22:14:27
Processing time 0.0203 sec