Loading... <p>1<span style="font-family:宋体">、软件管理器简介</span></p> <p> <span style="font-family:宋体">随着</span>Linux<span style="font-family:宋体">的不断发展及越来越多的人投入到</span>Linux<span style="font-family:宋体">大家庭中,软件管理器的作用对于还无法熟练掌握源码编译安装的人们还是显得尤为重要,同时,由</span>Linux<span style="font-family:宋体">开发商在为其编译完成的软件包在某种程度上要比在网络上流传的软件包要安全的多;所以,掌握</span>Linux<span style="font-family:宋体">常用的软件管理器还是非常重要的;</span></p> <p> <span style="font-family:宋体">目前常见的软件包管理器包括:</span>RPM<span style="font-family:宋体">和</span>DPKG<span style="font-family:宋体">,简单介绍如下(见鸟哥):</span></p> <table cellspacing="0" cellpadding="0"> <tbody> <tr class="firstRow"> <td width="111" valign="top"> <p style="text-align:center"><strong><span style="font-family:宋体;color:white">代表厂商</span></strong></p> </td> <td width="111" valign="top"> <p style="text-align:center"><strong><span style="font-family:宋体;color:white">软件管理机制</span></strong></p> </td> <td width="111" valign="top"> <p style="text-align:center"><strong><span style="font-family:宋体;color:white">管理命令</span></strong></p> </td> <td width="111" valign="top"> <p style="text-align:center"><strong><span style="font-family:宋体;color:white">在线升级</span></strong></p> </td> </tr> <tr> <td width="111" valign="top"> <p style="text-align:center"><strong>Red Hat/Suse</strong></p> </td> <td width="111" valign="top"> <p style="text-align:center">RPM</p> </td> <td width="111" valign="top"> <p style="text-align:center">rpm</p> </td> <td width="111" valign="top"> <p style="text-align:center">YUM(yum)</p> </td> </tr> <tr> <td width="111" valign="top"> <p style="text-align:center"><strong>Debian/Ubuntu</strong></p> </td> <td width="111" valign="top"> <p style="text-align:center">DPKG</p> </td> <td width="111" valign="top"> <p style="text-align:center">dpkg</p> </td> <td width="111" valign="top"> <p style="text-align:center">APT(apt-get)</p> </td> </tr> </tbody> </table> <p>2<span style="font-family:宋体">、</span>RPM<span style="font-family:宋体">简介</span></p> <p> RPM(Redhat Package Manager)<span style="font-family:宋体">是由</span>Red Hat<span style="font-family:宋体">公司所发展出来一种软件包管理机制,在之前,由于软件安装需要依赖其他属性的缘故,安装的过程将会非常复杂而</span>RPM<span style="font-family:宋体">则会大大简化这一过程;</span></p> <p style="text-indent:28px">RPM<span style="font-family:宋体">会将软件提前编译并打包成</span>RPM<span style="font-family:宋体">包的格式,同时通过打包好的软件里的默认数据库记录下此软件在安装过程中所要求的依赖关系,在执行软件安装时,会先依照软所记录的数据查询当前系统的环境是否满足,如满足,则执行安装;如不满足则不予以安装;</span></p> <p style="text-indent:28px"><span style="font-family:宋体">但是,</span>RPM<span style="font-family:宋体">包的缺点也是很多的</span>:</p> <p style="text-indent:28px">1<span style="font-family:宋体">、软件包的安装环境已经在制作时提前决定好了,所以不同的厂商发布的</span>RPM<span style="font-family:宋体">文件通常不会通用;</span></p> <p style="text-indent:28px">2<span style="font-family:宋体">、厂商提供的</span>RPM<span style="font-family:宋体">包安装时方便,安全性高,但通常版本较低,如果要体验新特性,新版本,一般这种</span>RPM<span style="font-family:宋体">包是不会满足我们的需求的;</span></p> <p style="text-indent:28px">3<span style="font-family:宋体">、由于依赖关系的存在,</span>RPM<span style="font-family:宋体">包的卸载升级也需要格外谨慎;最好是只卸载升级与其他软件依赖关系不大的软件包;</span></p> <p> </p> <p>3<span style="font-family:宋体">、从程序组成说起</span></p> <p> <span style="font-family:宋体">软件在编译前,是一段源代码,而在编译后,会分割成一段段我们能够更好理解的文件,基本如下:</span></p> <p><span style="font-family:宋体">二进制程序:</span>/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/sbin, /usr/local/sbin,</p> <p><span style="font-family:宋体">库文件:</span>/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64</p> <p><span style="font-family:宋体">配置文件:</span>/etc, /etc/DIR, /usr/local/{etc,conf}</p> <p><span style="font-family:宋体">帮助文件:</span>/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc</p> <p> <span style="font-family:宋体">更简单的说,我觉得</span>rpm<span style="font-family:宋体">就是将这些文件按照自己需要打包在一起成为一个软件包,而由于主观需要或其他元素,内容并不会往往是我们所需求的;</span></p> <p>4<span style="font-family:宋体">、看看格式</span></p> <p> <span style="font-family:宋体">以</span>centos 6.6<span style="font-family:宋体">的自带的</span>mysql<span style="font-family:宋体">为例:</span></p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703180632-72.png" title="1449298726718633.png" alt="1.png" /></p> <p> <span style="font-family:宋体">要补充的是,</span>Linux<span style="font-family:宋体">当中,很多源码包会因为功能被拆分为如下的多个包,仍然以</span>httpd<span style="font-family:宋体">为例:</span></p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703180632-22.png" title="1449298734211985.png" alt="2.png" /></p> <p>5<span style="font-family:宋体">、看看</span>rpm<span style="font-family:宋体">包来源</span></p> <p> a.<span style="font-family:宋体">系统的发行光盘镜像或官方站点</span>(<span style="font-family:宋体">或站点镜像服务器</span>)<span style="font-family:宋体">;</span></p> <p> <span style="font-family:宋体">挂载光盘:</span>mount -r /dev/cdrom /media/cdrom</p> <p> <span style="font-family:宋体">官方站点,镜像:</span></p> <p> mirrors.sohu.com</p> <p> mirrors.163.com</p> <p> mirrors.aliyun.com</p> <p> b.<span style="font-family:宋体">程序包的官方站点</span></p> <p> c.<span style="font-family:宋体">第三方组织:</span>epel</p> <p> d.<span style="font-family:宋体">搜索引擎</span></p> <p> http://rpmfind.net</p> <p> http://rpm.pbone.net</p> <p> http://pkgs.org</p> <p style="text-indent:28px"><span style="font-family:宋体">建议:安装之前要验证其的来源合法性和包的完整性;</span></p> <p>6<span style="font-family:宋体">、</span>RPM<span style="font-family:宋体">管理命令</span></p> <p> <span style="font-family:宋体">归根结底,在我们正确获得所要的</span>RPM<span style="font-family:宋体">包后,</span>RPM<span style="font-family:宋体">包的管理使用就成为重中之重了,而</span>RPM<span style="font-family:宋体">包管理通过</span>rpm<span style="font-family:宋体">这个命令来完成,总结下常用选项如下:</span></p> <p>a. <span style="font-family:宋体">安装篇:</span></p> <table cellspacing="0" cellpadding="0"> <tbody> <tr class="firstRow"> <td width="85" valign="top"> <p><strong>rpm</strong></p> </td> <td width="468" colspan="2" valign="top"> <p><strong>Usage</strong><strong><span style="font-family:宋体">:</span>rpm {-i|–install} [install-options] Package_file…</strong></p> </td> </tr> <tr> <td width="85" rowspan="7" valign="top"> <p><strong><span style="font-family:宋体">安装:</span></strong></p> <p><strong><span style="font-family:宋体">常用组合:</span></strong></p> <p><strong>-ivh</strong></p> </td> <td width="104" valign="top"> <p>-i, –install</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">安装</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>-h</p> </td> <td width="364" valign="top"> <p>hash,<span style="font-family: 宋体">以</span>#<span style="font-family:宋体">来表示安装进度,一个</span>#<span style="font-family:宋体">相当于</span>2%</p> </td> </tr> <tr> <td width="104" valign="top"> <p>-v, -vv, -vvv</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">显示安装过程中的详细信息;</span>-vv,-vvv<span style="font-family:宋体">显示更多信息;</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>–test</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">测试安装,而仅报告依赖关系及冲突信息等;</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>–nodeps</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">忽略依赖关系</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>–replacepkgs</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">覆盖安装:重新安装并覆盖原有的文件,</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>–force</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">强制安装</span></p> </td> </tr> <tr> <td width="85" valign="top"> <p><strong><span style="font-family:宋体">注意事项</span></strong></p> </td> <td width="468" colspan="2" valign="top"> <p><span style="font-family:宋体">程序包之间存在依赖关系,选用</span>-nodeps<span style="font-family:宋体">时,安装可能会成功,但未必能够成功执行;选用</span>-replacepkgs<span style="font-family:宋体">时,要注意配置文件;</span></p> </td> </tr> </tbody> </table> <p>b<span style="font-family:宋体">、升级篇</span></p> <table cellspacing="0" cellpadding="0"> <tbody> <tr class="firstRow"> <td width="85" valign="top"> <p><strong>rpm</strong></p> </td> <td width="468" colspan="2" valign="top"> <p><strong>rpm {-U|–upgrade} [install-options] PACKAGE_FILE… </strong><strong><span style="font-family:宋体">升级或安装</span></strong></p> <p><strong>rpm {-F|–freshen} [install-options] PACKAGE_FILE… </strong><strong><span style="font-family:宋体">仅升级</span></strong></p> </td> </tr> <tr> <td width="85" rowspan="4" valign="top"> <p><strong><span style="font-family:宋体">升级选项:</span></strong></p> <p><strong><span style="font-family:宋体">常用组合:</span></strong></p> <p><strong>-Uvh</strong></p> <p><strong>-Fvh</strong></p> </td> <td width="104" valign="top"> <p>-U</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">升级或安装</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>-F</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">升级</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>–oldpackage</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">降级到旧版本</span></p> </td> </tr> <tr> <td width="468" colspan="2" valign="top"> <p><span style="font-family:宋体">同样支持</span>-h, -v ,-vv,-vvv,-force<span style="font-family:宋体">选项</span></p> </td> </tr> <tr> <td width="85" valign="top"> <p><strong><span style="font-family:宋体">注意事项</span></strong></p> </td> <td width="468" colspan="2" valign="top"> <p>1. <span style="font-family:宋体">一定不要对内核执行升级;</span>Linux<span style="font-family:宋体">允许多内核共存,所以,可以直接安装多个不同版本的内核</span></p> <p>2.<span style="font-family:宋体">如果程序包的配置文件安装后曾经被修改,升级时,新版本的配置文件不会覆盖老版本的配置文件,而是把新版本的配置文件重命名</span>(<span style="font-family:宋体">加后缀</span>.rpmnew)<span style="font-family:宋体">后保存;</span></p> </td> </tr> </tbody> </table> <p>c<span style="font-family:宋体">、卸载篇</span></p> <table cellspacing="0" cellpadding="0"> <tbody> <tr class="firstRow"> <td width="85" valign="top"> <p><strong>rpm</strong></p> </td> <td width="468" colspan="2" valign="top"> <p><strong>rpm {-e|–erase} [–allmatches] [–nodeps] [–test] PACKAGE_NAME …</strong></p> </td> </tr> <tr> <td width="85" rowspan="4" valign="top"> <p><strong><span style="font-family:宋体">卸载选项:</span></strong></p> </td> <td width="104" valign="top"> <p>-e</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">卸载</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>–allmatches</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">如果一个程序包同时安装多个版本,则卸载所有</span> </p> </td> </tr> <tr> <td width="104" valign="top"> <p>–test</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">测试写在:</span>dry-run<span style="font-family:宋体">模式</span></p> </td> </tr> <tr> <td width="468" colspan="2" valign="top"> <p><span style="font-family:宋体">同样支持</span>-h, -v ,-vv,-vvv,-force,-nodeps<span style="font-family: 宋体">选项</span></p> </td> </tr> <tr> <td width="85" valign="top"> <p><strong><span style="font-family:宋体">注意事项</span></strong></p> </td> <td width="468" colspan="2" valign="top"> <p><span style="font-family:宋体">如果程序包的配置文件安装后曾被修改,卸载时,此文件通常不会被删除,而是被重命令</span>(<span style="font-family:宋体">加后缀</span>.rpmsave)<span style="font-family:宋体">后留存;</span></p> </td> </tr> </tbody> </table> <p>d<span style="font-family:宋体">、查询篇</span></p> <table cellspacing="0" cellpadding="0"> <tbody> <tr class="firstRow"> <td width="85" valign="top"> <p><strong>rpm</strong></p> </td> <td width="468" colspan="2" valign="top"> <p><strong>rpm {-q|–query} [select-options] [query-options]</strong></p> </td> </tr> <tr> <td width="85" rowspan="7" valign="top"> <p><strong><span style="font-family:宋体">常用选项:</span></strong></p> <p><strong>yeah,</strong><strong><span style="font-family:宋体">所有的一切都以加上</span>q</strong><strong><span style="font-family:宋体">为前提;</span></strong></p> </td> <td width="104" valign="top"> <p>-q</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">查询某包或某些包是否安装</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>-qa</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">查询已安装的所有包</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>-qf</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">查询某文件是有哪个安装包安装生成</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>-qi</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">查询某包的简要说明信息</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>-qip</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">查询某未安装的包文件的相关信息</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>-ql</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">查询某包安装生成的文件列表</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>-qc</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">查询某包安装完成后生成的所有配置文件</span></p> </td> </tr> <tr> <td width="85" valign="top"></td> <td width="104" valign="top"> <p>-qd</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">查询某包安装完成后的所有帮助文件</span></p> </td> </tr> <tr> <td width="85" valign="top"></td> <td width="104" valign="top"> <p>-q –changelog</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">查询某包制作时随版本变化的</span>changelog<span style="font-family:宋体">信息</span></p> </td> </tr> <tr> <td width="85" valign="top"></td> <td width="104" valign="top"> <p>-q –provides</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">查询某包提供的</span>capabilities</p> </td> </tr> <tr> <td width="85" valign="top"></td> <td width="104" valign="top"> <p>-q –requires</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">查询某包依赖的</span>capabilities</p> </td> </tr> <tr> <td width="85" valign="top"></td> <td width="104" valign="top"> <p>-q –scripts</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">查询某包安装或卸载时的执行脚本</span></p> </td> </tr> <tr> <td width="85" valign="top"> <p><strong><span style="font-family:宋体">注意事项</span></strong></p> </td> <td width="468" colspan="2" valign="top"> <p><span style="font-family:宋体">脚本有四类:</span></p> <p>preinstall<span style="font-family:宋体">:安装过程开始前执行的脚本;</span>postinstall<span style="font-family:宋体">:安装过程完成后执行的脚本;</span>preuninstall<span style="font-family:宋体">:卸载开始前执行的脚本;</span>postuninstall<span style="font-family:宋体">:卸载过程完成后执行的脚本</span></p> </td> </tr> </tbody> </table> <p>e<span style="font-family:宋体">、校验篇</span>—<span style="font-family:宋体">查询包安装之后生成的文件是否发生了改变</span></p> <p> <span style="font-family:宋体">查询方式:</span></p> <p> rpm {-V|–verify} [select-options] [verify-options]</p> <p> <span style="font-family:宋体">常见用法:</span></p> <p> rpm -V PACKAGE_NAMES</p> <p style="margin-left: 84px">S file Size differs <span style="font-family:宋体">文件大小</span></p> <p style="margin-left: 84px">M Mode differs (includes permissions and file type) <span style="font-family:宋体">权限</span></p> <p style="margin-left: 84px">5 digest (formerly MD5 sum) differs md5<span style="font-family:宋体">校验和</span></p> <p style="margin-left: 84px">D Device major/minor number mismatch <span style="font-family:宋体">主从设备号</span></p> <p style="margin-left: 84px">L readLink(2) path mismatch <span style="font-family:宋体">符号链接</span></p> <p style="margin-left: 84px">U User ownership differs <span style="font-family:宋体">属主</span></p> <p style="margin-left: 84px">G Group ownership differs <span style="font-family:宋体">属组</span></p> <p style="margin-left: 84px">T mTime differs <span style="font-family:宋体">最后修改时间</span></p> <p style="margin-left: 84px">P caPabilities differ</p> <p><span style="font-family: 宋体">注:</span></p> <p> 1<span style="font-family:宋体">、文件属性正常,则会显示点</span>’.’<span style="font-family:宋体">,否则会显示其代表字符,如:</span></p> <p><span style="font-family: 宋体"> 修改了</span>httpd<span style="font-family:宋体">配置文件后:</span></p> <p> [root@AZtest ~]# rpm -V httpd</p> <p> S.5….T. c /etc/httpd/conf/httpd.conf</p> <p> 2<span style="font-family:宋体">、</span>RPM<span style="font-family:宋体">校验也会用到</span>-a(<span style="font-family:宋体">所有已安装包</span>)<span style="font-family:宋体">,</span>-f(<span style="font-family:宋体">指定文件</span>)<span style="font-family:宋体">,</span>-p(<span style="font-family:宋体">指定</span>RPM<span style="font-family:宋体">包</span>)<span style="font-family:宋体">,</span>–noscripts<span style="font-family:宋体">,</span>–nodeps<span style="font-family:宋体">等选项;</span></p> <p> </p> <p>f<span style="font-family:宋体">、程序包的合法性验证:</span></p> <p style="text-align: left"> <span style="font-family:宋体">来源合法:由信任的制作者提供</span></p> <p style="text-align: left"> <span style="font-family:宋体">依赖于:制作者的数字签名,签名是作者使用自己的私钥加密程序包特征码进行的;</span></p> <p style="text-align: left"> <span style="font-family:宋体">内容合法:包未被</span>2<span style="font-family:宋体">次修改,完整性校验成功;</span></p> <p style="text-align: left"> <span style="font-family:宋体">依赖于:制作者提供的程序包特征码:</span></p> <p style="text-align: left"> <span style="font-family:宋体">验证方式:安装者用同样的特征码提取算法提取程序包的特征码,并与原作者提供的相比较;</span></p> <p style="text-align: left"> <span style="font-family:宋体">验证其光盘中程序包的来源及完整性:</span></p> <p style="text-align: left"> rpm –import /path/to/RPM-GPG-KEY-FILE</p> <p style="text-indent: 28px;text-align: left"><span style="font-family:宋体">验正:</span>rpm {-K|–checksig} PACKAGE_FILE</p> <p style="text-align: left"> –nosignature<span style="font-family:宋体">:不检查来源合法性</span></p> <p style="text-align: left"> –nodigest<span style="font-family:宋体">:不检查完整性</span></p> <p>f<span style="font-family:宋体">、重建数据库篇</span></p> <p> rpm<span style="font-family:宋体">管理器数据库:</span>/var/lib/rpm<span style="font-family:宋体">,如果某些操作导致</span>RPM<span style="font-family:宋体">数据库</span>/var/lib/rpm<span style="font-family:宋体">内的文件损坏,可使用如下命令</span></p> <table cellspacing="0" cellpadding="0"> <tbody> <tr class="firstRow"> <td width="85" valign="top"> <p><strong>rpm</strong></p> </td> <td width="468" colspan="2" valign="top"> <p><strong>rpm {–initdb|–rebuilddb} [-v] [–dbpath DIRECTORY] [–root DIRECTORY]</strong></p> </td> </tr> <tr> <td width="85" rowspan="2" valign="top"> <p><strong><span style="font-family:宋体">重建数据库:</span></strong></p> </td> <td width="104" valign="top"> <p>–initab</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">初始化数据库,即数据库完全不存时,可新建之</span></p> </td> </tr> <tr> <td width="104" valign="top"> <p>–rebuilddb</p> </td> <td width="364" valign="top"> <p><span style="font-family:宋体">无论当前数据存在与否,都会直接重建此库</span></p> </td> </tr> <tr> <td width="85" valign="top"> <p><strong><span style="font-family:宋体">注意事项</span></strong></p> </td> <td width="468" colspan="2" valign="top"></td> </tr> </tbody> </table> <p> <span style="font-family: 宋体">最后说一句,为了强迫自己记忆和手敲,不记录例子了。。。</span></p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信