debian_20150814_main

每一種 Linux Distribution 在系統層面都會內建基本的套件管理工具,用來管理各種套件或函式庫的安裝與升級,並維護程式套件之間的相依關係。Linux 中兩大主流的套件管理工具,分別是 Red Hat 的 RPM 與 Debian 的 DEB。今天介紹如何透過 dpkg 這個命令還封裝自己的套件,以便於將程式進行散佈與部署。

Deb 套件介紹

在 Debian 系統中通常使用 dpkg 這個命令來打包程式或函式庫,除了要準備好我們要打包的程式碼之外,還需要撰寫一個套件描述檔,好讓我們描述套件與其他套件之間的相依關係。使用 dpkg 進行封裝時請先準備好以下的目錄與檔案:


deb_struct_example_20150814

上圖 DEBIAN 資料夾中的 control 檔案就是套件打包最重要的描述檔,透過 control 可以定義套件相關資訊,範例的內容如下:

Package: package-name
Version: 1.0.0.0
Architecture: all
Maintainer: SJ Chou >
Installed-Size: 16
Depends: php5 (>=5.5.9), php5-curl (>=5.5.9), php5-mongo (>=1.4.5)
Section: web
Priority: optional
Homepage: http://blog.toright.com
Description: This is debian package build example

先介紹一下 deb-control 控制檔中比較重要的幾個設定

Package : 套件的名稱,在系統中必須是唯一的代號,慣例上用英文小寫與「-」組成
Version : 套件版本號
Architecture : 指定套件可執行的架構:例如 i368, amd64, sparc… 等等,也可以用 all 表示所有的平台皆可執行
Maintainer : 維護者資訊
Installed-Size : 安裝解壓縮後需要的磁碟空間
Depends : 描述這個套件相依的其他套件,用來確保安裝後可以正確執行,非常好用

DEBIAN 目錄中除了上面介紹的 control 控制檔,還有 postinst, preinst, postrm, prerm 這幾支檔案。這些檔案稱為 Maintainer Scripts,其實也就是一些在安裝與解除安裝過程中會被執行的 Script 執行檔,用來定義套件安裝與反安裝的過程需要執行的動作,詳細的執行流程請參考「Maintainer Scripts」這裡的說明。

前面介紹的目錄結構中,除了 DEBIAN 目錄之外,整個資料夾就是對應到系統的 root 根目錄上,我們可以把要安裝程式碼放在對應的路徑中,這些檔案被系統安裝後就會被進行管理,因此每一個套件中的檔案相對於系統跟目錄不可重複,避免管理上的麻煩。如果是一些設定檔,建議在 postinst Script 中進行安裝,這樣的設計會比較好。

利用 dpkg 命令進行打包

準備好上面的資料與檔案後,就可以透過以下命令執行套件打包:

dpkg -b ./package-name/ package-name_1.0.0.0.deb

執行完後會產生 deb 檔案,接著我們可以用 dpkg -i 來進行安裝,命令如下:

sudo dpkg -i package-name_1.0.0.0.deb

執行畫面如下:


deb_struct_example_20150814_02

打包的過程最麻蠻的就是那個 Installed-Size 的計算,因此我們遵循 Linux 的慣例來設計一個 Makefile 讓我方便製套件檔,Makefile 內容如下:

PACKAGE_NAME="package-name"
VERSION=1.0.0.0
all ::

@echo “[INFO] Create debian package file (control)."

    rm -rf ./${PACKAGE_NAME}/DEBIAN/control ;\
    cp ./${PACKAGE_NAME}/DEBIAN/control.sample ./${PACKAGE_NAME}/DEBIAN/control ;\
    SIZE=`du -sx –exclude DEBIAN “${PACKAGE_NAME}/DEBIAN/" | awk ‘{print $$1}’` ;\
    sed -i “s/Installed-Size: 0/Installed-Size: $${SIZE}/g" “./${PACKAGE_NAME}/DEBIAN/control" ;\
    sed -i ‘s/Version: 0.0.0-0/Version: ${VERSION}/g’ “./${PACKAGE_NAME}/DEBIAN/control" ;\
    cat ./${PACKAGE_NAME}/DEBIAN/control
    @echo “[INFO] Build Deb Package."
    mkdir -p ./dest
    rm -rf “./dest/${PACKAGE_NAME}_${VERSION}.deb"
    dpkg -b “./${PACKAGE_NAME}" “./dest/${PACKAGE_NAME}_${VERSION}.deb"

install ::
dpkg -i “./dest/${PACKAGE_NAME}_${VERSION}.deb"

可以直接修改 PACKAGE_NAME 與 VERSION 參數,然後我們僅需要執行 make 命令後就可以直接打包出檔案 (在 ./dest 目錄中)。並且透過 make install 進行安裝,是不是方便多了呢?執行畫面如下:

介紹完囉,上述的所有範例程式在 GitHub 中,需要的大大請自行服用。有了自行打包的套件後,在網路服務的佈署工作上蠻方便的,可以快速地進版與退版,自動化才是王道。如果是 Red Hat 系統其實也是差不多的流程,RPM 的封裝我就留到下次再介紹囉。


 學會在 Debian 中封裝套件、提高散佈與部署的方便性

 https://www.facebook.com/hkitblog