ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux软件包管理:从RPM到DNF的全面指南

Linux软件包管理:从RPM到DNF的全面指南 1. Linux软件包管理基础认知第一次接触Linux系统时最让我困惑的就是软件安装方式与Windows完全不同。在Windows里我们习惯下载exe安装包双击运行而在Linux世界则需要掌握一套全新的软件包管理体系。经过多年运维工作我总结出Linux软件包管理的几个核心特点首先Linux软件包通常以包(package)的形式存在包含了预编译的二进制文件、配置文件、文档和依赖关系信息。这与Windows的独立安装程序有本质区别。主流的包格式分为两大阵营Red Hat系的RPM包和Debian系的DEB包。我们今天重点讨论的是RPM体系这也是CentOS、Fedora、RHEL等发行版的基础。关键认知Linux软件包不是独立存在的它们之间存在复杂的依赖关系树。安装A软件可能需要先安装B和C库这就是包管理器存在的核心价值。现代Linux发行版都提供了高级包管理工具来简化这一过程yum (Yellowdog Updater Modified)RHEL/CentOS 7及之前版本的主要工具dnf (Dandified YUM)yum的下一代替代品Fedora 22/RHEL 8默认使用zypperSUSE系的包管理器aptDebian/Ubuntu系的解决方案2. RPM包管理深度解析2.1 RPM基础命令实战RPM(Red Hat Package Manager)是Linux世界最古老的包管理系统之一其核心命令rpm虽然逐渐被dnf/yum取代但仍是系统管理员必须掌握的底层工具。以下是几个最常用的场景查询已安装包# 查看系统所有已安装包 rpm -qa # 查询特定软件是否安装如查看vim rpm -q vim # 显示包的详细信息以openssh为例 rpm -qi openssh-server # 列出包安装的文件查看nginx安装了哪些文件 rpm -ql nginx安装本地RPM包rpm -ivh package.rpm这里的参数含义-i安装模式-v显示详细输出-h显示进度条升级已有包rpm -Uvh new-version.rpm-U参数表示升级(Upgrade)如果包未安装则会自动转为安装操作。卸载软件包rpm -e package-name注意这里只需要包名而不需要.rpm后缀。2.2 RPM的典型问题与解决在实际运维中RPM操作经常会遇到以下问题依赖地狱(Dependency Hell)error: Failed dependencies: libssl.so.1.1()(64bit) is needed by packageA-1.0-1.el8.x86_64 libcrypto.so.1.1()(64bit) is needed by packageA-1.0-1.el8.x86_64这是RPM最令人头疼的问题。传统解决方法是通过--nodeps强制安装但这会导致系统不稳定。正确的做法是使用高级包管理器(dnf/yum)来自动解决依赖。签名验证失败error: package.rpm: Header V3 RSA/SHA256 Signature, key ID xxxxxx: NOKEY解决方法是通过rpm --import导入密钥rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial文件冲突file /usr/bin/python from install of python-3.6.8-1.el7.x86_64 conflicts with file from package python-2.7.5-89.el7.x86_64这种情况通常需要先卸载旧版本或使用--replacefiles参数强制替换。3. DNF/YUM现代包管理实战3.1 DNF核心操作指南DNF作为YUM的下一代替代品在保持兼容性的同时提供了更好的性能和依赖解析能力。以下是日常使用频率最高的命令仓库配置默认仓库文件位于/etc/yum.repos.d/目录下每个.repo文件定义了一个软件源。例如添加EPEL仓库dnf install epel-release搜索软件包# 基本搜索查找nginx相关包 dnf search nginx # 高级搜索按提供的能力查找 dnf provides */nginx安装操作# 基本安装 dnf install nginx # 安装特定版本 dnf install nginx-1.20.1-1.el8 # 重新安装修复损坏的包 dnf reinstall nginx更新操作# 检查可用更新 dnf check-update # 更新单个包 dnf update nginx # 更新所有包生产环境慎用 dnf update卸载操作# 卸载软件但保留依赖 dnf remove nginx # 彻底卸载包括不再需要的依赖 dnf autoremove nginx3.2 高级功能解析事务历史DNF会记录所有包操作的历史记录这在排查问题时非常有用# 查看完整历史 dnf history # 查看特定事务的详细信息 dnf history info 23 # 回滚特定事务 dnf history undo 23组包管理Linux发行版通常将相关软件打包成组(group)例如Development Tools# 列出可用组 dnf group list # 安装整个组如安装GNOME桌面环境 dnf groupinstall GNOME Desktop本地仓库创建当需要离线安装大量软件时可以创建本地仓库# 安装createrepo工具 dnf install createrepo # 创建仓库目录结构 mkdir -p /localrepo/Packages # 复制所有需要的RPM包到Packages目录 cp *.rpm /localrepo/Packages/ # 生成仓库元数据 createrepo /localrepo # 创建仓库配置文件 echo [localrepo] nameLocal Repository baseurlfile:///localrepo enabled1 gpgcheck0 /etc/yum.repos.d/local.repo4. 编译安装与RPM打包进阶4.1 源码编译安装全流程虽然包管理器很方便但有时我们需要从源码编译安装软件如获取最新版本。以安装最新版Nginx为例准备编译环境dnf groupinstall Development Tools dnf install pcre-devel zlib-devel openssl-devel标准编译流程wget https://nginx.org/download/nginx-1.23.1.tar.gz tar zxvf nginx-1.23.1.tar.gz cd nginx-1.23.1 ./configure --prefix/usr/local/nginx \ --with-http_ssl_module \ --with-http_v2_module make make install关键参数说明--prefix指定安装目录make -j$(nproc)使用所有CPU核心加速编译make test运行测试套件如果有4.2 将编译软件打包为RPM对于需要批量部署的场景我们可以将编译好的软件打包成RPM。以打包Node.js为例安装打包工具dnf install rpm-build rpmdevtools设置开发环境rpmdev-setuptree这会创建~/rpmbuild目录结构BUILD - 编译时使用的目录 RPMS - 生成的二进制RPM存放位置 SOURCES - 源代码和补丁文件 SPECS - spec文件打包配方 SRPMS - 源码RPM编写spec文件Name: nodejs Version: 18.12.1 Release: 1%{?dist} Summary: Node.js JavaScript runtime License: MIT URL: https://nodejs.org/ Source0: https://nodejs.org/dist/v%{version}/node-v%{version}.tar.gz %description Node.js JavaScript runtime built on Chromes V8 JavaScript engine. %prep %setup -q -n node-v%{version} %build ./configure --prefix/usr make %{?_smp_mflags} %install rm -rf %{buildroot} make install DESTDIR%{buildroot} %files /usr/bin/node /usr/include/node/* /usr/lib/node_modules/ /usr/share/doc/node/构建RPM包rpmbuild -ba ~/rpmbuild/SPECS/nodejs.spec生成的RPM包会存放在~/rpmbuild/RPMS目录下。5. 企业级软件部署实践5.1 离线环境部署方案在生产环境中服务器通常无法直接访问互联网。这时我们需要建立本地镜像仓库同步官方仓库# 安装reposync工具 dnf install yum-utils # 创建存储目录 mkdir -p /data/repos/{baseos,appstream,epel} # 同步CentOS官方仓库 reposync -p /data/repos/baseos --repobaseos --download-metadata reposync -p /data/repos/appstream --repoappstream --download-metadata # 同步EPEL仓库 reposync -p /data/repos/epel --repoepel --download-metadata生成仓库元数据createrepo /data/repos/baseos createrepo /data/repos/appstream createrepo /data/repos/epel客户端配置# 备份原有repo文件 mkdir /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ # 创建本地仓库配置 echo [local-baseos] nameLocal BaseOS baseurlhttp://repo-server/data/repos/baseos enabled1 gpgcheck0 /etc/yum.repos.d/local-baseos.repo5.2 软件版本锁定策略在生产环境中意外的软件更新可能导致服务异常。DNF提供了版本锁定功能安装插件dnf install dnf-plugin-versionlock锁定特定版本dnf versionlock add nginx-1.20.1-1.el8查看锁定列表dnf versionlock list解除锁定dnf versionlock delete nginx-1.20.1-1.el86. 疑难问题排查指南6.1 依赖问题深度解决当遇到复杂的依赖问题时可以尝试以下方法查看依赖树dnf repoquery --requires --resolve nginx强制清理依赖缓存dnf clean all rm -rf /var/cache/dnf使用--skip-broken跳过问题包dnf update --skip-broken6.2 仓库优先级管理当多个仓库提供相同软件时可以通过优先级控制使用哪个源安装插件dnf install yum-plugin-priorities配置优先级[epel] nameEPEL baseurlhttps://mirrors.aliyun.com/epel/$releasever/Everything/$basearch/ enabled1 priority10 gpgcheck0优先级数字越小优先级越高官方仓库通常设置为priority1。6.3 回滚错误更新当更新导致系统问题时可以回滚到之前状态查看事务历史dnf history回滚特定事务dnf history undo 42系统级回滚Btrfs文件系统dnf install dnf-plugin-snapper snapper list snapper undochange 123..1247. 安全最佳实践7.1 GPG签名验证所有官方软件包都带有GPG签名应始终验证导入发行版公钥rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial验证已安装包rpm -qa --qf %{NAME}-%{VERSION}-%{RELEASE} %{SIGPGP:pgpsig}\n | grep -v Key ID配置仓库强制验证[baseos] nameCentOS-$releasever - Base mirrorlisthttp://mirrorlist.centos.org/?release$releaseverarch$basearchrepoBaseOS gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial7.2 最小化安装原则生产服务器应遵循最小化安装原则初始安装时dnf install minimal定期清理不需要的包dnf autoremove dnf remove $(dnf repoquery --extras)7.3 安全更新策略只安装安全更新dnf update --security自动安全更新适用于某些场景dnf install dnf-automatic systemctl enable --now dnf-automatic.timer关键服务器更新策略先在测试环境验证更新创建系统快照如使用LVM或Btrfs在维护窗口期执行更新准备回滚方案监控更新后系统状态
返回列表