歡迎您光臨本站 註冊首頁

THE DEBIAN WAY: Debian維護工具之Dpkg

←手機掃碼閱讀     火星人 @ 2014-03-23 , reply:0

本文的對Debian GNU/Linux 的Dpkg工具做了較為詳細的描述, 希望Linux用戶對於Debian 有個較為深刻的了解.
1. 聲明

2. dpkg 概述

在其 manpage 中, 這樣描述:

dpkg - a medium-level package manager for Debian.

dpkg - Debian 的中級軟體包管理器.

dpkg 是 Debian 軟體包管理系統的中流砥柱, 負責安裝卸載軟體包, 配置, 以及維護已安裝的軟體包. 也是Debian系統中眾多軟體包管理工具的後端.

dpkg 通過資料庫來維護系統中軟體, 這包括文件清單, 依賴關係, 軟體狀態, 等等詳細的內容, 通常在/var/lib/dpkg目錄下. 並確保系統與資料庫的情況相一致.因此,dpkg在處理程序時非常健壯,和優秀.

dpkg 在處理軟體包時, 首先要判斷是否會引起系統的混亂, 當發現可能出現時, dpkg 將拒絕安裝此軟體, 而不是自作主張將軟體裝入系統, 然後把爛攤子扔給用戶了之.

dpkg是一個龐大的家族, 不僅提供了大量的參數選項, 同時也提供了許多子命令比如:

dpkg-deb

dpkg-divert

dpkg-query

dpkg-split

dpkg-statoverride

start-stop-daemon

...

本文檔不是 dpkg 的 manpage, 將不會對所有的參數和子命令加以介紹, 同時記住所有參數也是相當痛苦的事情, 在這裡只對常用參數和命令做示例性介紹.

dpkg 涵蓋了 dpkg 家族的大部分功能, 因此dpkg可以作為一個多合一(ALL-IN-ONE)的軟體使用,以更好的使用 dpkg 家族的全部功能.
3. deb軟體包命名規則:

Debian軟體包命名遵循下列約定: <軟體包名稱>_<版本>-<修訂號>_<平台>.deb

* 軟體包名稱(Package Name):
* 版本(Version Number):
* 修訂號(Build Number):
* 平台(Architecture):
o i386
o all: 平台無關. 即適用於所有平台.比如文本, 網頁, 圖片, 媒體, pdf 等.

例如

* nano_1.3.10-2_i386.deb
o 軟體包名稱: nano
o 版本: 1.3.10
o 修訂號: 2
o 平台: i386

4. 軟體包處理

(注:本文的中的操作以nano為例)

dpkg-deb : 用於處理本地Debian軟體包. 可以提取從.deb文件中提取軟體包信息和數據. 詳細信息,請參閱 dpkg-deb 的聯機手冊.

* 列出軟體包的內容:

tony@tony:~/doc/dpkg$ dpkg-deb -c nano_1.3.10-2_i386.deb |more
drwxr-xr-x root/root 0 2006-02-05 00:29:18 ./
drwxr-xr-x root/root 0 2006-02-05 00:29:07 ./etc/
-rw-r--r-- root/root 11887 2006-02-05 00:29:07 ./etc/nanorc
drwxr-xr-x root/root 0 2006-02-05 00:29:14 ./usr/
drwxr-xr-x root/root 0 2006-02-05 00:29:12 ./usr/share/
drwxr-xr-x root/root 0 2006-02-05 00:29:01 ./usr/share/doc/
drwxr-xr-x root/root 0 2006-02-05 00:29:15 ./usr/share/doc/nano/
-rw-r--r-- root/root 1847 2005-08-30 02:29:02 ./usr/share/doc/nano/AUTHORS
-rw-r--r-- root/root 2338 2005-03-20 05:33:13 ./usr/share/doc/nano/README
-rw-r--r-- root/root 3175 2005-11-21 17:36:11 ./usr/share/doc/nano/THANKS
-rw-r--r-- root/root 2206 2005-06-08 10:28:06 ./usr/share/doc/nano/TODO
-rw-r--r-- root/root 1066 2003-03-24 21:09:26 ./usr/share/doc/nano/UPGRADE
-rw-r--r-- root/root 35996 2005-11-22 05:45:07 ./usr/share/doc/nano/faq.html
... ...

* 查看軟體包的信息

tony@tony:~/doc/dpkg$ dpkg-deb -I nano_1.3.10-2_i386.deb
new debian package, version 2.0.
size 477372 bytes: control archive= 2656 bytes.
12 bytes, 1 lines conffiles
714 bytes, 18 lines control
3529 bytes, 51 lines md5sums
613 bytes, 21 lines * postinst #!/bin/sh
160 bytes, 5 lines * postrm #!/bin/sh
379 bytes, 20 lines * preinst #!/bin/sh
288 bytes, 14 lines * prerm #!/bin/sh
Package: nano
Version: 1.3.10-2
Section: editors
Priority: important
Architecture: i386
Depends: libc6 (>= 2.3.5-1), libncursesw5 (>= 5.4-5)
Suggests: spell
Conflicts: nano-tiny (<= 1.0.0-1), pico
Replaces: pico
Provides: editor
Installed-Size: 1108
Maintainer: Jordi Mallach
Description: free Pico clone with some new features
GNU nano is a free replacement for Pico, the default Pine editor. Pine is
copyrighted under a restrictive licence, that makes it unsuitable for
Debian's main section. GNU nano is an effort to provide a Pico-like
editor, but also includes some features that were missing in the original,
such as 'search and replace', 'goto line' or internationalization support.

* 重新構建軟體包

比如nano(1.3.10)需要滿足以下依賴關係:

$ dpkg-deb -f nano_1.3.10-2_i386.deb depends //depends 為對應查詢段

libc6 (>= 2.3.5-1), libncursesw5 (>= 5.4-5)

當系統不能滿足依賴關係, 比如不能滿足里來版本, 可以通過下邊的方法處理, 當然這種情況下安裝的nano並不一定運行正常, 這種方法可以應用於某些軟體的變通安裝.

$ mkdir nano //創建nano目錄

$ dpkg-deb -e ./nano_1.3.10-2_i386.deb ./nano/DEBIAN //解壓控制文件

$ dpkg-deb -x ./nano_1.3.10-2_i386.deb ./nano //解壓程序文件

$ vi ./nano/DEBIAN/control //修改控制信息

$ dpkg-deb -b nano nano_1.3.10-2_ill.deb //重新打包

5. 資料庫查詢

當前版本的 dpkg 使用文本文件來作為資料庫.通稱在 /var/lib/dpkg 目錄下. 通稱在 status 文件中存儲軟體狀態,和控制信息. 在 info/ 目錄下備份控制文件, 並在其下的 .list 文件中記錄安裝文件清單, 其下的 .mdasums 保存文件的 MD5 編碼.

體驗使用資料庫的時刻到了:

$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name Version Description
+++-===========-================-========================================
ii aalib1 1.4p5-28 ascii art library - transitional package
ii adduser 3.85 Add and remove users and groups
ii alien .63 install non-native packages with dpkg
... ...

每條記錄對應一個軟體包, 注意每條記錄的第一, 二, 三個字元. 這就是軟體包的狀態標識, 後邊依此是軟體包名稱, 版本號, 和簡單描述.

* 第一字元為期望值,它包括:
o u 狀態未知,這意味著軟體包未安裝,並且用戶也未發出安裝請求.
o i 用戶請求安裝軟體包.
o r 用戶請求卸載軟體包.
o p 用戶請求清除軟體包.
o h 用戶請求保持軟體包版本鎖定.
* 第二列,是軟體包的當前狀態.此列包括軟體包的六種狀態.
o n 軟體包未安裝.
o i 軟體包安裝並完成配置.
o c 軟體包以前安裝過,現在刪除了,但是它的配置文件還留在系統中.
o u 軟體包被解包,但還未配置.
o f 試圖配置軟體包,但是失敗了.
o h 軟體包安裝,但是但是沒有成功.
* 第三列標識錯誤狀態,可以總結為四種狀態. 第一種狀態標識沒有問題,為空. 其它三種符號則標識相應問題.
o h 軟體包被強制保持,因為有其它軟體包依賴需求,無法升級.
o r 軟體包被破壞,可能需要重新安裝才能正常使用(包括刪除).
o x 軟包件被破壞,並且被強制保持.

也可以以統配符模式進行模糊查詢, 比如我要查找以nano字元開始的所有軟體包:

$ dpkg -l nano*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name Version Description
+++-==============-==============-============================================
ii nano 1.3.10-2 free Pico clone with some new features
pn nano-tiny (no description available)
un nanoblogger (no description available)

以上狀態說明: 系統中安裝了 nano 版本為 1.3.10-2;安裝過 nano-tiny, 後來又清除了; 從未安裝過nanoblogger.

如果覺得 dpkg 的參數過多, 不利於記憶的話, 完全可以使用 dpkg-query 進行 dpkg 資料庫查詢.

應用範例:

* 查詢系統中屬於nano的文件:

$ dpkg --listfiles nano

or

$ dpkg-query -L nano

* 查看軟體nano的詳細信息:

$ dpkg -s nano

or

$ dpkg-query -s nano

* 查看系統中軟體包狀態, 支持模糊查詢:

$ dpkg -l

or

$dpkg-query -l

* 查看某個文件的歸屬包:

$ dpkg-query -S nano

or

$ dpkg -S nano

6. 安裝軟體包

運行下面的命令:

$dpkg -l nano
un nano (no description available)

當前 nano 的狀態說明在系統中從未安裝過 nano 軟體包, 可以通過以下命令安裝本地的 nano 包:

$dpkg-deb -e ./nano_1.3.10-2_i386.deb

當使用 dpkg 安裝軟體包時, 主要分為兩個階段: 首先解包; 然後運行postinst控制腳本(如果有的話),這就是所謂的配置階段. 當完成軟體包當解包后, dpkg 的--intall選項自動調用配置階段. 注意, 操作時應當指定 .deb 文件的實際路徑, 僅僅給出文件名無法找到對應文件.

這樣, 軟體的安裝就可被拆分為兩個對立的過程:

* dpkg --unpack
* dpkg --configure

解包

運行

#dpkg --unpack nano_1.3.10-2_i386.deb


然後

$ dpkg -l nano
iU nano 1.3.10-2 free Pico clone with some new features

說明此時系統中安裝了nano 包, 但是未經配置.

解包可能包括一下步驟:

* 將控制文件解壓到臨時目錄.
* 運行 preinst(如果有的話). 通常為停止相關服務.
* 解壓配置文件到 /etc 目錄, 並添加.dpkg-new 後綴, 以防止衝突.
* 解壓 data.tar.gz 到系統根目錄,(--root=dir).
* 將控制文件解壓到 /var/lib/dpkg/info 目錄並添加軟體名前綴. 對資料庫進行更新.
* 資料庫中將軟體包的狀態設置為"unpacked".

僅僅解包, 並不能確保軟體可以正常運行.

配置

#dpkg --configure nano

$ dpkg -l nano
ii nano 1.3.10-2 free Pico clone with some new features

如輸出所示, nano 已經正常安裝.

軟體解包后, 還需要對其進行調整, 比如根據實際情況對配置文件進行修改. 這一步通常是在安裝過程中自動進行的, 當然可以手動調用, 這次用到的是軟體名, 而不是deb文件名.

通過命令 dpkg -L nano 可以得以驗證

這一過程可能包括一下步驟:

* 詢問對配置文件的處理方法, 覆蓋當前版本, 還是不做處理.(當軟體升級時會碰到這種情況)
* 運行 postinst 腳本
* 將軟體包標記為 "installed"

如果想再次修改配置選項, 可以運行:

#dpkg-reconfigure nano

7. 軟體卸載

在Debian中卸載和清除軟體包是兩個不同的概念. 不同之處在於軟體包被刪除(卸載)后,它的配置文件仍會留在系統中,只有清除時才會刪除它們. 默認情況下, Debian 僅會做刪除操作, 除非你明確指出, 才會將配置文件刪除. 如果要清除軟體包, 則在清除前將會隱含地執行刪除操作.

要刪除一個軟體包,dpkg需要使用--remove選項將軟體包卸載.與安裝不同,刪除只需要軟體包名,而不是實際的deb文件名.

刪除

#dpkg -r nano

* 首先運行 prerm 腳本(如果有的話).
* 然後, 保留配置文件, 其他文件全部刪除.
* 刪除 /var/lib/dpkg/info 目錄下軟體包的所有配置文件, 保留postrm和list文件.
* 最後, dpkg 在資料庫中將軟體狀態修改為刪除.

運行

$dpkg -l nano

rc nano 1.3.10-2 free Pico clone with some new features

清除

#dpkg -P nano

* 刪除所有的文件. 所有的文件都被解除了(從系統中刪除了).
* 運行postrm腳本.如果還存在,運行postrm腳本.
* 刪除 postrm 和 list 文件.保留的兩個文件,從系統中解除postfix.postrm和postfix.files.
* 在dpkg的資料庫中將軟體包標記為未安裝

$dpkg -l nano
pn nano (no description available)

注意輸出的狀態: pn 這意味著軟體包實際上是被清除了,但是在資料庫中還有這個軟體包的記錄.因此,pn 明確指出以前安裝過 nano, 在軟體包資料庫中出現過,並且現在已被完全清除.
8. 異常處理

有時,因為不能滿足依賴關係, 或存在衝突, 文件會被覆蓋, 或控制腳本中存在錯誤而安裝失敗. 在 stable 發行版中從不會存在這類問題(這被視為重大錯誤). 但是, 在運行 unstable 發行版的系統中,有時卻是難免的.

處理文件衝突

dpkg 不會允許一個軟體包覆蓋屬於其它軟體包的文件.可以強制dpkg覆蓋屬於其它軟體包的軟體(使用 --force-overwrite), 但是這樣做十分危險. 如果這只是暫時的衝突(在 unstable 中, 這種情況常有), 覆蓋沒有太大問題. 請注意, 遇到這種情況應該向軟體包的維護者提交相關錯誤報告.

如果你使用的是非官方包, 或是通過 alien 或 checkinstall自己構建的軟體包, 那麼應該對包內文件改名, 或者放棄使用這類軟體包.

處理在安裝過程中控制腳本腳本出現了問題. 問題腳本是出現問題的另一原因. 如果, 軟體包的 postinst 控制文件中有錯誤,那麼就無法用 dpkg 完成對這個軟體包的配置.

這種錯誤一定要作為嚴重問題向錯誤跟蹤系統提交報告.象這種腳本的問題,自己對其進行調試, 以判斷問題所在, 比如您可以簡單的在腳本的第一行以後插入 set -x, 對其運行情況進行跟蹤.除非必要, 您也應該拒絕使用這類軟體包.

處理卸載過程中損壞的控制文件

當軟體包的卸載腳本出現問題時.即使您可以強制刪除控制腳本沒有清除乾淨的文件,這也會妨礙dpkg正確的維護您的系統,從而有可能在系統中留下垃圾文件.對於這類問題, 還沒有太好的處理方法(強烈建議您提交錯誤報告), 唯有等待軟體更新(或自行對軟體包包修復). 然後藉助更新包將相關文件卸載.
9. dpkg vs rpm

* 列出系統中安裝的軟體包
o rpm -qa
o dpkg --list
* 列出軟體包信息
o rpm -qi pkgname
o dpkg --status pkgname
* 列出一個包所安裝的文件
o rpm -ql pkgname
o dpkg --listfiles pkgname
* 列出本地包文件的信息
o rpm -qpi file.rpm
o dpkg --info file.deb
* 列出本地包文件所含文件
o rpm -qpl file.rpm
o dpkg --contents file.deb
* 安裝本地包
o rpm -i file.rpm
o dpkg --install file.deb
* 從系統中清除包
o rpm -E pkgname
o dpkg --purge pkgname
* 查詢文件歸屬
o rpm -qf file
o dpkg --search file

10. 參考文獻

* Debian參考手冊
* Debian常見文件解答
* APT and Dpkg 快速參考表; 也可從 apt-dpkg-ref_5_all.deb 包中獲取.
* dpkg vs rpm
* Debian GNU/Linux Anwenderhandbuch
* pkg 軟體維護工具工具

[火星人 ] THE DEBIAN WAY: Debian維護工具之Dpkg已經有505次圍觀

http://coctec.com/docs/linux/show-post-130667.html