Linux 包管理器比較:dnf 和 apt
- 包管理器提供大致相同的功能:安裝、管理和移除應(yīng)用,但是它們還是有一些不一樣的地方。
 
在 Linux 系統(tǒng)上獲取一個(gè)應(yīng)用 有多種方式。例如,有新的 Flatpak 和容器方式,也有 DEB 和 RPM 這樣一直以來(lái)經(jīng)過(guò)考驗(yàn)的方式。
并沒(méi)有一種通用的可以用于所有的操作系統(tǒng)的應(yīng)用安裝程序。如今,因?yàn)橛袩o(wú)數(shù)的開(kāi)發(fā)者發(fā)布軟件,這導(dǎo)致了大部分的操作系統(tǒng)使用了應(yīng)用商店(包括第一方和第三方)、拖放式安裝,還有安裝向?qū)?。不同的開(kāi)發(fā)者對(duì)于他們發(fā)布的代碼有不同的需求,這直接導(dǎo)致了他們所選擇的安裝方式的不同。
Linux 開(kāi)創(chuàng)了一種通過(guò)命令行安裝、管理、移除應(yīng)用的包管理器的概念。apt 和 dnf 就是兩種較為常見(jiàn)的包管理器。apt 命令是用來(lái)管理 DEB 格式的包,dnf 命令是用來(lái)管理 RPM 格式的包。這兩種包管理器在理論上并不是完全互斥的,盡管在實(shí)際的實(shí)踐中,Linux 發(fā)行版通常只會(huì)使用到其中的一種。理論上,這兩種命令可以運(yùn)行在同一個(gè)系統(tǒng)上,但是會(huì)造成安裝包的重疊,版本控制也會(huì)更加困難,命令也會(huì)是冗余的。然而,如果你是在一個(gè)混合的 Linux 環(huán)境下工作,比如你的工作站運(yùn)行的是一個(gè)發(fā)行版,同時(shí)需要與運(yùn)行另外一種發(fā)行版的服務(wù)器進(jìn)行交互,那么你最好同時(shí)掌握這兩種包管理器。
搜索應(yīng)用
當(dāng)你通過(guò)包管理器安裝一個(gè)應(yīng)用時(shí),你需要先知道包的名稱(chēng)。通常,應(yīng)用的名稱(chēng)和包的名稱(chēng)是一樣的。dnf 和 apt 驗(yàn)證要安裝的包名的過(guò)程是完全相同的。
- $ sudo dnf search zsh
 - ====== Name Exactly Matched: zsh ======
 - zsh.x86_64 : Powerful interactive shell
 - [...]
 
使用 apt:
- $ sudo apt search zsh
 - Sorting... Done
 - Full Text Search... Done
 - csh/stable 20110502-4+deb10u1 amd64
 - Shell with C-like syntax
 - ddgr/stable 1.6-1 all
 - DuckDuckGo from the terminal
 - direnv/stable 2.18.2-2 amd64
 - Utility to set directory specific environment variables
 - draai/stable 20180521-1 all
 - Command-line music player for MPD
 - [...]
 
如果想通過(guò) apt 更快的獲取相關(guān)的搜索結(jié)果,你可以使用 正則表達(dá)式:
- apt search ^zsh
 - Sorting... Done
 - Full Text Search... Done
 - zsh/stable 5.7.1-1 amd64
 - shell with lots of features
 - [...]
 
查找應(yīng)用程序包
有一些命令是與其它命令捆綁在一起的,都在一個(gè)包中。在這種情況下,你可以通過(guò)包管理器去了解哪個(gè)包提供了你需要的命令。dnf 和 apt 命令在如何搜索這類(lèi)元數(shù)據(jù)上是有區(qū)別的。
使用 dnf:
- $ sudo dnf provides pgrep
 - procps-ng-3.3.15-6.el8.x86_64 : System and process monitoring utilities
 - Repo : baseos
 - Matched from:
 - Filename : /usr/bin/pgrep
 
apt 命令使用子命令 apt-file。要使用 apt-file,你必須先安裝它,然后提示它更新緩存:
- $ sudo apt install apt-file
 - Reading package lists... Done
 - Building dependency tree
 - Reading state information... Done
 - The following additional packages will be installed:
 - libapt-pkg-perl libexporter-tiny-perl liblist-moreutils-perl libregexp-assemble-perl
 - The following NEW packages will be installed:
 - apt-file libapt-pkg-perl libexporter-tiny-perl liblist-moreutils-perl libregexp-assemble-perl
 - 0 upgraded, 5 newly installed, 0 to remove and 14 not upgraded.
 - Need to get 297 kB of archives.
 - After this operation, 825 kB of additional disk space will be used.
 - Do you want to continue? [Y/n] y
 - $ sudo apt-file update
 - [...]
 
你可以通過(guò) apt-file 搜索命令。你可以使用此命令進(jìn)行廣泛的全局搜索,但假如你知道命令的執(zhí)行路徑,它會(huì)更準(zhǔn)確:
- $ sudo apt-file search /usr/bin/pgrep
 - pgreplay: /usr/bin/pgreplay
 - procps: /usr/bin/pgrep
 
安裝應(yīng)用程序
使用apt 和 dnf 安裝應(yīng)用程序基本上是相同的:
- $ sudo apt install zsh
 
使用 dnf,你可以使用同樣的方式來(lái)安裝一個(gè)包:
- $ sudo dnf install zsh
 
許多基于 RPM 的發(fā)行版都具有組包安裝的特性,它會(huì)將有時(shí)表面相關(guān)的應(yīng)用程序收集到一個(gè)易于安裝的目標(biāo)中。例如,F(xiàn)edora 中的 Design Suite 組包就包含流行的創(chuàng)意應(yīng)用程序。那些想要某一個(gè)創(chuàng)意應(yīng)用程序的藝術(shù)家可能也想要類(lèi)似的應(yīng)用程序,選擇安裝一整個(gè)組包一個(gè)簡(jiǎn)單而快速的方法,可以合理地開(kāi)始建立一個(gè)數(shù)字工作室。你可以通過(guò) group list 來(lái)查看可用的組包(使用 -v 來(lái)查看不帶空格的組名):
- $ sudo dnf group list -v
 - [...]
 - Available Groups:
 - Container Management (container-management)
 - RPM Development Tools (rpm-development-tools)
 - Design Suite (design-suite)
 - Development Tools (development)
 - [...]
 
使用 group install 子命令安裝 RPM 組包:
- $ sudo dnf group install design-suite
 
你可以使用 @ 符號(hào)來(lái)減少輸入:
- $ sudo dnf install @design-suite
 
更新應(yīng)用程序
使用包管理器的一個(gè)優(yōu)點(diǎn)是,它知道所有已經(jīng)安裝的應(yīng)用。這樣你不必去尋找應(yīng)用程序的更新版本。相反,你可以通過(guò)包管理器去獲取更新的版本。
dnf 和 apt 使用的子命令略有不同。因?yàn)?apt 保存了一個(gè)需要定期更新的緩存信息,它使用 upgrade 子命令來(lái)更新應(yīng)用程序:
- $ sudo apt upgrade
 
相比之下,dnf 命令在你每次使用時(shí)都會(huì)更新元信息,所以 update 和 upgrade 子命令是可以互換的:
- $ sudo dnf upgrade
 
這等同于:
- $ sudo dnf update
 
移除應(yīng)用程序
如果你曾經(jīng)嘗試在任何一個(gè)平臺(tái)上手動(dòng)刪除一個(gè)應(yīng)用程序,你就會(huì)知道,應(yīng)用程序刪除后,在硬盤(pán)上會(huì)殘留各種文件,比如首選項(xiàng)文件、數(shù)據(jù)或圖標(biāo)。所以包管理器的另一個(gè)優(yōu)點(diǎn)是,包管理器管理著包中安裝的每一個(gè)文件,可以很方便的刪除:
- $ sudo dnf remove zsh
 
remove 子命令也適用于 apt:
- $ sudo apt remove zsh
 
使用 apt 命令刪除一個(gè)包并不會(huì)刪除已修改的用戶(hù)配置文件,以防你意外刪除了包。如果你想通過(guò) apt 命令刪除一個(gè)應(yīng)用及其配置文件,請(qǐng)?jiān)谀阒皠h除過(guò)的應(yīng)用程序上使用 purge 子命令:
- $ sudo apt purge zsh
 
apt 和 dnf 都不會(huì)刪除家目錄中的數(shù)據(jù)和配置文件(即使使用 purge 子命令)。如果想要從家目錄中刪除數(shù)據(jù),你必須手動(dòng)操作(通常你可以在 ~/.config 和 ~/.local 文件中找到)。
了解包管理
無(wú)論你選擇的發(fā)行版支持的是 apt 還是 dnf,這些命令的用途大致相同。它們可以幫助你安裝、更新和移除包。這兩種包管理器是目前最通用的包管理器。它們的語(yǔ)法元素在很大程度上是相同的,所以在兩者之間切換非常容易。
apt 和 dnf 還有一些高級(jí)功能,例如倉(cāng)庫(kù)管理,但這些功能并不像你使用 search 和 install 那樣頻繁。
無(wú)論你更經(jīng)常使用哪種包管理器,你都可以下載我們的 apt 備忘單 和 dnf 備忘單,以便你在最需要的時(shí)候可以查詢(xún)使用語(yǔ)法。















 
 
 







 
 
 
 