Linux下的软件包管理:RPM 完全指南
在 Linux 操作系统的软件管理中,几乎绕不开 RPM 这款核心工具。RPM 的全称为 Redhat Package Manager,由 Redhat 公司提出,专门用于管理 Linux 下的软件包。简而言之,Linux 系统在安装时,除了几个核心模块之外,其余绝大多数模块都是通过 RPM 来完成的。RPM 提供了五种核心操作模式:安装、卸载、升级、查询和验证,满足了日常软件管理的大部分需求。
接下来,我们逐一深入这几种操作的具体用法与实战技巧。
RPM 安装操作
最基本的安装命令非常简洁:
rpm -i 需要安装的包文件名
举个例子,如果你想安装一个名为 example.rpm 的软件包,直接执行:
rpm -i example.rpm
不过,在实际工作中,更常用的还是带参数的版本。加上 -v 可以在安装过程中显示正在安装的文件信息,再加上 -h 则会显示安装进度条。因此,完整命令通常是:
rpm -ivh example.rpm
这组参数组合在一起,已经成为日常安装 RPM 包的标准操作方式。
RPM 查询操作
查询操作可能是日常使用频率最高的功能之一。它的基本命令是:
rpm -q …
在此基础上,可以搭配不同的附加参数来满足各种查询需求:
- -a:查询所有已经安装的包
- -i:显示安装包的信息
- -l:显示安装包中的所有文件被安装到哪些目录下
- -s:显示安装包中的所有文件状态及被安装到哪些目录下
- -p:查询的是 安装包 的信息(注意,是还没安装的 .rpm 文件)
- -f:查询的是 已安装的某文件 所属的包信息
来看几个实际例子:
rpm -qa | grep tomcat4 # 查看 tomcat4 是否被安装 rpm -qip example.rpm # 查看 example.rpm 安装包的信息 rpm -qif /bin/df # 查看 /bin/df 文件所在安装包的信息 rpm -qlf /bin/df # 查看 /bin/df 文件所在安装包中的各个文件分别被安装到哪个目录下
注意,-p 和 -f 的区别很关键:前者针对的是未安装的 .rpm 文件,后者针对的是系统中已有的文件。
RPM 卸载操作
卸载操作的命令是:
rpm -e 需要卸载的安装包
卸载前,别忘了先用 rpm -q … 查出确切的包名。例如:
rpm -e tomcat4
这里有个坑需要留意:包名不能带 .rpm 后缀。例如,卸载 proftpd-1.2.8-1 时,正确写法是 rpm -e proftpd-1.2.8-1 或 rpm -e proftpd,但绝对不能写成 rpm -e proftpd-1.2.8-1.i386.rpm。
如果遇到“... is needed by ...”这样的提示,说明该包被其他软件依赖,不能随意卸载。可以添加 --nodeps 参数强制卸载,但风险需自行承担。
RPM 升级操作
升级的操作同样简单:
rpm -U 需要升级的包
实际使用中,通常也会带上 -v 和 -h 参数:
rpm -Uvh example.rpm
RPM 验证操作
验证操作用于检查文件是否被篡改过。命令是:
rpm -V 需要验证的包
比如验证 /etc/tomcat4/tomcat4.conf 这个文件:
rpm -Vf /etc/tomcat4/tomcat4.conf
输出信息类似:S.5....T c /etc/tomcat4/tomcat4.conf。其中,S 表示文件大小被改过,T 表示文件日期被改过。更多验证信息的说明,可以用 man rpm 查阅。
RPM 的其他附加命令
除了刚才提到的,还有几个常用参数值得记一下:
- --force:强制操作,比如强制安装或删除
- --requires:显示该包的依赖关系
- --nodeps:忽略依赖关系并继续操作
可以说,RPM 的出现让 Linux 下的软件安装、卸载和升级变得容易多了。它原本是 Red Hat 发行版的专属工具,但由于遵循 GPL 规则且功能强大,逐渐被其他发行版广泛采纳。
语法和选项
完整的 RPM 命令语法是:
rpm (选项)(参数)
其中,选项部分非常丰富,列几个常用的:
-a:查询所有套件 -b<完成阶段><套件档>+ 或 -t<完成阶段><套件档>+:设置包装套件的完成阶段 -c:只列出组态配置文件(需配合 -l 使用) -d:只列出文本文件(需配合 -l 使用) -e<套件档> 或 --erase<套件档>:删除指定的套件 -f<文件>+:查询拥有指定文件的套件 -h 或 --hash:安装时列出标记 -i:显示套件的相关信息 -i<套件档> 或 --install<套件档>:安装指定的套件档 -l:显示套件的文件列表 -p<套件档>+:查询指定的 RPM 套件档 -q:使用询问模式 -R:显示套件的关联性信息 -s:显示文件状态(需配合 -l 使用) -U<套件档> 或 --upgrade<套件档>:升级指定的套件档 -v:显示指令执行过程 -vv:详细显示指令执行过程,便于排错
参数部分很简单,就是你要操作的 RPM 软件包文件名。
实战:安装与卸载的进阶技巧
如何安装 rpm 软件包
最标准的安装方式是:
rpm -ivh your-package.rpm
安装时如果遇到 ... conflict with ... 的警告,说明要安装的包里有些文件会覆盖现有文件。默认情况下无法继续,可以加 --force 参数强制安装。如果遇到 ... is needed by ... 或 ... is not installed ...,说明缺少依赖,可以用 --nodeps 忽略。不过要注意,rpm -i --force --nodeps 这种组合虽然能安装任何包,但强行安装的软件可能无法完全正常工作。
如何安装 .src.rpm 软件包
以 .src.rpm 结尾的包是包含源代码的,安装时需要编译。有两种方法:
方法一:
rpm -i your-package.src.rpm cd /usr/src/redhat/SPECS rpmbuild -bp your-package.specs # 一个和你的软件包同名的specs文件 cd /usr/src/redhat/BUILD/your-package/ # 一个和你的软件包同名的目录 ./configure # 和编译普通源码一样,可以加参数 make make install
方法二:
rpm -i you-package.src.rpm cd /usr/src/redhat/SPECS
前两步和方法一相同,然后执行:
rpmbuild -bb your-package.specs # 一个和你的软件包同名的specs文件
这时在 /usr/src/redhat/RPM/i386/(也可能是 i686、noarch 等)目录下,会生成一个编译好的二进制 RPM 包。最后执行 rpm -i new-package.rpm 安装即可。
如何不安装但提取 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-directory 相同,表示根据包中文件路径建立目录;-m 保持文件的更新时间。
查看与 rpm 包相关的文件和信息
下面以软件包 mysql-3.23.54a-11 为例,演示几种常见查询场景。
1. 查看系统中安装的所有 rpm 包
rpm -qa # 列出所有安装过的包
如果想查找包含某个字符串(比如 sql)的包:
rpm -qa | grep sql
2. 获取某个包的完整名称
rpm -q mysql
这条命令会返回系统中安装的 mysql 包全名,比如 mysql-3.23.54a-11。
3. 查看一个包中的文件安装到了哪些目录
rpm -ql 包名
注意,包名不带 .rpm 后缀。如果只想知道可执行程序的位置,也可以用 which 命令,比如 which mysql。
4. 查看一个包中包含哪些文件
- 对于未安装的包:
rpm -qlp ****.rpm - 对于已安装的包:
rpm -ql ****.rpm
5. 获取包的版本、用途等信息
- 对于未安装的包:
rpm -qip ****.rpm - 对于已安装的包:
rpm -qi ****.rpm
6. 查找某个程序是由哪个包安装的
rpm -qf `which 程序名` # 返回包的全名 rpm -qif `which 程序名` # 返回包的有关信息 rpm -qlf `which 程序名` # 返回包的文件列表
注意,这里的符号不是引号,而是键盘左上角的反引号 `。也可以把 qilf 组合在一起用,同时输出包信息和文件列表。
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 包管理的核心操作了。熟练之后,你会发现 Linux 下的软件管理其实相当顺手。
