使用 dnf 進行 Linux 包管理
在計算機系統上安裝應用程序非常簡單:就是將檔案(如 ??.zip?
? 文件)中的文件復制到目標計算機上,放在操作系統預期放應用程序的位置。因為我們中的許多人習慣于使用花哨的安裝“向導”來幫助我們在計算機上安裝軟件,所以這個過程似乎在技術上應該比實際更復雜。
然而,復雜的是,是什么構成了一個程序?用戶認為的單個應用程序實際上包含了分散在操作系統中的軟件庫的各種依賴代碼(例如:Linux 上的 .so 文件、Windows 上的 .dll 文件和 macOS 上的 .dylib 文件)。
為了讓用戶不必擔心這些程序代碼之間的復雜的互相依賴關系, Linux 使用 包管理系統package management system 來跟蹤哪些應用程序需要哪些庫,哪些庫或應用程序有安全或功能更新,以及每個軟件會附帶安裝哪些額外的數據文件。包管理器本質上是一個安裝向導。它們易于使用,提供了圖形界面和基于終端的界面,讓你的生活更輕松。你越了解你的發行版的包管理器,你的生活就會越輕松。
在 Linux 上安裝應用程序
如果你在使用 Linux 桌面時,偶爾想要安裝一個應用程序,那么你可能正在尋找 ??GNOME “軟件”??,它是一個桌面應用程序瀏覽器。
GNOME “軟件” 程序
它會按你的預期工作:點擊它的界面,直到你找到一個看起來有用的應用程序,然后單擊 “安裝” 按鈕。
或者,你可以在 GNOME “軟件” 中打開從網絡下載的 ??.rpm?
?? 或 ??.flatpakref?
? 軟件包,以便它進行安裝。
但如果你更傾向于使用命令行,請繼續閱讀。
用 dnf 搜索軟件
在安裝應用程序之前,你可能需要確認它是否存在于你的發行版的服務器上。通常,使用 ??dnf?
?? 搜索應用程序的通用名稱就足夠了。例如,假設你最近閱讀了 ??一篇關于 Cockpit 的文章???,并決定嘗試一下。你可以搜索 ??cockpit?
? 驗證該發行版是否包含它:
$ dnf search cockpit
Last metadata expiration check: 0:01:46 ago on Tue 18 May 2021 19:18:15 NZST.
==== Name Exactly Matched: cockpit ====
cockpit.x86_64 : Web Console for Linux servers
==== Name & Summary Matched: cockpit ==
cockpit-bridge.x86_64 : Cockpit bridge server-side component
cockpit-composer.noarch : Composer GUI for use with Cockpit
[...]
有一個精確的匹配。上面列出的匹配的軟件包名為 ??cockpit.x86_64?
??,但名稱中的 ??.x86_64?
?? 部分僅表示它兼容該 CPU 架構。默認情況下,你的系統會安裝適配當前 CPU 架構的軟件包,因此你可以忽略該擴展名。所以你確認你要查找的軟件包確實簡稱為 ??cockpit?
?。
現在你可以放心地使用 ??dnf install?
? 安裝它。 此步驟需要管理員權限:
$ sudo dnf install cockpit
一般來說,這就是典型的 ??dnf?
? 工作流:搜索并安裝。
然而,有時 ??dnf search?
?? 的結果并不清晰,或者你想要關于一個軟件包的更多信息,而不僅僅是它的通用名稱。有一些相關的 ??dnf?
? 子命令,具體取決于你想要的信息。
軟件包的元數據
如果你覺得你的搜索已 接近 想要的結果,但還不確定,查看軟件包的元數據通常會有所幫助,例如項目的網址和描述。要獲取此信息,請使用顧名思義的 ??dnf info?
? 命令:
$ dnf info terminator
Available Packages
Name : terminator
Version : 1.92
Release : 2.el8
Architecture : noarch
Size : 526 k
Source : terminator-1.92-2.el8.src.rpm
Repository : epel
Summary : Store and run multiple GNOME terminals in one window
URL : https://github.com/gnome-terminator
License : GPLv2
Description : Multiple GNOME terminals in one window. This is a project to produce
: an efficient way of filling a large area of screen space with
: terminals. This is done by splitting the window into a resizeable
: grid of terminals. As such, you can produce a very flexible
: arrangements of terminals for different tasks.
這個信息告訴你可用軟件包的版本、在你系統中注冊的哪一個存儲庫提供了它、該項目的網站以及詳細的功能描述。
哪個軟件包提供的這個文件?
軟件包名稱并不總是與你要查找的內容相匹配。例如,假設你正在閱讀的文檔告訴你必須安裝名為 ??qmake-qt5?
? 的東西:
$ dnf search qmake-qt5
No matches found.
??dnf?
?? 數據庫非常廣泛,因此你不要局限于搜索完全匹配的內容。你可以使用 ??dnf provides?
? 命令來了解你正在尋找的東西是否作為某個更大的軟件包的一部分而提供:
$ dnf provides qmake-qt5
qt5-qtbase-devel-5.12.5-8.el8.i686 : Development files for qt5-qtbase
Repo : appstream
Matched from:
Filename : /usr/bin/qmake-qt5
qt5-qtbase-devel-5.15.2-3.el8.x86_64 : Development files for qt5-qtbase
Repo : appstream
Matched from:
Filename : /usr/bin/qmake-qt5
可以確認應用程序 ??qmake-qt5?
?? 是名為 ??qt5-qtbase-devel?
?? 的軟件包的一部分。它還告訴你,該應用程序會安裝到 ??/usr/bin?
?,因此你知道了安裝后它的確切位置。
軟件包中包含哪些文件?
有時我發現自己會從完全不同的角度來對待 ??dnf?
?。有時,我已經確認我的系統上安裝了一個應用程序;我只是不知道我是怎么得到它的。還有一些時候,我知道我安裝了一個特定的軟件包,但我不清楚這個軟件包到底在我的系統上安裝了什么。
如果你需要對包的有效負載payload進行 “逆向工程reverse engineer”,可以使用 ??dnf repoquery?
?? 命令和 ??--list?
? 選項。這將查看存儲庫中有關軟件包的元數據,并列出該軟件包提供的所有文件:
$ dnf repoquery --list qt5-qtbase-devel
/usr/bin/fixqt4headers.pl
/usr/bin/moc-qt5
/usr/bin/qdbuscpp2xml-qt5
/usr/bin/qdbusxml2cpp-qt5
/usr/bin/qlalr
/usr/bin/qmake-qt5
/usr/bin/qvkgen
/usr/bin/rcc-qt5
[...]
這些列表可能很長,使用 ??less?
? 或你喜歡的分頁命令配合管道操作會有所幫助。
移除應用程序
如果你決定系統中不再需要某個應用程序,可以使用 ??dnf remove?
? 卸載它,該軟件包本身安裝的文件以及不再需要的任何依賴項都會被移除:
$ dnf remove bigapp
有時,你發現隨著一個應用程序一起安裝的依賴項對后來安裝的其他應用程序也有用。如果兩個包需要相同的依賴項,??dnf remove?
? 不會 刪除依賴項。在安裝和卸載大量應用程序之后,孤兒軟件包散落各處的現象并不少見。大約每年我都要執行一次 ??dnf autoremove?
? 來清除所有未使用的軟件包:
$ dnf autoremove
這不是必需的,但這是一個讓我的電腦感覺更好的大掃除步驟。
了解 dnf
你對包管理器的工作方式了解得越多,在必要時安裝和查詢應用程序就越容易。即便你不是 ??dnf?
? 的重度使用者,當你發現自己與基于 RPM 的發行版交互時,了解它也會很有用。
告別 ??yum?
?? 后,我最喜歡的包管理器之一是 ??dnf?
?? 命令。雖然我不喜歡它的所有子命令,但我發現它是目前最健壯的 包管理系統package management system 之一。 ??下載我們的 dnf 速查表?? 習慣該命令,不要害怕嘗試一些新技巧。一旦熟悉了它,你可能會發現很難使用其他任何東西替代它。