天天看點

dpkg打包

如何制作Deb包和相應的軟體倉庫,其實這個很簡單。這裡推薦使用dpkg來進行deb包的建立、編輯和制作。

首先了解一下deb包的檔案結構:

deb 軟體包裡面的結構:它具有DEBIAN和軟體具體安裝目錄(如etc, usr, opt, tmp等)。在DEBIAN目錄中起碼具有control檔案,其次還可能具有postinst(postinstallation)、postrm(postremove)、preinst(preinstallation)、prerm(preremove)、copyright (版權)、changlog (修訂記錄)和conffiles等。

control: 這個檔案主要描述軟體包的名稱(Package),版本(Version)以及描述(Description)等,是deb包必須具備的描述性檔案,以便于軟體的安裝管理和索引。同時為了能将軟體包進行充分的管理,可能還具有以下字段:

Section: 這個字段申明軟體的類别,常見的有`utils’, `net’, `mail’, `text’, `x11′ 等;

Priority: 這個字段申明軟體對于系統的重要程度,如`required’, `standard’, `optional’, `extra’ 等;

Essential: 這個字段申明是否是系統最基本的軟體包(選項為yes/no),如果是的話,這就表明該軟體是維持系統穩定和正常運作的軟體包,不允許任何形式的解除安裝(除非進行強制性的解除安裝)

Architecture:申明軟體包結構,如基于`i386′, ‘amd64’,`m68k’, `sparc’, `alpha’, `powerpc’ 等;

Source: 軟體包的源代碼名稱;

Depends: 軟體所依賴的其他軟體包和庫檔案。如果是依賴多個軟體包和庫檔案,彼此之間采用逗号隔開;

Pre-Depends: 軟體安裝前必須安裝、配置依賴性的軟體包和庫檔案,它常常用于必須的預運作腳本需求;

Recommends: 這個字段表明推薦的安裝的其他軟體包和庫檔案;

Suggests: 建議安裝的其他軟體包和庫檔案。

對于control,這裡有一個完整的例子:

Package: bioinfoserv-arb

Version: 2007_14_08

Section: BioInfoServ

Priority: optional

Depends: bioinfoserv-base-directories (>= 1.0-1), xviewg (>= 3.2p1.4), xfig (>= 1:3), libstdc++2.10-glibc2.2

Suggests: fig2ps

Architecture: i386

Installed-Size: 26104

Maintainer: Mingwei Liu <[email protected]>

Provides: bioinfoserv-arb

Description: The ARB software is a graphically oriented package comprising various tools for sequence database handling and data analysis.

If you want to print your graphs you probably need to install the suggested fig2ps package.preinst: 這個檔案是軟體安裝前所要進行的工作,工作執行會依據其中腳本進行;

postinst這個檔案包含了軟體在進行正常目錄檔案拷貝到系統後,所需要執行的配置工作。

prerm :軟體解除安裝前需要執行的腳本

postrm: 軟體解除安裝後需要執行的腳本現在來看看如何修訂一個已有的deb包軟體

=================================================================

debian制作DEB包(在root權限下),打包位置随意。

#建立要打包軟體檔案夾,如

mkdir Cydia

cd   Cydia

#依據程式的安裝路徑建立檔案夾,并将相應程式添加到檔案夾。如

mkdir Applications

mkdir var/mobile/Documents (遊戲類需要這個目錄,其他也有可能需要)

mkdir *** (要依據程式要求來添加)

#建立DEBIAN檔案夾

mkdir DEBIAN

#在DEBIAN目錄下建立一個control檔案,并加入相關内容。

touch DEBIAN/control(也可以直接使用vi DEBIAN/control編輯儲存)

#編輯control

vi DEBIAN/control

#相關内容(注意結尾必須空一行):

Package: soft (程式名稱)

Version: 1.0.1 (版本)

Section: utils (程式類别)

Architecture: iphoneos-arm   (程式格式)

Installed-Size: 512   (大小)

Maintainer: your <[email protected]>   (打包人和聯系方式)

Description: soft package (程式說明)

                                       (此處必須空一行再結束)

注:此檔案也可以先在電腦上編輯(使用文本編輯就可以,完成後去掉.txt),再傳到打包目錄裡。

#在DEBIAN裡還可以根據需要設定腳本檔案

preinst

在Deb封包件解包之前,将會運作該腳本。許多“preinst”腳本的任務是停止作用于待更新軟體包的服務,直到軟體包安裝或更新完成。

postinst

該腳本的主要任務是完成安裝包時的配置工作。許多“postinst”腳本負責執行有關指令為新安裝或更新的軟體重新開機服務。

prerm

該腳本負責停止與軟體包相關聯的daemon服務。它在删除軟體包關聯檔案之前執行。

postrm

該腳本負責修改軟體包連結或檔案關聯,或删除由它建立的檔案。

#postinst 如:

#!/bin/sh

if [ "$1" = "configure" ]; then

/Applications/MobileLog.app/MobileLog -install

/bin/launchctl load -wF /System/Library/LaunchDaemons/com.iXtension.MobileLogDaemon.plist

fi

#prerm 如:

#!/bin/sh

if [[ $1 == remove ]]; then

/Applications/MobileLog.app/MobileLog -uninstall

/bin/launchctl unload -wF /System/Library/LaunchDaemons/com.iXtension.MobileLogDaemon.plist

fi

#如果DEBIAN目錄中含有postinst 、prerm等執行檔案

chmod -R 755 DEBIAN

#退出打包軟體檔案夾,生成DEB

dpkg-deb --build Cydia

=====================================================================

有時候安裝自己打包的deb包時報如下錯誤:

Selecting previously deselected package initrd-deb.

(Reading database ... 71153 files and directories currently installed.)

Unpacking initrd-deb (from initrd-vstools_1.0_amd64.deb) ...

dpkg: error processing initrd-vstools_1.0_amd64.deb (--install):

trying to overwrite `/boot/initrd-vstools.img', which is also in package initrd-deb-2

dpkg-deb: subprocess paste killed by signal (Broken pipe)

Errors were encountered while processing:

initrd-vstools_1.0_amd64.deb

主要意思是說,已經有一個deb已經安裝了相同的檔案,是以預設退出安裝,隻要把原來安裝的檔案給解除安裝掉,再次進行安裝就可以了。

下面為實踐内容:

所有的目錄以及檔案:

mydeb

|----DEBIAN

       |-------control

               |-------postinst

       |-------postrm

|----boot

       |----- initrd-vstools.img

在任意目錄下建立如上所示的目錄以及檔案

# mkdir   -p /root/mydeb                          # 在該目錄下存放生成deb包的檔案以及目錄

# mkdir -p /root/mydeb/DEBIAN           #目錄名必須大寫

# mkdir -p /root/mydeb/boot                   # 将檔案安裝到/boot目錄下

# touch /root/mydeb/DEBIAN/control    # 必須要有該檔案

# touch /root/mydeb/DEBIAN/postinst # 軟體安裝完後,執行該Shell腳本

# touch /root/mydeb/DEBIAN/postrm    # 軟體解除安裝後,執行該Shell腳本

# touch /root/mydeb/boot/initrd-vstools.img    # 所謂的“軟體”程式,這裡就隻是一個空檔案

control檔案内容:

Package: my-deb   (軟體名稱,中間不能有空格)

Version: 1                  (軟體版本)

Section: utils            (軟體類别)

Priority: optional        (軟體對于系統的重要程度)

Architecture: amd64   (軟體所支援的平台架構)

Maintainer: xxxxxx <[email protected]> (打包人和聯系方式)

Description: my first deb (對軟體所的描述)

postinst檔案内容( 軟體安裝完後,執行該Shell腳本,一般用來配置軟體執行環境,必須以“#!/bin/sh”為首行,然後給該腳本賦予可執行權限:chmod +x postinst):

#!/bin/sh

echo "my deb" > /root/mydeb.log

postrm檔案内容( 軟體解除安裝後,執行該Shell腳本,一般作為清理收尾工作,必須以“#!/bin/sh”為首行,然後給該腳本賦予可執行權限:chmod +x postrm):

#!/bin/sh

rm -rf /root/mydeb.log

給mydeb目錄打包:

# dpkg -b   mydeb   mydeb-1.deb      # 第一個參數為将要打包的目錄名,

                                                            # 第二個參數為生成包的名稱。

安裝deb包:

# dpkg -i   mydeb-1.deb      # 将initrd-vstools.img複制到/boot目錄下後,執行postinst,

                                            # postinst腳本在/root目錄下生成一個含有"my deb"字元的mydeb.log檔案

解除安裝deb包:

# dpkg -r   my-deb      # 這裡要解除安裝的包名為control檔案Package字段所定義的 my-deb 。

                                    # 将/boot目錄下initrd-vstools.img删除後,執行posrm,

                                    # postrm腳本将/root目錄下的mydeb.log檔案删除

檢視deb包是否安裝:

# dpkg -s   my-deb      # 這裡要解除安裝的包名為control檔案Package字段所定義的 my-deb

檢視deb封包件内容:

# dpkg   -c   mydeb-1.deb

檢視目前目錄某個deb包的資訊:

# dpkg --info mydeb-1.deb

解壓deb包中所要安裝的檔案

# dpkg -x   mydeb-1.deb   mydeb-1    # 第一個參數為所要解壓的deb包,這裡為 mydeb-1.deb

                                                             # 第二個參數為将deb包解壓到指定的目錄,這裡為 mydeb-1

解壓deb包中DEBIAN目錄下的檔案(至少包含control檔案)

# dpkg -e   mydeb-1.deb   mydeb-1/DEBIAN    # 第一個參數為所要解壓的deb包,

                                                                           # 這裡為 mydeb-1.deb

                                                                          # 第二個參數為将deb包解壓到指定的目錄,

                                                                           # 這裡為 mydeb-1/DEBIAN