萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

YUM/DNF 包管理完全指南:配置倉庫、安裝更新、依賴解決、模組化串流與離線部署

YUM 到 DNF 的演進

  • YUM (Yellowdog Updater, Modified):Python 2 時代產物,CentOS 7/RHEL 7 主力。
  • DNF (Dandified YUM):C++/Python 3 重寫,解決依賴解析效能差、記憶體佔用高、API 不穩定等問題。Fedora 18+、CentOS 8+/RHEL 8+、openSUSE 預設。**命令參數高度兼容**,習慣不變,體驗更快。

倉庫配置:/etc/yum.repos.d/*.repo

[baseos]
name=CentOS Stream $releasever - BaseOS
baseurl=https://mirrors.aliyun.com/centos-stream/$releasever/BaseOS/$basearch/os/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
# metadata_expire=6h  # 元數據緩存過期時間

[appstream]
name=CentOS Stream $releasever - AppStream
baseurl=https://mirrors.aliyun.com/centos-stream/$releasever/AppStream/$basearch/os/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[epel]
name=EPEL $releasever
baseurl=https://mirrors.aliyun.com/epel/$releasever/Everything/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever

關鍵指令:yum repolist all (列出所有倉庫)、yum makecache (預下載元數據)、yum clean all (清理緩存)。

核心操作指令速查

任務命令 (DNF/YUM 通用)說明
安裝套件dnf install nginx自動解決依賴
安裝本地 RPMdnf install ./package.rpm自動解決本地包依賴
移除套件dnf remove nginx移除包及無用依賴 (autoremove 邏輯)
徹底清除含配置dnf erase nginx / dnf remove --setopt=clean_requirements_on_remove=1 nginx
升級全系統dnf upgrade / dnf update同義,升級所有
升級指定包dnf upgrade kernel
降級包dnf downgrade package-1.0回滾版本
搜尋包dnf search keyword名稱/摘要搜尋
查看包詳情dnf info nginx
列出已安裝dnf list installed
列出可升級dnf list updates
查詢檔案歸屬dnf provides /usr/bin/nginx反向查找
查看依賴樹dnf repoquery --requires --resolve nginx遞歸依賴
查看反向依賴dnf repoquery --whatrequires nginx誰依賴它
清理緩存dnf clean allpackages, metadata, expire-cache
查看事務歷史dnf history含回滾 ID
回滾事務dnf history undo 撤銷指定事務
重新安裝dnf reinstall nginx修復損壞檔案
下載不安裝dnf download nginx獲取 RPM 檔案

模組化串流 : 同一軟體多版本共存

RHEL 8+/CentOS Stream/Fedora 引入 AppStream 倉庫,以模組形式提供多版本軟體 (如 Node.js, Python, PostgreSQL, Maven, PHP)。

# 列出可用模組
dnf module list nodejs
# 輸出: nodejs 10, 12, 14, 16, 18 [d][e] ... (d=default, e=enabled)

# 安裝特定版本串流 (配置檔自動處理依賴)
dnf module install nodejs:18/common
dnf module install php:8.1
dnf module install postgresql:15/server

# 切換串流 (先重置)
dnf module reset nodejs
dnf module install nodejs:20

# 查看模組內容
dnf module info nodejs:18

離場/內網環境部署策略

1. 建立本地鏡像倉庫

# 掛載 ISO 或同步遠程倉庫
reposync --repoid=baseos --repoid=appstream --repoid=epel -p /var/www/html/repos --download-metadata --newest-only
createrepo_c /var/www/html/repos/baseos
createrepo_c /var/www/html/repos/appstream
# 客戶端 repo 檔指向 baseurl=https://local-mirror/repos/baseos

2. 下載套件及所有依賴 (離線安裝包)

# 下載 nginx 及所有遞歸依賴到 ./offline_pkgs
dnf download --resolve --destdir=./offline_pkgs nginx

# 目標機離線安裝
dnf install ./offline_pkgs/*.rpm

3. 構建自定義 RPM (簡單修改/回傳上游)

dnf install rpm-build rpmdevtools
rpmdev-setuptree
# 獲取源碼 RPM (SRPM)
dnf download --source nginx
rpm -ivh nginx-*.src.rpm
# 編輯 ~/rpmbuild/SPECS/nginx.spec
rpmbuild -ba ~/rpmbuild/SPECS/nginx.spec
# 產出: ~/rpmbuild/RPMS/x86_64/nginx-*.rpm

常見問題排查

  • Metadata 過期/報錯:dnf clean all && dnf makecache
  • GPG 簽名驗證失敗:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-* 或臨時 --nogpgcheck。
  • 依賴衝突/檔案衝突:dnf install --allowerasing pkg (允許移除衝突包)、dnf install --skip-broken (跳過有問題包)。
  • 鎖定版本不升級:dnf versionlock add nginx (需 dnf-plugins-core),配置文件 /etc/dnf/plugins/versionlock.list。
  • 排除特定包升級:dnf upgrade --exclude=kernel* 或 exclude=kernel* in /etc/dnf/dnf.conf。

總結

DNF/YUM 是 RPM 系系統的生命線。掌握倉庫配置優化 (換源)、模組化串流選版、事務歷史回滾、離線部署技巧、依賴關係查詢,能將軟體管理從「被動修補」轉為「主動可控」。

copyright © 萬盛學電腦網 all rights reserved