Debian APT HOWTO 第三章 軟體包管理(轉)

post0發表於2007-08-11
Debian APT HOWTO 第三章 軟體包管理(轉)[@more@]

APT HOWTO

第三章 軟體包管理

3.1 更新可用軟體包列表

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

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

你可以使用apt-get update來更新資料庫列表。這個命令將掃描/etc/apt/sources.list檔案中所指路徑中的軟體包列表檔案。有關該列表檔案的更多資訊請查閱 第二章 /etc/apt/source.list檔案。

定時執行這個程式是個好主意,它將使你和你的系統獲得最新的軟體包更新和安全更新等資訊。

3.2 安裝軟體包

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

現在,終於到了你一直期待的階段!準備好了sources.list和最新版的的可用軟體包,你所需做的就是執行apt-get來安裝你渴望已久的軟體了。例如,你可以這樣:

apt-get install xchat

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

[root]@[/] # 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 This help text.

-d Download only - do NOT install or unpack archives

-f Attempt to continue if the integrity check fails

-s No-act. Perform ordering simulation

-y Assume Yes to all queries and do not prompt

-u Show a list of upgraded packages as well

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

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

[root]@[/] # 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]

有關刪除軟體包的更多詳細資訊,參閱 3.3 移除軟體包。

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

[root]@[/] # 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]

本文件寫作時所參考的APT版本為0.5.3,這個版本還屬於“unstable”(sid)階段。如是你安裝了這個版本,你可以在系統配置中使用新增的功能:你可以用apt-get install package/distribution來安裝指定釋出版中的軟體包,或者用apt-get install package=version,如下所示:

apt-get install nautilus/unstable

它將為你安裝“unstable”釋出版中的nautilus軟體包,即使你當前執行的是“stable”版本。命令中“distribution”選項的可用引數值為:stable,testing,unstable。

在處理關聯問題時,你可能更樂意使用-t開關來選擇目標釋出版,讓apt-get幫你考慮使用哪個釋出版。

重要資訊:最新版的Debian軟體包首先會上傳到“unstable”釋出版中,這個釋出版包含了軟體包所有更改階段,無論是小修小補還是影響到眾多軟體包乃至整個系統的重大修改。所以,新手和那些強調系統穩定性的使用者不會使用這個釋出版。

“testing”釋出版比起“unstable”釋出版,多注重了些系統穩定性,但正式執行的系統應當使用“stable”釋出版。

3.3 移除軟體包

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

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

[root]@[/] # 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會刪除指定軟體包以及與之有依賴關係的軟體包,但它們的配置檔案,如果有的話,會完好無損地保留在系統裡。如果想徹底刪除這些包及其配置檔案,執行:

[root]@[/] # 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]

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

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

[root]@[/] # 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列出了那些將要被安裝的關聯軟體包(即保證該軟體包正常執行的其它軟體包)和將要被刪除關聯軟體包,然後,再次列出了將要被安裝的軟體包。

3.4 更新軟體包

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

軟體包更新是APT最成功的特點。只需一條命令即可完成更新:apt-get upgrade。你可以使用這條命令從相同版本號的釋出版中更新軟體包,也可以從新版本號的釋出版中更新軟體包,儘管實現後一種更新的首選命令為apt-get dist-upgrade;實情參閱 3.5升級到新版本。

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

[root]@[/] # 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。詳情參閱 3.5升級到新版本。

3.5 升級到新版本

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

APT的絕活就是讓你一次就完成整個系統的更新,不論是透過Internet還是透過光碟檔案(購買的碟片或下載的ISO映象檔案)。

它也可以用來更新尋些改變了關聯關係的軟體包。即如前所述的那些使用apt-get upgrade時被阻止更新(kept back)的軟體包。

例如,假設你目前使用的Debian為stable revision 0(如woody 3.0 r0,譯者注),而你購買了revision 3的新版Debian(如woody 3.0 r3,譯者注),你可以使用APT從新光碟上升級你的系統。使用apt-cdrom(參閱 2.4將CD-ROM加入source.list檔案)將光碟載入到/etc/apt/sources.list中,然後執行apt-get dist-upgrade。

請注意,APT總是搜尋最新版本的軟體包,因此,如果一個軟體包在你的/etc/apt/sources.list中所列的版本比光碟上所列的版本要新,那麼APT會按照sources.list檔案所指的地址下載這個軟體包而不是使用光碟上的軟體包。

在 3.4更新軟體包 中我們舉了個例子,我們看到有些包被阻止更新(kept back),現在我們就用dist-upgrade方法來解決這個問題:

[root]@[/] # apt-get -u dist-upgrade

Reading Package Lists... Done

Building Dependency Tree... Done

Calculating Upgrade... Done

The following NEW packages will be installed:

cpp-2.95 cron exim gcc-2.95 libident libopenldap-runtime libopenldap1

libpcre2 logrotate mailx

The following packages have been kept back

lilo

The following packages will be upgraded

adduser ae apt autoconf cpp debhelper dpkg-dev esound esound-common ftp gcc

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

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

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

Do you want to continue? [Y/n]

注意現在那些軟體包將會被更新,那些新的關聯軟體包也會被安裝。但是lilo仍被阻止更新,可能還存在一些比建立新關聯更棘手的問題,我們透過如下方法確定問題所在:

[root]@[/] # apt-get -u install lilo

Reading Package Lists... Done

Building Dependency Tree... Done

The following extra packages will be installed:

cron debconf exim libident libopenldap-runtime libopenldap1 libpcre2

logrotate mailx

The following packages will be REMOVED:

debconf-tiny

The following NEW packages will be installed:

cron debconf exim libident libopenldap-runtime libopenldap1 libpcre2

logrotate mailx

The following packages will be upgraded

lilo

1 packages upgraded, 9 newly installed, 1 to remove and 31 not upgraded.

Need to get 225kB/1179kB of archives. After unpacking 2659kB will be used.

Do you want to continue? [Y/n]

檢視上述提示資訊可知,lilo與debconf-tiny包產生了一個新衝突,這表明除非刪除debconf-tiny,否則將無法更新lilo。

想知道該保留或刪除哪些軟體包,你可以使用:

# apt-get -o Debug::pkgProblemResolver=yes dist-upgrade

Reading Package Lists... Done

Building Dependency Tree... Done

Calculating Upgrade... Starting

Starting 2

Investigating python1.5

Package python1.5 has broken dep on python1.5-base

Considering python1.5-base 0 as a solution to python1.5 0

Holding Back python1.5 rather than change python1.5-base

Investigating python1.5-dev

Package python1.5-dev has broken dep on python1.5

Considering python1.5 0 as a solution to python1.5-dev 0

Holding Back python1.5-dev rather than change python1.5

Try to Re-Instate python1.5-dev

Done

Done

The following packages have been kept back

gs python1.5-dev

0 packages upgraded, 0 newly installed, 0 to remove and 2 not upgraded.

現在,你很容易就知道不能安裝python1.5-dev軟體包是因為無法滿足另一個軟體包python1.5的關聯要求。

3.6 移除無用軟體包檔案:apt-get clean and autoclean

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

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

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

apt-get clean將刪除/var/cache/apt/archives目錄和/var/cache/apt/archives/partial目錄下的所有檔案,除了被鎖定的檔案。這樣以來,當你需要再次安裝某個軟體包時,APT將重新下載它。

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

下面這個例子顯示了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]

總之,apt-get autoclean僅刪除那些過時的檔案。參閱 3.9如何從Debian的專用版本下升級軟體包 獲得更多apt-show-versions相關資訊。

3.7 在dselect中操作APT

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

dselect工具幫助使用者選取想要安裝的Debian軟體包。它有點複雜甚至令人望而生厭,但經過實踐你就能掌握它恐怖的終端介面。

dselect高階功能之一就是它知道利用Debian軟體包的“推薦”和“建議”能力。(Debian軟體包有一種能力:推薦或建議系統在安裝自己的同時,安裝別的軟體包以配合自身的工作,當然這些推薦的軟體包不一定是必須的;而dselect工具可以識別和利用這個能力,使用dselect時你就能體會到。譯者注)以root身份執行dselect,進入程式後選擇apt作為連線方式(access)。該步驟不是必須的,但如果你沒有光碟機而且想透過Internet下載安裝軟體包,這是使用dselect的最好方法。

想深入學習dselect的用法,請到Debian網站查閱dselect文件頁面

在dselect中選好了軟體包後,執行:

apt-get -u dselect-upgrade

如下例所示:

[root]@[/] # apt-get -u dselect-upgrade

Reading Package Lists... Done

Building Dependency Tree... Done

The following packages will be REMOVED:

lbxproxy

The following NEW packages will be installed:

bonobo console-tools-libs cpp-3.0 enscript expat fingerd gcc-3.0

gcc-3.0-base icepref klogd libdigest-md5-perl libfnlib0 libft-perl

libgc5-dev libgcc300 libhtml-clean-perl libltdl0-dev libsasl-modules

libstdc++3.0 metamail nethack proftpd-doc psfontmgr python-newt talk tidy

util-linux-locales vacation xbill xplanet-images

The following packages will be upgraded

debian-policy

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

Need to get 7140kB of archives. After unpacking 16.3MB will be used.

Do you want to continue? [Y/n]

比較一下我們在相同系統上執行apt-get dist-upgrade時的情形:

[root]@[/] # apt-get -u dist-upgrade

Reading Package Lists... Done

Building Dependency Tree... Done

Calculating Upgrade... Done

The following packages will be upgraded

debian-policy

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

Need to get 421kB of archives. After unpacking 25.6kB will be freed.

Do you want to continue? [Y/n]

我們看到在前例中許多軟體包被安裝是其它軟體包“推薦”或“建議”的結果。另外一些軟體包被安裝或刪除(例如lbxproxy軟體包)是我們透過dselect工具作出的決定。由此可見dselect與APT結合起來將是一個功能強大的工具。

3.8 如何構建一個混合系統

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

人們常使用testing釋出版,因為它比unstable要穩定同時又比stable時髦。然而對於那些想執行某些軟體包的最新版本,又不希望將整個系統遷移到unstable釋出版的還有一種選擇:執行一個testing/unstable混合系統。對另一部分保守的使用者而言,他們可能希望執行stable/testing混合系統。

要實現混合系統,請在/etc/apt/apt.conf中加入下面的語句:

APT::Default-Release "testing";

以後,在從unstable釋出版安裝軟體包時,使用-t開關:

# apt-get -t unstable install packagename

別忘了,使用Debian的某個釋出版的軟體包時,要將映象源加入到/etc/apt/sources.list檔案中。在這個例子中,除了加入testing釋出版映象源處,我們還需要加入unstable釋出版映象源。

3.9 如何從Debian的專用版本下升級軟體包

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

apt-show-versions提供了一個安全的途徑,讓那些使用混合系統的使用者放心升級他們的系統,不必擔心升級會將原來屬於stable的包升級成了unstable包。例如,這條命令將只升級你的unstable軟體包:

# apt-get install `apt-show-versions -u -b | grep unstable`

3.10 如何維護已安裝軟體包的多個版本(複雜)

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

你可能會遇到這種情況,更改了某個軟體包中的一些檔案,但你沒有時間或根本就不想將這些更改引入到新版本中。或者,你將系統升級到3.0,但仍想繼續使用Debian 2.2下的某個軟體包。你可以“釘住”(pin)這個版本,這樣它就不會被更新了。

操作起來十分簡單,你只需編輯/etc/apt/preferences檔案。

檔案格式很簡單:

Package:

Pin:

Priority:

例如,我對sylpheed軟體包做了某些修改,其版本為0.4.99,我想保留這些修改不被更新,可加上:

Package: sylpheed

Pin: version 0.4.99*

注意我用了一個 *(星號)。這是一個“萬用字元”;它表明我希望“釘住”所有以0.4.99打頭的版本(以防它們被下載並安裝到我機器上。pin控制的是伺服器端的更新軟體包而非本地的已安裝軟體包。譯者注)。因為Debian使用“Debian版本號”為其軟體包定版本,我不想進行所有這些版本的升級,如果不用萬用字元,那麼0.4.99-1版或0.4.99-10版只要一出爐系統就會安裝它們。如果你修改了軟體包,你一定不希望這麼做。

Priority是可選域;如果沒有特別指定,它的預設值為989。

讓我們來看看pin如何體現優先順序(priorty)區別。一個低於0的優先順序表示:該軟體包被禁止安裝;優先順序在0到100之間表示:軟體包沒有安裝並且當前也沒有可用版本,這些軟體包不會出現在供選擇版本列表中;優先順序為100表示軟體包已被安裝——對於這個已安裝的軟體包,如果有一個不同的版本要替換它,那麼替換者的優先順序必須大於100。

優先順序在100以上表示軟體包應該被安裝。典型的例子如,某個軟體包的升級補丁包,任何處於100和1000(包括1000)之間的優先順序都表示上述情形。但是,一個軟體包如果被定為這樣的優先順序,它並不會降級已安裝的版本。例如,如果我安裝了sylpheed 0.5.3併為sylpheed 0.4.99指定了一個優先順序為999的pin,那麼由於要滿足pin的優先順序,所以0.4.99軟體包不會被安裝。如果要實現軟體包“降級”,則需要將pin的優先順序定為大於1000。(1001000時,伺服器端軟體包不論比本機的軟體包新還是舊,均對本機相關軟體包進行更新。譯者注)

pin可以被用來控制軟體包的修訂版本(version)、釋出版本(release)或版本來源(origin)。

在前面我們已經看到,釘住修訂版本時使用萬用字元來代替版本號數字,這樣可一次指定多個版本。

release選項是基於釋出版檔案(Release file)的,這個檔案在本地APT軟體庫中或安裝光碟上。如果你從本地軟體庫安裝軟體包而軟體庫中又沒有該檔案,那麼這個選項將失效。來看看/var/lib/apt/lists/目錄中釋出版檔案的內容,釋出版包括這些引數:a(archive),c(components),v(version),o(origin),l(lable)。

來看一個例子:

Package: *

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

Priority: 1001

在本例中,我們選擇了version為2.2*的Debian(它可以是2.2r2,2.2r3——這些版本包含了“point releases”即安全更新和其它非常生要的更新),stable軟體庫,main類軟體包(非contrib或non-free),版本來源和標籤均為Debian。版本來源(o=)說明誰製作了這個釋出版檔案,標籤(l=)說明該釋出版的名稱:Debian即是指Debian自己,Progeny即是指後裔製作者,下面是一個釋出版檔案的樣例:

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

Archive: stable

Version: 2.2r3

Component: main

Origin: Debian

Label: Debian

Architecture: i386

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

APT HOWTO

1.8.2 - November 2002

Gustavo Noronha Silva kov@debian.org

中文翻譯:LYOO iamlyoo@163.com

2003/01/26

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-945913/,如需轉載,請註明出處,否則將追究法律責任。

相關文章