如何解開「deb檔(Debian Package)」

測試環境

以下測試是在「Xubuntu 14.04 64位元」。

前提

以「man-db」這個「Package」為例。

執行步驟

準備工作環境

建立工作環境資料夾

$ mkdir ~/Downloads/man-db/download -p

切換到工作環境資料夾

$ cd ~/Downloads/man-db/download

下載範例套件

下載「man-db」這個套件。可以參考「這篇」的說明。

$ apt-get download man-db

會顯示

Get:1 http://tw.archive.ubuntu.com/ubuntu/ trusty-updates/main man-db amd64 2.6.7.1-1ubuntu1 [857 kB]
Fetched 857 kB in 5s (150 kB/s)

觀看下載了什麼檔案

$ ls -1

會顯示

man-db_2.6.7.1-1ubuntu1_amd64.deb

解壓縮主要檔案內容

執行

$ dpkg -x man-db_2.6.7.1-1ubuntu1_amd64.deb man-db

會產生一個資料夾「man-db」

$ ls -1

會顯示

man-db
man-db_2.6.7.1-1ubuntu1_amd64.deb

用「tree」觀看目錄結構

$ tree man-db

會顯示

man-db
├── etc
│   ├── cron.daily
│   │   └── man-db
│   ├── cron.weekly
│   │   └── man-db
│   └── manpath.config
├── usr
│   ├── bin
│   │   ├── apropos -> whatis
│   │   ├── catman
│   │   ├── lexgrog
│   │   ├── man
│   │   ├── mandb
│   │   ├── manpath
│   │   ├── whatis
│   │   └── zsoelim
│   ├── lib
│   │   └── man-db
│   │       ├── globbing
│   │       ├── libman-2.6.7.1.so
│   │       ├── libmandb-2.6.7.1.so
│   │       ├── libmandb.so -> libmandb-2.6.7.1.so
│   │       ├── libman.so -> libman-2.6.7.1.so
│   │       ├── man -> ../../bin/man
│   │       ├── manconv
│   │       └── mandb -> ../../bin/mandb
│   ├── sbin
│   │   └── accessdb
│   └── share
│       ├── bug
│       │   └── man-db
│       │       └── presubj
│       ├── doc
│       │   └── man-db
│       │       ├── ChangeLog-2013.gz
│       │       ├── changelog.Debian.gz
│       │       ├── copyright
│       │       ├── examples
│       │       │   ├── manpage.example
│       │       │   ├── manpage.example.mdoc
│       │       │   ├── manpage.example.pod
│       │       │   ├── manpage.example.sgml.gz
│       │       │   └── manpath.config.gz
│       │       ├── FAQ
│       │       ├── man-db-manual.ps.gz
│       │       ├── man-db-manual.txt.gz
│       │       ├── NEWS.gz
│       │       ├── README.gz
│       │       ├── THANKS
│       │       └── TODO
│       ├── doc-base
│       │   └── man-db
│       ├── lintian
│       │   └── overrides
│       │       └── man-db
│       ├── man
│       │   ├── da
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── de
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── es
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── fr
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── id
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── it
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── ja
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── man1
│       │   │   ├── apropos.1.gz
│       │   │   ├── lexgrog.1.gz
│       │   │   ├── man.1.gz
│       │   │   ├── manconv.1.gz
│       │   │   ├── manpath.1.gz
│       │   │   ├── whatis.1.gz
│       │   │   └── zsoelim.1.gz
│       │   ├── man5
│       │   │   └── manpath.5.gz
│       │   ├── man8
│       │   │   ├── accessdb.8.gz
│       │   │   ├── catman.8.gz
│       │   │   └── mandb.8.gz
│       │   ├── nl
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── pl
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── ru
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   └── zh_CN
│       │       ├── man1
│       │       │   ├── apropos.1.gz
│       │       │   ├── lexgrog.1.gz
│       │       │   ├── man.1.gz
│       │       │   ├── manconv.1.gz
│       │       │   ├── manpath.1.gz
│       │       │   ├── whatis.1.gz
│       │       │   └── zsoelim.1.gz
│       │       ├── man5
│       │       │   └── manpath.5.gz
│       │       └── man8
│       │           ├── accessdb.8.gz
│       │           ├── catman.8.gz
│       │           └── mandb.8.gz
│       └── man-db
│           └── chconfig
└── var
    ├── cache
    │   └── man
    └── lib
        └── man-db

71 directories, 166 files

在執行安裝的時候,「man-db」這個資料夾的檔案,就會放置對應到「/」底下。

解開control檔案

執行

$ dpkg -e man-db_2.6.7.1-1ubuntu1_amd64.deb

會產生一個資料夾「DEBIAN」。

ls -1

顯示

DEBIAN
man-db
man-db_2.6.7.1-1ubuntu1_amd64.deb

用「tree」觀看「DEBIAN」目錄結構

$ tree DEBIAN

顯示

DEBIAN
├── conffiles
├── config
├── control
├── md5sums
├── postinst
├── postrm
├── preinst
├── prerm
├── templates
└── triggers

0 directories, 10 files

也可以將「DEBIAN」這個資料夾,解開到某個資料夾底下

執行

$ dpkg -e man-db_2.6.7.1-1ubuntu1_amd64.deb man-db/DEBIAN

執行

$ tree man-db/DEBIAN

顯示

man-db/DEBIAN
├── conffiles
├── config
├── control
├── md5sums
├── postinst
├── postrm
├── preinst
├── prerm
├── templates
└── triggers

0 directories, 10 files

這時候,你就可以執行下面的指令,製作一個新的「deb擋」了,請參考「這篇

$ dpkg -b man-db

會顯示

dpkg-deb: warning: 'man-db/DEBIAN/control' contains user-defined field 'Original-Maintainer'
dpkg-deb: warning: ignoring 1 warning about the control file(s)

dpkg-deb: building package `man-db' in `man-db.deb'.

表示產生一個新的檔,叫做「man-db.deb」。

執行

$ ls -1

會顯示

DEBIAN
man-db
man-db_2.6.7.1-1ubuntu1_amd64.deb
man-db.deb

利用 ar 解開

新產生一個資料夾叫「raw」

$ mkdir raw

切換到「raw」這個資料夾

$ cd raw

複製剛剛下載下來的「man-db_2.6.7.1-1ubuntu1_amd64.deb」

$ cp ../man-db_2.6.7.1-1ubuntu1_amd64.deb ./

觀看目前有哪些檔

$ ls -1

顯示

man-db_2.6.7.1-1ubuntu1_amd64.deb

利用「ar」解開「man-db_2.6.7.1-1ubuntu1_amd64.deb」

$ ar xv man-db_2.6.7.1-1ubuntu1_amd64.deb

會顯示下面的訊息

x - debian-binary
x - control.tar.gz
x - data.tar.xz

觀看目前有哪些檔

$ ls -1

會顯示

control.tar.gz
data.tar.xz
debian-binary
man-db_2.6.7.1-1ubuntu1_amd64.deb

觀看「debian-binary」

$ cat debian-binary

會顯示

2.0

產生一個資料夾叫「DEBIAN」

$ mkdir DEBIAN

解開「control.tar.gz」到「DEBIAN」這個資料夾

$ tar xf control.tar.gz -C DEBIAN

用「tree」觀看「DEBIAN」目錄結構

$ tree DEBIAN

會顯示

DEBIAN
├── conffiles
├── config
├── control
├── md5sums
├── postinst
├── postrm
├── preinst
├── prerm
├── templates
└── triggers

0 directories, 10 files

跟剛剛用「dpkg -e」解開的結果是一樣的。

產生一個資料夾,叫「man-db」

$ mkdir man-db

解開「data.tar.xz」到「man-db」這個資料夾

$ tar xf data.tar.xz -C man-db

用「tree」觀看「man-db」目錄結構

$ tree man-db
man-db
├── etc
│   ├── cron.daily
│   │   └── man-db
│   ├── cron.weekly
│   │   └── man-db
│   └── manpath.config
├── usr
│   ├── bin
│   │   ├── apropos -> whatis
│   │   ├── catman
│   │   ├── lexgrog
│   │   ├── man
│   │   ├── mandb
│   │   ├── manpath
│   │   ├── whatis
│   │   └── zsoelim
│   ├── lib
│   │   └── man-db
│   │       ├── globbing
│   │       ├── libman-2.6.7.1.so
│   │       ├── libmandb-2.6.7.1.so
│   │       ├── libmandb.so -> libmandb-2.6.7.1.so
│   │       ├── libman.so -> libman-2.6.7.1.so
│   │       ├── man -> ../../bin/man
│   │       ├── manconv
│   │       └── mandb -> ../../bin/mandb
│   ├── sbin
│   │   └── accessdb
│   └── share
│       ├── bug
│       │   └── man-db
│       │       └── presubj
│       ├── doc
│       │   └── man-db
│       │       ├── ChangeLog-2013.gz
│       │       ├── changelog.Debian.gz
│       │       ├── copyright
│       │       ├── examples
│       │       │   ├── manpage.example
│       │       │   ├── manpage.example.mdoc
│       │       │   ├── manpage.example.pod
│       │       │   ├── manpage.example.sgml.gz
│       │       │   └── manpath.config.gz
│       │       ├── FAQ
│       │       ├── man-db-manual.ps.gz
│       │       ├── man-db-manual.txt.gz
│       │       ├── NEWS.gz
│       │       ├── README.gz
│       │       ├── THANKS
│       │       └── TODO
│       ├── doc-base
│       │   └── man-db
│       ├── lintian
│       │   └── overrides
│       │       └── man-db
│       ├── man
│       │   ├── da
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── de
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── es
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── fr
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── id
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── it
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── ja
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── man1
│       │   │   ├── apropos.1.gz
│       │   │   ├── lexgrog.1.gz
│       │   │   ├── man.1.gz
│       │   │   ├── manconv.1.gz
│       │   │   ├── manpath.1.gz
│       │   │   ├── whatis.1.gz
│       │   │   └── zsoelim.1.gz
│       │   ├── man5
│       │   │   └── manpath.5.gz
│       │   ├── man8
│       │   │   ├── accessdb.8.gz
│       │   │   ├── catman.8.gz
│       │   │   └── mandb.8.gz
│       │   ├── nl
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── pl
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   ├── ru
│       │   │   ├── man1
│       │   │   │   ├── apropos.1.gz
│       │   │   │   ├── lexgrog.1.gz
│       │   │   │   ├── man.1.gz
│       │   │   │   ├── manconv.1.gz
│       │   │   │   ├── manpath.1.gz
│       │   │   │   ├── whatis.1.gz
│       │   │   │   └── zsoelim.1.gz
│       │   │   ├── man5
│       │   │   │   └── manpath.5.gz
│       │   │   └── man8
│       │   │       ├── accessdb.8.gz
│       │   │       ├── catman.8.gz
│       │   │       └── mandb.8.gz
│       │   └── zh_CN
│       │       ├── man1
│       │       │   ├── apropos.1.gz
│       │       │   ├── lexgrog.1.gz
│       │       │   ├── man.1.gz
│       │       │   ├── manconv.1.gz
│       │       │   ├── manpath.1.gz
│       │       │   ├── whatis.1.gz
│       │       │   └── zsoelim.1.gz
│       │       ├── man5
│       │       │   └── manpath.5.gz
│       │       └── man8
│       │           ├── accessdb.8.gz
│       │           ├── catman.8.gz
│       │           └── mandb.8.gz
│       └── man-db
│           └── chconfig
└── var
    ├── cache
    │   └── man
    └── lib
        └── man-db

71 directories, 166 files

跟剛剛用「dpkg -x」解開的結果是一樣的是一樣的

關於「DEBIAN」這裡面的檔案

用「tree」觀看「DEBIAN」目錄結構

$ tree DEBIAN

顯示

DEBIAN
├── conffiles
├── config
├── control
├── md5sums
├── postinst
├── postrm
├── preinst
├── prerm
├── templates
└── triggers

0 directories, 10 files

這裡面的檔案,在執行安裝流程的時候,會解開到「/var/lib/dpkg/info/」這個資料夾。

可以執行下面的指令來對照

$ tree /var/lib/dpkg/info/ -P 'man-db*'

就可以看到對應的檔案

/var/lib/dpkg/info/
├── man-db.conffiles
├── man-db.config
├── man-db.list
├── man-db.md5sums
├── man-db.postinst
├── man-db.postrm
├── man-db.preinst
├── man-db.prerm
├── man-db.templates
└── man-db.triggers

0 directories, 10 files

或是執行

$ ls /var/lib/dpkg/info/man-db* -1

顯示

/var/lib/dpkg/info/man-db.conffiles
/var/lib/dpkg/info/man-db.config
/var/lib/dpkg/info/man-db.list
/var/lib/dpkg/info/man-db.md5sums
/var/lib/dpkg/info/man-db.postinst
/var/lib/dpkg/info/man-db.postrm
/var/lib/dpkg/info/man-db.preinst
/var/lib/dpkg/info/man-db.prerm
/var/lib/dpkg/info/man-db.templates
/var/lib/dpkg/info/man-db.triggers

可以對照一下,「DEBIAN/postinst」和「/var/lib/dpkg/info/man-db.postinst」,這兩個檔案是否一樣

執行

$ md5sum DEBIAN/postinst

顯示

c330e26ed02c6b09d2ce99e849ca8daf  DEBIAN/postinst

執行

$ md5sum /var/lib/dpkg/info/man-db.postinst

顯示

c330e26ed02c6b09d2ce99e849ca8daf  /var/lib/dpkg/info/man-db.postinst