第6章:软件包管理:软件包管理、rpm命令、yum命令

软件包对于依赖库的处理方式分为2种:静态链接、动态链接 ------------------------------------------------------- 链接:处理好各个模块之间相互引用的部分,使得各个模块之间能够正确地衔接。 静态链接:例如程序中会引用一些公共库,编译型开发语言在编译程序时,会将依赖的公共库完整地复制一份,并打包进程程序中 特点:1.公共库打包进程序中;2.程序升级难,需要重新编译;3.打包了公共库,占用更多的空间,但是程序迁移方便 动态链接: 特点:1.把依赖库做了一个动态链接,公共库未打包进程序中;2.升级相对简单;3.节省空间;4.程序迁移依赖主机环境

软件包管理器、软件包的分类和拆包 ===================================================== 二进程应用程序的组成部分:二进制文件、库文件、配置文件、帮助文件 程序包管理器: debian:deb文件,dpkg包管理器 redhat:rpm文件,rmp包管理器(redhat package manager,RPM package manager) 系统盘的Packages目录下存放的就是各种rpm包 自动挂载方法:进入图形化界面,即自动挂载,df命令查看挂载 例如目录路径:/run/media/username/CentOS\ 7\ x86_64/Packages/ ------------------------------------------------------ 包:分类和拆包(满足特定用户安装部分功能的需求,就有了包的拆分) application-VERSION-ARCH.rpm 主包 application-devel-VERSION-ARCH.rpm 开发子包 application-utils-VERSION-ARCH.rpm 其他子包 application-libs-VERSION-ARCH.rpm 其他子包 例如:[root@yefeng Packages]# ls |grep httpd httpd-2.4.6-95.el7.centos.x86_64.rpm httpd-devel-2.4.6-95.el7.centos.x86_64.rpm httpd-manual-2.4.6-95.el7.centos.noarch.rpm httpd-tools-2.4.6-95.el7.centos.x86_64.rpm 包之间可能存在依赖关系,甚至循环依赖 包依赖管理工具: yum:rpm包管理器的前端工具 apt-get:deb包管理器的前端工具 zypper:suse上的rpm前端管理工具 dnf:Fedore 18+ rpm包管理器的前端工具

rpm包命名方式、程序包组成 ========================================================== rpm包命名方式:name-VERSION-release.arch.rpm 例如:bash-4.2.46-19.el7.x86_64.rpm name------------------------------------------------------------bash VERSION = major.minor.release 与源码包VERSION相同---------------4.2.46 ARCH = release . [OS] . arch------------------------------------19.el7.x86_64 release是指rpm的release, rpm进行编译释放后的版本--------------19(打包了19次?数字越大说明打包难度越大) OS指在进行编译时操作系统的类型--------------------------------el7 arch是指编译时的硬件环境, 一般使用CPU类型指代------------------x86_64 常见arch: x86:i386,i486,i586,i686 x86_64:x64,x86_64,amd64 powerpc:ppc 平台无关:noarch --------------------------------------------------------- 程序包组成:(例如tree包 tree-1.6.0-10.el7.x86_64.rpm) 1.RPM包内的文件 2.RPM的元数据metadata,如名称、版本、依赖性、描述等等 3.安装or卸载时运行的脚本 rpm使用者安装rpm包时, 主机中的rpm包管理软件会根据软件包里的数据库文件查看依赖软件是否满足: 条件满足时则进行安装, 并将软件信息写入本地rpm管理软件的数据库(/var/lib/rpm目录)中, 方便后续对软件的查询,验证和升级等操作 本地rpm管理软件的数据库(/var/lib/rpm目录):保存了程序包名称、版本、依赖关系、功能说明、包安装后生成的各文件路径及校验码信息

ldd命令、ldconfig命令 ============================================================================================= ldd命令:ldd可以列出一个程序所需要得动态链接库(so)、即查看指定软件包的依赖库 ldd(list, dynamic, dependencies)本身不是一个程序,而仅是一个shell脚本:ldd可以列出一个程序所需要得动态链接库(so) --version:打印指令版本号; -v:详细信息模式,打印所有相关信息; -u:打印未使用的直接依赖; -d:执行重定位和报告任何丢失的对象; -r:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数; --help:显示帮助信息。 示例:ldd /bin/ls ------------------------------------------------------------------------------------------- ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表. 配置文件:/etc/ld.so.conf,/etc/ld.so.conf.d/*.conf 缓存文件:/etc/ld.so.cache 示例:ldconfig -p #显示本机已经缓存的所有可用库文件名及文件路径映射关系
管理程序包的方式:
1.使用包管理器rpm
2.使用前端工具yum、dnf

程序包的来源途径 1.系统发行的光盘、官方服务器、各种镜像服务器 CentOS镜像 https://www.centos.org/download/ http://mirrors.aliyun.com http://mirrors.163.com 2.项目官方站点 3.第三方组织 4.自己制作 注意:第三方包建议要检查其合法性、完整性

rpm2cpio命令、cpio命令 ==================================== rpm2cpio言下之意就是把RPM包转化成CPIO归档档案! rpm2cpio package.rpm | cpio -tv #将rpm包转化为cpio格式,然后用cpio进行预览 rpm2cpio package.rpm | cpio -idv #默认解压所有文件 rpm2cpio package.rpm > package.cpio #把RPM包转化为cpio包,cpio包的使用范围和可用性会比RPM更广! ==================================== cpio是用来建立,还原备份档的工具程序,它可以加入,解开 cpio 或 tar 备份档内的文件。
rpm程序包管理器命令
因为rpm命令使用环境较多, 在不同环境模式下有不同的语法格式
通用选项:
-v: 显示安装过程
-h: 以#形式显示安装进度

rpm安装模式:-i|--install 语法: rpm {-i|--install} [install-options] PACKAGE_FILE ... install-options安装选项: --test: 测试安装,但不真正执行安装过程;dry run模式; --nodeps:忽略依赖关系; --force:强制安装 --replacepkgs: 重新安装; --replacefiles:假如A包B包都会安装一个相同文件,当检测到A包已安装,那么B包在安装时可能会遇到问题,这时可以使用replacefiles --nosignature: 不检查来源合法性; --nodigest:不检查包完整性; --noscript:不执行程序包脚本 %pre:安装前脚本;--nopre %post:安装后脚本;--nopost %preun:卸载前脚本;--nopreun %postun:卸载后脚本;--nopostun 常用示例: rpm -i PACKAGE_FILE rpm -ivh PACKAGE_FILE #*****以过程和进度方式显示安装程序包(-i安装,-v详细信息,-h可读的) rpm -ivh --force PACKAGE_FILE #强制安装 rpm -ivh --replacepkgs PACKAGE_FILE #当文件被破环,而rpm数据库显示程序已安装,可以使用--replacepkgs重新安装

rpm升级模式:-U|--upgrade、-F|--freshen 语法: rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...旧版存在则进行升级; 不存在则进行安装 rpm {-F|--freshen} [install-options] PACKAGE_FILE ...只有已安装旧版本情况下才进行对旧版本进行升级 install-options升级选项: --oldpackage:降级; --force: 强行升级; 升级内核建议采用安装的方式,而不要进行升级: 即内核升级建议使用-ivh;而不是使用-Uvh,-Fvh linux支持多内核版本并存,在启动系统时,进行内核选择 使用示例: rpm -Uvh PACKAGE_FILE rpm -Fvh PACKAGE_FILE

rpm查询模式-q|--query 语法: rpm {-q|--query} [select-options] [query-options] 作用: 用于显示程序包相关信息, 查询已安装rpm包时不需要使用版本号, 查询未安装rpm包时需要使用版本号 select-options选择选项: -a: 所有包 -f file: 查看指定的文件由哪个程序包安装生成 -p /PATH/TO/PACKAGE_FILE:针对尚未安装的程序包文件做查询操作; --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供; --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖; query-options查询选项: --changelog:查询rpm包的changlog -c: 查询程序的配置文件 -d: 查询程序的文档 -i: information -l: 查看指定的程序包安装后生成的所有文件; --scripts:程序包自带的脚本片断 -R: 查询指定的程序包所依赖的CAPABILITY; --provides: 列出指定程序包所提供的CAPABILITY; 使用示例: rpm -qa #查看系统上所有已安装的包 rpm -qa "tree" #在系统的已安装包中进行模糊查找 rpm -qa "tree*" #在系统的已安装包中进行模糊查找 rpm -q tree #查看指定包是否已安装,若已安装则显示安装的包名 rpm -qf /usr/bin/tree #查询指定文件的安装包 rpm -ql tree #*****查看安装tree,生成的所有文件 rpm -q --whatprovides tree #根据命令去查看安装包 rpm -qi tree #*****查看tree的安装包信息 rpm -qpi tree-1.6.0-10.el7.x86_64.rpm #功能同上,对象不同,这里查询对象是包 rpm -q --script httpd #*****查看已安装包httpd的脚本内容(不是所有的包都有脚本的!) rpm -qp --scripts httpd-2.4.6-95.el7.centos.x86_64.rpm #查看未安装的rpm的脚本内容

rpm卸载模式-e|--erase 语法: rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ... 作用: 用于卸载指定程序包 选项: --noreps: 忽略依赖关系进行卸载 使用示例: rpm -e --allmatches xxxx #当某程序安装有多个版本,携带--allmatches则卸载所有版本 rpm -e tree #卸载时填写软件名 rpm -ivh tree-1.6.0-10.el7.x86_64.rpm #安装时,填写包名称

rpm校验模式、rpm包检验 ============================================================================= rpm校验模式-V|--verify 语法: rpm {-V|--verify} [select-options] [verify-options] 作用: 用于验证程序包完整性 校验模式的输出字段意义: S: 文件的容量大小是否改变 M: 文件的类型或文件rwx属性是否改变 5: MD5指纹码是否改变 D: 设备的主次代码是否改变 L: 链接路径是否改变 U: 文件的属主是否改变 G: 文件的属组是否改变 T: 文件的mtime是否改变 P: 功能是否发生改变 使用示例: rpm -V tree #将指定程序的相关文件和rpm数据库(/var/lib/rpm)做比较,然后列出变化的项 rpm -Va #查询所有包的变化 ============================================================================= rpm包检验:包来源合法性验证及完整性验证 # 使用rpm安装时需要先导入密钥, 通过 rpm --import /PATH/GPGKEY 导入软件公钥, 在通过查看和比对公钥信息来验证程序包的来源合法性 [root@yefeng CentOS 7 x86_64]# rpm --import RPM-GPG-KEY-CentOS-7 #导入公钥;不导入该公钥,即使检查光盘文件也是not ok rpm -qa "gpg-pubkey" #导入公钥后,实际上生成gpg-pubkey-f4a80eb5-53a7ff4b包 rpm -e gpg-pubkey-f4a80eb5-53a7ff4b #卸载包检验公钥 [root@yefeng Packages]# rpm -K tree-1.6.0-10.el7.x86_64.rpm [root@yefeng Packages]# rpm --checksig tree-1.6.0-10.el7.x86_64.rpm #包校验,--checksig功能同-K

实验1:CentOS7如何修复已知公共库缺失的故障(进入CentOS7救援模式--光盘) CentOS7救援模式--光盘:https://blog.51cto.com/1929297/2421543 人为制造故障: 1.查看ls命令依赖的公共库 ldd /bin/ls 2.移动其中依赖的一个公共库 mv /lib64/libc.so.6 libc.so.6 修复故障: 1.启动系统时,在vmware界面提示“press F2 to enter SETUP,F12 for Network Boot,ESC for Boot Menu”。按ESC键 2.选择 CD-ROM Drive 3.选择Troubleshooting 4.选择Rescue a CentOS system 5.选择continue,系统提示centos7系统被挂载在/mnt/sysimage目录下 1)continue:救援模式程序会自动查找系统中已有的文件系统,并可读写挂载到/mnt/sysimage目录下。 2)Read-Only:会以只读的方式挂载已有的文件系统。 3)Skip to shell: 手动挂载 6.移动文件:mv /mnt/sysimage/root/libc.so.6 /mnt/sysimage/lib64/ 方法2:因为/lib64/libc.so.6其实是一个软链接文件 cd /mnt/sysimage/lib64 ln -sysimage lib-2.17.so libc.so.6 #注意,使用相对路径的方式创建软链接 7.输入exit,启动自动重启并已修复

实验2:CentOS7如何修复rpm被删除的故障(进入CentOS7救援模式--光盘) 制造故障1: which rpm #查询rpm命令 rpm -qf /bin/rpm #查询rpm命令的安装包 rpm -ql rpm #查询rmp包包含的文件列表 rm -f /bin/rpm #制造故障 修复故障方法1: [root@yefeng ~]# rpm2cpio /run/media/csda325/CentOS\ 7\ x86_64/Packages/rpm-4.11.3-45.el7.x86_64.rpm |cpio -idv ./bin/rpm #rpm2cpio把RPM包转化成CPIO归档档案,解压指定文件./bin/rpm [root@yefeng ~]# cp ./bin/rpm /bin/ #修复 制造故障2: rpm -e rpm --nodeps #忽略依赖关系卸载rpm,此时rpm2cpio也没有了 修复故障方法2: 1.按照步骤进入到救援模式 2.df #我们的centos系统挂载在/mnt/sysimage目录下,光盘挂载在/run/install/repo 3.rpm -ivh /run/install/repo/Packages/rpm-4.11.3-45.el7.x86_64.rpm --root=/mnt/sysimage 4.chroot /mnt/sysimage #切根,进行rpm测试 个人理解,在救援模式下,默认/是光盘镜像系统的/;进入切根操作后(chroot /mnt/sysimage ),才切换到系统/
yum命令

yum命令原理与介绍、yum日志 ======================================================================= yum(yellowdog update modifier)rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具 yum通过依赖rpm程序包管理器, 实现了rpm程序包管理器在功能上的扩展, 因此yum是不能脱离rpm而独立运行的 yum repository:yum repo,存储了众多rpm包,以及包的相关的元数据文件(放在特定目录repodata下) yum功能上的实现原理 yum是CS架构的软件 Server端先对程序包进行分类后存储到不同repository容器中; 再通过收集到大量的rpm的数据库文件中程序包之间的依赖关系数据, 生成对应的依赖关系和所需文件在本地的存放位置的说明文件(.xml格式), 存放在本地的repodata目录下供Client端取用 Cilent端通过yum命令安装软件时发现缺少某些依赖性程序包, Client会根据本地的配置文件(/etc/repos.d/SERVER.repo)找到指定的Server端, 从Server端repo目录下获取说明文件xxx.xml后存储在本地/var/cache/yum中方便以后读取, 通过xxx.xml文件查找到需要安装的依赖性程序包在Server端的存放位置, 再进入Server端yum库中的指定repository容器中获取所需程序包, 下载完成后在本地实现安装 ---------------------------------------------------------------------- /var/log/yum.log #yum的日志文件 yum常见故障 1.配置文件书写错误 2.yum cache问题

yum Client配置文件说明、yum-config-manager命令、更新yum源 ======================================================================= yum Client配置文件说明 /etc/yum.conf #为所有仓库提供公共配置 用户可以在本地系统的/etc/yum.repos.d/目录下编辑配置文件*.repo, 用于指定yum Server, 一个文件中可以指定多个Server通过Repo_ID来进行区别, 因此同一文件中的不同Repo_ID不能重名。 [Repo_ID] #epo仓库的唯一标识符,不要在同一文件中有重名ID;不能有空格,光盘镜像源一般习惯命名base name=Description # 用于描述repo的简要信息 baseurl=ftp://|http://|https://|file:///PATH/TO/PAKS # Server端repodata目录所在的具体路径, 支持四种路径格式 ftp, http,https,file(本地路径) enabled={1|0} # 表示是否启用该repo, 默认为开启 gpgcheck={1|0} # 表示是否验证 rpm 包的合法性,如果启用必须填写 gpgkey 字段, 默认启用 gpgkey=ftp://|http://|file:///PATH/TO/KEY # gpgkey文件所在的具体路径,数字证书公钥文件所在位置;设置了gpgkey后会自动进行检查 mirrorlist #列出这个容器可以使用的镜像站点,如果不想使用,可以注释 cost=1000 #默认值为1000 配置文件*.repo中可用的变量: $releasever 当前OS的发行版的主版本号 $arch 平台,i386,i486,i586,x86_64等 $basearch 基础平台,i386,x86_64 $YUM0-$YUM9 自定义变量 极简配置示例:(最少仅需配置3项:[]、baseurl、gpgcheck) [base] name=Description baseurl=file:///media gpgcheck=0 ---------------------------------------------------------------------- yum-config-manager命令的本质是对/etc/yum.repos.d/(库数据的储存位置)文件夹下文件的增删查改,推荐使用yum-config-manager命令进行改动 yum-config-manager --add-repo repository_url #添加repository yum-config-manager --disable itemName #切换库中资源---禁用 yum-config-manager --enable itemName #切换库中资源---启用 ---------------------------------------------------------------------- 更新yum源为阿里源 阿里yum源路径:http://mirrors.aliyun.com/centos/7/updates/x86_64/ linux更新yum源改成阿里云源:https://developer.aliyun.com/article/691851 1、备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 7 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 或者 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 3、之后运行yum makecache生成缓存

yum命令参数 --nogpgcheck #禁止进行gpg check -y #自动回答yes -q #静默模式 --disablerepo=repoidglob #临时禁用此处指定的repo --enablerepo=repoidglob #临时启用此处指定的repo --noplugins #禁用所有插件

yum查询模式、yum清理模式 ============================================================ yum查询模式: yum repolist [all|enabled|disabled] #显示本地repo文件中的yum仓库信息 yum list {available|installed|updates} [glob_exp1] [...] #根据状态查询相关程序包 yum search string1 [string2] [...] #按关键字搜索程序包 yum info [...] #查看程序包信息 yum provides | whatprovides feature1 [feature2] [...] #查看指定的特性或文件由哪个程序包所提供 yum deplist package1 [package2] [...] #查看指定包所依赖的capabilities 示例: yum repolist #查看本地的yum仓库信息,默认查看enabled的仓库。无缓存则依赖网络 yum list #列出yum仓库中可用的软件包;无缓存则依赖网络 yum search httpd #默认在本地yum仓库搜索;无缓存则依赖网络 yum info httpd #默认查看本地缓存信息;无缓存则依赖网络 yum provides httpd #查看一个命令or应用的安装包名称,默认根据本地缓存信息进行查看,无缓存则依赖网络 yum provides tree yum deplist tree ----------------------------------------------------------- yum清理模式: yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] 根据条件清理指定数据 yum makecache #主动构建yum仓库缓存;一般不需要做此操作,因为下载时会自动构建缓存 示例: yum clean all yum makecache #主动构建yum仓库缓存;一般不需要做此操作,因为下载时会自动构建缓存

yum安装模式、yum升级模式、yum卸载模式、yum事务历史 ============================================================ yum安装模式: yum install package1 [package2] [...] 安装指定程序包 yum reinstall package1 [package2] [...] 重新安装指定程序包 示例: yum install httpd ----------------------------------------------------------- yum升级模式: yum check-update 检查可用升级 yum update [package1] [package2] [...] 升级指定程序包 yum downgrade package1 [package2] [...] 降级指定程序包 ----------------------------------------------------------- yum卸载模式: yum remove | erase package1 [package2] [...] 卸载指定程序包 示例: yum remove httpd #卸载后想要再次安装,显示“Error: Nothing to do”,更换yum源后解决 ----------------------------------------------------------- yum事务历史:(安装卸载同一个软件,会发现往往安装时的包数量比卸载时多,是因为安装时会安装依赖包,卸载时不会卸载依赖包;此时可能需要事务进行回滚操作) yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats] yum history #查看yum的安装历史记录 yum history info 6 #查看id为6的安装步骤的详细安装信息 yum history undo 6 #回滚id为6的安装,即撤销安装,达到删除安装包和依赖包的目的 #若回滚操作为撤销卸载,即安装软件,需要yum仓库oryum源中有该安装包 yum history redo 6 #重做id为6的安装

yum包组管理:(适合批量包的安装,例如安装图形化界面) yum grouplist [hidden] [groupwildcard] [...] 列出指定程序安装包组信息 yum groupinfo group1 [...] 查看指定程序安装组信息 yum groupinstall group1 [group2] [...] 安装指定的程序安装包组 yum groupupdate group1 [group2] [...] 升级指定程序安装包组 yum groupremove group1 [group2] [...] 卸载指定程序安装组 yum groupinfo "Development Tools" 没有带等号的是你原本就已经安装了的;等号表示包是随着包组装好的;加号减号都表示包还没有安装:但是加号将来会随着包组升级而一起安装、而减号表示你将来装包组也不会安装

实验1:自定义本地yum仓库 1.自定义本地yum仓库 [root@yefeng data]# ls httpd-2.4.6-95.el7.centos.x86_64.rpm [root@yefeng data]# createrepo /data #创建yum仓库,即创建仓库的元数据metadata [root@yefeng data]# ls httpd-2.4.6-95.el7.centos.x86_64.rpm repodata 2.自定义yum配置文件/etc/yum.repos.d/*.repo [base] name=Description baseurl=file:///data gpgcheck=0

实验2:搭建自定义基于网络的yum仓库 1.安装httpd,并开启httpd服务;同时关闭防火墙 yum install httpd systemctl stop firewalld.service systemctl disable firewalld.service systemctl start httpd systemctl enable httpd iptables -vnL 2./var/www/html/目录下的文件即可访问的网络资源 echo 'hello world!' > /var/www/html/index.html 浏览器输入http://192.168.1.7访问 将rpm安装包放入到/var/www/html/目录下,并创建yum仓库 cp /data/httpd-2.4.6-95.el7.centos.x86_64.rpm /var/www/html/data/ createrepo /var/www/html/data/ 浏览器输入http://192.168.1.7/data/,即访问yum仓库
搭建一个yum仓库
其实本质还是提供http服务,所以nginx、httpd都可以实现
1.搭建http服务,使用nginx、httpd都可以
2.使用createrepo命令制作yum仓库(yum源)
3.测试
Linux程序包管理--rpm和yum的原理和基本用法 https://blog.51cto.com/pavel86/1690012
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!