最近因項目需要,需要把文件夾打包為.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