.deb文件打包


最近因項目需要,需要把文件夾打包為.deb格式的包,幸虧一位朋友幫忙指導了我一個晚上,才得以完成,這里再次對他表示感謝。

 

整理打包流程如下:

 

請先參考此博客內容,了解deb文件打包

 

如何制作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 <lmingwei@gmail.com>
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 <your_email@gmail.com style="word-wrap: break-word;">   (打包人和聯系方式)
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 <
xxxxxxxx@xxxx.xx> (打包人和聯系方式)
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

 

 

下面開始打包,本人這里以eclipse為例:

 

先從官網下載64位的Eclipse的j2ee版本,然后,解壓后得到eclipse目錄,eclipse目錄內容如下

 

 

正常,進入到/opt/eclipse目錄,然后執行./eclipse就可以運行eclipse了,如果不可以,確保自己的電腦已經安裝了jdk或者openjdk

 

 

然后構建如下目錄情況,然后執行deb打包

在DEBIAN下,創建control文件,並添加如下內容。

注意:DEBIAN需要大寫。這里,需要將eclipse從.deb安裝到/opt下,所以就將解壓后的 eclipse文件夾放到/home/xlz/test/eclipse/opt/目錄下,也就是說

應該建立這樣的目錄結構

 

 

再在DEBIAN下創建postinst和postrm兩個文件,並添加如下內容。

 

 

這樣postinst之后,就可以直接在命令行里面輸入$eclipse來啟動eclipse開發環境了

添加完這兩個文件以后,需要 sudo chmod +x postinst

sudo chmod +x postrm

為這兩個文件添加可執行權限。

重新回到需要打包的目的父目錄中,執行

 

比如這里,eclipse在/opt/build文件夾下,

也就是說,回到build目錄下,

輸入如下命令:sudo dpkg -b eclispe eclipse_64.deb

進行文件打包。

然后,運行如下命令,進行安裝,然后在命令行運行eclipse即可。

 

 

 

如何制作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 <lmingwei@gmail.com>
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 <your_email@gmail.com style="word-wrap: break-word;">   (打包人和聯系方式)
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 <
xxxxxxxx@xxxx.xx> (打包人和聯系方式)
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM