deb包解壓跟打包

deb 是 Debian 系 Linux 使用的軟件包格式,也是我最欣賞的軟件包格式。我所知道的打 deb 軟件包的方法有兩種,一種是使用 checkinstall,另一種是使用 dpkg。

checkinstall 不僅僅可以用來打 deb 包,還可以打 rpm 和 tgz 包,而且使用方法相對簡單。但是 checkinstall 的運行不是那麼穩定,我搞不懂它在什麼情況下才能正常運行,而且它的定製性不是很強,使用時老是要交互地輸入些信息,所以我還是放棄了使用它來打包軟件。感興趣的朋友可以在網上搜索一下這個程序的使用方法。

dpkg 是 Debian 的“原生”包管理軟件,但是很多人不太願意使用 dpkg 來打包 deb。究其原因可能是需要寫麻煩的配置文件,但是寫配置文件的一個好處就是在下次打包時候可以直接用上次的配置文件,只修改一個版本號就可以了,而不用每次都需要填包信息。在介紹如何打 deb 包之前,我們現看一下如何解 deb 包。

$ sudo apt-get install tree
$ dpkg -X /var/cache/apt/archives/tree_1.5.1.1-1_i386.deb fakeroot
$ cd fakeroot
$ dpkg -e /var/cache/apt/archives/tree_1.5.1.1-1_i386.deb
$ tree
.
|-- DEBIAN
|   |-- control
|   `-- md5sums
`-- usr
|-- bin
|   `-- tree
`-- share
|-- doc
|   `-- tree
|       |-- README
|       |-- changelog.Debian.gz
|       |-- changelog.gz
|       `-- copyright
`-- man
`-- man1
`-- tree.1.gz

dpkg -X 是將 deb 包的內容文件釋放出來,dpkg -e 是將 deb 包的控制信息釋放出來。前面執行那個 sudo apt-get install tree 是爲了將 tree_1.5.1.1-1_i386.deb 下載到本地 apt cache,如果您已經安裝過 tree 這個軟件,可以爲 apt-get 加上 -d 參數,使其只下載而不安裝。

從上面 tree 命令的執行結果我們發現,deb 包解開後分兩部分:一部分是控制信息,在 DEBIAN 目錄下;一部分是安裝內容,在 usr 目錄下。現在您大概明白爲什麼我們使用 fakeroot 作爲目錄名了,因爲這個目錄就是一個"假根目錄",您在這個目錄下所有的修改,最後都會被映射到目標機的根目錄 / 下。比如 fakeroot/usr/bin/tree 這個文件,就會被安裝到 /usr/bin 下,以此類推。

只要您能理解 fakeroot 這個目錄映射,您就知道如何安放自己的文件了。爲了讓生成的包將文件 foo 安裝到目錄 /usr/xx/yy 目錄下,您只用在 fakeroot 目錄下建立 usr/xx/yy 目錄,並將 foo 拷貝進去就行了。

好,下面進入關鍵的配置文件部分,關於 control 和 md5sums。

$ more DEBIAN/control
Package: tree
Version: 1.5.1.1-1
Architecture: i386
Maintainer: Ubuntu MOTU Developers
Original-Maintainer: Florian Ernst
Installed-Size: 92
Depends: libc6 (>= 2.6-1)
Section: utils
Priority: optional
Description: displays directory tree, in color
Displays an indented directory tree, using the same color assignments as
ls, via the LS_COLORS environment variable.
.
Homepage: http://mama.indstate.edu/users/ice/tree/

我們可以看到,control 文件中包含的主要是軟件的版本和維護者信息,我相信大家都能基本看懂上面這些信息什麼意思:Package 包名(tree)、Version 版本(1.5.1.1-1)、Architecture 目標機架構(i386 386及以後)、Maintainer 維護者(Ubuntu MOTU Developers)、Original-Maintainer 原維護者(Florian Ernst)、Installed-Size 安裝後大小(92K)、Depends 依賴軟件包(libc6 不低於 2.6-1 版本)、Section 包分類(工具)、Priority 優先級(可選)、Description 包描述、Homepage 軟件主頁。

由於咱們分析這個包是 Ubuntu 發佈的包,所以包信息給的比較全,其實並不是上面所有的信息都有必要提供(小聲說一句,就算全提供也不是很難吧?除了咱不用的,Original-Maintainer 這種就算了)。關於哪些信息比較重要,以及每個域的具體含義和可選項,可以參考 Debian 的文檔 Debian Policy Manual Chapter 5 - Control files and their fields 

您也可以依樣畫葫蘆,寫一個類似的 control 文件放到 DEBIAN 目錄下,提供一些自己軟件包的信息,基本有這個配置文件就可以打包了。

$ more DEBIAN/md5sums
d60a3b4736f761dd1108cb89e58b9d4e usr/bin/tree
981ea0343c2a3eb37d5fc8b5ac5562df usr/share/man/man1/tree.1.gz
483a56158a07a730ec60fc36b3f81282 usr/share/doc/tree/README
ea56d78ae0d54693ae8f3c0908deeeff usr/share/doc/tree/copyright
4456e04c3c268eabcd10ee9b949a9b9a usr/share/doc/tree/changelog.gz
ec104db6914cfce2865a0d8c421512bb usr/share/doc/tree/changelog.Debian.gz

md5sums,這文件名一看,就知道是保存着軟件包中各文件的 md5 校驗值,用來校驗軟件包是否被損壞了。其實這個文件純屬“臘月三十逮兔子,有它沒它都過年”,您可以完全不提供它。

這樣呢,我們就準備好了 deb 包的內容文件和控制信息:控制文件放在了 fakeroot/DEBIAN 目錄下,內容文件放在 fakeroot/usr 下,目錄樹就像開頭 tree 命令的結果。下面只需要一個命令就能打出來 deb 安裝包了:

$ cd ..
$ dpkg -b fakeroot/ foo.deb

這時候當前目錄下就出現了 foo.deb。您可以使用 dpkg -I foo.deb 查看 foo.deb 的控制信息,dpkg -c foo.deb 查看 foo.deb 包含了什麼文件,sudo dpkg -i 安裝 foo.deb。

小技巧:

1. 如果您懶得自己新建一個控制文件和目錄樹,您完全可以像本文開頭那樣,找一個簡單的軟件包,將它的內容和控制信息釋放出來,對它進行修改,然後打出來自己的包。

2. 生成 md5sums 文件不是什麼難事,您只需要在 fakeroot 目錄使用下面這個命令:

$ md5sum `find usr -type f` > DEBIAN/md5sums
或者
$ find usr/ -type f -exec md5sum {} + > DEBIAN/md5sums

3. 將您的可執行文件拷貝到 fakeroot/usr 下並不一定要手動一個個拷。如果您使用 GNU 自動工具集,./configure 時加個參數 --prefix=fakeroot/usr/ 即可;如果您自己寫的 Makefile,可以在 Makefile 中使用一個變量 PREFIX=/usr,當您不加參數時,make install 的安裝目標就是 /usr 下,您可以使用 Makefile -e PREFIX=fakeroot/usr/ install 來覆蓋 Makefile 中的變量設置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章