Linux 包管理基礎: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-get
和 apt-cache
命令處理的常見操作。這個命令是可選的,但使用它可以簡化一些任務。
CentOS、Fedora 和其它 Red Hat 家族成員使用 RPM 檔案。在 CentOS 中,透過 yum
來與單獨的包檔案和儲存庫進行互動。
在最近的 Fedora 版本中,yum
已經被 dnf
取代,dnf
是它的一個現代化的分支,它保留了大部分 yum
的介面。
FreeBSD 的二進位制包系統由 pkg
命令管理。FreeBSD 還提供了 Ports
集合,這是一個存在於本地的目錄結構和工具,它允許使用者獲取原始碼後使用 Makefile 直接從原始碼編譯和安裝包。
更新包列表
大多數系統在本地都會有一個和遠端儲存庫對應的包資料庫,在安裝或升級包之前最好更新一下這個資料庫。另外,yum
和 dnf
在執行一些操作之前也會自動檢查更新。當然你可以在任何時候對系統進行更新。
系統 | 命令 |
---|---|
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 系統上,yum
和 dnf
用於安裝單個的檔案,並且會處理需要的依賴。
系統 | 命令 | 說明 |
---|---|---|
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-get
和 apt-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-get
和 apt-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 集合一起工作 |
結論和進一步的閱讀
本指南透過對多個系統間進行交叉對比概述了一下包管理系統的基本操作,但只涉及了這個複雜主題的表面。對於特定系統更詳細的資訊,可以參考以下資源:
- 這份指南 詳細介紹了 Ubuntu 和 Debian 的軟體包管理。
- 這裡有一份 CentOS 官方的指南 使用 yum 管理軟體
- 這裡有一個有關 Fedora 的
dnf
的 wiki 頁面 以及一份有關dnf
官方的手冊 - 這份指南 講述瞭如何使用
pkg
在 FreeBSD 上進行包管理 - 這本 FreeBSD Handbook 有一節講述了如何使用 Ports 集合
via: https://www.digitalocean.com/community/tutorials/package-management-basics-apt-yum-dnf-pkg
譯者後記:
從經典的 configure
&& make
&& make install
三部曲到 dpkg
,從需要手處理依賴關係的 dpkg
到全自動化的 apt-get
,恩~,你有沒有想過接下來會是什麼?譯者只能說可能會是 Snaps
,如果你還沒有聽過這個東東,你也許需要關注下這個公眾號了:Snapcraft
作者:Brennen Bearnes 譯者:Snapcrafter 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
相關文章
- 包管理工具apt-get和yum的區別apt-get
- 【Linux】apt軟體管理和遠端登入LinuxAPT
- Linux中wget、yum與apt-get用法及區別Linuxwgetapt-get
- linux 基礎(10)程式管理Linux
- Linux網路管理基礎Linux
- linux 基礎(7)賬號和群組的管理Linux
- Linux中如何透過yum或者apt下載安裝MySQLLinuxAPTMySql
- Linux dnf 包管理工具使用教程Linux
- linux下使用yum upgrade軟體包Linux
- Linux基礎之網路管理Linux
- Linux基礎之檔案管理Linux
- Linux基礎命令---管理組gpasswdLinux
- 如何使用 apt 進行 Linux 包管理APTLinux
- 如何在 Linux 上使用 dnf 命令安裝軟體包?Linux
- Linux基礎之許可權管理Linux
- Linux基礎入門:⑥Linux常見壓縮工具及程式包安裝及管理方式Linux
- 【JS基礎】作用域和閉包JS
- javascript 基礎(作用域和閉包)JavaScript
- 系列教程--Linux基礎--05--Linux 檔案管理Linux
- yum/dnf/rpm 等 檢視rpm 包安裝路徑 (fedora 中 pygtk 包內容安裝到哪裡了)
- pkg cache stmt包羅永珍
- Linux(9)-遠端登入Linux系統以及apt管理LinuxAPT
- Linux 基礎-檔案及目錄管理Linux
- linux核心基礎-系統服務管理Linux
- Linux基礎命令---mail郵件管理程式LinuxAI
- Linux基礎命令---smbpasswd管理samba密碼LinuxSamba密碼
- Linux yum 包管理工具使用教程Linux
- linux的yum軟體包管理器Linux
- apt 和 dkpg 包管理工具APT
- Linux和Windows有啥區別?Linux基礎LinuxWindows
- linux 基於YUM方式部署MYSQL8.0LinuxMySql
- Linux磁碟管理基礎知識全彙總Linux
- Linux中apt和apt-get命令有什麼區別?如何使用?Linuxapt-get
- git的工作管理和基礎操作Git
- apt-get——Debian Linux發行版中的APT軟體包管理工具apt-getLinux
- linux 中 yum makecache 、yum update、yum upgrade的作用Linux
- linux基礎Linux
- 配置RHEL8本地yum源及DNF簡介
- Linux基礎之使用者和組Linux