1. 程式人生 > >deb包構建手冊

deb包構建手冊

COS標準構源建手冊

一、使用deb包 1. 檢視deb包含有哪些檔案(不安裝) $ dpkg -c xxx.deb // 安裝前根據deb檔案檢視 $ dpkg -L debname // 安裝後根據包名檢視 2. 安裝deb包 $ dpkg -i xxx.deb 注意,如果提示錯誤,可以加引數—force-all強制安裝,但不推薦這樣做 3. 檢視某個檔案屬於哪個deb包 $ dpkg -S filepath 4. 移除deb包 $ dpkg -r debname 二、製作deb包 1. 原理 1) deb包通常包含兩部分:控制資訊(DEBIAN目錄)、安裝內容(模擬root目錄) 2) 通過解開已有的deb包看其中內容 i. 釋放安裝內容到dirname目錄中 $ dpkg -X xxx.deb dirname ii.釋放控制資訊到當前目錄下的DEBIAN子目錄中 $ dpkg -e xxx.deb 2. 準備 1) 實驗平臺 ubuntu 8.04 2) 安裝相關工具 $ apt-get install dh-make checkinstall 3) 下載示例軟體包 以遊戲模擬器為例(也可使用其它原始碼包),製作它的deb包,下載地址: http://prdownloads.sourceforge.net/fceultra/fceu-0.98.12.src.tar.bz2 4) 注意:對於自己寫的程式碼製做deb包,建議用autoconf, automake生成編譯指令碼,例程見 http://xy0811.spaces.live.com/default.aspx?_c01_BlogPart=blogentry&_c=BlogPart&handle=cns!F8AECD2A067A6B17!1002 3. 方法一: 使用checkinstall方法建立deb包 checkinstall不僅可以生成deb包,還可以生成rpm包,使用簡單,但是不靈活,功能粗糙,只做介紹,不推薦使用 $ tar xvjf fceu-0.98.12.src.tar.bz2 // 解包 $ cd fceu;./configure;make // 編譯 $ checkinstall -D -y -install=no –pkgversion-0.98 –pkgname=fceuxy –pkgcource=./ –showinstall=no -default make install // 製作deb包 此時當前目錄下生成了deb包 4. 方法二: 使用dpkg方法建立deb包 dpkg是最基本的製作deb包的方法,推薦使用 $ tar xvjf fceu-0.98.12.src.tar.bz2 // 解包 $ mv fceu fceu-0.98 // 改目錄名為 包名-版本號 $ cd fceu-0.98 $ dh_make -s -e
[email protected]
-f ../fceu-0.98.12.src.tar.bz2 // 生成製作deb包所需的預設資訊 此時當前目錄下生成了debian目錄,此時通常修改兩個檔案:   修改debian/control檔案,配置你的資訊,具體欄位見參考部分   修改debian/rules指令碼,它決定編譯引數(也可以不改) $ dpkg-buildpackage -rfakeroot 此時可以看到,上層目錄中已建立了deb包 5. 方法三: 修改已有deb包 自己建立deb所需目錄結構(控制資訊和安裝內容),然後打包,一般使用這種方法來修改已有的deb包,而不是新建deb包,命令如下: $ dpkg -X xxx.deb test // 解包安裝內容 $ cd test $ dpkg -e ../xxx.deb // 解包控制資訊 修改其中內容 $ cd ../ $ dpkg -b dirname xxx_new.deb // 重新打包 三、參考 1. debian/control檔案中資訊說明 1) Package 包名 2) Version 版本 3) Architecture 目標機架構(i386, arm等) 4) Maintainer 維護者 5) Depends 依賴軟體包 6) Description 描述 2. checkinstall詳細例程 http://www.ibm.com/developerworks/cn/linux/l-cn-checkinstall/index.html 3. 自己製作deb包例程 http://blog.chinaunix.net/u2/78998/showart.php?id=1404403 4. 官方的debian製作手冊(比較長) http://www.debian.org/doc/manuals/maint-guide/index.zh-cn.html 本文轉自:http://xy0811.spaces.live.com/blog/cns!F8AECD2A067A6B17!1305.entry

1.apt-get高階包管理工具

1.1 軟體包基本概念

Debian的各個釋出版本中上萬個官方軟體包都是由世界各地的志願者維護的,他們遵照Debian Policy Manual 對軟體包進行命名、打包,並設定軟體包之間的依賴關係,之後經過嚴格的測試程式和bug跟蹤機制才能逐步進入ustable, testing乃至stable釋出。對於使用者來說,就是在安裝軟體包的時候,如果有其他軟體包被依賴或者衝突,就會得到apt的一個提示,讓使用者決定繼續進行安裝依賴,解除安裝衝突,還是放棄安裝了。不會因為被報告缺少特定檔案而手足無措了。

Debian 的軟體包的命名方式是:

<package name>_<version>.deb

這裡的軟體包名稱是全域性唯一的,而版本則是嚴格遵循規律,新版本的字串值比舊版本的大的,這樣就可以通過字串比較,確定同一軟體包的不同版本的新舊了。

ubuntudeb軟體包中的資訊:

Package: adduser

Priority: required

Section: admin

Installed-Size: 644

Maintainer: Ubuntu Core Developers <[email protected]>

Original-Maintainer: Debian Adduser Developers <[email protected]>

Architecture: all

Version: 3.113+nmu3ubuntu1

Replaces: manpages-it (<< 0.3.4-2), manpages-pl (<= 20051117-1)

Depends: perl-base (>= 5.6.0), passwd (>= 1:4.0.12), debconf | debconf-2.0

Recommends: ecryptfs-utils (>= 67-1)

Suggests: liblocale-gettext-perl, perl-modules

Filename: pool/main/a/adduser/adduser_3.113+nmu3ubuntu1_all.deb

Size: 168208

MD5sum: cfe970d660989b837e4ff9eca70c2421

SHA1: 597e4cabbb7cb7a40c42aaa2402fe1fe960e2d07

SHA256: 5a3be5248004b1f7d835aaa57ecc88f88450527fc47fca19515e4ef4d2630197

Description: add and remove users and groups

Multi-Arch: foreign

Homepage: http://alioth.debian.org/projects/adduser/

Description-md5: 7965b5cd83972a254552a570bcd32c93

Bugs: https://bugs.launchpad.net/ubuntu/+filebug

Origin: Ubuntu

Supported: 9m

Task: minimal

資訊表中重要的屬性會在後面的介紹。

1.1.1 Debian的軟體包的優先順序Priority

Debian的軟體包的優先順序Priority分為:

Required

優先順序為required的包是系統的正常執行所必須的,缺少他們,系統就無法正

常工作。

Important

這個優先順序的軟體包都是一些幾乎日常必備的東西,任何unix的系統都應該具

備這些軟體,對於有經驗的linux和unix的使用者,缺少這些工具是不可接受的,

但是這個優先順序的軟體不能太大。

Standard

這個優先順序是一些預設的安裝的軟體包,他們不一定只是在字元模式下工作,

但是必須足夠小而且是有用的。

Optional

這個優先順序的軟體包就包括很多比較大的工具了,只要是對使用者有用,對系統沒有什麼不良的影響,都可以放在這個優先順序。對於這個優先順序的軟體包,是不允許相互之間有衝突關係的。

Extra

其餘的軟體包就是extra 的了,他們肯能和其他軟體包(包括其它優先順序的)

有衝突或者功能重複,所以通常在知道這些軟體包的用途的情況下才會安裝這

些軟體包。

通過這種根據重要性分出的層次,結合根據用途的分類,debian的軟體包被十分良好的進行了分類組織。軟體打包的時候,不僅指出軟體包本身的優先順序,還包括相互的依賴關係,正是依靠這些依賴關係,可以確定軟體包進行安裝、解除安裝、升級等維護操作時對周圍其他軟體包乃至整個系統所產生的影響和應該採取的相應操作。

Adduser包資訊中的優先順序Priority:Required。

1.1.2 Debian的軟體包依賴關係

Debian的軟體包依賴關係包括:

依賴

軟體包在魔杖程度上依賴或需要某個軟體包或者某個軟體包的特定版本

depends

軟體包依賴於另一個軟體包,如果沒有那個軟體包,本軟體包將無法工作。

recommends

雖然不是必須的,但是強烈建議安裝那個軟體包,否者軟體包將失去很多重要特徵。

suggests

建議安裝的軟體包,如果安裝了可以得到更多的附加功能,但是沒有也不影響使用。

enhances

本軟體包增強這些軟體包的功能,予以和suggest 的是相互的,比較少見。

pre-depends

一類特殊的強依賴關係,缺少depends包的軟體包可以解包,但是無法成功執行安裝指令碼,然而缺少pre-depends 包的軟體包甚至無法解包。

衝突

conflict

軟體包與某個軟體包或它的某個版本不能共存。

提供

provide

軟體包中包含了某幾款其它的軟體包。

取代

replace

提供相同的檔案和功能,會被覆蓋replace的軟體包。

Adduser包資訊中依賴的資訊如下所示:

Replaces: manpages-it (<< 0.3.4-2), manpages-pl (<= 20051117-1)

Depends: perl-base (>= 5.6.0), passwd (>= 1:4.0.12), debconf | debconf-2.0

Recommends: ecryptfs-utils (>= 67-1)

Suggests: liblocale-gettext-perl, perl-modules

1.2 apt軟體包管理

1.2.1更新可用軟體包列表

APT軟體包管理工具使用一個檔案列出可獲得軟體包的映象站點地址,這個檔案就是/etc/apt/sources.list

檔案中的各項資訊通常按如下格式列出:

deb http://host/debian distribution section1 section2 section3

deb-src http://host/debian distribution section1 section2 section3

Ubuntu資訊格式跟debian一致,但是稱呼有區別

deb http://host/ubuntucodenamecomponent1 component2 component3

deb-src http://host/ubuntucodename component1 component2 component3

軟體包管理系統使用一個私有資料庫跟蹤列表中軟體包的當前狀態:已安裝、未安裝或可安裝。apt-get通過該資料庫來確定如何安裝使用者想用的軟體包以及正常執行該軟體包所必須的其它關聯包。

使用者使用apt-get update來更新資料庫列表。

這個命令將掃描 /etc/apt/sources.list檔案中所指路徑中的軟體包列表檔案。

使用者也可以通過修改/etc/apt/sources.list檔案來更換軟體源,例如國內網易,搜狐都有官方的源映象

ubuntu13.04映象源如下所示:

deb http://mirrors.163.com/ubuntu/ raring main universe restricted multiverse

deb-src http://mirrors.163.com/ubuntu/ raring main universe restricted multiverse

1.2.2安裝軟體包

準備好了sources.list和最新版的的可用軟體包,你所需做的就是執行apt-get來安裝你渴望已久的軟體了

apt-get install nautilus

APT會掃描它的資料庫找到最新的版本的軟體包,並將它從sources.list中所指的地方下載到本地。如果該軟體包需要其它軟體包才能正常執行,APT會做關聯性檢查並自動安裝所關聯軟體包。如下所示:

$ apt-get install nautilus

     Reading Package Lists... Done

     Building Dependency Tree... Done

     The following extra packages will be installed:

       bonobo libmedusa0 libnautilus0

     The following NEW packages will be installed:

       bonobo libmedusa0 libnautilus0 nautilus

     0 packages upgraded, 4 newly installed, 0 to remove and 1 not upgraded.

     Need to get 8329kB of archives. After unpacking 17.2MB will be used.

     Do you want to continue? [Y/n]

Nautilus軟體包需要引用共享函式庫,因此APT會從映象源處下載相關共享函式庫,如果你在apt-get命令列中手動指定了這些共享函式庫的名稱, APT不會詢問你是否要繼續;它會自動認為你希望安裝所有這些軟體包。也就是說APT只會在安裝那些沒有在命令列中指定的軟體包時進行提示確認。

與apt-get 相關指令引數

-h

這個幫助資訊

-d

只下載,不安裝或解壓檔案

-f

即便完整性檢查失敗了仍然繼續

-s

不做什麼,只是按順序模擬

-y

對於所有問題都假定為Yes,不詢問

-u

顯示一系列已經將要更新的包

可以用一條命令安裝多個軟體包,包檔案從網路上下載到本地 /var/cache/apt/archives目錄,稍後再安裝。

可以用同樣的命令列刪除指定軟體包,只需在軟體包名稱後緊跟一個“-”,如下所示:

$ apt-get install nautilus gnome-panel-      

     Reading Package Lists... Done

     Building Dependency Tree... Done

     The following extra packages will be installed:

       bonobo libmedusa0 libnautilus0

     The following packages will be REMOVED:

       gnome-applets gnome-panel gnome-panel-data gnome-session

     The following NEW packages will be installed:

       bonobo libmedusa0 libnautilus0 nautilus

     0 packages upgraded, 4 newly installed, 4 to remove and 1  not upgraded.

     Need to get 8329kB of archives. After unpacking 2594kB will be used.

     Do you want to continue? [Y/n]

假如使用者不小心損壞了已安裝的軟體包而想修復它,或者僅僅想重新安裝軟體包中某些檔案的最新版本,這是可以做到的,你可以用如下的--reinstall選項:

$ apt-get --reinstall install gdm

     Reading Package Lists... Done

     Building Dependency Tree... Done

     0 packages upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 1  not upgraded.

     Need to get 0B/182kB of archives. After unpacking 0B will be used.

     Do you want to continue? [Y/n]

1.2.3移除軟體包

如果使用者不再使用某些軟體包,你可以用APT將其從系統中刪除。要刪除軟體包只需輸入:apt-get remove package。如下所示:

$ apt-get remove gnome-panel

     Reading Package Lists... Done

     Building Dependency Tree... Done

     The following packages will be REMOVED:

       gnome-applets gnome-panel gnome-panel-data gnome-session

     0 packages upgraded, 0 newly installed, 4 to remove and 1  not upgraded.

     Need to get 0B of archives. After unpacking 14.6MB will be freed.

     Do you want to continue? [Y/n]

由上例可知,APT會關注那些與被刪除的軟體包有依賴關係的軟體包。使用APT刪除一個軟體包將會連帶刪除那些與該軟體包有依賴關係的軟體包。

上例中執行apt-get會刪除指定軟體包以及與之有依賴關係的軟體包,但它們的配置檔案,如果有的話,會完好無損地保留在系統裡。如果想徹底刪除這些包及其配置檔案,執行:

$ apt-get --purge remove gnome-panel

     Reading Package Lists... Done

     Building Dependency Tree... Done

     The following packages will be REMOVED:

       gnome-applets* gnome-panel* gnome-panel-data* gnome-session*

     0 packages upgraded, 0 newly installed, 4 to remove and 1  not upgraded.

     Need to get 0B of archives. After unpacking 14.6MB will be freed.

     Do you want to continue? [Y/n]

注意:軟體包名字後面的*表示該軟體包所有的配置檔案也將被刪除。

就象install時一樣,你可以在remove命令中用一個符號來指定安裝某個軟體包。在刪除軟體包時,如果你在軟體包名字後面緊跟一個“+”,那麼該軟體包就會被安裝而不是刪除。

$ apt-get --purge remove gnome-panel nautilus+

     Reading Package Lists... Done

     Building Dependency Tree... Done

     The following extra packages will be installed:

       bonobo libmedusa0 libnautilus0 nautilus

     The following packages will be REMOVED:

       gnome-applets* gnome-panel* gnome-panel-data* gnome-session*

     The following NEW packages will be installed:

       bonobo libmedusa0 libnautilus0 nautilus

     0 packages upgraded, 4 newly installed, 4 to remove and 1  not upgraded.

     Need to get 8329kB of archives. After unpacking 2594kB will be used.

     Do you want to continue? [Y/n]

注意,apt-get列出了那些將要被安裝的額外軟體包(即保證該軟體包正常執行的其它軟體包)和將要被刪除關聯軟體包,然後,再次列出了將要被安裝的軟體包(包括了額外的包)。

1.2.4更新軟體包

軟體包更新是APT最成功的特點。只需一條命令即可完成更新:apt-get upgrade。使用者可以使用這條命令從相同版本號的釋出版中更新軟體包,也可以從新版本號的釋出版中更新軟體包,儘管實現後一種更新的推薦命令為apt-get dist-upgrade

在執行該命令時加上-u選項很有用。這個選項讓APT顯示完整的可更新軟體包列表。不加這個選項,你就只能盲目地更新。APT會下載每個軟體包的最新更新版本,然後以合理的次序安裝它們。注意在執行該命令前應先執行 apt-get update更新資料庫。請看下面的例子:

$ apt-get -u upgrade

     Reading Package Lists... Done

     Building Dependency Tree... Done

     The following packages have been kept back

       cpp gcc lilo

     The following packages will be upgraded

       adduser ae apt autoconf debhelper dpkg-dev esound esound-common ftp indent

       ipchains isapnptools libaudiofile-dev libaudiofile0 libesd0 libesd0-dev

       libgtk1.2 libgtk1.2-dev liblockfile1 libnewt0 liborbit-dev liborbit0

       libstdc++2.10-glibc2.2 libtiff3g libtiff3g-dev modconf orbit procps psmisc

     29 packages upgraded, 0 newly installed, 0 to remove and 3 not upgraded.

     Need to get 5055B/5055kB of archives. After unpacking 1161kB will be used.

     Do you want to continue? [Y/n]

整個更新過程非常簡單。注意在本例中頭幾行,apt-get報告有些軟體包的更新被kept back,這表明這些軟體包的更新版本因故無法安裝,可能的原因有關聯不同步(當前沒有供下載的新版本關聯包)或關聯擴充套件(需要安裝新的關聯包以配合新版軟體包)。

對於第一種原因沒有很好的解決方法,對於第二次原因,執行apt-get intall安裝所需的新關聯包就可以。另一個更好的解決方法就是使用dist-upgrade。

1.2.5清除無用軟體包檔案

使用者需要安裝某個軟體包時,APT從/etc/apt/sources.list中所列的主機下載所需的檔案,將它們儲存到本機軟體庫/var/cache/apt/archives/中,然後開始安裝

本地軟體庫會不斷膨脹佔用大量硬碟空間,幸運的是,APT提供了工具來管理本地軟體庫:apt-get的clean方法和autoclean方法。

apt-getclean將刪除/var/cache/apt/archives目錄和

/var/cache/apt/archives/partial目錄下鎖檔案以外的所有檔案。這樣當用戶需要再次安裝某個軟體包時,APT將重新下載deb。

apt-getautoclean僅刪除那些不需要再次下載的檔案。

下面這個例子顯示了apt-get autoclean如何工作:

$ ls /var/cache/apt/archives/logrotate* /var/cache/apt/archives/gpm*

     logrotate_3.5.9-7_i386.deb

     logrotate_3.5.9-8_i386.deb

     gpm_1.19.6-11_i386.deb

在/var/cache/apt/archives目錄下有兩個不同版本的logrotate 軟體包檔案以及一個gpm軟體包檔案。

$ apt-show-versions -p logrotate

     logrotate/stable uptodate 3.5.9-8

$ apt-show-versions -p gpm

     gpm/stable upgradeable from 1.19.6-11 to 1.19.6-12

其中apt-show-versions顯示logrotate_3.5.9-8_i386.deb提供了logrotate的升級版本,所以logrotate_3.5.9-7_i386.deb沒用了,同樣 gpm_1.19.6-11_i386.deb也沒有用了,因為可以下載該軟體包的更新版本。

$ apt-get autoclean

     Reading Package Lists... Done

     Building Dependency Tree... Done

     Del gpm 1.19.6-11 [145kB]

     Del logrotate 3.5.9-7 [26.5kB]

1.2.6設定apt優先順序preferences

當用戶有這樣一個需求,在使用apt的時候優先使用某個版本的軟體包,或者優先使用某個特定軟體源,那麼可以設定首選發行版,還可以對軟體包版本或者對特定軟體源進行優先順序設定,那麼只需編輯/etc/apt/preferences檔案就可以了

設定首選發行版在/etc/apt/apt.conf裡面新增屬性

APT::Default-Release "version";

Version對於debian來說是stable、unstable、test;對於ubuntu來說是raring 等,然後系統會優先下載使用首選發行版的軟體包。

Apt優先順序設定在檔案/etc/apt/preferences:

     Package: <package>

     Pin: <pin definition>

     Pin-Priority: <pin's priority>

其中每個條目都要以空白行與其它條目分割開。例如,對sylpheed 軟體包做了某些修改以使用“reply-to-list”功能,其版本為0.4.99。我想保留這些修改不被更新,可加上:

     Package: sylpheed

     Pin: version 0.4.99*

注意這裡用了一個*(星號)。這是一個“萬用字元”標識所有以0.4.99打頭的版本都暫停跟新,以防它們被下載並安裝到系統上。Pin控制的是伺服器端的更新軟體包而非本地的已安裝軟體包。因為Debian使用“Debian版本號”那麼* 可以阻止0.4.99-1版或0.4.99-10版軟體包被安裝。

Pin的優先順序幫助使用者檢查一個與“Packages:”和“Pin:”相符合的軟體包是否應該被安裝。當優先順序比較高時,符合的軟體包將會被安裝。

下面是apt-preference不同級別的含義

P >=1000

安裝後永遠不會被apt替換,即使之前安裝過高版本的包也會被這個優先順序的軟體包所替換。

990 <= P < 1000

軟體包只會被最新的版本替換,不會被首選發行版的高版本軟體包替換

500 <= P < 990

軟體包只會被最新的版本和首選發行版的高版本軟體包替換

100 <= P < 500

任何發行版的高版本軟體包都可以替換,但是相對低版本而言仍使用當前版本

0 < P < 100

任何發行版的高版本軟體包都可以替換,只有沒有其他版本軟體包可以安裝時才使用

P < 0

優先順序為負,阻止這個軟體被安裝

在設定優先順序中使用者還可以修改Pin release 屬性來得到想要的軟體

release選項依賴於APT倉庫上的或者系統CD中的Release檔案。如果使用者使用的 APT倉庫並沒有提供這個檔案,就沒通過APT倉庫引數

在/var/lib/apt/lists/中看到Release檔案的內容:

$ cat /var/lib/apt/lists/ftp.debian.org.br_debian_dists_potato_main_binary-i386_Release

ftp.debian.org.br_debian_dists_potato_main_binary-i386_Release

 Archive: stable

     Version: 2.2r3

     Component: main

     Origin: Debian

     Label: Debian

     Architecture: i386

release的引數對應關係是:

a = archive存檔

c = component部件

v = version版本

o = origin起源

l = label標籤

n = codename代號(這個引數在ubuntu的release檔案中,13.04版本為raring)

舉例修改Pin的引數

     Package: *

     Pin: release v=2.2*,a=stable,c=main,o=Debian,l=Debian

     Pin-Priority: 1001

在這個例子中,我們選擇了Debian版本2.2*(可以為2.2r2、2.2r3——這些版本中通常包含了對安全問題的修復和其它重要更新),stable倉庫,元件main (相應的還有contrib或者non-free)區段、起源和標籤都是 Debian。origin(o=)定義了誰製作了這個Release檔案,label(l=)定義了發行版的名字。

使用者可以通過修改這些引數來確定,優先使用那些軟體源,linuxmint中就是把mint自己軟體源的優先順序設定的比ubuntu要高,從而達到系統更新的是mint軟體包的目的。

1.2.7apt相關查詢工具

APT的查詢方面,使用者可以使用APT提供的相關工具進行查詢。

apt-cache search package

用來搜尋想要查詢的軟體包。

apt-cache show package

用來出這個軟體包的詳細資訊及其用途的完整描述如果你的系統中已安裝了某個軟體包而系統又搜尋到它的新版本,系統會將它們的詳細資訊一併列出。

apt-cache showpkpackage

用來獲取某個軟體包的常規資訊

apt-cache dependspackage

可以查詢到軟體包的依賴關係

apt-cache showsrc package

檢視軟體原始碼包全部資訊

apt-show-versions

可以告訴你係統中哪些包可以更新

apt-file search filename

可以通過輸入程式的檔名或者包中包含的某些檔案的來查詢軟體包的名稱,而且還會列出包含該檔案的已刪除軟體包

apt-file list package

可以列出軟體包的內容

apt-file update

完成軟體包資訊資料庫更新,apt-file用一個數據庫來存放所有軟體包的內容資訊,和auto-apt 一樣,這個資料庫也需要實時更新。

當然在每個軟體包被安裝以後,都會在文件目錄(/usr/share/doc/packagename) 生成一個changelog.Debian.gz的檔案,使用者可以通過檢視這個檔案來了解該軟體

包最後一次更新對系統做了哪些修改,有一個工具能完成這項任務,apt-listchanges。

首先使用者需要裝上apt-listchanges軟體包。安裝了apt-listchanges後,每當apt下載軟體包之後(不論來源是Internet、光碟或是硬碟)都會顯示這些軟體包的系統更新資訊。

1.2.8apt原始碼包操作

在自由軟體的世界裡,經常需要學習原始碼或為程式除錯,所以使用者需要下載這些原始碼包,

APT提供了一套簡便的方法幫你獲得釋出版中眾多程式的原始碼以及建立一個.debs所需的所有檔案。

完成這些工作,首先修改/etc/apt/sources.list檔案中deb-src所指引用映象源如1.2.1中所示,deb-src是提供原始碼包的下載的站點地址。

然後用下面的命令下載原始碼包:

$ apt-get source packagename

通常會下載三個檔案:一個.orig.tar.gz、一個.dsc和一個.diff.gz檔案

apt-getdownload指令則用來下載deb包,但是並不安裝。

dpkg-source通過.dsc檔案中的資訊,將原始碼包解包到 packagename-version目錄,下載下來的原始碼包中有一個debian/目錄,裡面是建立.deb包所需的檔案。

想要下載的原始碼包自動編譯成軟體包,只需在命令列中加上-b,如下:

$ apt-get -b source packagename

如果使用者不打算在下載後就立刻建立.deb檔案,可以在之後用下面的命令建立:

$ dpkg-buildpackage -rfakeroot -uc -b

上述命令應當在下載後為軟體包建立的目錄中執行。要安裝用這種方式構建好的軟體包,只能直接使用軟體包管理器,例如:

$ dpkg -i file.deb

apt-get的source命令與它的其它命令有所不同,普通使用者就可以執行source命令。檔案被下載到使用者呼叫apt-source package命令時所處的目錄中。

通常,編譯原始碼包時要用到某些標頭檔案和共享庫,所有的原始碼包的控制檔案中都有一個域“Build-Depends:”,域中指出了編譯該原始碼包需要哪些附加包。

APT提供了一個簡單的方法下載這些附加包,你只需執行apt-get build-dep package,其中“package”就是你打算編譯的原始碼包名稱。見下例:

$ apt-get build-dep gmc

     Reading Package Lists... Done

     Building Dependency Tree... Done

     The following NEW packages will be installed:

       comerr-dev e2fslibs-dev gdk-imlib-dev imlib-progs libgnome-dev libgnorba-dev

       libgpmg1-dev

     0 packages upgraded, 7 newly installed, 0 to remove and 1  not upgraded.

     Need to get 1069kB of archives. After unpacking 3514kB will be used.

     Do you want to continue? [Y/n]

注意:這些將要被安裝的包是用於正確編譯gmc的。注意這個命令不能用來搜尋某個軟體的原始碼包。


2.apt軟體源工具

2.1軟體倉庫的結構

APT的型別軟體倉庫都會有一個特定的結構,這個結構是根據apt包管理工具的原理而定製的,倉庫中目錄結構包含dist、pool兩個檔案目錄:

dists用來儲存軟體包的相關資訊,原始碼包的相關資訊

pool  按照字母順序儲存所有的deb包檔案以及原始碼包檔案

具體的目錄結構在reprepro配置屬性,建立倉庫時介紹。

2.2 apt-mirror工具建立本地源映象

如果使用者不想是使用官方的軟體源(官方源在國外,速度較慢),除了可以把source.list中地址更換為國內源映象,例如:網易,搜狐等,還可以自己在本地,或者本地的伺服器上下載,配置官方源,從而提高使用效率。

2.2.1 apt-mirror工具

apt-mirror工具能夠將官方映象下載到本地,並保證目錄結構與其一致,但是不能對映象倉庫進行修改。如果想要下載並修改映象倉庫,需要使用reprepro工具,將在下一章節介紹。

首先安裝apt-mirror工具

sudo apt-get install apt-mirror

下載安裝apt-mirror完成後,修改/etc/apt/mirror.list配置檔案,修改內容如下:

############# config ##################

#

# set base_path    /var/spool/apt-mirror

#

# set mirror_path  $base_path/mirror

# set skel_path    $base_path/skel

# set var_path     $base_path/var

# set cleanscript $var_path/clean.sh

# set defaultarch  <running host architecture>

# set postmirror_script $var_path/postmirror.sh

# set run_postmirror 0

set nthreads     20

set _tilde 0

#

############# end config ##############

deb http://packages.linuxmint.com olivia main upstream import 

deb http://archive.ubuntu.com/ubuntu raring main restricted universe multiverse

deb http://archive.ubuntu.com/ubuntu raring-updates main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ raring-security main restricted universe multiverse

deb http://archive.canonical.com/ubuntu/ raring partner

deb-src http://packages.linuxmint.com olivia main upstream import 

deb-src http://archive.ubuntu.com/ubuntu raring main restricted universe multiverse

deb-src http://archive.ubuntu.com/ubuntu raring-updates main restricted universe multiverse

deb-src http://security.ubuntu.com/ubuntu/ raring-security main restricted universe multiverse

deb-src http://archive.canonical.com/ubuntu/ raring partner

Config中的是下載映象時的配置資訊,基本按預設的就可以,後面新增使用者想要下載的官方源地址資訊。其中預設下載的事與使用者作業系統一致的32 或64位軟體包,但是可以指定在deb 的後面新增i386就指定下載32位, amd64就指定下載64位。

修改完成後執行命令sudo apt-mirror。該命令會啟動20個執行緒去下面的源地址下載,命令執行完成後,/var/spool/apt-mirror目錄下就有了所有需要的deb包、原始碼包和相應的apt配置檔案。

當需要跟官方同步更新的時候,再次執行apt-mirror,就可以更新下載。

2.2.2 本地源映象的網路服務

使用apt-mirror完成官方源下載後,需要提供網路服務才能使用,由於apache2伺服器服務於靜態檔案時非常高效穩定,因此選擇apache2伺服器。

sudo apt-get install apache2

apache2伺服器安裝後,預設使用/var/www/目錄作為Web的根目錄,cd進入/var/www/目錄後,執行以下命令:

ln /var/spool/apt-mirror/mirror/xxxxxx -s

建立一個軟連結,將下載的源映象連結到apache2的www目錄下,使用者可以根據下載的源映象的不同,建立多個軟連結。

之後啟動apache2伺服器,對應的相關apache2 的指令如下

sudo apache2ctl start/restart/stop/status

該命令可以管理apache2伺服器,使用sudo apache2ctl start啟動後,就可以提供軟體源服務了。

2.3 reprepro工具建立本地軟體倉庫

2.3.1 reprepro的軟體倉庫目錄結構

與apt-mirror不同,reprepro工具是用來建立使用者本地的apt軟體倉庫的一款工具,可以用來儲存.deb .udeb .dsc等。由於管理包和校驗和檔案儲存在一個libdb4.3資料庫(或者libdb4.4 libdb3,根據reprepro編譯),所以reprepro不需要資料庫伺服器。

在使用reprepro建立軟體倉庫之前,先介紹一下reprepro建立的apt倉庫的目錄結構。以Cos軟體源定製手冊匯中的用於構建基礎系統的Cos3為例:

URL地址後面的第一級目錄為軟體倉庫的根目錄(名稱可自定),這裡的4個倉庫分別為canonical、mint、security、ubuntu。如下圖所示:

以ubuntu為例:Ubuntu目錄下有4個目錄,conf、db、dists、pool如下圖所示:

conf為repepro倉庫的配置檔案(正式釋出的源需要將檔案隱藏),其中包含distributions和options兩個配置檔案,其中distributions用於配置整個軟體倉庫的目錄結構屬性,options是操作功能上的配置檔案。

db目錄是配置好reprepro屬性後自動生成的倉庫的配置檔案。(釋出時需要隱藏)。

dists目錄中是倉庫的索引目錄,根據distributions的配置屬性自動生成。一級目錄raring和raring-updates是配置屬性中的codename(倉庫的代號)。

Raring中包含的檔案主要是4個目錄,main、multiverse、restricted、universe是配置屬性中components(元件)。

main:完全的自由軟體。

restricted:不完全的自由軟體。

universe:ubuntu官方不提供支援與補丁,全靠社群支援。

muitiverse:非自由軟體,完全不提供支援和補丁。

Release檔案是儲存每一個components中全部Packages、Source、Release檔案的MD5校驗和的檔案,用於保證資料完整性,Release.gpg是Release的簽名檔案。具體的安全機制在第三部分介紹。

以components中的main為例,裡面有2個目錄,binary-i386和source都是配置屬性中的Architectures,binary-i386是存32位軟體包資訊的目錄,source是儲存軟體包原始碼資訊的目錄。

在binary-i386目錄中包含的Packages是儲存deb包資訊的檔案,Packages.gz是apt-get update更新時下載使用的打包檔案。

Packages包含deb的資訊如下所示:

Pool目錄中是實際儲存deb包和原始碼包檔案的目錄,根據components分類,然後按照字母順排序

2.3.2 reprepro建立本地軟體倉庫

1)安裝reprepro建立倉庫工具

sudo apt-get install reprepro

2)建立Cos軟體倉庫

首先建立Cos的根目錄:/var/spool/apt-mirror/mirror/cos

然後建立Cos根目錄下reprepro倉庫所在的目錄:

/var/spool/apt-mirror/mirror/cos/ubuntu,這個倉庫用於儲存ubuntu的重新構建軟體。

在ubuntu/目錄下建立conf目錄/var/spool/apt-mirror/mirror/cos/ubuntu/conf

在conf目錄下分別建立2個配置檔案distributions和options,

ubuntu/conf/distributions和options

Distributions配置資訊如下:

Origin: Cos   #來源

Label: Cos    #標籤

Suite: raring   #套件

Version: 1.0    #版本

Codename: raring    #倉庫的代號

Architectures: i386 source   #倉庫的結構(32位,64位,原始碼)

Components: main restricted universe multiverse   #倉庫儲存軟體的元件分類

Description: Cos 1.0 Ubuntu Raring 13.04       #描述說明

SignWith: <key-id>

Origin: Cos

Label: Cos

Suite: raring-updates

Version: 1.0

Codename: raring-updates  #倉庫的代號

Architectures: i386 source

Components: main restricted universe multiverse

Description: Cos 1.0 Ubuntu Raring Updates 13.04

SignWith:<key-id>

在這裡的屬性與之前1.2.6中介紹的release檔案中的屬性含義是一樣的,這裡配置的屬性會在倉庫生成之後release檔案中體現出來,軟體源優先順序設定的各個屬性就是直接與這個配置資訊相關,所以這個配置檔案不能出錯。

在distributions中配了兩個軟體倉庫的資訊,分別是raring和raring-updates它們同屬於ubuntu的目錄之下,但是卻是兩個相互獨立的倉庫,在進行新增刪除等操作時,注意:Codename倉庫代號,要確認名稱是raring還是raring-updates再進行操作。

Reprepro的其他屬性配置:詳細見附錄reprepro文件

Options的位置資訊如下所示ubuntu/conf/options

verbose

ask-passphrase

basedir .(注意後面有空格和.)

配置資訊完成後,倉庫還沒有建成,需要分別給倉庫新增deb包,才能完成倉庫的初始化,具體新增方法後面介紹。完成初始化之後,倉庫的會自動生成相應的目錄結構。

2.3.3軟體倉庫的簽名

為了保證apt工具在資料傳輸中的完整性,需要對軟體包進行簽名。具體安全機制在第三部分debian的安全機制中介紹。

1)生成簽名所需的金鑰

sudo apt-get install gnupg-agent

gpg --gen-key

後面會對這個key的位數和使用期限進行一個設定,debian官方使用的key的有效期是一年,一年後會更換key從而安全性。

然後配置過程中需要輸入一個使用者名稱,以及一個密碼,這個密碼後面在簽名是需要用到。

金鑰生成後,記錄生成的公鑰的ID,keyid簽名時需要用到。

當這個key生成之後也可以更換、新增、刪除key的使用使用者。

gpg --list-keys

列出系統的全部gpg的key。

gpg --export -a 6A9E1B52 > key.pub

將key-id 為6A9E1B52的公鑰匯出到key.pub檔案中,釋出者需要將這個檔案提供下載渠道供使用者使用。

sudo apt-key add key.pub

使用者需要將這個公鑰key.pub下載新增到系統的keyring中,才能下載使用這個軟體倉庫中的檔案。

2)給deb軟體包簽名

安裝簽名工具gpg金鑰工具和dpkg-sig簽名工具

sudo apt-get install dpkg-sig

給軟體包簽名指令如下:

dpkg-sig -k keyid --sign builder /your_packages_<version>_<architecture>.deb

Keyid為之前生成的公鑰ID, --sign builder後面為deb全路徑和deb包

此時還需要輸入之前生成公鑰時的密碼,-p引數讓軟體包批量簽名,只需要輸入一次密碼。

2.3.4reprepro軟體倉庫管理

1)新增deb到倉庫中

reprepro –Vb . –C components–p priority includedeb codename /home/download/*.deb

說明:Codename是指倉庫代號名稱例如:raring  raring-updates olivia等

- v

verbose

輸出更多的執行狀態

-b

basedir

新增倉庫根目錄所在地

/var/spool/apt-mirror/mirror/cos/ubuntu

如果是當前目錄就:b空格.空格

-C

component

倉庫中的分類main restricted universe multiverse等

-A

architecture

軟體倉庫結構 i386 source

-p

priority

軟體包的優先順序 required 在1.1.1中有詳細介紹

更多的reprepro的指令和引數詳細見附錄reprepro文件

2)新增dsc到倉庫中

reprepro –vb . –C main includedsc olivia /*.dsc

操作會自動新增dsc檔案和與其相關的原始碼包檔案。

3)從倉庫中刪除軟體

reprepro -vb . remove raring adduser

此處不用新增版本號,只需要包名,也可以

4)查詢倉庫的軟體資訊

reprepro -vb . list raring adduser

這樣本地的倉庫就完成了,可以進行新增,刪除和查詢。

2.4 reprepro工具建立官方源映象

Reprepro工具功能全面,還可以用來下載配置官方映象源,並且在此基礎上通過reprepro命令對映象進行修改。這樣使用者就可以在使用官方映象源的同時,新增一些自己定製的軟體到倉庫裡面一起使用。

以ubuntu的raring的軟體倉庫為例:軟體倉庫的conf目錄下的distributions檔案。

/conf/distributions

Origin: Ubuntu

Label: Ubuntu

Suite: raring

Version: 13.04

Codename: raring

Architectures: i386 source

Components: main restricted universe multiverse

Description: Ubuntu Raring 13.04

Contents: .gz

Update: - ubuntu-raring

Log: /var/spool/cos_repos/cos4/ubuntu/log/raring.log

SignWith: 4AB24B30

這裡主要是配置了Update屬性,這個屬性會關聯到conf中的更新配置檔案updates ,log屬性是為了記錄使用者對源倉庫進行了那些修改。

/conf/updates

Name: ubuntu-raring

Method: http://archive.ubuntu.com/ubuntu

Components: main multiverse restricted universe

Suite: raring

Architectures: i386 source

VerifyRelease: 3B4FE6ACC0B21F32

Name屬性要保證和distributions中的update一致才能關聯到。

Method屬性的是使用者下載的官方源的地址,需要詳細到dists和pool的上一級目錄ubuntu(後面不要加/)。

Components屬性是使用者選擇官方源中要下載的元件,並且需要distributions中的components屬性和Architecture屬性要與updates中保持一致。

Architecture屬性選擇要下載i386還是amd64,是否下載原始碼包source。

VerifyRelease是從官方得到的16位GPG 公鑰,(一般公鑰的id是8位)用來驗證release檔案完整性。如果缺少這個屬性就會提示:該軟體源沒有認證,使用者是否繼續下載。

獲取16位公鑰的方法如下所示:

首先下載Release.gpg和Release,然後

cd /tmp

wget http://archive.ubuntu.com/ubuntu/dists/raring/Release.gpg

wget http://archive.ubuntu.com/ubuntu/dists/raring/Release

然後通過release檔案得到公鑰id,8位,有時會得到兩個id

gpg Release.gpg #:

enter the name of data file:Release

然後去gpg的伺服器查詢16位的公鑰id,如果8位公鑰id已知並確定是其release檔案的簽名,則可以跳過之前兩步,直接進行查詢

gpg --keyserver subkeys.pgp.net --search-keys C0B21F32

查詢到這個key之後輸入“1”回車,會得到16位的公鑰id: 3B4FE6ACC0B21F32,

下面指令可以看到這個16位的公鑰資訊

gpg --with-colons --list-key

sub:-:2048:16:251BEFF479164387:2004-09-12::::::e:

pub:-:4096:1:3B4FE6ACC0B21F32:2012-05-11:::-:Ubuntu Archive Automatic Signing Key (2012) <[email protected]>::scSC:

這裡3B4FE6ACC0B21F32就是前面reprepro中配置updates檔案中的VerifyRelease屬性中的值。

如果使用者需要將這個key加入到apt keyring中,輸入

gpg --keyserver subkeys.pgp.net --recv 9AA38DCD55BE302B

gpg --export --armor 9AA38DCD55BE302B | apt-key add -

最後,所有的的配置檔案屬性配置完成後,在軟體倉庫的主目錄ubuntu執行:

reprepro -V update

Reprepro工具會把這個ubuntu raring的倉庫下載到本地,並且保留倉庫中原始的release檔案,使用者做任何reprepro的操作會被儲存到新的release檔案中。

如果官方庫有新的跟新,還可以執行這個指令來更新本地的映象源。通過讀取filelist進行比對,之前下載過的軟體包不會被重新下載,只有新的軟體包才會。但是之前對reprepro的所有修改都會被覆蓋。Release,Packages等檔案也會全部更新,所以需要更新要慎重。

如果使用者不再更新,希望使用自己的軟體包,就可以使用reprepro的新增、刪除等命令對倉庫進行修改,這種方法可以在自己的倉庫裡使用使用者自己編譯構建的包來替換官方的軟體包,替換的相關日誌則記錄在相應的log中。


3.1 Debian 安全構建過程

Debian 有一個由五名成員和兩位祕書組成的安全小組,來處理 stable 發行版的安全問題. 處理安全問題意味著他們要跟蹤記錄軟體出現的問題(檢視論壇譬如 bugtraq,或 vuln-dev) 並確定 stable版是否受其影響。一旦一個可能的問題被安全小組接受,將會被調查其是否對 stable 版造成影響,如果是,將會做一個基於原始碼的修復. 這修復有時包括上游製作的移植補丁(它通常比 Debian發行的要高几個版本)。修復通過測試後,將會準備新的軟體包,並在 security.Debian.org 站點上釋出,這樣就可以通過 apt 獲取。同時,將會在web站點上釋出Debian安全公告(DSA),並將其傳送給包括 

Debian 安全公告的內容一般包括:

l  問題軟體的版本號

l  問題型別

l  是會被遠端攻擊還是本地

l  軟體包的簡短描述

l  問題描述

l  攻擊描述

l  修復描述

軟體包是由安全小組完成上載的(並在完成上載後十五分鐘內附帶上載到

 security.debian.org:/org/security.debian.org/queue/unchecked 或 ftp://security.debian.org/pub/SecurityUploadQueue),完成後,它們將被加入自動構建清單(這不是每日的事務)。因此,軟體包可以自動在它們被上載後的三十分鐘貨一個小時內完成基於各個平臺的構建。然而,安全更新與平時的軟體維護者完成的上載稍有不同,在某些情況下,在公佈以前,需要等待進一步測試,得到測試報告,或者需要等待一個周,或者更久的時間,以避免與軟體的原始開發者修正這一錯誤發生衝突。

安全更新工作包括以下步驟:

·        有人發現了安全問題.

·        某個人修正該問題,並上載到 security.debian.org 的incoming 區 (某個人 通常是安全小組成員,但也可能是一個以前與安全小組有過聯絡的軟體維護者完成修正). 修改日誌包括根據目標版本 testing-security 或 stable-security.

·        提交由一個Debian 系統完成檢查和處理,然後將其轉移到 queue/accepted,並在 builds 上通告. 這些檔案可由安全小組和(間接的) builds 訪問.

·        Security-enabledbuilds 對原始碼包進行整理,打包,然後將日誌傳送給安全小組.

·        安全小組對日誌做出迴應,最新構建的軟體包將被上載到queue/unchecked,在這裡它們由 Debian系統統一處理,然後轉移到queue/accepted.

·        當安全小組發現原始碼包可以接受時(即,它可以在各種平臺正確的構建,並且修復了安全漏洞,而自身不會產生新的問題),他們將會執行一個指令碼來完成:

o   軟體包安裝到安全歸檔區

o   用通常的方式(dpkg-scanpackages, dpkg-scansources...)更新軟體包,原始碼並在 security.debian.org 上釋出檔案

o   設定安全小組完成的模板通告

o   將軟體包轉移到對應的proposed-updates,這樣就可以儘快的進入真正的歸檔區

3.2 在Debian倉庫進行包簽名

包簽名機制是Debian安全設施的重要一部分內容,可以防止有人惡意篡改映象源中的包,或者避免包在下載過程中遭到中間人攻擊。可以理解為如何安全地對Debian系統進行升級/更新。Debian自身並沒有提供簽名包,但自Debian 4.0 (codenameetch) 起,提供了一種機制來允許系統管理員測試通過上述計劃下載的軟體包的完整性,使用的工具為apt 0.6及以後版本。

當前Debian系統的包簽名檢測方案:

1)  使Release檔案儲存Packages.gz檔案的MD5校驗和(Packages.gz用於儲存各個軟體包的MD5校驗和),然後對Release檔案進行簽名,生成Release.gpg。簽名的來源要可靠。

2)  執行命令'apt-get update',簽過名的Release檔案被下載,與Packages.gz檔案儲存在一起。

3)  當用戶準備安裝一個Package時,首先會下載這個包,然後生成它的MD5校驗和。

4)  在確認release檔案簽名正確之後,從release檔案中提取Packages.gz檔案的MD5校驗和,再從Packages.gz檔案中提取需要下載的軟體包的MD5校驗和。

5)  如果下載的軟體包的MD5校驗和與Packages.gz檔案中的MD5校驗和是一致的,這個軟體才會被安裝,否則,這個軟體包也會被放到快取中並提出警告,由管理員決定是否安裝。如果這個軟體包根本不在Packages.gz檔案中,且管理員將系統配置為只安裝經過檢查的包,那麼它也不會被安裝。

通過以上MD5校驗和的檢查步驟,apt能夠驗證一個包是否來自於指定的發行