歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> Debian軟件包管理詳解

Debian軟件包管理詳解

日期:2017/3/6 15:30:16   编辑:關於Unix
一篇關於Debian/GNU軟件配置工具介紹的文章 主要工具 dselect --- 使用菜單界面的軟件包管理工具(最上層的包管理工具) dpkg --- 安裝軟件包(管理軟件包中的文件) apt-get --- 安裝軟件包(管理軟件包,CLI APT) tasksel --- 安裝任務套件(管理面向某方 一篇關於Debian/GNU軟件配置工具介紹的文章

 主要工具

  dselect --- 使用菜單界面的軟件包管理工具(最上層的包管理工具)

  dpkg --- 安裝軟件包(管理軟件包中的文件)

  apt-get --- 安裝軟件包(管理軟件包,CLI APT)

  tasksel --- 安裝任務套件(管理面向某方面任務的一套軟件包)

  aptitude --- 安裝軟件包(管理軟件包和任務套件,ncurses APT)

  deity --- 另一種ncurses APT

  synaptic, gsynaptic --- 另一種GUI APT

  它們不是同級的工具。`dselect'運行於APT(命令行命令是`apt-get')和`dpkg'之上。

  APT使用`/var/lib/apt/lists/*'來跟蹤可用的軟件包,而`dpkg'使用的是`/var/lib/dpkg/available'。如果直接用`apt-get'或同類工具如`aptitude'等來安裝軟件包,千萬別忘了更新`/var/lib/dpkg/available'文件,可以使用dselect的`[U]pdate'選項或在運行`dselect

  update'、`tasksel'或`dpkg -l'前執行shell命令行“`dselect update'”。

  在理關聯軟件包的方式上,`apt-get'會自動搜索下載_depends_類軟件包,但不會理睬_recommends_和_suggests_類軟件包,而`dselect'在軟件包的選擇方面采用菜單方式操作,對_depends_、_recommends_和_suggests_三類相關軟件包均給出提示。`aptitude'則提供了選項下載安裝所有_depends_、_recommends_和_suggests_類軟件包。

  方便的工具

  apt-cache - 在本地緩沖區檢查包文件

  dpkg-reconfigure - 重新配置已安裝的軟件包(如果它是使用debconf進行配置的)

  dpkg-source - 管理源碼包

  dpkg-buildpackage - 自動生成包文件

  ...

  Debian軟件包管理基礎

  地安裝軟件包稱之為_task_,還可以使用軟件包管理工具逐個地安裝軟件包或升級系統。

  使用`tasksel'或`aptitude'進行_task_安裝

  `tasksel'是_Debian的任務安裝器_,系統安裝過程中它為用戶提供了一種`簡易'軟件包選擇方式。

  如果你希望完裝的某項常規功能包含了許多軟件包,最好的辦法就是使用它來安裝。運行如下命令:

  # dselect update

  # tasksel

  `aptitude'亦可訪問_task_。用它不僅可以選擇_tasks_還可以對_task_選項菜單中的軟件包進行逐個取捨。

  設置APT系統

  使用`testing'發布版的用戶,有時需要對系統進行有選擇性地升級

  首先,在`/etc/apt/sources.list'中添加`stable'、`testing'和`unstable'鏡像源,接著編輯`/etc/apt/preferences',設置合適的Pin-Priority。

  [1]

  Package: *

  Pin: release a=stable

  Pin-Priority: 500

  Package: *

  Pin: release a=testing

  Pin-Priority: 600

  Package: *

  Pin: release a=unstable

  Pin-Priority: 50

  [1] I kept the description around here as is to maintain consistency with

  other parts. If you are really tracking `testing' or `unstable', you

  should actually remove references to `stable' in

  `/etc/apt/sources.list' and `/etc/apt/preferences'. This is because

  `testing' starts as a copy of `stable'.

  用 dselect代替apt:

  `dselect'會自動選上所有“Required”、“Important”和“Standard”類軟件包,在Potato系統中,某些大型應用程序如TeX和Emacs處於這些分類中,在初次安裝系統時最好手工取消對它們的選擇(輸入“_”)。在Woody穩定版中,這些大型應用程序被移入“Optional”類軟件包。

  `dselect'的用戶界面有點怪。有4個相似命令(注意是大寫字母!):

  Key-stroke Action

  Q 退出。確認當前的選擇然後退出。

  (override dependencies)

  R 恢復!我放棄我做出的選擇

  D 不管它!我不管dselect有什麼建議,照我說的做!

  U 照系統的建議做

  使用`D'和`Q'可以選擇有沖突的選項,你要自負風險,所以使用這些命令要小心。當前`dselect'是一款成熟的菜單驅動式工具,在對_suggests_和_recommends_類軟件包的選擇控制方面,它提供相當棒的微操作能力。

  在`/etc/dpkg/dselect.cfg'中加上一行包含“expert”選項以減少干擾。對於速度慢的機器,請在其它速度快的機器上運行`dselect'選好軟件包,然後用`apt-get

  install'安裝它們。

  對於沒有定義Pin-Priority的軟件包,`dselect'不會訪問它們。

  使用 aptitude程序:

  `aptitude'是一款新的菜單驅動式軟件包安裝工具,與`dselect'很相似。它亦可作為命令行工具`apt-get'的替代品。

  `aptitude'可接受單字符命令,通常是小寫字母。

  Key-stroke Action

  F10 菜單

  ? 鍵盤命令幫助

  u 更新軟件包信息

  g 下載並安裝選定的軟件包

  q 保存修改並退出當前屏幕

  x 放棄修改並退出當前屏幕

  Enter 浏覽某軟件包的相關信息

  `aptitude'提供了選項可自動選取所有_depends_、_recommends_和_suggests_類軟件包。可在`F10

  -> Options -> Dependency handling'菜單中設置它。

  通過`aptitude'可訪問某軟件包的所有版本。

  apt-cache和apt-get命令

  還是以上面使用`testing'發布版的用戶為例,可使用下列命令管理系統:

  * `apt-get -u upgrade'

  跟蹤`testing'發布版的更新情況,對系統上所有軟件包進行升級並從`testing'處安裝關聯軟件包。

  * `apt-get -u dist-upgrade'

  跟蹤`testing'發布版的更新情況,對系統上所有軟件包進行升級並從`testing'處重新分析關聯關系並安裝關聯包。

  * `apt-get -u dselect-upgrade'

  跟蹤`testing'發布版的更新情況,對系統上所有在`dselect'中選定了的軟件包進行升級。

  * `apt-get -u install '

  從`testing'處安裝及其關聯包。

  * `apt-get -u install /unstable'

  從`unstable'處安裝並從`testing'處安裝關聯包。

  * `apt-get -u install -t unstable '

  從`unstable'處安裝及其關聯包。注意須設置`unstable'的Pin-Priority為990。

  * `apt-cache policy '

  檢查軟件包的狀態。

  * `apt-cache show | less'

  查看軟件包的有關信息。

  * `apt-get install '

  安裝軟件包的特定版本<2.2.4-1>。

  * `apt-get -u install '

  安裝軟件包並刪除軟件包。

  * `apt-get remove '

  刪除軟件包,但保留其配置文件。

  * `apt-get remove --purge '

  刪除軟件包及其配置文件。

  在上面的例子中用`-u'選項的作用是在實際升級之前將所有將要升級的軟件包列出,並提示用戶確認。下面的操作可將`-u'設置為默認行為:

  $ cat >> /etc/apt/apt.conf << .

  // Always show packages to be upgraded (-u)

  APT::Get::Show-Upgraded "true";

  .

  使用`-s'可進行模擬升級,並不進行真正的升級行為。

  跟蹤某Debian發行版

  根據個人的喜好,選擇要跟蹤的Debian發行版

  `設置APT系統'的樣例文件`/etc/apt/preferences':

  track stable: 將testing的Pin-Priority改為50

  track testing: 保持上面的設置不變

  track testing(unstable): 將unstable的Pin-Priority改為500

  track unstable(testing): 將unstable的Pin-Priority改為800

  有關如何選定Pin-Priority的說明:在上表中,從上而下代表了某個版本

  從上個版本剛剛發布之後到下一版進入凍結期之前這段時間經歷的各個階段。

  請注意,跟蹤`testing'發行版的Debian有一個負面影響,安全補丁的更新很慢。

  請注意,如果將Debian各版本混合,例如將`testing'混入`stable'或將`unstable'混入`stable',這會造成眾多關鍵軟件包不自覺地從`testing'處或`unstable'處獲得,結果引起許多麻煩。

  如何對`/etc/apt/preferences'進行設置,將某些關鍵包鎖定在成熟版本,而讓其它非關鍵包跟蹤不太成熟的新版本,可參考樣例目錄

  (http://www.debian.org/doc/manuals/debian-reference/examples/)中的`preferences.testing'和`preferences.unstable'文件。另一方面,`preferences.stable'強制所有軟件包降級到“stable”。

  將所有軟件包降級到`stable'

  要將所有軟件包降級到`stable',可按下面的方法編輯`/etc/apt/preferences':

  Package: *

  Pin: release a=stable

  Pin-Priority: 1001

  然後運行“`apt-get upgrade'”,由於Pin-priority >

  1000而引起強制降級。注意,該操作可能會在關聯性方面發生一點問題。

  /etc/apt/preferences概述

  `設置APT系統'中展示的`/etc/apt/preferences'樣例文件裡,首行`Package:

  *'表示該段落指令作用於所有軟件包。可以通過指定軟件包名稱來為某個特定的軟件包設置指定的Pin-Priority。

  接下來的一行是`Pin: release a=stable'表示`apt-get'從包含`Archive:

  stable'節的`Release'文件所在的目錄獲得`Packages.gz'文件。

  最後一行`Pin-Priority: 500'指定Pin-Priority為500。

  如果多個軟件包同名,系統通常會安裝擁有最高Pin-Priority的軟件包。

  在此,Pin-Priority表示:

  * 1001及以上:可降級優先級。

  Pin-Priority處於該范圍的軟件包允許降級操作。

  * 100到1000:標准優先級。

  不允許降級。幾個key Pin-Priority的值:

  * 990:由`--target-release'或apt-get(8)`-t'選項設置的優先級。

  * 500:所有默認軟件包文件的優先級。

  * 100:當前安裝軟件包文件的優先級。

  * 0到99:非自動優先級。(僅用於軟件包沒有安裝或沒有別的可用版本時。)

  * 小於0:決不選擇該版本。

  按下面的方法設置`/etc/apt/apt.conf'可獲得與`--target-release'一樣的效果:

  # echo 'APT:efault-Release "testing";' >> /etc/apt/apt.conf

  命令行選項`--target-release'和`/etc/apt/apt.conf'中的設置會頂替`/etc/apt/preferences'的設置。在玩`/etc/apt/preferences'的時候小心兩者沖突。

  檢測程序錯誤尋求幫助

  如你使用某個軟件包出現問題,在尋求幫助或發送錯誤報告之前請確認查看過下列站點(`lynx'、`links'和`w3m'同樣好用):

  $ lynx http://bugs.debian.org/

  $ lynx http://bugs.debian.org/ # 如果你知道軟件包名稱

  $ lynx http://bugs.debian.org/ # 如果你知道錯誤序號

  如有疑問,可閱讀幫助文件。設置`CDPATH'如下:

  export CDPATH=.:/usr/local:/usr/share/doc

  然後輸入

  $ cd $ pager README.Debian # if this exists

  $ mc

  APT升級錯誤及解決方法

  從`unstable'/`testing'進行升級時可能出現第 5.3 節,

  `升級Debian系統'中提到的軟件包關聯問題。多數情況下,是因為升級的軟件包所需的新增的關聯包沒有安裝。可使用如下方法解決:

  # apt-get dist-upgrade

  如果這招無效,可以重復下面的方法至到問題解決:

  # apt-get upgrade -f # continue upgrade even after error

  ... 或

  # apt-get dist-upgrade -f # continue dist-upgrade even after error

  一些的確存在問題的升級腳本會引起持續出錯。最好的解決方法是檢查該軟件包的安裝腳本`/var/lib/dpkg/info/packagename.<>'然後運行:

  # dpkg --configure -a # 配置所有未完成安裝的軟件包

  如果腳本報告缺少配置文件,查看一下`/etc'中相關的配置文件。如果配置文件有`.new'擴展名(或其它類似的擴展名),去掉(`mv')它的擴展名。

  從unstable/testing進行升級時可能出現軟件包關聯問題。可用這個方法智取:

  # apt-get install -f # 重載壞關聯

  使用dpkg救助

  如果系統的`dselect'(APT)受損無法完成安裝,可使用`dpkg'來恢復:

  # cd /var/cache/apt/archives

  # dpkg -i libc6* libdb2* perl*

  # dpkg -i apt* dpkg* debconf*

  # dpkg -i * # 直至不再出錯

  如果軟件包丟失,用下述方法從鏡像源

  (http://www.debian.org/mirror/)下載:

  # mc # use "FTP link" pointing to Debian FTP server

  現在,在HTTP/FTP服務器上,軟件包的真正位置不再是傳統的`/dist'目錄而是新的`/pool'目錄。

  然後開始安裝:

  # dpkg -i /var/cache/apt/archives/

  對於壞關聯,可這樣解決:

  # dpkg --ignore-depends=,... -i # dpkg --force-depends -i # dpkg--force-depends --purge # dpkg --force-confmiss -i # Install missingconffile

  恢復軟件包選擇狀態的數據

  如果`/var/lib/dpkg/status'因為某種原因壞掉了,Debian系統將會完全丟失軟件包選擇狀態的數據。趕快到`/var/lib/dpkg/status-old'或`/var/backups/dpkg.status.*'下找找舊的`/var/lib/dpkg/status'文件。

  將`/var/backups/'放在其它的分區是個好習慣,因為該目錄包含了許多非常重要的系統數據。

  如果舊的`/var/lib/dpkg/status'文件也壞了,仍可以從`/usr/share/doc/'下的目錄進行恢復這些信息。

  # ls /usr/share/doc |

  grep -v [A-Z] |

  grep -v '^texmf$' |

  grep -v '^debian$' |

  awk '{print " install"}' |

  dpkg --set-selections

  # dselect --expert # reinstall system, de-select as needed

  /var被刪除後如何恢復系統

  `/var'目錄包含著定時更新的數據如mail,它們很容易遭破壞。將目錄放到別的分區可降低風險,如果最壞的事情發生了,可以通過重建`/var'目錄來挽救Debian系統。

  從相同或舊版本的最簡Debian系統中取得`/var'目錄的內容框架,例如var.tar.gz

  (http://people.debian.org/~osamu/pub...膔oot目錄,接著

  # cd /

  # mv var var-old # 如果剩有有用內容

  # tar xvzf var.tar.gz # 使用Woody框架文件

  # aptitude # 或用dselect

  上述步驟可使系統恢復工作。

  `恢復軟件包選擇狀態的數據'中描述的技術加速軟件包選擇數據的恢復。

  ([FIXME]:該過程需要更多的實踐來檢驗)

  為無法啟動的系統安裝軟件包

  使用Debian急救軟盤/CD或從多啟動Linux系統其它分區啟動。

  `啟動系統'.

  將無法啟動的系統掛載到`/target'並使用`dpkg'的chroot安裝模式。

  # dpkg --root /target -i

  接下來就可以著手配置並解決問題。

  如是只是由於`lilo'損壞而造系統無法啟動,可使用標准Debian急救盤啟動。假設你的root分區位於`/dev/hda12'且想使用runlevel

  3,在啟動提示符輸入:

  boot: rescue root=/dev/ 3

  這樣,你就可以使用軟盤中內核啟動系統,新系統的功能基本齊全。(可能丟失某些內核特性或模塊)

  如果dpkg命令出錯該怎麼辦

  如果`dpkg'損壞就不能安裝任何`.deb'文件。下面的操作可幫助你修復這種狀況。(在第一行,你可將“links”替換成你喜歡的浏覽器。)

  $ links http:///debian/pool/main/d/dpkg/

  ... 下載完好的dpkg__.deb

  $ su

  password: *****

  # ar x dpkg__.deb

  # mv data.tar.gz /data.tar.gz

  # cd /

  # tar xzfv data.tar.gz

  對`i386',亦可用`http://packages.debian.org/dpkg'作為URL。

  文件信息

  查找特定文件所屬的軟件包:

  $ dpkg pattern # search for pattern in installed packages

  $ wget http://ftp.us.debian.org/debian/dists//

  $ zgrep -e pattern

  # find filename-pattern of files in the debian archive

  或使用專門的軟件包命令:

  # apt-get install dlocate

  # conflicts with slocate (secure version of locate)

  $ dlocate # fast alternative to dpkg -L and dpkg -S

  ...

  # apt-get install auto-apt # on-demand package installation tool

  # auto-apt update # create db file for auto-apt

  $ auto-apt search # search for pattern in all packages, installed or not

  軟件包信息

  搜索並顯示包文件的信息。編輯`/etc/apt/sources.list',讓APT指向正確的包文件。如果想了解testing/unstable中的相應軟件包與當前系統安裝的軟件包有何差別,使用`apt-cache

  policy'---更好。

  # apt-get check # 更新緩沖區並檢查損壞的軟件包

  $ apt-cache search # 按文本描述搜索軟件包

  $ apt-cache policy # 軟件包的priority/dists信息

  $ apt-cache show -a # 顯示所有dists中軟件包描述信息

  $ apt-cache showsrc # 顯示相應源碼包的信息

  $ apt-cache showpkg # 軟件包調試信息

  # dpkg --audit|-C # 搜索未完成安裝的軟件包

  $ dpkg ... # 已安裝軟件包描述

  $ dpkg -l ... # 已安裝軟件包的狀態(每個占一行)

  $ dpkg -L ... # 列出軟件包安裝的文件的名稱

  如果是Woody發布版沒有為`apt-cache showsrc'建檔,但該命令可用

  你也這可這樣查看軟件包信息(我用`mc'浏覽):

  /var/lib/apt/lists/*

  /var/lib/dpkg/available

  比較下面的文件可以確切了解最近的安裝過程對系統造成了那些改變。

  /var/lib/dpkg/status

  /var/backups/dpkg.status*

  使用APT進行全自動系統安裝

  進行全自動安裝,要在`/etc/apt/apt.conf'中加上一行:

  Dpkg::Options

  另一種等階的方法是運行`apt-get -q -y

  '。這種方法可能產生嚴重的負作用,所以使用起來要小心。參閱apt.conf(5)和dpkg(1)。

  安裝完畢以後重新配置已安裝軟件包'中的方法配置特定的軟件包。

  重新配置已安裝軟件包

  使用下列方法重新配置已安裝軟件包。

  # dpkg-reconfigure --priority= [...]

  # dpkg-reconfigure --all # 重新配置所有的軟件包

  # dpkg-reconfigure locales # 生成別的locales

  # dpkg-reconfigure --p= xserver-xfree86 # 重新配置X服務器

  如果你想永久改變`debconf'對話框模式,可這麼做。

  某些程序用於生成特殊的配置腳本。

  apt-setup - 創建/etc/apt/sources.list

  install-mbr - 安裝主引導(Master Boot Record)管理器

  tzconfig - 設定本地時間

  gpmconfig - 設置gpm鼠標daemon

  sambaconfig - 在Potato中配置Samba(Woody使用debconf來配置)

  eximconfig - 配置Exim (MTA)

  texconfig - 配置teTeX

  apacheconfig - 配置Apache (httpd)

  cvsconfig - 配置CVS

  sndconfig - 配置聲音系統

  ...

  update-alternatives - 設定默認啟動命令,例如設定vi啟動vim

  update-rc.d - System-V init腳本管理工具

  update-menus - Debian菜單系統

  ...

  刪除軟件包

  刪除軟件包但保留其配置文件:

  # apt-get remove ...

  # dpkg --remove ...

  刪除軟件包並刪除配置文件:

  # apt-get remove --purge ...

  # dpkg --purge ...

  阻止舊軟件包升級

  舉個例子,要阻止`libc6'和`libc6-dev'通過`dselect'或使用`apt-get -u

  upgrade '命令升級,可執行:

  # echo -e "libc6 holdlibc6-dev hold" | dpkg --set-selections

  這種方法不影響`apt-get -u install '命令操作。要阻止`apt-get

  -u upgrade '或`apt-get -u

  dist-upgrade'命令對軟件包執行的強制自動降級行為,可在`/etc/apt/preferences'中加上:

  Package: libc6

  Pin: release a=stable

  Pin-Priority: 2000

  這裡“`Package:'”後不能使用通配符如“`libc6*'”,如果要保持所有與`glibc'源碼包相關的二進制包的版本同步,可以明確的列出它們。

  該命令可以顯示處於“阻止”狀態的軟件包:

  dpkg --get-selections "*"|grep -e "hold$"

  stable/testing/unstable混合系統

  `apt-show-versions'可以列出發行版中可用軟件包的版本。

  $ apt-show-versions | fgrep /testing | wc

  ... 你有多少testing軟件包

  $ apt-show-versions -u

  ... 列出可升級的軟件包

  $ apt-get install `apt-show-versions -u -b | fgrep /unstable`

  ... 將所有unstable軟件包升級到最新版本

  刪除緩存包文件

  使用APT安裝軟件包會在`/var/cache/apt/archives'目錄留下緩存文件,要清除這些文件可使用:

  # apt-get autoclean # removes only useless package files

  # apt-get clean # removes all cached package files

  記錄/拷貝系統配置

  對軟件包選擇情況進行本地備份:

  $ dpkg --get-selections "*" > # or use *

  `“*”'使`'包含那些被指定“完全刪除(purge)”的文件。

  你可將這個文件發送到另一台電腦並在那兒按文件中的選擇進行軟件包安裝。

  # dselect update

  # dpkg --set-selections <

  # apt-get -u dselect-upgrade # dselect install

  stable系統引入軟件包

  對stable系統進行部分升級,在軟件運行環境中重新編譯源碼的確是個誘人的想法,這樣可以避免由於關聯關系不得不對大量軟件包升級。首先,將下列鏡像源加入

  /etc/apt/sources.list:(以下是美國的Debian源)

  deb-src http://http.us.debian.org/debian testing

  main contrib non-free

  deb-src http://non-us.debian.org/debian-non-US testing/non-US

  main contrib non-free

  deb-src http://http.us.debian.org/debian unstable

  main contrib non-free

  deb-src http://non-us.debian.org/debian-non-US unstable/non-US

  main contrib non-free

  由於屏幕輸出的限制,上述每條`deb-src'命令均分成了2行,實際上在`sources.list'中它們均為單行。

  然後下載源碼並在本地生成軟件包:

  $ apt-get source $ dpkg-source -x $ cd ... 查找需要的軟件包(編譯所需的關聯包列在.dsc文件中)並安裝它們,

  你還需要“fakerroot”軟件包。

  $ dpkg-buildpackage -rfakeroot

  ...or (no sig)

  $ dpkg-buildpackage -rfakeroot -us -uc # use "debsign" later if needed

  ...Then to install

  $ su -c "dpkg -i "

  通常,需要安裝一些帶“-dev”後綴的軟件包以滿足關聯關系。`debsign'在`devscripts'軟件包中。`auto-apt'可以輕松解決這些關聯問題。請使用`fakeroot',如是沒有必要,就別使用root帳號。

  在Woody中,這些關聯問題已被簡化。例如,編譯`pine'源碼包:

  # apt-get build-dep pine

  # apt-get source -b pine

  完結:以上全部方法同樣可用於ubuntu

 作者: LiEn

  來源: www.linuxsir.org

Copyright © Linux教程網 All Rights Reserved