包管理基礎(chǔ):apt、yum、dnf 和 pkg

包管理基礎(chǔ)
包管理基礎(chǔ)

介紹

大多數(shù)現(xiàn)代的類(lèi) Unix 操作系統(tǒng)都提供了一種中心化的機(jī)制用來(lái)搜索和安裝軟件。軟件通常都是存放在存儲(chǔ)庫(kù)中,并通過(guò)包的形式進(jìn)行分發(fā)。處理包的工作被稱(chēng)為包管理。包提供了操作系統(tǒng)的基本組件,以及共享的庫(kù)、應(yīng)用程序、服務(wù)和文檔。

包管理系統(tǒng)除了安裝軟件外,它還提供了工具來(lái)更新已經(jīng)安裝的包。包存儲(chǔ)庫(kù)有助于確保你的系統(tǒng)中使用的代碼是經(jīng)過(guò)審查的,并且軟件的安裝版本已經(jīng)得到了開(kāi)發(fā)人員和包維護(hù)人員的認(rèn)可。

在配置服務(wù)器或開(kāi)發(fā)環(huán)境時(shí),我們最好了解下包在官方存儲(chǔ)庫(kù)之外的情況。某個(gè)發(fā)行版的穩(wěn)定版本中的包有可能已經(jīng)過(guò)時(shí)了,尤其是那些新的或者快速迭代的軟件。然而,包管理無(wú)論對(duì)于系統(tǒng)管理員還是開(kāi)發(fā)人員來(lái)說(shuō)都是至關(guān)重要的技能,而已打包的軟件對(duì)于主流 Linux 發(fā)行版來(lái)說(shuō)也是一筆巨大的財(cái)富。

本指南旨在快速地介紹下在多種 Linux 發(fā)行版中查找、安裝和升級(jí)軟件包的基礎(chǔ)知識(shí),并幫助您將這些內(nèi)容在多個(gè)系統(tǒng)之間進(jìn)行交叉對(duì)比。

包管理系統(tǒng):簡(jiǎn)要概述

大多數(shù)包系統(tǒng)都是圍繞包文件的集合構(gòu)建的。包文件通常是一個(gè)存檔文件,它包含已編譯的二進(jìn)制文件和軟件的其他資源,以及安裝腳本。包文件同時(shí)也包含有價(jià)值的元數(shù)據(jù),包括它們的依賴(lài)項(xiàng),以及安裝和運(yùn)行它們所需的其他包的列表。

雖然這些包管理系統(tǒng)的功能和優(yōu)點(diǎn)大致相同,但打包格式和工具卻因平臺(tái)而異:

操作系統(tǒng) 格式 工具
Debian .deb apt, apt-cache, apt-get, dpkg
Ubuntu .deb apt, apt-cache, apt-get, dpkg
CentOS .rpm yum
Fedora .rpm dnf
FreeBSD Ports, .txz make, pkg

Debian 及其衍生版,如 Ubuntu、Linux Mint 和 Raspbian,它們的包格式是 .deb。APT 這款先進(jìn)的包管理工具提供了大多數(shù)常見(jiàn)的操作命令:搜索存儲(chǔ)庫(kù)、安裝軟件包及其依賴(lài)項(xiàng),并管理升級(jí)。在本地系統(tǒng)中,我們還可以使用 dpkg 程序來(lái)安裝單個(gè)的 deb 文件,APT 命令作為底層 dpkg 的前端,有時(shí)也會(huì)直接調(diào)用它。

最近發(fā)布的 debian 衍生版大多數(shù)都包含了 apt 命令,它提供了一個(gè)簡(jiǎn)潔統(tǒng)一的接口,可用于通常由 apt-getapt-cache 命令處理的常見(jiàn)操作。這個(gè)命令是可選的,但使用它可以簡(jiǎn)化一些任務(wù)。

CentOS、Fedora 和其它 Red Hat 家族成員使用 RPM 文件。在 CentOS 中,通過(guò) yum 來(lái)與單獨(dú)的包文件和存儲(chǔ)庫(kù)進(jìn)行交互。

在最近的 Fedora 版本中,yum 已經(jīng)被 dnf 取代,dnf 是它的一個(gè)現(xiàn)代化的分支,它保留了大部分 yum 的接口。

FreeBSD 的二進(jìn)制包系統(tǒng)由 pkg 命令管理。FreeBSD 還提供了 Ports 集合,這是一個(gè)存在于本地的目錄結(jié)構(gòu)和工具,它允許用戶(hù)獲取源碼后使用 Makefile 直接從源碼編譯和安裝包。

更新包列表

大多數(shù)系統(tǒng)在本地都會(huì)有一個(gè)和遠(yuǎn)程存儲(chǔ)庫(kù)對(duì)應(yīng)的包數(shù)據(jù)庫(kù),在安裝或升級(jí)包之前最好更新一下這個(gè)數(shù)據(jù)庫(kù)。另外,yumdnf 在執(zhí)行一些操作之前也會(huì)自動(dòng)檢查更新。當(dāng)然你可以在任何時(shí)候?qū)ο到y(tǒng)進(jìn)行更新。

系統(tǒng) 命令
Debian / Ubuntu sudo apt-get update
sudo apt update
CentOS yum check-update
Fedora dnf check-update
FreeBSD Packages sudo pkg update
FreeBSD Ports sudo portsnap fetch update

更新已安裝的包

在沒(méi)有包系統(tǒng)的情況下,想確保機(jī)器上所有已安裝的軟件都保持在最新的狀態(tài)是一個(gè)很艱巨的任務(wù)。你將不得不跟蹤數(shù)百個(gè)不同包的上游更改和安全警報(bào)。雖然包管理器并不能解決升級(jí)軟件時(shí)遇到的所有問(wèn)題,但它確實(shí)使你能夠使用一些命令來(lái)維護(hù)大多數(shù)系統(tǒng)組件。

在 FreeBSD 上,升級(jí)已安裝的 ports 可能會(huì)引入破壞性的改變,有些步驟還需要進(jìn)行手動(dòng)配置,所以在通過(guò) portmaster 更新之前最好閱讀下 /usr/ports/UPDATING 的內(nèi)容。

系統(tǒng) 命令 說(shuō)明
Debian / Ubuntu sudo apt-get upgrade 只更新已安裝的包
sudo apt-get dist-upgrade 可能會(huì)增加或刪除包以滿(mǎn)足新的依賴(lài)項(xiàng)
sudo apt upgrade apt-get upgrade 類(lèi)似
sudo apt full-upgrade apt-get dist-upgrade 類(lèi)似
CentOS sudo yum update
Fedora sudo dnf upgrade
FreeBSD Packages sudo pkg upgrade
FreeBSD Ports less /usr/ports/UPDATING 使用 less 來(lái)查看 ports 的更新提示(使用上下光標(biāo)鍵滾動(dòng),按 q 退出)。
cd /usr/ports/ports-mgmt/portmaster && sudo make install && sudo portmaster -a 安裝 portmaster 然后使用它更新已安裝的 ports

搜索某個(gè)包

大多數(shù)發(fā)行版都提供針對(duì)包集合的圖形化或菜單驅(qū)動(dòng)的工具,我們可以分類(lèi)瀏覽軟件,這也是一個(gè)發(fā)現(xiàn)新軟件的好方法。然而,查找包最快和最有效的方法是使用命令行工具進(jìn)行搜索。

系統(tǒng) 命令 說(shuō)明
Debian / Ubuntu apt-cache search search_string
apt search search_string
CentOS yum search search_string
yum search all search_string 搜索所有的字段,包括描述
Fedora dnf search search_string
dnf search all search_string 搜索所有的字段,包括描述
FreeBSD Packages pkg search search_string 通過(guò)名字進(jìn)行搜索
pkg search -f search_string 通過(guò)名字進(jìn)行搜索并返回完整的描述
pkg search -D search_string 搜索描述
FreeBSD Ports cd /usr/ports && make search name=package 通過(guò)名字進(jìn)行搜索
cd /usr/ports && make search key=search_string 搜索評(píng)論、描述和依賴(lài)

查看某個(gè)軟件包的信息

在安裝軟件包之前,我們可以通過(guò)仔細(xì)閱讀包的描述來(lái)獲得很多有用的信息。除了人類(lèi)可讀的文本之外,這些內(nèi)容通常包括像版本號(hào)這樣的元數(shù)據(jù)和包的依賴(lài)項(xiàng)列表。

系統(tǒng) 命令 說(shuō)明
Debian / Ubuntu apt-cache show package 顯示有關(guān)包的本地緩存信息
apt show package
dpkg -s package 顯示包的當(dāng)前安裝狀態(tài)
CentOS yum info package
yum deplist package 列出包的依賴(lài)
Fedora dnf info package
dnf repoquery --requires package 列出包的依賴(lài)
FreeBSD Packages pkg info package 顯示已安裝的包的信息
FreeBSD Ports cd /usr/ports/category/port && cat pkg-descr

從存儲(chǔ)庫(kù)安裝包

知道包名后,通??梢杂靡粋€(gè)命令來(lái)安裝它及其依賴(lài)。你也可以一次性安裝多個(gè)包,只需將它們?nèi)苛谐鰜?lái)即可。

系統(tǒng) 命令 說(shuō)明
Debian / Ubuntu sudo apt-get install package
sudo apt-get install package1 package2 ... 安裝所有列出來(lái)的包
sudo apt-get install -y package apt 提示是否繼續(xù)的地方直接默認(rèn) yes
sudo apt install package 顯示一個(gè)彩色的進(jìn)度條
CentOS sudo yum install package
sudo yum install package1 package2 ... 安裝所有列出來(lái)的包
sudo yum install -y package yum 提示是否繼續(xù)的地方直接默認(rèn) yes
Fedora sudo dnf install package
sudo dnf install package1 package2 ... 安裝所有列出來(lái)的包
sudo dnf install -y package dnf 提示是否繼續(xù)的地方直接默認(rèn) yes
FreeBSD Packages sudo pkg install package
sudo pkg install package1 package2 ... 安裝所有列出來(lái)的包
FreeBSD Ports cd /usr/ports/category/port && sudo make install 從源碼構(gòu)建安裝一個(gè) port

從本地文件系統(tǒng)安裝一個(gè)包

對(duì)于一個(gè)給定的操作系統(tǒng),有時(shí)有些軟件官方并沒(méi)有提供相應(yīng)的包,那么開(kāi)發(fā)人員或供應(yīng)商將需要提供包文件的下載。你通常可以通過(guò) web 瀏覽器檢索這些包,或者通過(guò)命令行 curl 來(lái)檢索這些信息。將包下載到目標(biāo)系統(tǒng)后,我們通??梢酝ㄟ^(guò)單個(gè)命令來(lái)安裝它。

在 Debian 派生的系統(tǒng)上,dpkg 用來(lái)處理單個(gè)的包文件。如果一個(gè)包有未滿(mǎn)足的依賴(lài)項(xiàng),那么我們可以使用 gdebi 從官方存儲(chǔ)庫(kù)中檢索它們。

在 CentOS 和 Fedora 系統(tǒng)上,yumdnf 用于安裝單個(gè)的文件,并且會(huì)處理需要的依賴(lài)。

系統(tǒng) 命令 說(shuō)明
Debian / Ubuntu sudo dpkg -i package.deb
sudo apt-get install -y gdebi && sudo gdebi package.deb 安裝 gdebi,然后使用 gdebi 安裝 package.deb 并處理缺失的依賴(lài)
CentOS sudo yum install package.rpm
Fedora sudo dnf install package.rpm
FreeBSD Packages sudo pkg add package.txz
sudo pkg add -f package.txz 即使已經(jīng)安裝的包也會(huì)重新安裝

刪除一個(gè)或多個(gè)已安裝的包

由于包管理器知道給定的軟件包提供了哪些文件,因此如果某個(gè)軟件不再需要了,它通??梢愿蓛衾涞貜南到y(tǒng)中清除這些文件。

系統(tǒng) 命令 說(shuō)明
Debian / Ubuntu sudo apt-get remove package
sudo apt remove package
sudo apt-get autoremove 刪除不需要的包
CentOS sudo yum remove package
Fedora sudo dnf erase package
FreeBSD Packages sudo pkg delete package
sudo pkg autoremove 刪除不需要的包
FreeBSD Ports sudo pkg delete package
cd /usr/ports/path_to_port && make deinstall 卸載 port

apt 命令

Debian 家族發(fā)行版的管理員通常熟悉 apt-getapt-cache。較少為人所知的是簡(jiǎn)化的 apt 接口,它是專(zhuān)為交互式使用而設(shè)計(jì)的。

傳統(tǒng)命令 等價(jià)的 apt 命令
apt-get update apt update
apt-get dist-upgrade apt full-upgrade
apt-cache search string apt search string
apt-get install package apt install package
apt-get remove package apt remove package
apt-get purge package apt purge package

雖然 apt 通常是一個(gè)特定操作的快捷方式,但它并不能完全替代傳統(tǒng)的工具,它的接口可能會(huì)隨著版本的不同而發(fā)生變化,以提高可用性。如果你在腳本或 shell 管道中使用包管理命令,那么最好還是堅(jiān)持使用 apt-getapt-cache。

獲取幫助

除了基于 web 的文檔,請(qǐng)記住我們可以通過(guò) shell 從 Unix 手冊(cè)頁(yè)(通常稱(chēng)為 man 頁(yè)面)中獲得大多數(shù)的命令。比如要閱讀某頁(yè),可以使用 man

man page

man 中,你可以用箭頭鍵導(dǎo)航。按 / 搜索頁(yè)面內(nèi)的文本,使用 q 退出。

系統(tǒng) 命令 說(shuō)明
Debian / Ubuntu man apt-get 更新本地包數(shù)據(jù)庫(kù)以及與包一起工作
man apt-cache 在本地的包數(shù)據(jù)庫(kù)中搜索
man dpkg 和單獨(dú)的包文件一起工作以及能查詢(xún)已安裝的包
man apt 通過(guò)更簡(jiǎn)潔,用戶(hù)友好的接口進(jìn)行最基本的操作
CentOS man yum
Fedora man dnf
FreeBSD Packages man pkg 和預(yù)先編譯的二進(jìn)制包一起工作
FreeBSD Ports man ports 和 Ports 集合一起工作

結(jié)論和進(jìn)一步的閱讀

本指南通過(guò)對(duì)多個(gè)系統(tǒng)間進(jìn)行交叉對(duì)比概述了一下包管理系統(tǒng)的基本操作,但只涉及了這個(gè)復(fù)雜主題的表面。對(duì)于特定系統(tǒng)更詳細(xì)的信息,可以參考以下資源:


via: https://www.digitalocean.com/community/tutorials/package-management-basics-apt-yum-dnf-pkg

此文由 Snapcraft 公眾號(hào)翻譯,歡迎關(guān)注 : )

作者:Brennen Bearnes
譯者:Snapcrafter
校對(duì):wxy

本文由 LCTT 原創(chuàng)編譯,Linux中國(guó) 榮譽(yù)推出

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容