2010年2月16日 星期二

淺談 debian packging -2

binary package 其實一點都不神秘,每一台 debian(或 deb based) 的機器都有完整的工具可以解開他的面紗。最主要的工具就是 dpkg-deb

查看 dpkg-deb 的 man page,可以看到這個工具不止可以解開,還可以修改、建立 deb 檔。在建立 deb 檔的部份,可以看到 deb 檔格式的部份面貌:

Creates  a  debian  archive  from  the filesystem tree stored in directory. directory must have a DEBIAN subdirectory, which contains  the  control  information  files such as the control fileitself. This directory will not appear in the  binary  package's filesystem  archive,  but instead the files in it will be put in the binary package's control information area.

也就是說,每個 deb 檔都要有一個名為 DEBIAN/ 的特殊目錄,這裡面放的是控制資訊。那麼控制資訊又是什麼呢?不如來實際操作一下好了:

  • 先找個將要接受我們赤裸裸檢視的受害者吧!就決定是你了,gedit!
    wget ftp://ftp.debian.org/debian/pool/main/g/gedit/gedit_2.28.3-1_i386.deb
  • 從 man page 中可以看到 -e 選項可以解開控制資訊
    dpkg-deb -e gedit_2.28.3-1_i386.deb
  • 解開之後,可以看到 DEBIAN/ 裡有這些東西

control 是這個套件的資訊,像是名稱、維護者、官網、相依套件有哪些…等等;md5sums 是 md5 檢查碼,用來檢查檔案有沒有缺損或是錯誤用的。至於另外三個檔案,在解釋之前,要提一下 apt 的操作。

最常見的 apt 操作不外乎安裝、升級、移除三大類。其中升級可以想像成是把舊的版本移除之後,再裝上新的版本。postinst 正如字面所示,是安裝後會自動執行的 shell script,另外兩個也是依此類推。通常這是用來設定一些系統的、或是特殊的設定。比如有增刪程式庫的話,可能會需要額外執行 ldconfig 來更新一下。這就是使用postinst和postrm的好時機了。

所以 binary package 安裝的時候,大致上是這樣:

  1. 讀取 control 和 md5sums 兩個檔案,檢查各種可能的錯誤
  2. 如果有 preinst 的話就執行他
  3. 把其他檔案解壓縮到根目錄
  4. 如果有 postinst 的話就執行他

下篇預定來談談 deb 優於其他 binary package 的長處,也就是 DEBIAN/control 的內容