Linux軟件安裝管理之——dpkg與apt-*詳解


 Linux軟件安裝管理之——dpkg與apt-*詳解

【Linux軟件安裝管理系列】— — 傳送門:

— —《Linux軟件安裝管理之——源碼安裝詳解

— —《Linux軟件安裝管理之——RPM與YUM詳解

— —《Linux軟件安裝管理之——dpkg與apt-*詳解》

一、序言

        上一篇文章《Linux軟件安裝管理之——源碼安裝詳解》詳細介紹了Linux平台下的源碼包安裝原理,雖然使用源代碼進行軟件編譯可以具有定制化的設置,但對於Linux distribution的發行商來說,則有軟件管理不晚的問題,畢竟不是每個人都會進行源代碼編譯的。這個問題將會嚴重的影響linux平台上軟件的發行與推廣。

        為了解決上述的問題,廠商先在他們的系統上面編譯好了我們用戶所需要的軟件,然后將這個編譯好並可執行的軟件直接發布給用戶安裝。不同的 Linux 發行版使用不同的打包系統,一般而言,大多數發行版分別屬於兩大包管理技術陣營: Debian 的”.deb”,和 Red Hat的”.rpm”。也有一些重要的例外,比方說 Gentoo, Slackware,和 Foresight,但大多數會使用這兩個基本系統中的一個。

        這里將要介紹的是Debian系列發行版的dpkg與apt-*的詳細使用方法,如需要了解Red Hat系列發行版的包管理系統可查看我的另一篇文章:《Linux軟件安裝管理之——RPM與YUM詳解》。

        注:本人系統版本【Ubuntu 12.04 LTS】

 

二、dpkg

1、簡介

        dpkg - package manager for Debian  (debian系統的包管理工具)。

        dpkg is a tool to install, build, remove and manage Debian packages,dpkg是Debian的一個底層包管理工具,主要用於對已下載到本地和已安裝的軟件包進行管理。

        dpkg這個機制最早由Debian Linux社區所開發出來的,通過dpkg的機制,Debian提供的軟件就能夠簡單的安裝起來,同時能提供安裝后的軟件信息,實在非常不錯。只要派生於Debian的其它Linux distributions大多使用dpkg這個機制來管理,包括B2D,Ubuntu等。

 

2、deb軟件包名規則

格式為:Package_Version-Build_Architecture.deb

如:nano_1.3.10-2_i386.deb

* 軟件包名稱(Package Name): nano

* 版本(Version Number):1.3.10

* 修訂號(Build Number):2

* 平台(Architecture):i386

 

3、dpkg軟件包相關文件介紹

/etc/dpkg/dpkg.cfg  dpkg包管理軟件的配置文件【Configuration file with default options】

/var/log/dpkg.log  dpkg包管理軟件的日志文件【Default log file (see /etc/dpkg/dpkg.cfg(5) and option --log)】

/var/lib/dpkg/available  存放系統所有安裝過的軟件包信息【List of available packages.】

/var/lib/dpkg/status   存放系統現在所有安裝軟件的狀態信息

/var/lib/dpkg/info   記安裝軟件包控制目錄的控制信息文件

 

4、dpkg數據庫

        dpkg 使用文本文件作為數據庫來維護系統中軟件,包括文件清單, 依賴關系, 軟件狀態, 等等詳細的內容,通常在 /var/lib/dpkg 目錄下。 通常在 status 文件中存儲軟件狀態和控制信息。 在 info/ 目錄下備份控制文件, 並在其下的 .list 文件中記錄安裝文件清單, 其下的 .mdasums 保存文件的 MD5 編碼。

例:查詢dpkg數據庫(顯示所有已安裝的Deb包)

 
dpkg -l

        如上圖,每條記錄對應一個軟件包,注意每條記錄的第一、二、三個字符,這就是軟件包的狀態標識,后邊依此是軟件包名稱、版本號和簡單描述。

1)第一字符為期望值(Desired=Unknown/Install/Remove/Purge/Hold),它包括:

u  Unknown狀態未知,這意味着軟件包未安裝,並且用戶也未發出安裝請求.

i  Install用戶請求安裝軟件包.

r  Remove用戶請求卸載軟件包.

p  Purge用戶請求清除軟件包.

h  Hold用戶請求保持軟件包版本鎖定.

2)第二列,是軟件包的當前狀態(Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend)

n  Not軟件包未安裝.

i  Inst軟件包安裝並完成配置.

c  Conf-files軟件包以前安裝過,現在刪除了,但是它的配置文件還留在系統中.

u  Unpacked軟件包被解包,但還未配置.

f  halF-conf試圖配置軟件包,但是失敗了.

h  Half-inst軟件包安裝,但是但是沒有成功.

w trig-aWait觸發器等待

t Trig-pend觸發器未決

3)第三列標識錯誤狀態,第一種狀態標識沒有問題,為空. 其它符號則標識相應問題(Err?=(none)/Reinst-required (Status,Err: uppercase=bad))

h  軟件包被強制保持,因為有其它軟件包依賴需求,無法升級.

r  Reinst-required,軟件包被破壞,可能需要重新安裝才能正常使用(包括刪除).

x  軟包件被破壞,並且被強制保持.

案例說明:

ii —— 表示系統正常安裝了該軟件

pn —— 表示安裝了該軟件,后來又清除了

un —— 表示從未安裝過該軟件

iu —— 表示安裝了該軟件,但是未配置

rc —— 該軟件已被刪除,但配置文件仍在

 

5、dpkg子命令

為了方便用戶使用,dpkg不僅提供了大量的參數選項, 同時也提供了許多子命令。

比如:

dpkg-deb、dpkg-divert、dpkg-query、dpkg-split、dpkg-statoverride、start-stop-daemon

這里將不會對dpkg的命令作詳細說明,如需了解可自行查閱資料。

 

三、dpkg使用手冊

1、安裝

1)安裝相關命令

dpkg -i package-name.deb    # --install, 安裝軟件包,必須是deb包的完整名稱。(軟件的安裝可被拆分為兩個對立的過程“解包”和“配置”)

dpkg --unpack package-name.deb  # “解包”:解開軟件包到系統目錄但不配置,如果和-R一起使用,參數可以是一個目錄

dpkg --configure package-name.deb  #“配置”:配置軟件包

dpkg -c package-name.deb    #列出 deb 包的內容

2)安裝相關選項

-R, --recursive    Recursively handle all regular files matching pattern *.deb found at specified directories and all of its subdirectories. This can be  used  with -i, -A, --install, --unpack and --avail actions(遞歸地指向特定目錄的所有安裝包,可以結合-i, -A, --install, --unpack 與 --avail一起使用)

2、移除軟件包

dpkg -r package-name  # --remove, 移除軟件包,但保留其配置文件

dpkg -P package-name  # --purge, 清除軟件包的所有文件(removes everything, including conffiles)

 

3、查詢

dpkg -l package-name-pattern  # --list, 查看系統中軟件包名符合pattern模式的軟件包

dpkg -L package-name  # --listfiles, 查看package-name對應的軟件包安裝的文件及目錄

dpkg -p package-name  # --print-avail, 顯示包的具體信息

dpkg -s package-name  # --status, 查看package-name(已安裝)對應的軟件包信息

dpkg -S filename-search-pattern  # --search, 從已經安裝的軟件包中查找包含filename的軟件包名稱

(Tip:也可使用子命令dpkg-query來進行查詢操作)

例1:列出系統上安裝的與dpkg相關的軟件包

dpkg -l \*dpkg*

例2:查看dpkg軟件包安裝到系統中的文件

dpkg -L dpkg

更多dpkg的使用方法可在命令行里使用man dpkg來查閱 或直接使用dpkg --help

 

三、apt

1、apt簡介

        雖然我們在使用dpkg時,已經解決掉了 軟件安裝過程中的大量問題,但是當依賴關系不滿足時,仍然需要手動解決,而apt這個工具解決了這樣的問題,linux distribution 先將軟件放置到對應的服務器中,然后分析軟件的依賴關系,並且記錄下來,然后當客戶端有安裝軟件需求時,通過清單列表與本地的dpkg以存在的軟件數據相比較,就能從網絡端獲取所有需要的具有依賴屬性的軟件了。

 

2、工作原理

        Ubuntu采用集中式的軟件倉庫機制,將各式各樣的軟件包分門別類地存放在軟件倉庫中,進行有效地組織和管理。然后,將軟件倉庫置於許許多多的鏡像服務器中,並保持基本一致。這樣,所有的Ubuntu用戶隨時都能獲得最新版本的安裝軟件包。因此,對於用戶,這些鏡像服務器就是他們的軟件源(Reposity)

       然而,由於每位用戶所處的網絡環境不同,不可能隨意地訪問各鏡像站點。為了能夠有選擇地訪問,在Ubuntu系統中,使用軟件源配置文件/etc/apt/sources.list列出最合適訪問的鏡像站點地址。

例1:apt-get的更新過程

1)執行apt-get update

2)程序分析/etc/apt/sources.list

3)自動連網尋找list中對應的Packages/Sources/Release列表文件,如果有更新則下載之,存入/var/lib/apt/lists/目錄

4)然后 apt-get install 相應的包 ,下載並安裝。

        即使這樣,軟件源配置文件只是告知Ubuntu系統可以訪問的鏡像站點地址,但那些鏡像站點具體都擁有什么軟件資源並不清楚。若每安裝一個軟件包,就在服務器上尋找一遍,效率是很低的。因而,就有必要為這些軟件資源列個清單(建立索引文件),以便本地主機查詢。

        用戶可以使用“apt-get update”命令刷新軟件源,建立更新軟件包列表。在Ubuntu Linux中,“apt-get update”命令會掃描每一個軟件源服務器,並為該服務器所具有軟件包資源建立索引文件,存放在本地的/var/lib/apt/lists/目錄中。 使用apt-get執行安裝、更新操作時,都將依據這些索引文件,向軟件源服務器申請資源。因此,在計算機設備空閑時,經常使用“apt-get update”命令刷新軟件源,是一個好的習慣。

例2:apt-get install原理圖

 
 

3、apt相關文件

var/lib/dpkg/available    文件的內容是軟件包的描述信息, 該軟件包括當前系統所使用的Debian 安裝源中的所有軟件包,其中包括當前系統中已安裝的和未安裝的軟件包.

/etc/apt/sources.list  記錄軟件源的地址(當你執行 sudo apt-get install xxx 時,Ubuntu 就去這些站點下載軟件包到本地並執行安裝)

/var/cache/apt/archives  已經下載到的軟件包都放在這里(用 apt-get install 安裝軟件時,軟件包的臨時存放路徑)

/var/lib/apt/lists    使用apt-get update命令會從/etc/apt/sources.list中下載軟件列表,並保存到該目錄

4、源文件

        apt的源文件由配置文件/etc/apt/sources.list指定,該文件配置內存如下圖所示:

 
sources.list

        鏡像服務器的存放位置如:

 
 

        通過解壓Packages.gz后我們可以看到所有軟件包的基本信息,並且Packages.gz 已經包含所有所依賴的軟件及其版本信息、以及下載地址。

四、apt使用手冊

1、apt-get

        apt-get is the command-line tool for handling packages, and may be considered the user's "back-end" to other tools using the APT library. Several "front-end" interfaces exist, such as dselect(1), aptitude(8), synaptic(8) and wajig(1).

        apt-get 是一個下載安裝軟件包的簡單命令行接口。最常用的命令是update(更新)和install(安裝)。

用法: apt-get [選項] 命令

常用選項:

-h 本幫助文件。

-q 輸出到日志 - 無進展指示

-qq 不輸出信息,錯誤除外

-d 僅下載 - 不安裝或解壓歸檔文件

-s 不實際安裝。模擬執行命令

-y 假定對所有的詢問選是,不提示

-f 嘗試修正系統依賴損壞處

-m 如果歸檔無法定位,嘗試繼續

-u 同時顯示更新軟件包的列表

-b 獲取源碼包后編譯

-V 顯示詳細的版本號

-c=? 閱讀此配置文件

-o=? 設置自定的配置選項,如 -o dir::cache=/tmp

常用命令:

1)apt-get update  更新源

     【aptitude update】

2)apt-get dist-upgrade  升級系統到相應的發行版(根據 source.list 的配置)

     【aptitude dist-upgrade】

3)apt-get upgrade  更新所有已經安裝的軟件包

     【aptitude upgrade】

4)apt-get install package_name  安裝軟件包(加上 --reinstall重新安裝)

    apt-get install package_name=version    安裝指定版本的軟件包

    【aptitude install package_name】

5)apt-get remove  package_name    卸載一個已安裝的軟件包(保留配置文件)

    【aptitude remove package_name】

6)apt-get purge package_name  移除軟件包(刪除配置信息)

     或apt-get  --purge remove packagename

    【aptitude purge package_name】

7)apt-get check  檢查是否有損壞的依賴

8)apt-get autoclean  刪除你已經刪掉的軟件(定期運行這個命令來清除那些已經卸載的軟件包的.deb文件。通過這種方式,您可以釋放大量的磁盤空間。如果您的需求十分迫切,可以使用apt-get clean以釋放更多空間。這個命令會將已安裝軟件包裹的.deb文件一並刪除。大多數情況下您不會再用到這些.debs文件,因此如果您為磁盤空間不足 而感到焦頭爛額,這個辦法也許值得一試)

    【aptitude autoclean】

9)apt-get clean    把安裝的軟件的備份也刪除,不過這樣不會影響軟件的使用

    【aptitude clean】

2、apt-cache

        apt-cache - query the APT cach.

        apt-cache performs a variety of operations on APT's package cache.  apt-cache does not manipulate the state of the system but does provide operations to search and generate interesting output from the package metadata.

1)apt-cache depends packagename  了解使用依賴

2)apt-cache rdepends packagename  是查看該包被哪些包依賴

3)apt-cache search  packagename  搜索包

    【aptitude search packagename】

4)apt-cache show packagename  獲取包的相關信息,如說明、大小、版本等

    【aptitude show packagename】

5)apt-cache  showpkg packagename    顯示軟件包的大致信息

(注:中括號【】內的aptitude也是類似於apt-*的一個包管理上層工具)

參考:

阿里雲開源鏡像站:http://mirrors.aliyun.com/

網易開源鏡像站:http://mirrors.163.com/

書籍:《The Linux Command Line》William E. Shotts, Jr.

Ubuntu官方網站:https://www.ubuntu.com

Debian官方網站:https://www.debian.org/doc/user-manuals

https://www.debian.org/doc/manuals/debian-handbook/apt.zh-cn.html

迷途的個人博客:http://blog.csdn.net/astraylinux/article/details/7039744


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM