從範本快速自製 deb
有許多工具可以幫我們打包 deb ,但是最基本的工具是 dpkg-deb 。只要了解 dpkg-deb 的用法,甚至可以自行開發一個 deb 打包工具。
下載一個既有的套件 deb 作為範本修改,可以省掉許多摸索的時間。
dpkg 工具與範本
dpkg-deb 常用功能:
- -b, --build: 將指定的目錄內容,打包為 deb.
- -c, --contents: 顯示 deb 的目錄結構與檔案.
- -x, --extract: 解開一個 deb 的內容到指定目錄。但是不包含 controll files.
- -I, --info: 顯示 deb 的資訊,包括 control files.
- -e, --control: 解開一個 deb 的內容到指定目錄(預設定 ./DEBIAN).
上列的 dpkg-deb 功能選項,也是 dpkg 工具的相同功能選項。例如執行 dpkg -I hello.deb 時,dpkg 背後實際上會去呼叫 dpkg-deb -I hello.deb。
我們可以先下載一個最簡單的 deb ,作為我們自製 deb 時的範本。按照 Debian 慣例,我們下載 hello 這個套件的 deb ,再複製到自己的家目錄。
$ sudo apt-get -d install hello
$ cp /var/cache/apt/archives/hello_2.2-3_i386.deb ~
deb 目錄內容
首先,我們先用 dpkg -x 解開 hello deb ,假設我們解開放到 mydeb 目錄。接著用 dpkg -e 將 controll files 解開放到 mydeb/DEBIAN 目錄。
$ dpkg -x hello_2.2-3_i386.deb mydeb
$ dpkg -e hello_2.2-3_i386.deb mydeb/DEBIAN
我們進入 mydeb 目錄,這時的 mydeb 目錄,就是安裝 deb 時的根目錄。所以 mydeb 目錄內的 usr/bin/hello 這個檔案,安裝時會被複製到 /usr/bin/hello 。自製 deb 時,我們需要做的第一件事,就是在 mydeb 目錄下,建立安裝的目錄與檔案結構。
按照 Debian 慣例,套件的文件會放在 /usr/share/doc/$package_name 。共用檔案會放在 /usr/share/$package_name 目錄。執行檔會放在 /usr/bin 或 /usr/share/$package_name/bin 或 /usr/local/bin 。組態檔會放在 /etc/$package_name 或 /usr/share/$package_name/etc 或 /usr/local/etc/$package_name 。
再看 mydeb/DEBIAN 目錄,這是我們放 control files 之處。一定要有的 control file 就是 control (本文說明的是 binary package。如要打包 source package,則需要更多必要文件,請參考Debian Policy Manual Chapter 4 - Source packages)。我們可以參考 hello deb 的 control 編輯我們自製 deb 的套件資訊。我們必須要自填的套件資訊欄位如下:
- Package: 套件名稱
- Version: 版本編號
- Architecture: 套件適用架構。i386 表示 x86 32bit架構;all 表示所有架構都適用,例如 Java 程式、shell scripts。
- Maintainer: 維護者的姓名與資訊。
- Depends: 相依套件。
- Section: 套件分類。devel: 開發工具類;web: Web應用程式;network: 網路工具類,等等。
- Priority: 套件重要性。我們自行開發的 deb ,此欄都是填 optional 或 extra 。
- Description: 套件說明文字。可以多行,但第二行起,都要在開頭空一格。
我們還可以在 mydeb/DEBIAN 目錄下放置下列四個可以選擇的安裝程序 (scripts):
- preinst: 安裝前執行的 script。當 dpkg 將檔案複製到指定目錄前,會執行它。當套件更新時,也會執行它。如果你安裝的套件是一個 demon ,那麼你可以將停止 demon 的動作放在這,以便更新套件前先停止運行中的 demon。
- postinst: 安裝後執行的 script。當 dpkg 將檔案複製到指定目錄前,會執行它。大部份的安裝動作會寫在這。
- prerm: 移除套件前執行的 script 。
- postrm: 移除套件後執行的 script 。
script 的回傳值如果不是零,那麼 dpkg 將會標記此套件的狀態為「壞狀態」(dpkg manual::INFORMATION ABOUT PACKAGES)。所謂壞狀態是指:
- half-installed - The installation of the package has been started, but not completed for some reason.
- not-installed - The package is not installed on your system.
- unpacked - The package is unpacked, but not configured.
- half-configured - The package is unpacked and configuration has been started, but not yet completed for some reason.
其他的 control files ,會由 dpkg 自行產生,我們不必更動。
在我們將軟體打包為 deb 之前,我們的 mydeb 目錄的結構,長得像下列所示。實際內容依各位的項目而定。
- mydeb/
- usr/
- bin/
- $program_binary...
- share/
- doc/
- $package_name/
- $package_documents, 例如 LICENSE, README. 自己決定。
- LICENSE
- README
- $package_name/
- $package_name/
- lib/
- bin/
- icons/
- doc/
- bin/
- DEBIAN/
- control
- postinst
- usr/
打包 deb
檔案都準備好了,那就可以執行 dpkg -b 打包為 deb 了。deb 的檔名是可選的,如果未給,那麼預設的 deb 檔名就是目錄名稱。
$ dpkg -b mydeb myhello_0.1234-1.deb
建立 deb 的動作流程,大致就是:
- 建立一個目錄作為 deb 內容的根目錄。
- 在 deb 內容的根目錄下,建立安裝內容的目錄結構,將要安裝的檔案放入。
- 在 deb 內容的根目錄下,建立名稱叫 DEBIAN 的目錄,放控制檔。
- 在 DEBIAN 目錄下,建立 control ,這是套件資訊。
- 在 DEBIAN 目錄下,建立安裝程序的 scripts 。
- 使用 dpkg -b 將目錄打包為 deb 。
當你逐漸熟悉打包 deb 的動作後,你就可以把它們寫進你的建置檔 (Makefile, build.xml) ,或者設計一個打包工具來做這些事。
請參考《Debian新維護人員手冊》了解更多關於 deb 打包的事項。