最近更新: 2009-12-31

從範本快速自製 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/
          • lib/
          • bin/
          • icons/
    • DEBIAN/
      • control
      • postinst

打包 deb

檔案都準備好了,那就可以執行 dpkg -b 打包為 deb 了。deb 的檔名是可選的,如果未給,那麼預設的 deb 檔名就是目錄名稱。


$ dpkg -b mydeb  myhello_0.1234-1.deb

建立 deb 的動作流程,大致就是:

  1. 建立一個目錄作為 deb 內容的根目錄。
  2. 在 deb 內容的根目錄下,建立安裝內容的目錄結構,將要安裝的檔案放入。
  3. 在 deb 內容的根目錄下,建立名稱叫 DEBIAN 的目錄,放控制檔。
  4. 在 DEBIAN 目錄下,建立 control ,這是套件資訊。
  5. 在 DEBIAN 目錄下,建立安裝程序的 scripts 。
  6. 使用 dpkg -b 將目錄打包為 deb 。

當你逐漸熟悉打包 deb 的動作後,你就可以把它們寫進你的建置檔 (Makefile, build.xml) ,或者設計一個打包工具來做這些事。

請參考《Debian新維護人員手冊》了解更多關於 deb 打包的事項。

樂多舊網址: http://blog.roodo.com/rocksaying/archives/11239791.html