在Linux系统中,RPM(RedHat Package Management)是最常用的软件包管理工具之一。无论是安装、卸载还是查询软件包,掌握一套熟练的RPM命令能让日常运维事半功倍。下面从安装、卸载、查询到一些进阶技巧,逐一拆解。
1. 安装rpm软件包
安装RPM包直接用rpm命令即可。执行:
rpm -i your-package.rpm
这里your-package.rpm是包文件名,通常放在当前目录下。安装过程中可能会遇到两类常见提示:
- ... conflict with ... —— 说明包里的某些文件会覆盖现有文件。缺省情况下安装会被拒绝,此时可以用
rpm --force -i强制安装。 - ... is needed by ... 或 ... is not installed ... —— 说明依赖的软件缺失。可以用
rpm --nodeps -i忽略依赖检查,强行装上。
换句话说,rpm -i --force --nodeps 能摆脱几乎所有约束,什么包都能安上。但强制安装的软件包不保证功能完整,使用时需谨慎。
2. 安装.src.rpm软件包
以.src.rpm结尾的包包含源代码,安装时需要先编译。有两种主流方法:
方法一:
- 执行
rpm -i your-package.src.rpm - 进入
/usr/src/redhat/SPECS目录 - 运行
rpmbuild -bp your-package.specs(specs文件与包同名) - 进入
/usr/src/redhat/BUILD/your-package/目录(与包同名) - 执行
./configure(可加参数,和编译普通源码一样) - 执行
make - 执行
make install
方法二:
- 执行
rpm -i you-package.src.rpm - 进入
/usr/src/redhat/SPECS(前两步与方法一相同) - 运行
rpmbuild -bb your-package.specs
此时在 /usr/src/redhat/RPM/i386/(也可能是i686、noarch等)目录下会生成一个编译好的二进制RPM包。执行 rpm -i new-package.rpm 即可安装。
3. 卸载rpm软件包
命令格式:rpm -e 包名。包名可以包含版本号,但不能带有.rpm后缀。示例:卸载proftpd-1.2.8-1,以下格式都有效:
rpm -e proftpd-1.2.8-1
rpm -e proftpd-1.2.8
rpm -e proftpd-
rpm -e proftpd
下面几种写法是错误的:
rpm -e proftpd-1.2.8-1.i386.rpm
rpm -e proftpd-1.2.8-1.i386
rpm -e proftpd-1.2
rpm -e proftpd-1
卸载时如果出现 ... is needed by ...,说明该软件被其他程序依赖,不能随便卸。可以用 rpm -e --nodeps 强制卸载,但同样可能影响系统稳定性。
4. 不安装但获取rpm包中的文件
借助 rpm2cpio 和 cpio 工具,可以在不安装包的情况下提取其中文件:
rpm2cpio xxx.rpm | cpio -vi
rpm2cpio xxx.rpm | cpio -idmv
rpm2cpio xxx.rpm | cpio --extract --make-directories
参数说明:-i(或--extract)表示提取文件;-v 显示执行过程;-d(--make-directories)按包中原路径创建目录;-m 保持文件的时间戳。
5. 查看与rpm包相关的文件和其他信息
以下举例均以软件包 mysql-3.23.54a-11 为参考。
5.1 已安装的包有哪些?
rpm -qa 会列出所有安装过的包。若需筛选含特定字符串的包,比如sql:
rpm -qa | grep sql
5.2 获取某个包的文件全名
rpm -q mysql 返回系统中安装的MySQL包全名(如mysql-3.23.54a-11),从中可获取版本信息。
5.3 包中的文件安装到了哪里?
rpm -ql 包名(包名不含.rpm)。例如 rpm -ql mysql 或 rpm -ql mysql-3.23.54a-11。若只想知道可执行文件路径,也可以用 which mysql。
5.4 一个rpm包中包含了哪些文件?
对于未安装的包:rpm -qlp ****.rpm。对于已安装的包:rpm -ql ****.rpm(注意包名写法)。
5.5 获取软件包的版本、用途等信息
未安装的包:rpm -qip ****.rpm。已安装的包:rpm -qi ****.rpm。
5.6 某个程序是哪个包安装的?
rpm -qf `which 程序名`(注意不是引号,而是反引号,即键盘左上角的`键)。例如:
# rpm -qf `which ftptop`
proftpd-1.2.8-1
还可搭配其他参数:rpm -qif 返回信息,rpm -qlf 返回文件列表,rpm -qilf 同时输出两者。
5.7 某个普通文件是哪个包安装的?
适用于任何文件(不仅可执行程序)。先用 whereis 或 which 获取完整路径,再用 rpm -qf。示例:
# whereis ftptop
ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz
# rpm -qf /usr/bin/ftptop
proftpd-1.2.8-1
# rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt
proftpd-1.2.8-1
总结一下:rpm -q 是查询核心,后面可跟:i(info,软件包信息)、l(list,文件列表)、a(all,所有包)、f(file,根据文件查询)、p(package,根据包查询)。查询条件可通过 grep 或反引号内的命令产生。
6. 关于rpm软件包的一些相关知识
6.1 什么是rpm
RPM 即 RedHat Package Management,是 RedHat 的发明之一,用于管理软件包的安装、升级、配置和卸载。
6.2 为什么需要rpm
操作系统下有成百上千的软件包,彼此存在依赖关系,版本、安装、卸载都需要自动化。RPM 正是为解决这些问题而生的管理系统。只要软件包符合 RPM 标准,就能方便地安装、升级、卸载。
6.3 是不是所有Linux都使用rpm
很多Linux发行版都使用RPM(如RedHat、Mandrake等),但并非全部。其他系统有自己的包管理工具,例如Debian的deb包、Slackware的包管理系统。由于RPM的源代码可以跨平台编译,理论上其他系统也能用RPM。
6.4 rpm包的文件名为什么那么长
文件名包含了软件包名称、版本号、发行号、目标操作系统、硬件架构等信息。例如 mypackage-1.1-2TL.i386.rpm:mypackage是包名,1.1是版本,2是发行号,TL表示用于TL操作系统(也可能是RH等),i386表示适用Intel x86平台。
6.5 软件包文件名中的i386、i686是什么意思
这些标识适用于哪种硬件架构:
- i386:适用于Intel 80386以上x86架构(IA32)。
- i686:适用于Intel 80686以上(奔腾Pro以上)的x86架构(IA32),通常针对CPU做了优化。
- noarch:与硬件架构无关,可通用。
i686包向后兼容性一般,i386包可在所有x86机器上运行。如今奔腾Pro以下的CPU已很少见,普通机器都可以使用i686包。
6.6 不同操作系统发行的rpm包可否混用?
已编译好的二进制RPM包因操作系统环境不同,一般不能混用。而以.src.rpm发行的包需在本地编译,通常可在不同系统下安装。
6.7 使用rpm时遇到的一些特殊问题
Q: 用 rpm -e **.rpm 无法删除包?
A: 包名不要带.rpm,正确格式是 rpm -e 包名(可含版本号,但无后缀)。
Q: 在Windows系统下有没有读取RPM文件的工具?
A: 可以使用 wincmd 配合 RPM 插件。
Q: 是否可以通过FTP安装/升级RPM包?
A: 可以。例如 rpm -ivh ftp://xxxxxxxx/PATH2SomeRPM。
Q: RPM安装时提示已有包版本过高怎么办?
A: 如果系统中相关包版本较新,导致依赖文件缺失,有两种办法:一是在系统文件中找到功能相近的文件,做个符号链接到所需目录;二是考虑降级或使用兼容版本。具体情况需灵活处理。
