在 Linux 各大發行版中,對於安裝軟體這件事都有自己的管理方式,我們在 Linux 中要安裝軟體通常不會使用 "軟體" 這個詞,更多時候會使用 "套件" 來表示。
在 Enterprise Linux 系列發行版裡,最小的套件管理格式為 RPM 格式,有一個同名的管理指令為 rpm
。
rpm 是一個套件管理系統,它允許我們安裝、升級、配置或者移除軟體套件。與直接從來源碼編譯軟體相比,使用 RPM 等套件管理系統更為方便和高效。
RPM 是一個套件封裝格式,使用 rpm
來管理它,這是我們已經知道了。RPM 記載著這個套件的資訊、版本以及 "相依套件"。
假設有一個套件為 foo.rpm,我們可以使用 rpm 來安裝它:
student$ sudo rpm -ivh foo.rpm
此時 foo.rpm
可能會有相信性問題,比如他出現錯誤告訴我們需要 bar
套件,此時我們就要先處理 bar
之後再重新安裝 foo.rpm
,對於這種安裝流程會有很多困擾,尤其是在多層相依時更為嚴重。
以下為一個安裝 httpd
套件時遇到相依問題的案例:
student$ sudo rpm -ivh httpd-2.4.53-11.el9_2.5.x86_64.rpm
error: Failed dependencies:
httpd-core = 0:2.4.53-11.el9_2.5 is needed by httpd-2.4.53-11.el9_2.5.x86_64
system-logos-httpd is needed by httpd-2.4.53-11.el9_2.5.x86_64
然而,rpm
有一個明顯的缺點,就是上述的相依性問題。如果某個 RPM 套件依賴於其他套件,rpm
並不會自動解決這種相依性。這就是 yum
(Yellowdog Updater, Modified)出現的原因。yum
可以自動解決相依性問題,並且它還能從各種軟體倉庫(Repositories)中下載和安裝套件,這大大簡化了套件管理過程。
透過 yum 這個方便工具,我們可以使用下列方式安裝 foo
套件。
參考操作方式如下:
student$ yum install foo
隨著軟體和需求的發展,資訊科技界開始需要更高效和靈活的套件管理工具。尤其是在處理多版本和模組化需求時,yum
已經無法滿足這些需求。於是 dnf
(Dandified YUM)應運而生。它不僅更快,更高效,也支持模組化的套件管理。dnf
最初在 Fedora 中被採用,後來也被引入到 Enterprise Linux 8 中。
dnf
是 yum
的下一代版本,基本上與 yum 的命令行參數是相容的,也代表說在 yum
使用的指令在 dnf
大多也可以繼續使用。
如上一例的說明,若要安裝 foo
套件的話,我們在 dnf 中可以這麼做:
student$ dnf install foo
不論是使用 yum
還是 dnf
,這些工具的核心目的都是為了更有效地管理 RPM 套件。這些高階工具解決了 rpm 所面臨的相依性問題,並引入了更多進階功能,如模組化管理和自動更新。
因此,對於任何使用 Enterprise Linux 的系統管理員來說,熟悉這些套件管理工具是非常重要的。這不僅能簡化管理過程,也能確保系統的穩定性和安全性。
雖然現在已經有 yum/dnf 等工具,但是身為一位稱職的系統管理員來仍然需要瞭解 RPM 的基本管理方式,以便在除錯、離線管理或查詢時有更精準的操作。
以下簡單示範使用 rpm 管理方法:
安裝 foo.rpm。
root# rpm -ivh foo.rpm
查詢系統有哪些 已安裝套件,並顯示前 10 項。
student$ sudo rpm -qa | head
libgcc-11.2.1-9.4.el9.x86_64
linux-firmware-whence-20220209-126.el9_0.noarch
crypto-policies-20220223-1.git5203b41.el9_0.1.noarch
tzdata-2022a-1.el9_0.noarch
linux-firmware-20220209-126.el9_0.noarch
gawk-all-langpacks-5.1.0-6.el9.x86_64
libssh-config-0.9.6-3.el9.noarch
libreport-filesystem-2.15.2-6.el9.rocky.0.2.noarch
dnf-data-4.10.0-5.el9_0.noarch
ncurses-base-6.2-8.20210508.el9.noarch
已知某一檔案 /usr/lib64/libxml2.so.2,欲查出是屬於哪一套件。
student$ sudo rpm -qf /usr/lib64/libxml2.so.2
libxml2-2.9.13-1.el9.x86_64
在 apr-1.7.0-11.el9.x86_64.rpm 裡,在安裝前先列出有哪些檔案會被安裝。
student$ sudo rpm -ql apr-1.7.0-11.el9.x86_64.rpm
/usr/lib/.build-id
/usr/lib/.build-id/09
/usr/lib/.build-id/09/3f313c88fe52caaeae081468e3bce56ac01d8f
/usr/lib64/libapr-1.so.0
/usr/lib64/libapr-1.so.0.7.0
/usr/share/doc/apr
/usr/share/doc/apr/CHANGES
/usr/share/doc/apr/LICENSE
/usr/share/doc/apr/NOTICE
/usr/share/doc/apr/README
/usr/share/doc/apr/README.cmake
/usr/share/doc/apr/README.deepbind
/usr/share/doc/apr/README.deepbind.deepbind
查出系統中 kernel 套件,其修改的記錄,顯示前 10 行。
student$ sudo rpm -q --changelog kernel | head
* Tue May 17 2022 Release Engineering <releng@rockylinux.org> - 5.14.0-70.13.1
- Porting to 9.0, debranding and Rocky branding with new release pkg (Sherif Nagy)
- Porting to 9.0, debranding and Rocky branding (Louis Abel)
* Thu Apr 14 2022 Herton R. Krzesinski <herton@redhat.com> [5.14.0-70.13.1.el9_0]
- redhat: disable uncommon media device infrastructure (Jarod Wilson) [2074598]
- netfilter: nf_tables: unregister flowtable hooks on netns exit (Florian Westphal) [2056869]
- netfilter: nf_tables_offload: incorrect flow offload action array size (Florian Westphal) [2056869] {CVE-2022-25636}
- netfilter: nf_tables: validate registers coming from userspace. (Phil Sutter) [2065350] {CVE-2022-1015}
- scsi: qedi: Fix failed disconnect handling (Chris Leech) [2071524]
透過上述示範,可以應用在套件查詢的作業上。