dpkg 被中斷問題解決方法

linux系統安裝軟件是有時會碰到“dpkg 被中斷,您必須手工運行 sudo dpkg –configure -a解決此問題”,然而按照提示運行卻並沒能很好的解決問題。其實導致這個問題的主要原因是因爲/var/lib/dpkg/updates文件下的文件有問題,可能是其他軟件安裝過程或是其他原因導致的,這裏刪除掉然後重建即可。

sudo rm /var/lib/dpkg/updates/*
sudo apt-get update
sudo apt-get upgrade
[*]sudo apt-get update指令會重新建立這些資料,所以不必擔心刪除後會出問題;
[*]sudo apt-get upgrade會更新你的電腦裏面已安裝的軟件的明細,根據軟件的明細更新軟件到最新版。
PS:“dpkg ”是“Debian Packager ”的簡寫。爲 “Debian” 專門開發的套件管理系統,方便軟件的安裝、更新及移除。所有源自“Debian”的“Linux ”發行版都使用 “dpkg”

dpkg詳解

1. dpkg描述
     dpkg是一個安裝、創建、移除和管理debian包的工具。更多使用界面友好的dpkg的前端”dselect”,。dpkg完全受控於命令行參數,和零個或更多參數正確的組成一個操作方式。參數告訴dpkg要做什麼和多種選項控制不同的行爲。dpkg不僅提供了大量的參數選項, 同時也提供了許多子命令比如:
dpkg-deb
dpkg-divert
dpkg-query
dpkg-split
dpkg-statoverride
start-stop-daemon

2. 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

3. 軟件包處理
    dpkg可用作dpkg-deb的前端,處理本地Debian軟件包. 可以提取從.deb文件中提取軟件包信息和數據. 詳細信息,請參閱 dpkg-deb 的聯機手冊.以下是dpkg-deb操作方式:
    -b, –build   //dpkg-deb -b nano nano_1.3.10-2_ill.deb  重新打包
    -c, –contents //dpkg-deb -c nano_1.3.10-2_i386.deb  |more  列出軟件包的內容
    -I, –info  //dpkg-deb -I nano_1.3.10-2_i386.deb  查看軟件包的信息
    -f, –field  //重新構建軟件包,比如nano(1.3.10)需要滿足以下依賴關係:$ dpkg-deb -f nano_1.3.10-2_i386.deb depends     depends 爲對應查詢段)
    -e, –control  //dpkg-deb -e ./nano_1.3.10-2_i386.deb ./nano/DEBIAN  解壓控制文件
    -x, –extract  //dpkg-deb -x ./nano_1.3.10-2_i386.deb ./nano   解壓程序文件
    -X, –vextract, and –fsystarfile.//dpkg-deb -X ./nano_1.3.10-2_i386.deb ./nano   解壓程序文件並列出軟件包內容。

4. 數據庫查詢當前版本的 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 數據庫查詢.
使用 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 nano5. 安裝軟件包
dpkg -i | –install package_file…
例如:$dpkg -i ./nano_1.3.10-2_i386.deb
如果指定–recursive 或 -R 選項,必須指定一個目錄代替包文件。
安裝步驟如下:
1). 導出新包的控制文件。               
2). 如果相同包的另一個版本在新包安裝前已經被安裝,執行舊包的prerm腳本程序。
3). 如果由包提供,運行postinst腳本。
4). 解壓新文件同時備份舊文件,如果遇到問題以便修復。
5). 如果另一個版本的同一個包在新包安裝前已經安裝,執行舊包的postrm腳本。注意:執行postrm 腳本後執行新文件的preint腳本,因爲寫新文件的同時移除舊文件。
6). 配置軟件包。
或者
$dpkg-deb -e ./nano_1.3.10-2_i386.deb
當使用 dpkg 安裝軟件包時, 主要分爲兩個階段: 首先解包; 然後運行postinst控制腳本(如果有的話),這就是所謂的配置階段. 當完成軟件包當解包後, dpkg 的–install選項自動調用配置階段. 注意, 操作時應當指定 .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 nano6. 軟件卸載
dpkg -r | –remove | -P | –purge package … | -a | –pending
在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
清除
-P or –purge 刪除所有的包括配置文件。 (主要刪除的是/var/lib/dpkg/status中指定文件,)如果給出的是-a或者–pending而不是包的名字,那麼所有的包都被打開(解壓縮),但是在/var/bin/dpkg/status文件中標記被移除或清除的,將會分別被移除或清除(但是在 /var/bin/dpkg/status文件中標記“要”移除)
    #dpkg -P nano
    * 刪除所有的文件. 所有的文件都被解除了(從系統中刪除了).
    * 運行postrm腳本.如果還存在,運行postrm腳本.
    * 刪除 postrm 和 list 文件.保留的兩個文件,從系統中解除postfix.postrm和postfix.files.
    * 在dpkg的數據庫中將軟件包標記爲未安裝
$dpkg -l nano
pn  nano                                          (no description available)
注意輸出的狀態: pn 這意味着軟件包實際上是被清除了,但是在數據庫中還有這個軟件包的記錄.因此,pn 明確指出以前安裝過 nano, 在軟件包數據庫中出現過,並且現在已被完全清除.
附加:
dpkg-reconfigure
重新配製一個已經安裝的包裹,如果它使用的是 debconf (debconf 爲包裹安裝提供了一個統一的配製界面).你能夠重新配製 debconf 它本身,如你想改變它的前端或提問的優先權.例如,重新配製 debconf ,使用一個 dialog 前端,簡單運行:
dpkg-reconfigure –frontend=dialog debconf (如果你安裝時選錯了,這裏可以改回來喲
echo ” hold” | dpkg –set-selections
設置  的狀態爲 hlod (命令行方式)
dpkg –get-selections “”
取的  的當前狀態 (命令行方式)

支持通配符,如:Debian:~# dpkg –get-selections *wine*
libwine hold
libwine-alsa hold
libwine-arts hold
libwine-dev hold
libwine-nas hold
libwine-print hold
libwine-twain hold
wine hold
wine+ hold
wine-doc hold
wine-utils hold
dpkg-source -x
如果你手工下載了一個程序的源碼包,其中包含了幾個類似 .orig.tar.gz , .dsc ,
以及 .diff.gz 之類的文件,
那麼你就可以對 .dsc 文件使用這個命令來 unpack 源碼包。
dpkg-buildpackage
從 Debian 源碼樹建立一個deb包。你必須在source tree的主目錄才能生效。例如:
dpkg-buildpackage -rfakeroot -uc -b
這裏 ‘-rfakeroot’ 指定命令使用 fakeroot 程序來模仿 root 權限 (來實現所有者(ownership)目的),
‘-uc’ 表示 “Don’t cryptographically sign the changelog”, ‘-b’ 代表只建立二進制包.
debuild
一個快速打包腳本類似 dpkg-buildpackage ,能自動的識別是否使用 fakeroot,
同時爲你運行 lintian 和 gpg
修正倚賴關係
dpkg –configure –pending
如果dpkg在apt-get install upgrade dist-uptradeing 的時候出錯退出,
嘗試使用此命令來配置已經unpack的包。
然後再用 apt-get install ,upgrade, or dist-upgrade -f ,
然後再用 apt-get install, upgrade, or dist-upgrade.
可能會重複多次,這樣通常可以解決大多數的依賴性問題。
(同時,如果提示由於某種原因需要某個特定的包裹,你可以常識安裝或卸載這個包)
apt-get install -f
apt-get upgrade -f
apt-get dist-upgrade -f
嘗試修正上述過程中出現依賴性關係
注意 apt-get install -f 不需要  作爲參數。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章