Loading... <h1 style="margin: 5px 0px;font-family: inherit;font-weight: normal;line-height: 35px;color: inherit;font-size: 20px;text-align: center"><strong><span style="font-size: 36px">linux软件包管理</span></strong></h1> <h4 style="margin: 1em 0px 0.6em;font-family: inherit;line-height: 1.1;color: inherit;font-size: 1.5em">简介</h4> <blockquote><p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> 在Linux系统中,软件包的安装和管理是很重要的知识,而linux/unix一个麻烦的地方就是软件安装程序比较麻烦和复杂,尤其是当所安装的软件包要处理较多的包依赖关系,这就更让人头疼了,最常见linux软件安装方式有三种:</span></p> </blockquote> <blockquote><p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> 本文主要介绍Linux中RedHat或CentOS发行版的软件包管理。</span></p> </blockquote> <h4 style="margin: 1em 0px 0.6em;font-family: inherit;line-height: 1.1;color: inherit;font-size: 1.5em">一、软件包的表现形式:</h4> <blockquote><p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px">(1)、软件的源代码,需要自己动手编译它。这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz)。<br />源码安装的好处是不会受到平台的限制,而且能够根据自己的系统和平台自己优化一些选项,所以这个是比较推荐的一种安装方式,缺点是对于软件的依赖关系只能靠自己的经验来解决了。<br />(2)软件的可执行程序,也是二进制软件包。<br />其实可以细分为rpm包与yum包安装。RPM为最常见的两类软件包管理工具,他们的安装的时候不要需要网络,只要下载下来在系统上安装即可。rpm包的使用容易受平台和系统的限制,所以要根据自己的linux的分支版本以及cpu平台等来决定下载和使用何种软件包。而且需要自己处理软件的依赖关系。<br /> redhat系列软件安装包通常被是一个RPM包(Redhat Linux Packet Manager,就是Redhat的包管理器),后缀是.rpm。<br /> 二进制更方便的一种安装形式就是yum。这种方式的安装软件的时候需要联网,好处是能自动处理软件间的依赖关系,比较推荐。<br /> Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装. [百度百科]<br />(3)脚本安装,其实就是安装命令的堆积,当然也要对系统比较了解才能写出好的脚本,既可以包含yum这类,也可以使用rpm这类命令。如lnmp一键安装脚本。</span></p> </blockquote> <h4 style="margin: 1em 0px 0.6em;font-family: inherit;line-height: 1.1;color: inherit;font-size: 1.5em">二、软件软件安装:</h4> <p><strong style="line-height: 1.6"> 第一部分:搞定rpm</strong></p> <blockquote><p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> RPM是Red Hat公司随Redhat Linux推出了一个软件包管理器,通过它能够更加轻松容易地实现软件的安装、卸载、升级、查询、校验、数据库维护。</span></p> </blockquote> <p><span style="font-family: 黑体, SimHei"> 1.安装软件:<br /> 命令:rpm {-i|–install} [install-options] PACKAGE_FILE …<br /> 选项:-v: verbose表示显示附加信息 [可选]<br /> -h: 以#显示程序包管理执行进度;每个#表示2%的进度 [可选]<br /> -i:install 不能省略,表示安装<br /> [install-options]<br /> –-test: 测试安装,但不真正执行安装过程;dry run模式;<br /> –-nodeps:忽略依赖关系;(这样比较麻烦,而且通常无法使用)<br /> –-replacepkgs: 重新安装;<br /> –-nosignature: 不检查来源合法性;<br /> –-nodigest:不检查包完整性;<br /> –-noscipts:不执行程序包脚本片断;<br /> %pre: 安装前脚本; –nopre<br /> %post: 安装后脚本; –nopost<br /> %preun: 卸载前脚本; –nopreun<br /> %postun: 卸载后脚本; –nopostun</span></p> <p><span style="font-family: 黑体, SimHei"> 2.软件包升级:<br /> 命令:rpm {-U|–upgrade} [install-options] PACKAGE_FILE …</span></p> <p><span style="font-family: 黑体, SimHei"> 或 rpm {-F|–freshen} [install-options] PACKAGE_FILE …<br /> -U:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”;<br /> -F:安装有旧版程序包,则“升级”;如果不存在,则不执行升级操作;<br /> –-oldpackage:降级;<br /> –-force: 强行升级;</span></p> <p><span style="font-family: 黑体, SimHei"> 3.卸载rpm包:<br /> 命令:rpm {-e|–-erase} [–-nodeps] [–-noscripts] [–-notriggers] [–-test] PACKAGE_NAME …<br /> 选项:-e: earse表示从系统中删除软件,软件包必须是已安装的<strong>软件包名称</strong>,不是软件包的文件名</span></p> <p><span style="font-family: 黑体, SimHei"> 4.安装软件:<br /> 命令:rpm {-q|–query} [select-options] [query-options]</span></p> <p><span style="font-family: 黑体, SimHei"> [select-options]<br /> –a: 所有包;<br /> –f: 查看指定文件是由哪个包安装生成;<br /> –p:不检查包完整性;<br /> –whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;</span></p> <p><span style="font-family: 黑体, SimHei"> –whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;</span></p> <p><span style="font-family: 黑体, SimHei"></span></p> <p><span style="font-family: 黑体, SimHei"> [query-options]<br /> –c: 查询程序包的配置文件;<br /> –d: 查询程序包的帮助文档;<br /> –i:程序包的详细信息;</span></p> <p><span style="font-family: 黑体, SimHei"> –l:指定程序安装完成后生成的所有文件;</span></p> <p><span style="font-family: 黑体, SimHei"> -R:查询指定的程序包所依赖的CAPABILITY;</span></p> <p><span style="font-family: 黑体, SimHei"> –provides:列出指定程序包所提供的CAPABILITY;</span></p> <p><span style="font-family: 黑体, SimHei"> 5.校验:<br /> </span>命令:rpm {-V|–verify} [select-options] [verify-options]</p> <p> S file Size differs</p> <p> M Mode differs (includes permissions and file type)</p> <p> 5 digest (formerly MD5 sum) differs</p> <p> D Device major/minor number mismatch</p> <p> L readLink(2) path mismatch</p> <p> U User ownership differs</p> <p> G Group ownership differs</p> <p> T mTime differs</p> <p> P caPabilities differ</p> <p> 包来源合法性验正及完整性验正:</p> <p> 完整性验正:SHA256</p> <p> 来源合法性验正:RSA</p> <p> 导入所需要公钥:</p> <p> 命令:rpm –import /PATH/FROM/GPG-PUBKEY-FILE</p> <p> CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7</p> <blockquote><p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px">软件依赖关系: </span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> 由于开源的多态性,Linux 操作系统中的软件之间的依赖性关系处理一直令人感到头疼。如果 package_a 依赖于 package_b,那么在一个没有安装 package_b 的系统中,package_a 是不被系统推荐安装的,强制安装很可能会导致软件无法正常工作。基于以上 package_a 和 package_b 的关系,在一个干净的系统中 ( 未安装 package_a 或 package_b),欲安装 package_a,错误通常会表现为:</span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> [root@vm227 Packages]# rpm -ivh php-5.3.3-26.el6.x86_64.rpm </span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> error: Failed dependencies: </span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> httpd is needed by php-5.3.3-26.el6.x86_64 </span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> httpd is needed by php-5.3.3-26.el6.x86_64</span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> php-cli(x86-64) = 5.3.3-26.el6 is needed by php-5.3.3-26.el6.x86_64 </span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> php-common(x86-64) = 5.3.3-26.el6 is needed by php-5.3.3-26.el6.x86_64 </span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px">嵌套的依赖关系:</span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> 如上示例为最理想的依赖关系,实际应用中往往最令人头疼的是 package_a 依赖于 package_b/c/d/e/f 等多个包 , 而 package_b/c/d/e/f 等包又依赖于 package_b1,b2,b3/c1,c2/d1,d2/e1,e2/f1,f2 等等 … … 为保证软件的正常使用,必须找到所有依赖包以及子依赖包并且安装。过多的依赖关系大大降低了 Linux 软件安装的用户友好性。所以针对此类问题,使用了更高级的包管理策略去解决 – Yum 。</span></p> </blockquote> <p><strong style="line-height: 1.6"> 第二部分:搞定YUM</strong></p> <blockquote><p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> YUM:RPM包的前端管理工具,解决包依赖性,可以在多个库中定位软件包。</span></p> </blockquote> <p><span style="font-family: 黑体, SimHei"> 1.YUM命令的使用:<br /> 命令:rpm {-i|–install} [install-options] PACKAGE_FILE …<br /> 显示仓库列表:repolist [all|enabled|disabled]<br /> list:<br /> # yum list [all | glob_exp1] [glob_exp2] […]<br /> # yum list {available|installed|updates} [glob_exp1] […]<br /> 安装程序包:<br /> # yum install package1 [package2] […]<br /> 重新安装:<br /> # yum reinstall package1 [package2] […] <br /> 升级程序包:<br /> # yum update [package1] [package2] […]<br /> 降级程序包:<br /> # yum downgrade package1 [package2] […]<br /> 检查可用升级:<br /> # yum check-update<br /> 卸载程序包:<br /> # yum remove | erase package1 [package2] […]<br /> 查看程序包information:<br /> # yum info […]<br /> </span><span style="font-family: 黑体, SimHei">查看指定的特性(可以是某文件)是由哪个程序包所提供:<br /> # yum provides | whatprovides feature1 [feature2] […]<br /> 清理本地缓存:<br /> # yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]<br /> 构建缓存:</span><span style="font-family: 黑体, SimHei"><br /> # yum makecache</span></p> <p> <span style="font-family: 黑体, SimHei">搜索:以指定的关键字搜索程序包名及summary信息;</span></p> <p><span style="font-family: 黑体, SimHei"> # yum search string1 [string2] […]<br /> 查看指定包所依赖的capabilities:<br /> # yum deplist package1 [package2] […]<br /> 查看yum事务历史:<br /> # yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]<br /> 包组管理的相关命令:<br /> * groupinstall group1 [group2] […]<br /> * groupupdate group1 [group2] […]<br /> * grouplist [hidden] [groupwildcard] […]<br /> * groupremove group1 [group2] […]<br /> * groupinfo group1 […]</span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6"><span style="font-family: 黑体, SimHei;font-size: 16px"> 2、配置额外YUM库(客户端):<br /></span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6"><span style="font-family: 黑体, SimHei;font-size: 16px"> </span><span style="font-family: 黑体, SimHei">方法一:在/etc/yum.repos.d目录下新建.repo结尾的文件或者修改原有的repo文件,更方便的是直接下载第三方的yum源的配置文件,如网易163的源文件。</span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6"><span style="font-family: 黑体, SimHei"> 方法二:用光盘搭建本地yum源,但是你会发现很多光盘包含的软件包都比较旧。</span><span style="font-family: 黑体, SimHei;font-size: 1em;line-height: 1.6"> </span><span style="font-family: 黑体, SimHei;font-size: 1em;line-height: 1.6"> </span></p> <p> <span style="font-family: 黑体, SimHei;font-size: 16px">yum客户端:</span></p> <p><span style="font-family: 黑体, SimHei;font-size: 16px"> 配置文件:</span></p> <p><span style="font-family: 黑体, SimHei;font-size: 16px"> /etc/yum.conf:为所有仓库提供公共配置</span></p> <p><span style="font-family: 黑体, SimHei;font-size: 16px"> /etc/yum.repos.d/*.repo:为仓库的指向提供配置</span></p> <p></p> <p><span style="font-family: 黑体, SimHei;font-size: 16px"> 仓库指向的定义:</span></p> <p> <span style="font-family: 黑体, SimHei;font-size: 16px">[repositoryID]</span></p> <p> <span style="font-family: 黑体, SimHei;font-size: 16px">name=Some name for this repository</span></p> <p> <span style="font-family: 黑体, SimHei;font-size: 16px">baseurl=url://path/to/repository/</span></p> <p> <span style="font-family: 黑体, SimHei;font-size: 16px">enabled={1|0}</span></p> <p> <span style="font-family: 黑体, SimHei;font-size: 16px">gpgcheck={1|0}</span></p> <p> <span style="font-family: 黑体, SimHei;font-size: 16px">gpgkey=URL</span></p> <p> <span style="font-family: 黑体, SimHei;font-size: 16px">enablegroups={1|0}</span></p> <p> <span style="font-family: 黑体, SimHei;font-size: 16px">failovermethod={roundrobin|priority}</span></p> <p> <span style="font-family: 黑体, SimHei;font-size: 16px">默认为:roundrobin,意为随机挑选;</span></p> <p> <span style="font-family: 黑体, SimHei;font-size: 16px">cost=</span><span style="font-family: 黑体, SimHei">1000(<span style="font-family: 黑体, SimHei">默认</span>)</span></p> <p><span style="font-family: 黑体, SimHei"></span></p> <p><strong style="line-height: 1.6">第三部分:搞定</strong><strong style="line-height: 1.6">linux源码安装</strong></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6;padding: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px"> 程序包编译安装:<br /> 源代码 –> 预处理 –> 编译(gcc) –> 汇编 –> 链接 –> 执行<br /> 源代码组织格式:<br /> 多文件:文件中的代码之间,很可能存在跨文件依赖关系;<br /> C、C++: make (configure –> Makefile.in –> makefile)<br /> java: maven<br /> C代码编译安装三步骤:<br /> ./configure:<br /> (1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成makefile;<br /> (2) 检查依赖到的外部环境;<br /> make:<br /> 根据makefile文件,构建应用程序;<br /> make install</p> <p> 开发工具:<br /> autoconf: 生成configure脚本<br /> automake:生成Makefile.in</p> <p> 建议:安装前查看INSTALL,README<br /> 第一步:configure脚本<br /> 选项:指定安装位置、指定启用的特性</p> <p> –help: 获取其支持使用的选项<br /> 选项分类:<br /> 安装路径设定:<br /> –prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置;默认为/usr/local/<br /> –sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;</p> <p> System types:</p> <p> Optional Features: 可选特性<br /> –disable-FEATURE<br /> –enable-FEATURE[=ARG]</p> <p> Optional Packages: 可选包<br /> –with-PACKAGE[=ARG]<br /> –without-PACKAGE</p> <p> 第二步:make</p> <p> 第三步:make install</p> <p> 安装后的配置:<br /> (1) 导出二进制程序目录至PATH环境变量中;<br /> 编辑文件/etc/profile.d/NAME.sh<br /> export PATH=/PATH/TO/BIN:$PATH</p> <p> (2) 导出库文件路径<br /> 编辑/etc/ld.so.conf.d/NAME.conf<br /> 添加新的库文件所在目录至此文件中;</p> <p> 让系统重新生成缓存:<br /> ldconfig [-v]</p> <p> (3) 导出头文件<br /> 基于链接的方式实现:<br /> ln -sv </p> <p> (4) 导出帮助手册<br /> 编辑/etc/man.config文件<br /> 添加一个MANPATH</p> <p> 如果遇到错误提示,也别急,通常是十分简单的问题:<br /> 1)没有安装C或C++编译器;<br /> 确诊方法:执行命令gcc(C++则为g++),提示找不到这个命令。<br /> 解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:<br /> #rpm -ivh gcc* (哈哈,我们用到了第二种安装方式)<br /> 2)没有安装make工具;<br /> 确诊方法:执行命令make,提示找不到这个命令。<br /> 解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:<br /> #rpm -ivh make*<br /> 3)没有安装autoconf工具;<br /> 确诊方法:执行命令make,提示找不到这个命令。<br /> 解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:<br /> #rpm -ivh autoconf*<br /> 4)缺少某些链接库;<br /> 确诊方法:在make时,提示需要某些文件。<br /> 解决方法:安装包含这个文件的包,这就需要积累了。<br /> 5)软件依赖;<br /> 这时候只有安装软件的依赖关系,按照先后顺序安装软件。</span></p> <p><strong style="line-height: 1.6"> 第四部分:搞定bin文件安装</strong></p> <p><span style="font-family: 黑体, SimHei"> 1.以bin结尾的安装包,这种包类似于RPM包,安装也比较简单<br /></span><span style="font-family: 黑体, SimHei"> 2.给文件加上可执行属性:chmod +x ******.bin<br /></span><span style="font-family: 黑体, SimHei"> 3.执行命令:./******.bin<br /></span><span style="font-family: 黑体, SimHei"> 4.ok:<br /></span></p> <h2 id="总结" style="font-family: inherit;line-height: 1.1;color: inherit;margin: 1.2em 0px 0.6em;font-size: 2.15em">总结</h2> <blockquote><p style="margin-top: 0px;margin-bottom: 1.1em;font-size: 1em;line-height: 1.6"><span style="font-family: 黑体, SimHei;font-size: 16px">本文linux下,程序包的几种形式以及安装方法水平有限, 如果有错误及时指出;<br />作者:chrony <br />感谢: MageEdu</span></p> </blockquote> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信