rpm
<h2>简介</h2>
<ul>
<li>RPM Package Manager(RPM软件包管理器),又叫二进制包</li>
<li>这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,
<ul>
<li>现在包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用,可以算是公认的行业标准了。</li>
</ul></li>
<li>二进制包经过编译,机器可以识别的二进制,由0和1组成的包。
<ul>
<li>二进制源代码编译后,就不能看到原来的代码了。</li>
</ul></li>
<li>Linux操作系统CentOS版本,为系统默认安装的软件包,格式为RPM。</li>
</ul>
<h2>rpm包命名原则</h2>
<ul>
<li>
<p>查看一些RPM安装包</p>
<ul>
<li>如CentOS的镜像文件,用压缩软件打开,进入到Packages中</li>
</ul>
</li>
<li>
<p>包的组成</p>
<ul>
<li>
<p>软件包名-软件版本-软件发布的次数.适合的Linux平台.适合的硬件平台.扩展名</p>
</li>
<li>如:httpd-2.2.15-15.el6.centos.i686.rpm</li>
</ul>
<pre><code class="language-shell">httpd 软件包名
2.2.15 软件版本
15 软件发布的次数
el6.centos 适合的Linux平台
i686 适合的硬件平台
rpm rpm包扩展名</code></pre>
</li>
<li>
<p>包名与包全名</p>
<ul>
<li>操作的对象是未安装包,那么必须使用包全名,而且要使用绝对路径</li>
<li>操作的对象是已经安装的包,那么必须使用包名,但是任何路径都可以执行</li>
</ul>
</li>
</ul>
<h2>rpm包依赖性</h2>
<ul>
<li>rpm命令手工安装出现的问题
<ul>
<li>是PRM包依赖性</li>
<li>树形依赖</li>
<li>a->b->c</li>
<li>环形依赖</li>
<li>a->b->c->a</li>
<li>模块依赖</li>
<li>模块依赖查询网站:www.rpmfind.net</li>
<li>如果电脑不能上网,只能去猜PRM包依赖于哪个包了,猜不出来,就不能安装 </li>
</ul></li>
<li>rpm命令手工安装出现的依赖性解决方法,是yum在线安装</li>
</ul>
<h2>rpm命令</h2>
<h4>安装</h4>
<pre><code class="language-shell">rpm -ivh 包全名(绝对路径)
# 如:rpm -ivh httpd-2.2.3-43.el5.centos.i386.rpm
# -i(install) 安装
# -v(verbose) 显示详细信息
# -h(hash) 显示进度
# --nodeps 不检测依赖性,安装时禁止使用此选项,否则安装的包不能使用</code></pre>
<h4>升级</h4>
<pre><code class="language-shell">rpm -Uvh 包全名
# -U(upgrade)</code></pre>
<ul>
<li>升级过程和安装过程一样,甚至用升级过程取代安装过程,也是没有问题的</li>
</ul>
<h4>卸载</h4>
<pre><code class="language-shell">rpm -e 包名
# 如:rpm -e httpd
# -e(erase) 包名
# --nodeps 不检查依赖性</code></pre>
<ul>
<li>
<p>执行卸载时,不需要在安装的目录下执行了</p>
<ul>
<li>输入包名即可,相关安装数据,以经写入数据库中,卸载时会自动从数据库中查询</li>
<li>卸载完成,没有卸载成功提示</li>
</ul>
</li>
<li>
<p>Apache全部卸载完成的原因</p>
<ul>
<li>
<p>树形依赖 a->b->c</p>
</li>
<li>
<p>正常要先卸载a包,再卸载b包,再卸载c包的顺序</p>
</li>
<li>
<p>没有包依赖于Apache,Apache只依赖于其它包</p>
</li>
<li>Apache属于树形依赖的最顶层,a包</li>
</ul>
</li>
</ul>
<h4>查询</h4>
<ul>
<li>
<p>查询是否安装</p>
<pre><code class="language-shell"># -q 查询(query)
rpm -q 包名
# =-a 所有(all)
rpm -qa
# 管道方式查询
rpm -qa | grep httpd
</code></pre>
</li>
<li>
<p>查询软件包详细信息</p>
<ul>
<li>-i 查询软件信息(information)</li>
<li>-p 查询未安装包信息(package)</li>
<li>rpm -qi 包名</li>
<li>前提是生产包的时候,经以把信息写入包中了</li>
</ul>
</li>
<li>
<p>查询包中文件安装位置</p>
<ul>
<li>-l 列表(list)</li>
<li>rpm -ql 包名</li>
<li>rpm安装位置也可以手工指定</li>
<li>但会出现相关问题,很多功能搜索位置都是固定</li>
<li>不建议手工指定rpm文件安装位置</li>
</ul>
</li>
<li>
<p>查询系统文件属于哪个rpm包</p>
<ul>
<li>-f 查询系统文件属于哪个软件包(file)</li>
<li>rpm -qf 系统文件名</li>
<li>如:rpm -qf /etc/yum.conf</li>
</ul>
</li>
<li>
<p>查询软件包的依赖性</p>
<ul>
<li>
<p>-R 查询软件包的依赖性(require)</p>
</li>
<li>rpm -qR 包名</li>
</ul>
</li>
</ul>
<h4>校验</h4>
<ul>
<li>判断系统文件是否被人更改</li>
<li>rpm -V 已安装的包名</li>
<li>-V 校验指定RPM包中的文件(verify)</li>
<li>如果没有被改动过,执行完没有提示信息</li>
<li>文件改动提示
<ul>
<li>S.5....T. c /etc/httpd/conf/httpd.conf</li>
<li>验证内容中的信息,默认8个字符</li>
<li>S 文件内容大小是否改变</li>
<li>M 文件的类型或文件的权限(rwx)是否被改变</li>
<li>5 文件MD5校验和是否改变(可以看成文件内容是否改变)</li>
<li>D 设备的中,从代码是否改变</li>
<li>L 文件路径是否改变</li>
<li>U 文件的属主(所有者)是否改变</li>
<li>G 文件的属组是否改变</li>
<li>T 文件的修改时间是否改变</li>
</ul></li>
<li>如果出现用"."点代表,表示没有修改</li>
<li>文件类型
<ul>
<li>c 配置文件(config file)</li>
<li>d 普通文件(documentation)</li>
<li>g "鬼"文件(ghost file),很少风,就是该文件不应该被这个RPM包包含</li>
<li>l 授权文件(license file)</li>
<li>r 描述文件(read me)</li>
</ul></li>
</ul>
<h2>提取</h2>
<ul>
<li>
<p>误删除linux系统中的某个文件,知道此文件属于哪个软件包</p>
<ul>
<li>从此包提取出指定文件,进行覆盖,即可修复错误,而不用重新安装linux系统</li>
</ul>
</li>
<li>
<p>进行修复,最常见就是误删除操作,删除了某个命令</p>
</li>
<li>
<p>rpm2cpio 包全名 | \ cpio -idv .文件绝对路径 </p>
<ul>
<li>
<p>rpm2cpio 将rpm包转换为cpio格式命令</p>
</li>
<li>
<p>cpio 是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件</p>
</li>
<li>
<p>2 由于2是英文two的意思,而two又和to发音一样</p>
</li>
<li>
<p>cpio命令格式</p>
</li>
<li>-i copy-in模式,还原</li>
<li>-d 还原时自动新建目录</li>
<li>-v 显示还原过程</li>
<li>
<p>cpio 选项 <文件|设备></p>
</li>
<li>\ 反斜杠代表,一条命令没有输入完,进行换行</li>
<li>cpio -idv 代表当前目录</li>
<li>. 点代表,把指定文件提取到当前位置下
<ul>
<li>一般情况,.文件绝对路径,都要放在当前位置当中,作为标准格式记录下来</li>
</ul></li>
</ul>
</li>
<li>
<p>实例</p>
<pre><code class="language-shell">rpm -qf /bin/ls
# 查询ls命令属于哪个软件包
# 查询所属包为coreutils-8.4-31.el6.i686
mv /bin/ls /tmp
# 造成ls命令误删除假象
# 此时再输入ls命令出现提示 -bash: ls: command not found
rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-31.el6.i686.rpm | cpio -idv ./bin/ls
# 提取RPM包中ls命令到当前目录的/bin/ls下
# 成功会出现提示信息
# ./bin/ls
# 24819 块
# 输入ls命令,测试ls命令是否能够使用
# 如果ls命令不能使用,输入dir命令
# dir /tmp 可以看到tmp目录下有ls文件
cp /tmp/ls /bin/
# 把ls命令复制到/bin/目录,修复丢失的文件
# 再次测试ls命令,输入ls命令,如果ls命令可以使用,提取成功</code></pre>
</li>
</ul>
<h2>rpm安装实例</h2>
<ul>
<li>
<p>使用mount命令,查看光盘是否挂载</p>
<ul>
<li>如果光盘没有挂载,请挂载</li>
<li>进入到挂载的目录</li>
<li>如之前光盘挂载为/mnt/cdrom</li>
</ul>
</li>
<li>
<p>进入到当前目录Packages</p>
<ul>
<li>
<p>如果不进入到此目录下进行安装包的话</p>
</li>
<li>安装路径需要写绝对路径,包全名</li>
<li>
<p>进入此目录后,安装写相对路径就行,包名即可</p>
</li>
<li>
<p>安装时,建议进入到要安装的目录中</p>
</li>
<li>安装方便,使用相对路径,包名即可</li>
<li>
<p>支持包名自动补全功能</p>
<ul>
<li>输入包名的前几个字符</li>
<li>按Tab键,会列出含有输出字符的包名</li>
</ul>
</li>
<li>
<p>如果使用Tab键自动补全功能,拿安装包名举例</p>
</li>
<li>
<p>rpm -ivh http</p>
</li>
<li>
<p>按一下Tab键,会提示显示软件包名</p>
<pre><code class="language-shell">rpm -ivh httpd-</code></pre>
</li>
<li>
<p>所然后再两下Tab键,会提示显示软件包名和所有包含输入字符的包名</p>
<pre><code class="language-shell">rpm -ivh httpd-
httpd-2.2.15-29.el6.centos.i686.rpm
httpd-devel-2.2.15-29.el6.centos.i686.rpm
httpd-manual-2.2.15-29.el6.centos.noarch.rpm
httpd-tools-2.2.15-29.el6.centos.i686.rpm</code></pre>
</li>
<li>
<p>安装时,一般先安装主包,再安装附加包</p>
<ul>
<li>
<p>先安装httpd-2.2.15-29.el6.centos.i686.rpm主包</p>
</li>
<li>再安装</li>
</ul>
<pre><code class="language-shell">httpd-devel-2.2.15-29.el6.centos.i686.rpm
httpd-manual-2.2.15-29.el6.centos.noarch.rpm
httpd-tools-2.2.15-29.el6.centos.i686.rpm</code></pre>
</li>
</ul>
</li>
</ul>