概述
RPM 包的命名一般都会遵守统一的命名规则,例如:
httpd-2.2.15-15.el6.centos.1.i686.rpm
其中的各项代表的含义如下:
- httpd:软件包名。
- 2.2.15:软件版本。
- 15:软件发布的次数。
- el6:软件发行商。el6 是由 Red Hat 公司发布的,适合在 RHEL 6.x (Red Hat Enterprise Unux) 和 CentOS 6.x 上使用。
- i686:适合的硬件平台。RPM 包可以在不同的硬件平台上安装,选择适合不同 CPU 的软件版本,可以最大限度地发挥 CPU 性能,所以出现了所谓的 i386(386 以上的计算机都可以安装)、i586 (586 以上的计算机都可以安装)、i686(奔腾II以上的计算机都可以安装,目前所有的 CPU 是奔腾II以上的,所以这个软件版本居多)、x86_64 (64 位 CPU 可以安装)和 noarch(没有硬件限制)等文件名。
- rpm:RPM 包的扩展名。我们说过,Linux 下的文件不是靠扩展名区分文件类型的,也就是说 Linux 中的扩展名没有任何含义。可是这里怎么又出现了扩展名呢?原因很简单,如果不把 RPM 包的扩展名叫作".rpm",那么管理员很难知道这是一个 RPM 包,当然也就无法正确安装了。换句话说,如果 RPM 包不用".rpm"作为扩展名,那么系统可以正确识别,但是管理员很难识别这是一个什么样的软件。
注意,我们把 httpd-2.2.15-15.el6.centos.1.i686.rpm 叫作包全名,而把 httpd 叫作包名。为什么要做出特殊说明呢?因为有些命令后面一定跟的是包全名,如安装和升级;而有些命令后面一定跟的是包名,如查询和卸载。如果弄错,命令就会报错。
RPM 包默认安装路径
RPM 包一般采用系统默认路径安装,而源码包一般通过手工指定安装路径(一般安装到 /usr/local/ 中)安装。
RPM 包默认安装路径是可以通过命令査询的,一般安装在如表 1 所示的目录中。
安装路径 | 含 义 |
---|---|
/etc/ | 配置文件安装目录 |
/usr/bin/ | 可执行的命令安装目录 |
/usr/lib/ | 程序所使用的函数库保存位置 |
/usr/share/doc/ | 基本的软件使用手册保存位置 |
/usr/share/man/ | 帮助文件保存位置 |
RPM 包也可以手工指定安装路径,但是一旦手工指定安装路径,所有的安装文件就会安装到手工指定位置,而不会安装到系统默认位置。而系统的默认搜索位置并不会改变,依然会去默认位置之下搜索,当然系统就不能直接找到所需的文件,也就失去了作为系统默认安装路径的一些好处。所以我们一般不会指定 RPM 包的安装路径,而使用默认安装路径。
RPM包的安装
[root@localhost ~]# rpm -ivh 包全名
#注意一定是包全名。如果是跟包全名的命令,则要注意路径,因为软件包在光盘当中
选项:
- -i:安装(install);
- -v:显示更详细的信息(verbose);
- -h:打印 #,显示安装进度(hash);
例如,安装 apache 软件包,注意出现两个 100% 才是正确安装,第一个 100% 仅是在准备,第二个 100% 才是正确安装。如下所示:
[root@localhost ~]# rpm -ivh
/mnt/cdrom/Packages/httpd-2.2.15-15.el6.centos.1.i686.rpm
Preparing...
####################
[100%]
1:httpd
####################
[100%]
如果打算同时安装多个软件包呢?可以用一条命令同时安装,将多个软件包用空格分开就可以了。
[root@localhost ~]# rpm -ivh a.rpm b.rpm c.rpm
#一次安装多个软件包
如果还有其他安装要求,比如想强制安装某个软件包而不管它是否有依赖性,就可以通过选项进行调整:
- -nodeps:不检测依赖性安装。软件安装时会检测依赖性,确定所需的底层软件是否安装,如果没有安装则会报错。如果不管依赖性,想强制安装,则可以使用这个选项。注意:这样不检测依赖性安装的软件基本上是不能使用的,所以不建议这样做。
- -replacefiles:替换文件安装。如果要安装软件包,但是包中的部分文件已经存在,那么在正常安装时会报"某个文件已经存在"的错误,从而导致软件无法安装。使用这个选项可以忽略这个报错而覆盖安装。
- -replacepkgs:替换软件包安装。如果软件包已经安装,那么此选项可以把软件包重复安装一遍。
- -force:强制安装。不管是否已经安装,都重新安装。也就是-replacefiles和-replacepkgs的综合。
- -test:测试安装。不会实际安装,只是检测一下依赖性。
- -prefix:指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。注意:如果指定了安装路径,软件没有安装到系统默认路径中,那么系统会找不到这些安装的软件,需要进行手工配置才能被系统识别。所以,我们一遍采用默认路径安装RPM包。
注意,RPM 包默认保存在系统光盘的 Packages(注意 P 大写)目录中,所以在安装软件前需要挂载光盘。例如:
mkdir/mnt/cdrom <-建立挂载点
mount /dev/cdrom /mnt/cdrom <-挂载光盘
我们一直在说依赖性很麻烦,那么依赖性报错是什么样呢?我们来继续说说 gcc 这个软件,刚刚我们在写 hello.c 的时候假设这个软件已经安装成功了。其实,如果采用"基本服务器"方式安装 Linux 系统,那么 gcc 这个软件是没有安装的,需要我们手工安装,但是安装这个软件是会报依赖性错误的。
[root@localhost ~]# rpm -ivh /mnt/cdrom/Packages/ gcc-4.4.6-4.el6.i686.rpm
error: Failed dependencies: <―依赖性错误
cloog-ppi >= 0.15 is needed by gcc-4.4.6-4.el6.i686
cpp = 4.4.6-4.el6 is needed by gcc-4.4.6-4.el6.i686
glibc-devel >= 2.2.90-12 is needed by gcc-4.4.6-4.el6.i686
这里的依赖性很明显,需要我们先安装 cloog-ppl、cpp 和 glibc-devel 三个软件,其中:
- ">="表示版本要大于或等于所显示版本;
- "<="表示版本要小于或等于所显示版本;
- "="表示版本要等于所显示版本;
我们当然可以手工安装,只是比较麻烦。那么,有办法让它自动解决依赖性,直接安装吗?有,我们可以使用 yum 在线安装工具,它会自动安装依赖的软件,帮助我们解决依赖性。所以,再卖一个关子,我们不在这里安装 gcc,留到安装 yum 的时候让 gcc 自动安装。
RPM包的升级
[root@localhost ~]# rpm -Uvh 包全名
选项:
- -U(大写):升级安装。如果没有安装过,则系统直接安装。如果安装过的版本较低,则升级到新版本(upgrade);
[root@localhost ~]# rpm -Fvh 包全名
选项:
- -F(大写):升级安装。如果没有安装过,则不会安装。必须安装有较低版本才能升级(freshen);
RPM包卸载
卸载是有依赖性的。比如,在安装的时候,要先安装 httpd 软件包,再安装 httpd 的功能模块 mod_ssl 包。那么,在卸载的时候,一定要先卸载 mod_ssl 软件包,再卸载 httpd 软件包,否则就会报错。软件包卸载和拆除大楼是一样的,你要拆除 2 楼和 3 楼,一定要先拆除 3 楼。
删除格式非常简单,如下:
[root@localhost ~]# rpm -e 包名
选项:
- -e 卸载(erase);
如果不按依赖性卸载,就会报依赖性错误。例如:
[root@localhost ~]# rpm -e httpd
error: Failed dependencies:
httpd-mmn = 20051115 is needed by (installed) mod_wsgi-3.2-1.el6.i686
httpd-mmn = 20051115 is needed by (installed) php-5.3.3-3.el6_2.8.i686
httpd-mmn = 20051115 is needed by (installed) mod_ssl-1:2.2.15-15.el6.
centos.1.i686
httpd-mmn = 20051115 is needed by (installed) mod_perl-2.0.4-10.el6.i686
httpd = 2.2.15-15.el6.centos.1 is needed by (installed) httpd-manual-2.2.
15-15.el6.centos.1 .noarch
httpd is needed by (installed) webalizer-2.21_02-3.3.el6.i686
httpd is needed by (installed) mod_ssl-1:2.2.15-15.el6.centos.1.i686
httpd=0:2.2.15-15.el6.centos.1 is needed by(installed)mod_ssl-1:2.2.15-15.el6.centos.1.i686
当然,卸载命令是支持"--nocteps"选项的,可以不检测依赖性直接卸载。但是,如果这样做,则很可能导致其他软件包无法正常使用,所以并不推荐这样卸载。
Linux rpm命令查询软件包
RPM 包管理系统是非常强大和方便的包管理系统,它比源码包的方便之处就在于可以使用命令查询、升级和卸载。在查询的时候,其实是在查询 /var/lib/rpm/ 这个目录下的数据库文件,那为什么不直接查看这些文件呢?你可以尝试使用 Vim 查看这些文件,会发现都是乱码。也就是说,这些文件其实都是二进制文件,不能直接用编辑器查看,所以才需要使用命令查看。
查询命令的格式
RPM 查询命令采用如下格式:
[root@localhost ~]# rpm 选项 查询对象
查询软件包是否安装
可以查询软件包是否安装,命令格式如下:
[root@localhost ~]# rpm -q 包名
选项:
- -q:查询(query)
例如,查看一下 apache 包是否安装,可以执行如下命令:
[root@localhost ~]# rpm -q httpd
httpd-2.2.15-15.el6.centos.1.i686
因为 apache 是已经安装完成的包,所以只需要给出"包名",系统就可以识别。而没有安装的包就必须使用"绝对路径+包全名"格式才可以确定包。前面一直强调的包名和包全名不能写混乱就是这个原因。
查询系统中的所有安装软件包
可以查询 Linux 系统中所有已经安装的软件包,命令格式如下:
[root@localhost ~]# rpm -qa
libsamplerate-0.1.7-2.1.el6.i686
startup-notification-0.10-2.1.el6.i686
gnome-themes-2.28.1-6.el6.noarch
fontpackages-filesystem-1.41-1.1.el6.noarch
gdm-libs-2.30.4-33.el6_2.i686
gstreamer-0.10.29-1.el6.i686
redhat-lsb-graphics-4.0-3.el6.centos.i686
…省略部分输出…
当然,可以用管道符来查看所需的内容,比如:
[root@localhost ~]# rpm -qa | grep httpd
httpd-devel-2.2.15-15.el6.centos.1.i686
httpd-tools-2.2.15-15.el6.centos.1.i686
httpd-manual-2.2.15-15.el6.centos.1.noarch
httpd-2.2.15-15.el6.centos.1.i686
你会发现,使用"rpm-q包名"只能查看这个包是否安装,但是使用"rpm-qa|grep 包名"会把包含包名称的所有包都列出来。
查询软件包的详细信息
可以查询已经安装的某个软件包的详细信息,命令格式如下:
[root@localhost ~]# rpm -qi 包名
选项:
- -i:查询软件信息(information)
例如,查看 apache 包的安装信息,可以使用以下命令:
[root@localhost ~]# rpm -qi httpd
Name : httpd Relocations:(not relocatable)
#包名
Version : 2.2.15 Vendor:CentOS
#版本和厂商
Release : 15.el6.centos.1 Build Date: 2012年02月14日星期二 06时27分1秒
#发行版本和建立时间
Install Date: 2013年01月07日星期一19时22分43秒
Build Host:
c6b18n2.bsys.dev.centos.org
#安装时间
Group : System Environment/Daemons Source RPM:
httpd-2.2.15-15.el6.centos.1.src.rpm
#组和源RPM包文件名
Size : 2896132 License: ASL 2.0
#软件包大小和许可协议
Signature :RSA/SHA1,2012年02月14日星期二 19时11分00秒,Key ID
0946fca2c105b9de
#数字签名
Packager:CentOS BuildSystem <http://bugs.centos.org>
URL : http://httpd.apache.org/
#厂商网址
Summary : Apache HTTP Server
#软件包说明
Description:
The Apache HTTP Server is a powerful, efficient, and extensible web server.
#描述
通过这条命令可以看到包名、版本、发行版本、安装时间,软件包大小等信息。
不仅如此,还可以查询还没有安装的软件包的详细信息,命令格式如下:
[root@localhost ~]# rpm -qip 包全名
选项:
- -p:查询没有安装的软件包(package)
注意,没有安装的软件包是存放在光盘中的,而且因为没有安装,所以需要使用包全名。
查询软件包中的文件列表
可以查询已经安装的软件包中的文件列表和安装的完整目录,命令格式如下:
[root@localhost ~]# rpm -ql 包名
选项:
- -l:列出软件包中所有的文件列表和软件所安装的目录(list)
例如,想要查看一下问 apache 包文件的安装位置,可以执行如下命令:
[root@localhost ~]# rpm -ql httpd
那么,可以查询还没有安装的软件包中的文件列表和打算安装的位置吗?答案是可以,命令格式如下:
[root@localhost ~]# rpm -qlp 包全名
选项:
- -p:查询没有安装的软件包信息(package)
想要查询还没有安装的 bind 软件包中的文件列表和打算安装的位置,可以执行如下命令:
[root@localhost ~]# rpm -qlp /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm
查询系统文件属于哪个RPM包
既然可以知道每个 RPM 包中的文件的安装位置,那么可以查询系统文件属于哪个 RPM 包吗?当然可以,不过需要注意的是,手工建立的文件是不能查询的,因为这些文件不是通过 RPM 包安装的,当然不能反向查询它属于哪个 RPM 包。
命令格式如下:
[root@localhost ~]# rpm -qf 系统文件名
选项:
- -f:查询系统文件属于哪个软件包(file)
想查询一下 ls 命令是由哪个软件包提供的,可以执行如下命令:
[root@localhost ~]# rpm -qf /bin/ls
coreutils-8.4-19.el6.i686
查询软件包所依赖的软件包
查询系统中和已经安装的软件包有依赖关系的软件包,命令格式如下:
[root@localhost ~]# rpm -qR 包名
选项:
- -R:查询软件包的依赖性(requires)
例如,想查询一下 apache 包的依赖包,可以执行如下命令:
[root@localhost ~]# rpm -qR httpd
可以查询没有安装的软件包的依赖性吗?加"-p"选项即可。例如,查看一下还没有安装的 bind 软件包的依赖包,可以执行如下命令:
[root@localhost ~]# rpm -qRp /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm