如何解開「deb檔(Debian Package)」
測試環境
以下測試是在「Xubuntu 14.04 64位元」。
前提
以「man-db」這個「Package」為例。
執行步驟
準備工作環境
建立工作環境資料夾
$ mkdir ~/Downloads/man-db/download -p
切換到工作環境資料夾
$ cd ~/Downloads/man-db/download
下載範例套件
$ 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