1. 程式人生 > 其它 >『Linux學習筆記』11. Linux的軟體包管理

『Linux學習筆記』11. Linux的軟體包管理

什麼是軟體包管理

可以近似的理解為Windows系統或Android系統中的應用商店.

是Linux中安裝(獲取)軟體的途徑.

如果你在閱讀文章前學過任意一門程式語言, 那麼對這個概念應該不會陌生;

如Python中的pip, Java中的ant、Maven、Gradle, Js的npm, C#的NuGet等, 它們無一例外都做著包管理的工作.

為什麼需要軟體包管理

在第0章中我們提到過除了文中所使用的Ubuntu系統外, 還有其他Linux發行版.

或許你會有疑問: 他們的區別在哪裡呢? 在不同方面又分別具有什麼優勢呢?

其實, 不同的Linux發行版除了UI介面(是的, Linux也有UI介面)、穩定性、更新頻率等區別外, 還有至關重要的一點便是社群活躍度;

隨著Linux版本的快速迭代, 不同的發行版迫切需要社群中的開發者為它們提供持續支援. 如果失去了社群支援, Linux中的軟體流通性將大打折扣.

軟體包的支援也是社群支援的一部分.

在實際生產中, 一款軟體軟體很少會"特立獨行", 更常見的情況是多個軟體互相依賴、環環相扣最終實現一個又一個解決方案;

設想一下, 如果在A發行版上編譯執行的軟體到了B發行版上卻因某一個依賴不支援B發行版而無法執行, 這不僅大大增加了開發者的工作量並且著實令人沮喪.

得益於目前主流發行版活躍的社群, 包括跨發行版在內的問題往往都得到了解決, 社群中受僱與軟體開發商的維護者們對症下藥, 使軟體的跨發行版支援不再是開發者的噩夢.

因此, 選擇一個好的發行版可以使你節省很多後期工作量.

Linux的包管理系統

在Linux中, 目前主流的包管理系統分為兩大陣營 -- deb(Debian) 和 rpm(RedHat), 採用他們的發行版也有所不同, 如下表:

包管理系統發行版 (部分列表)
Debian (.deb) Debian, Ubuntu, Xandros, Linspire
Red Hat (.rpm) Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE, Mandriva, PCLinuxOS

此處我們將使用國內主流的UbuntuCentOS

進行舉例:

Ubuntu CentOS
基於Debian 基於RHEL
更新頻繁 除重大發布外基本不更新
國外更大活躍的社群與開發人員 相對較小的社群
網路資料豐富 網上可查閱資訊較少
使用apt-get包管理器安裝的.deb包 使用yum包管理器安裝的.rpm包

說人話:

Ubuntu CentOS
基於Debian 基於RHEL
更活躍 更穩定
搞開發 搞運維
資料多 資料少
安裝包是.deb格式 安裝包是.rpm格式
國內使用者少 國內使用者相對多得多

軟體包管理工具

deb和rpm之間的差異早已不是單純的打包格式不同, 它們擁有不一樣的規範, 是完全獨立的兩套依賴系統, 雖然它們的格式可以互相轉換, 但處理其中的依賴關係仍是非常繁瑣的一件事情. 因此deb和rpm這類軟體包的底層支援也被稱為底層工具.

而有底層工具就有與之相對應的上層工具, 也就是我們所使用的包管理工具, 你也可以把它看做軟體包的管理員, 當我們需要查詢、安裝、解除安裝、更新軟體包時就會用到它, 上層工具基於底層工具進行了封裝, 並添加了許多實用的功能, 使包管理工作變得簡潔明瞭且高效;

包管理工具
發行版底層工具上層工具
Ubuntu等基於Debian的發行版 dpkg(.deb) apt-get, aptitude
CentOS等基於Red Hat Enterprise Linux(RHEL)的發行版 rpm(.rpm) yum

從庫中查詢一個軟體包

假設我們需要查詢一個軟體包, 名為"emacs", 它是Linux中被公認為最受專業程式設計師喜愛的程式碼編輯器之一.

如果你是用的是Ubuntu:

apt-get update
apt-cache search emacs

若update命令無法正常執行, 請使用sudo或切換root賬戶.

如果你使用的是CentOS:

yum search emacs

從庫中安裝一個軟體

從庫中安裝是如今Linux中主流的軟體安裝方式之一, 它方便快捷且易於版本管理, 開發者們將各版本的軟體釋出到資源庫以供下載, 依舊拿"emacs"舉例:

如果你使用的是Ubuntu:

apt-get update
apt-get install emacs

如果你使用的是CentOS:

yum install emacs

從本地安裝軟體

在資源庫還未普及的年代, 人們想要在Linux中安裝一個軟體往往需要在自己的系統中將軟體再編譯一遍才能執行(也有可能不需要重新編譯, 但仍需要將對的東西放到對的地方, 如Windows中選擇安裝路徑一樣.), 同時這也是最原始的Linux軟體安裝方式.

雖然如今資源庫已經相對完善, 但我們仍需清楚如何從本地安裝一個軟體, 因為如果不巧系統中沒有網路或有其他稀奇古怪的問題, 那麼我們便不得不從選擇從本地安裝軟體.

從本地安裝軟體可以直接使用底層工具實現.

在安裝軟體前, 我們需要通過除庫以外的其他途徑獲取我們需要的軟體包;

如果你使用的是Ubuntu(假設我們已經下載好了軟體包"emacs-xx.x-x.xxx.deb"並放在了當前目錄下):

dpkg --install emacs-xx.x-x.xxx.deb

如果你使用的是CentOS(假設我們已經下載好了軟體包"emacs-xx.x-x.xxx.rpm"並放在了當前目錄下):

rpm -i emacs-xx.x-x.xxx.rpm

解除安裝已安裝的軟體

當我們想要解除安裝一個已安裝的軟體時上層工具底層工具都可以實現.

此處以上層工具為例

如果你使用的是Ubuntu:

apt-get remove emacs

如果你使用的是CentOS:

yum erase emacs

通過庫更新軟體

在能夠正常使用資源庫的前提下, 如果我們想更新已安裝軟體的版本並不需要將其解除安裝後再安裝, 可以直接通過以下命令將所有軟體更新至最新版本:

如果你使用的是Ubuntu:

apt-get update
apt-get upgrade 

如果你使用的是CentOS:

yum update

通過庫安裝指定版本的軟體

有時候最新版本的軟體未必使我們所需要的, 這時我們可以通過資源庫很方便的獲取並安裝軟體的歷史版本.

首先我們需要獲取我們所需軟體在倉庫中有哪些版本, 其次在安裝時指定完整的版本號:

如果你使用的是Ubuntu:

apt-cache madison emacs
apt-get install emacs=26.3+1-1ubuntu2

如果你使用的是CentOS:

yum list | grep emacs
yum install emacs-26.3-7.fc7-i386

從本地更新或安裝特定版本的軟體

並不是所有時候我們都能通過上層工具順利的從庫中獲得我們所需的版本, 因此我們還需要掌握如何通過底層工具更新或安裝特定版本的軟體.

假設我們已安裝emacs, 此時我們下載了一個另外版本的軟體包並放在目錄下:

如果你使用的是Ubuntu, 這將與從本地安裝軟體沒有區別, dpkg會將已安裝內容覆蓋(假設包為emacs-xx.x-x.xxx.deb):

dpkg --install emacs-xx.x-x.xxx.deb

如果你使用的是CentOS(假設包為emacs-xx.x-x.xxx.rpm):

yum -U emacs-xx.x-x.xxx.rpm

檢視所有已安裝的軟體

如果你使用的是Ubuntu:

dpkg --list

如果你使用的是CentOS:

rpm -qa

檢視是否已安裝了同名的軟體

假設我們需要查詢的軟體名為"emacs"

如果你使用的是Ubuntu:

dpkg --status emacs

如果你使用的是CentOS:

rpm -q emacs

檢視已安裝軟體的詳細資訊

有時我們需要了解我們系統中某個已安裝的軟體是什麼版本、源於哪裡、何時安裝可以使用下述命令.

假設我們已安裝"emacs"並且現在想要查詢它的詳細資訊.

如果你使用的是Ubuntu:

apt-cache show emacs

如果你使用的是CentOS:

yum info emacs

查詢某個檔案所屬的軟體包

隨著安裝的軟體越來越多, 在/usr/bin目錄下有可能出現一些我們並不清楚屬於什麼軟體的檔案, 此時我們的底層工具可以為我們查詢到它屬於哪一個軟體包.

假設我們的/usr/bin目錄下有一檔案"tencen_tt", 我們想要查詢他所屬的軟體包;

如果你使用的是Ubuntu:

dpkg --search /usr/bin/tencent_tt

如果你使用的是CentOS:

rpm -qf /usr/bin/tencent_tt

這時, 終端中的資訊就會告訴我們是哪一個軟體包安裝或使用時產生了該檔案.