[ 上一頁 ] [ 目錄 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 下一頁 ]


APT HOWTO (Obsolete Documentation)
第 3 章 - 套裝軟體管理


3.1 更新可用套裝軟體列表

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

你可以使用apt-get update來更新資料庫列表。這個命令將掃瞄 /etc/apt/sources.list檔案中所指路徑中的套裝軟體列表檔案。有關該列 表檔案的更多資訊請參考/etc/apt/sources.list檔案, 第 2.1 節

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


3.2 安裝套裝軟體

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

      # apt-get install xchat

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]

參考移除套裝軟體, 第 3.3 節一節以獲得更多的關於刪除套裝軟體的資訊。

假如你不小心損壞了已安裝的套裝軟體而想修復它,或是只有只有想重新安裝套裝軟體中某 些檔案的最新版本,這是可以做到的,你可以用如下的--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]

3.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列出了那些將要被安裝的額外套裝軟體(即保證該軟體 包正常執行的其它套裝軟體)和將要被刪除關聯套裝軟體,然後,再次列出了將要被安 裝的套裝軟體(包括了額外的包)。


3.4 更新套裝軟體

套裝軟體更新是APT最成功的特點。只需一條命令即可完成更新: apt-get upgrade。你可以使用這條命令從相同版本號的發佈版中更新 套裝軟體,也可以從新版本號的發佈版中更新套裝軟體,盡管實作後一種更新的推薦 命令為apt-get dist-upgrade;詳情請參考升級到新版本, 第 3.5 節

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

      # 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,而你購買了revision 3的 新版Debian,你可以使用APT從新光碟上升級你的系統。使用apt-cdrom(參考將CD-ROM加入source.list檔案, 第 2.4 節)將光碟加載到/etc/apt/sources.list中,然後執行apt-get dist-upgrade

請注意,APT總是搜索最新版本的套裝軟體,因此,如果一個套裝軟體在你的 /etc/apt/sources.list中所列的版本比光碟上所列的版本要新,那麼 APT會下載其中的套裝軟體而不是使用光碟上的套裝軟體。

更新套裝軟體, 第 3.4 節節的例子中,我們看到有些包被kept back了,現 在我們就用dist-upgrade方法來解決這個問題:

      # 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仍被 kept back,可能還存在一些比建立新關聯更棘手的問題,我們通過如下 方法確定問題所在:

      # 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-getclean方法和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只有刪除那些過時的檔案。參考 如何從Debian的專用版本下升級套裝軟體, 第 3.9 節以了解apt-show-versions的更多詳情。


3.7 在dselect中操作APT

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

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

想深入學習dselect的使用方式,請到Debian网站查閱dselect文件頁面http://www.debian.org/doc/ddp.

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

      # apt-get -u dselect-upgrade

如下例所示:

      # 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時的情形:

      # 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 如何保持一個混合系統

人們有時會對這種情況有興趣──使用一個版本的Debain作為其主發行版,但從另一 個分支上安裝一個或多個包。

要設定你的Debian主版本,應當修改/etc/apt/apt.conf檔案,並加 入:

      APT::Default-Release "version";

其中version是你希望作為主發行版使用的Debian版本。你可以使用的 版本有stabletestingunstable。 要從另外一個版本中安裝套裝軟體,你必須按照如下方式執行APT:

      # apt-get -t distribution install package

為了使其可以個工作,在你的/etc/apt/sources.list中至少有一行 是關於你要使用的那個版本的,而且要使用的套裝軟體也必須存在於該版本中。

你也可以要求使用某個特定把本的套裝軟體,如下所示:

      # apt-get install package=version

例如,下面的命令將會安裝2.2.4-1版的nautilus軟 件包:

      # apt-get install nautilus=2.2.4-1

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

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


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

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

      # apt-get install `apt-show-versions -u -b | grep unstable | cut -d ' ' -f 1`

3.10 如何維護已安裝套裝軟體的多個版本(複雜) How to keep specific versions of packages installed (complex)

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

操作起來十分簡單,你只需編輯/etc/apt/preferences檔案。 /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_preferences(7),其中有關於優先等級的詳細討論,但通過 一些簡單的例子也可以了解基本的概念。下面就說明了在上面的sylpheed例子中設 定優先等級網域的效果。

1001

Sylpheed 0.4.99永遠不會被apt取代。如果可能,apt甚至會用0.4.99版取代已經 安裝的更高的版本呢。只有那些優先等級比1000大的套裝軟體才會降級。

1000

除了不會將高版本降級以外,與1001的效果相同。

990

版本0.4.99只會被偏好發佈系列中高版本的的套裝軟體取代,偏好發行版由變數 “APT::Default-Release”定義(參考如何保持一個混合系統, 第 3.8 節

500

任何發佈系列中比0.4.99版本高的sylpheed都會被安裝,但相對於低版本而言,仍然 建議使用0.4.99。

100

任何發佈系列中高版本的sylpheed都會被安裝;因此只有沒有其它版本可以安裝時 才會安裝0.4.99。已安裝包的優先等級。

-1

負的優先等級也是允許的,它會組織0.4.99版被安裝。

釘子也可以用來指定套裝軟體的versionreleaseorigin

我們已經看到,釘在一個version上,可以使用具體的版本號,也可以使 用萬用字元一次指定多個版本。

release選項依賴於APT倉庫上的或是CD中的Release檔案。如果你使用的 APT倉庫並沒有提供這個檔案,這個選項就沒有任何用處了。你可以在 /var/lib/apt/lists/中看到Release檔案的內容。release的參數是: a(存檔)、c(部件)、v(版本)、o(起來源) 和l(標籤)。

例如:

      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=)定義了發行版的 名字:Debian自己就使用Debian而Progeny則使用Progeny。Release檔案的例子如下 所示:

      $ 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

[ 上一頁 ] [ 目錄 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 下一頁 ]


APT HOWTO (Obsolete Documentation)

1.8.10.4 - 2005年3月

Gustavo Noronha Silva kov@debian.org

劉浩 iamlyoo@163.com