iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

套件管理需求

在 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

相依性與 YUM

然而,rpm 有一個明顯的缺點,就是上述的相依性問題。如果某個 RPM 套件依賴於其他套件,rpm 並不會自動解決這種相依性。這就是 yum(Yellowdog Updater, Modified)出現的原因。yum 可以自動解決相依性問題,並且它還能從各種軟體倉庫(Repositories)中下載和安裝套件,這大大簡化了套件管理過程。

透過 yum 這個方便工具,我們可以使用下列方式安裝 foo 套件。

參考操作方式如下:

student$ yum install foo

DNF 與模組化需求

隨著軟體和需求的發展,資訊科技界開始需要更高效和靈活的套件管理工具。尤其是在處理多版本和模組化需求時,yum 已經無法滿足這些需求。於是 dnf(Dandified YUM)應運而生。它不僅更快,更高效,也支持模組化的套件管理。dnf 最初在 Fedora 中被採用,後來也被引入到 Enterprise Linux 8 中。

dnfyum 的下一代版本,基本上與 yum 的命令行參數是相容的,也代表說在 yum 使用的指令在 dnf 大多也可以繼續使用。

如上一例的說明,若要安裝 foo 套件的話,我們在 dnf 中可以這麼做:

student$ dnf install foo

演進結果

不論是使用 yum 還是 dnf,這些工具的核心目的都是為了更有效地管理 RPM 套件。這些高階工具解決了 rpm 所面臨的相依性問題,並引入了更多進階功能,如模組化管理和自動更新。

因此,對於任何使用 Enterprise Linux 的系統管理員來說,熟悉這些套件管理工具是非常重要的。這不僅能簡化管理過程,也能確保系統的穩定性和安全性。

RPM 基本管理方法

雖然現在已經有 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]
    

透過上述示範,可以應用在套件查詢的作業上。


上一篇
Day 25: 設定網路組態
下一篇
Day 27: 使用 dnf 管理套件
系列文
Linux 升華:初學者的探索到專家的洞察30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言