包管理基礎:apt、yum、dnf 和 pkg

包管理基礎
包管理基礎

介紹

大多數現代的類 Unix 操作系統都提供了一種中心化的機制用來搜索和安裝軟件。軟件通常都是存放在存儲庫中,并通過包的形式進行分發。處理包的工作被稱為包管理。包提供了操作系統的基本組件,以及共享的庫、應用程序、服務和文檔。

包管理系統除了安裝軟件外,它還提供了工具來更新已經安裝的包。包存儲庫有助于確保你的系統中使用的代碼是經過審查的,并且軟件的安裝版本已經得到了開發人員和包維護人員的認可。

在配置服務器或開發環境時,我們最好了解下包在官方存儲庫之外的情況。某個發行版的穩定版本中的包有可能已經過時了,尤其是那些新的或者快速迭代的軟件。然而,包管理無論對于系統管理員還是開發人員來說都是至關重要的技能,而已打包的軟件對于主流 Linux 發行版來說也是一筆巨大的財富。

本指南旨在快速地介紹下在多種 Linux 發行版中查找、安裝和升級軟件包的基礎知識,并幫助您將這些內容在多個系統之間進行交叉對比。

包管理系統:簡要概述

大多數包系統都是圍繞包文件的集合構建的。包文件通常是一個存檔文件,它包含已編譯的二進制文件和軟件的其他資源,以及安裝腳本。包文件同時也包含有價值的元數據,包括它們的依賴項,以及安裝和運行它們所需的其他包的列表。

雖然這些包管理系統的功能和優點大致相同,但打包格式和工具卻因平臺而異:

操作系統 格式 工具
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 這款先進的包管理工具提供了大多數常見的操作命令:搜索存儲庫、安裝軟件包及其依賴項,并管理升級。在本地系統中,我們還可以使用 dpkg 程序來安裝單個的 deb 文件,APT 命令作為底層 dpkg 的前端,有時也會直接調用它。

最近發布的 debian 衍生版大多數都包含了 apt 命令,它提供了一個簡潔統一的接口,可用于通常由 apt-getapt-cache 命令處理的常見操作。這個命令是可選的,但使用它可以簡化一些任務。

CentOS、Fedora 和其它 Red Hat 家族成員使用 RPM 文件。在 CentOS 中,通過 yum 來與單獨的包文件和存儲庫進行交互。

在最近的 Fedora 版本中,yum 已經被 dnf 取代,dnf 是它的一個現代化的分支,它保留了大部分 yum 的接口。

FreeBSD 的二進制包系統由 pkg 命令管理。FreeBSD 還提供了 Ports 集合,這是一個存在于本地的目錄結構和工具,它允許用戶獲取源碼后使用 Makefile 直接從源碼編譯和安裝包。

更新包列表

大多數系統在本地都會有一個和遠程存儲庫對應的包數據庫,在安裝或升級包之前最好更新一下這個數據庫。另外,yumdnf 在執行一些操作之前也會自動檢查更新。當然你可以在任何時候對系統進行更新。

系統 命令
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

更新已安裝的包

在沒有包系統的情況下,想確保機器上所有已安裝的軟件都保持在最新的狀態是一個很艱巨的任務。你將不得不跟蹤數百個不同包的上游更改和安全警報。雖然包管理器并不能解決升級軟件時遇到的所有問題,但它確實使你能夠使用一些命令來維護大多數系統組件。

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

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

搜索某個包

大多數發行版都提供針對包集合的圖形化或菜單驅動的工具,我們可以分類瀏覽軟件,這也是一個發現新軟件的好方法。然而,查找包最快和最有效的方法是使用命令行工具進行搜索。

系統 命令 說明
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 通過名字進行搜索
pkg search -f search_string 通過名字進行搜索并返回完整的描述
pkg search -D search_string 搜索描述
FreeBSD Ports cd /usr/ports && make search name=package 通過名字進行搜索
cd /usr/ports && make search key=search_string 搜索評論、描述和依賴

查看某個軟件包的信息

在安裝軟件包之前,我們可以通過仔細閱讀包的描述來獲得很多有用的信息。除了人類可讀的文本之外,這些內容通常包括像版本號這樣的元數據和包的依賴項列表。

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

從存儲庫安裝包

知道包名后,通常可以用一個命令來安裝它及其依賴。你也可以一次性安裝多個包,只需將它們全部列出來即可。

系統 命令 說明
Debian / Ubuntu sudo apt-get install package
sudo apt-get install package1 package2 ... 安裝所有列出來的包
sudo apt-get install -y package apt 提示是否繼續的地方直接默認 yes
sudo apt install package 顯示一個彩色的進度條
CentOS sudo yum install package
sudo yum install package1 package2 ... 安裝所有列出來的包
sudo yum install -y package yum 提示是否繼續的地方直接默認 yes
Fedora sudo dnf install package
sudo dnf install package1 package2 ... 安裝所有列出來的包
sudo dnf install -y package dnf 提示是否繼續的地方直接默認 yes
FreeBSD Packages sudo pkg install package
sudo pkg install package1 package2 ... 安裝所有列出來的包
FreeBSD Ports cd /usr/ports/category/port && sudo make install 從源碼構建安裝一個 port

從本地文件系統安裝一個包

對于一個給定的操作系統,有時有些軟件官方并沒有提供相應的包,那么開發人員或供應商將需要提供包文件的下載。你通常可以通過 web 瀏覽器檢索這些包,或者通過命令行 curl 來檢索這些信息。將包下載到目標系統后,我們通常可以通過單個命令來安裝它。

在 Debian 派生的系統上,dpkg 用來處理單個的包文件。如果一個包有未滿足的依賴項,那么我們可以使用 gdebi 從官方存儲庫中檢索它們。

在 CentOS 和 Fedora 系統上,yumdnf 用于安裝單個的文件,并且會處理需要的依賴。

系統 命令 說明
Debian / Ubuntu sudo dpkg -i package.deb
sudo apt-get install -y gdebi && sudo gdebi package.deb 安裝 gdebi,然后使用 gdebi 安裝 package.deb 并處理缺失的依賴
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 即使已經安裝的包也會重新安裝

刪除一個或多個已安裝的包

由于包管理器知道給定的軟件包提供了哪些文件,因此如果某個軟件不再需要了,它通常可以干凈利落地從系統中清除這些文件。

系統 命令 說明
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 家族發行版的管理員通常熟悉 apt-getapt-cache。較少為人所知的是簡化的 apt 接口,它是專為交互式使用而設計的。

傳統命令 等價的 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 通常是一個特定操作的快捷方式,但它并不能完全替代傳統的工具,它的接口可能會隨著版本的不同而發生變化,以提高可用性。如果你在腳本或 shell 管道中使用包管理命令,那么最好還是堅持使用 apt-getapt-cache

獲取幫助

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

man page

man 中,你可以用箭頭鍵導航。按 / 搜索頁面內的文本,使用 q 退出。

系統 命令 說明
Debian / Ubuntu man apt-get 更新本地包數據庫以及與包一起工作
man apt-cache 在本地的包數據庫中搜索
man dpkg 和單獨的包文件一起工作以及能查詢已安裝的包
man apt 通過更簡潔,用戶友好的接口進行最基本的操作
CentOS man yum
Fedora man dnf
FreeBSD Packages man pkg 和預先編譯的二進制包一起工作
FreeBSD Ports man ports 和 Ports 集合一起工作

結論和進一步的閱讀

本指南通過對多個系統間進行交叉對比概述了一下包管理系統的基本操作,但只涉及了這個復雜主題的表面。對于特定系統更詳細的信息,可以參考以下資源:


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

此文由 Snapcraft 公眾號翻譯,歡迎關注 : )

作者:Brennen Bearnes
譯者:Snapcrafter
校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容

  • http://blog.csdn.net/mathewsking/article/details/8211273 ...
    liuboxx1閱讀 6,089評論 1 1
  • Ubuntu的發音 Ubuntu,源于非洲祖魯人和科薩人的語言,發作 oo-boon-too 的音。了解發音是有意...
    螢火蟲de夢閱讀 99,449評論 9 467
  • Linux 程序包管理 linux系統中的諸多程序都是由源代碼編譯或者由二次發行商選擇性編譯分布,其大部分的程序安...
    魏鎮坪閱讀 5,841評論 1 8
  • title: dnf 入門指南id: 75categories: linux的學習記錄date: 2015-08-...
    jeffleefree閱讀 1,212評論 0 6
  • 這樣的少年,我忽然間就想到了這句歌詞"你呀你"。像在某個不經意的時刻聽到一首還挺舒服的歌曲,旋律留在了腦海里,...
    陳貳九閱讀 559評論 15 1