RPM指南
时间:2005-10-29 来源:rickyweiwei
RPM格式软件包的安装
1.简介
几乎所有的Linux发行版本都使用某种形式的软件包管理安装、更新和卸载软件。
RPM全称是Red Hat Package Manager(Red Hat包管理器)。RPM本质上就是一个包,包含可以立即在特定机器体系结构上安装和运行的Linux软件。RPM示意图见图1。
大多数Linux RPM软件包的命名有一定的规律,它遵循名称-版本-修正版-类型-MYsoftware-1.2 -1.i386.rpm 。
目前RPM有两种模式,一种是已经过编码的(i386.rpm),一种是未经编码的(src.rpm)。
#rpm --rebuild Filename.src.rpm
这时系统会建立一个文件Filenamr.rpm,在/usr/src/redflag/RPMS/子目录下,一般是i386,具体情况和Linux发行版本有关。
然后执行下面代码即可:
#rpm -ivh /usr/src/regflag/RPMS/i386/Filename.rpm
安装,升级,卸载
所有的这些命令需要‘root’权限。
rpm -i package :安装(install)一个包,
rpm -e archive :卸载(erase),
rpm -U package :升级(upgrades)到新版本(包括安装新的包),
rpm -F packages :更新(freshen)若干个包。先检查指定的包中哪些已安装,然后以合理的顺序更新这些包。
有两个特殊的修正(modifier)可以和上述参数连用:‘--test’ 、‘--verbose’(或‘-v’)。
‘--test’ 只是以模拟(as if)的方式执行命令:您可以获得 RPM 执行时产生的所有信息,但是实际上命令没有真正执行,这个修正没有缩写形式。
‘--verbose’(-v) 会输出 RPM 运行时的冗余(verbose)信息。这一参数在检查错误或与‘--test’连用时特别有用。添加另一个‘-v’(‘-vv’)能输出更多的冗余信息。
RPM格式软件包的安装
1.简介
几乎所有的Linux发行版本都使用某种形式的软件包管理安装、更新和卸载软件。
RPM全称是Red Hat Package Manager(Red Hat包管理器)。RPM本质上就是一个包,包含可以立即在特定机器体系结构上安装和运行的Linux软件。RPM示意图见图1。
大多数Linux RPM软件包的命名有一定的规律,它遵循名称-版本-修正版-类型-MYsoftware-1.2 -1.i386.rpm 。
目前RPM有两种模式,一种是已经过编码的(i386.rpm),一种是未经编码的(src.rpm)。
#rpm --rebuild Filename.src.rpm
这时系统会建立一个文件Filenamr.rpm,在/usr/src/redflag/RPMS/子目录下,一般是i386,具体情况和Linux发行版本有关。
然后执行下面代码即可:
#rpm -ivh /usr/src/regflag/RPMS/i386/Filename.rpm
2、RPM命令主要参数:
-i :安装软件
-F:更新
-U :升级
-e:卸除 (卸载包时, 要用原始包的实际文件名而不能使用包用,否则提示:package package_name is not installed。 )
补充参数:
输出用: -v -h驶(对安装、卸除过程更详细了解;-v说明执行步骤,-h显示百分比进度条)
预设条件: --nodeps , --force
重定位: --root
安装、升级、更新区别:
rpm -i : 在目标包或其旧版未安装情况下安装该rpm包(只有未安装则安装,已安装则不再进行安装) 安装
若正常安装,则无任何输出信息,返回提示符;若是已安装包则输入:package package_name is already installed
rpm -U : 无论目标包或其旧版包是否安装过,均安装或更新指定的包 (不论是否有相同的新旧包安装,都重新安装包) 升级
rpm -F : 仅在系统已安装某RPM包时,才更新指定包,如没安装则不安装(已安装则更新,未安装的包不进行不操作) 更新
更新全部软件包 rpm -U ,所以rpm -U用着升级 。更新已安装的软件包 rpm -F,称为更新
使用场景1:只想升级系统中已有的包时RPM 更新选项会非常有用。
这种情况下, 只需简单的键入:
# rpm -Fvh *.rpm
RPM 工具会自动升级那些已经安装好的包。
2:因为升级其实就是软件包的卸载与安装的综合,事实上用户可能总是使用 -U 来安装软件包, 因为即便以往未安装过该软件包,也能正常运行。尽管通常是使用 rpm -ivh *-1.i386.rpm 来安装包, 但也可以用 rpm -Uvh *.i386.rpm 来替代
3:如果软件包已被安装, 会出现以下信息:
package packe-name is already installed
如果仍要安装该包, 可以在命令行中使用 --replacepkgs 选项, 这样 RPM 将忽略该错误信息
4:文件冲突
如果要安装的软件包中有一个文件已在安装其它包时被安装,会显示以下信息:
/usr/bin/foo conflicts with file from bar-1.0-1
要想让RPM 忽略该错误信息, 请使用 --replacefiles 命令行选项
5:未解决依赖关系
一个 RPM 包可能会 "依赖" 其它软件包, 也就是说要求在安装了特定的软件包之后才能安装该软件包。 如果在安装这 个 软件包时未解决这种存在的依赖关系, 会看到: failed dependencies: who is needed by something
只有先安装完所依赖的软件包,才能解决这个问题。 如果想强制安装 (这不是个好办法,因为安装后的软件包未必能正常运行), 可以使用 --nodeps 命令行选项(此参数不检查依赖性关系)。
3、查询
该命令不需要‘root’权限。请注意,当您查询一个未安装的包时,您需要将‘-p’参数与‘-q’连用。
rpm -q archive :查询(query)包名和已安装包的版本号,
rpm -qp package :同样是查询,但只针对未安装的包,
rpm -qi archive :告知(inform)包的用途,由谁打包,何时、何地打包,这个包是什么时候安装的,包的大小,等等。要查询未安装的包,可运行 rpm -qpi package ,
rpm -ql archive :列出(list)已安装包中的所有文件,
rpm -qd archive :列出所有已安装包中的所有文档(documentation)文件,
rpm -qa :列出所有( all)已安装的包,经常与‘grep’连用,
rpm -qa --last :以安装日期为顺序列出所有包,最近安装的包在前,
rpm -q --changelog archive :显示维护者对包的所有修改记录,
rpm -qf file :显示该文件(file)属于哪个已安装的包。
除了指定包名以外,用户还可以使用以下选项与 -q 连用,来指明要查询哪些软件包的信息。这些选项被称之为 软件包指定选项。
-a 查询所有已安装的软件包。
-f 将查询包含有文件 的软件包。
有几种方式来指定查询软件包时所显示的信息。 以下选项可以出选择感兴趣的信息,加以显示。这样的选项被称作信息选择选项
-i 显示软件包信息,如描述、发行号、大小、编译日期、安装日期、硬件平台、以及其它一些各类信息。
-l 列出软件包中包含的文件。
-s 显示软件包中所有文件的状态。
-d 列出被标注为文档的文件 (如,man 手册、 info 信息、README,等等) 。
-c 列出被标注为配置文件的文件。这些文件是需要在安装完毕后加以定制的,如 (sendmail.cf, passwd, inittab, 等) 。
如果要在执行上述选项的同时,显示文件列表, 可以同时使用 -v 命令行选项,就能得出与 ls -l 格式类似的输出。
1找匹配的已安装包
常见的问题:您想知道某个包是否已安装,但却记不清包的确切名称,可用:
rpm -qa | grep -i pattern
将列出含有字符串‘pattern’的已安装包,并且不区分大小写。
2 在未安装的包中找一个文件
另一个常见问题是:哪个包里有这个文件?
for i in /mnt/cdrom/Mandrake/RPMS/*.rpm ; do rpm -qpli $i | grep filename && echo $i ; done
如果这个指定文件(filename)在其中的某个包中,这个 for-do 循环将返回其名称。
3 将已安装的包按顺序列出
可选项‘--queryformat’使您可以在给定的 RPM 中,根据说明文件中单独的某个域(field),按任何顺序进行查询。键入
rpm --querytags
将列出所有可用的域,这种格式有些复杂,所以最好用例子来演示。
假设您的硬盘空间紧张,想将已安装的包按大小列出,这样您就可以找出最好卸载哪个包,命令如下(在一行中):
-qf '%[输出宽度]{功能标签}'
rpm -qa --queryformat '% { name} % { size} ' | sort -n +1 | column -t
是不是有点迷糊?;) 第一部分完成了所有工作:只按查询标签(querytags)‘name’和‘size’,对所有包进行查找,其中的标签格式是‘%{[tag]}’。由于查询标签字符串中包含空格,所以要用单引号括起来。其中‘ ’在每行添加一个回车(line break)。
‘sort’命令将输出排序结果(大的在后),‘column’将每行分成漂亮的两列:名称在左,比特为单位的大小在右。只要您记得这种特殊的查询标签格式,使用起来还是很不错的。
4、校验(包安装到系统后是否发生变动的检查)
包校验是比较自软件包中安装的文件信息和软件包中的原始文件的相同信息。 与其它校验相同,包校验将比较文件的长度、MD5校验和、许可、类型、文件属主和群组。
使用 rpm -V 命令进行包校验。用户可以配合使用各个包选择选项 ,来列出校验包的查询结果。 简单地使用 rpm -V foo 可以校验 foo 包中原始安装时的所有文件。例如:
校验包含特定文件的软件包: rpm -Vf /bin/vi
校验所有已安装的软件包: rpm -Va
用 RPM 包文件校验已安装的软件包: rpm -Vp foo-1.0-1.i386.rpm
如果担心RPM数据库被破坏,就可以使用这种方式加以校验。
如果校验结果一切正常,将不会产生任何输出。如果有不一致的地方,会显示出来。 输出格式是8位长字符串, "c" 用以指配置文件, 接着是文件名。8位长字符,每个代表一个文件属性与RPM数据库中记录的属性相比较的结果。"." (点) 表示测试通过。 下面的字符代表某测试的失败:
5 -- MD5 校验和 (完整性,时间)
S -- 文件长度
L -- 符号链接
T -- 文件修改日期
D -- 设备
U -- 用户
G -- 用户组
M -- 模式 (包含许可和文件类型)
? -- 不可读文件
如果有信息输出, 用户应当认真加以考虑,是该删除、重新安装、还是修正出现的问题。
5、RPM包的检查(GPG签名检查,安装前检查包是否在纷发途中被篡改)
#gpg --import /usr/share/rhn/RPM-GPG-KEY
#rpm --import /usr/share/rhn/RPM-GPG-KEY
#rpm -K
6、已安装软件包查询(locate)
#rpm -qf /usr/bin/locate
#rpm -qf /usr/bin/updatedb
#rpm -ivh slocate-12.7-*.RHEL4
7、从rpm软件包抽取文件;为软件包指定安装目录:要加 -relocate 参数;
格式: rpm2cpio file.rpm |cpio -div
用‘rpm2cpio’命令,将 RPM 包转换到‘cpio’归档中,然后您再用‘cpio’命令对其进行操作。
8、常见问题 http://www.jijiao.com.cn/wenti/00000009.htm
http://www.rpm.org
http://fedora.linuxsir.org/main/?q=node/50