1、软件包的分类
Linux下的软件包众多,而且几乎都是经GPL授权的,也就是说这些软件都免费,振奋人心吧?而且更棒的是,这些软件几乎都提供源代码(开源的),只要你愿意,就可以修改程序源代码,以符合个人的需求和习惯。当然,你要具备修改这些软件的能力才可以。
源码包到底是什么呢?其实就是软件工程师使用特定的格式和语法所书写的文本代码,是人写的计算机语言的指令,一般由英文单词组成。是不是有点晕?其实源代码程序就是程序员写的计算机指令,符合特定的格式和语法。那么,众所周知,计算机可以识别的是机器语言,也就是二进制语言,所以需要一名翻译官把abcd翻译成二进制机器语言。我们一般把这名翻译官称为编译器,它的作用就是把人能够识别的abcd翻译成二进制机器语言,让计算机可以识别并执行。
源码包不用担心收费问题,但是我并不会C语言怎么办?那一大堆的源代码程序到底如何使用呢?这个源码包容易安装吗?源码包的安装因为要把源代码编译为二进制语言,所以安装的时间较长。比如,在Windows下大家可能安装过QQ,现在的QQ功能较多,程序相对较大,大概有60MB,但由于QQ并不是以源代码形式发布的,而是经过编译之后发布的,所以只需要几分钟并经过简单的配置就可以安装成功,安装时间较短(当然功能也基本不能自定义)。在Linux中安装一个MySQL数据库,这个数据库的压缩包大概有23MB,需要多长时间呢?答案是30分钟左右(根据计算机硬件配置不同)。这样看来编译还是很浪费时间的,而且绝大多数用户并不熟悉写程序的语言,所以我们要祈祷程序不要报错,否则对初学者来讲很难解决。
为了解决源码包的这些问题,在Linux中就出现了二进制包,也就是源码包经过编译之后的包。这种包因为编译过程在发布之前已经完成,所以用户安装时速度较快(和Windows下安装软件速度相当),而且报错也大大减少。二进制包是Linux下的默认安装软件包,所以有时我们也把二进制包称作默认安装软件包。目前主要有两个系列的二进制包管理系统:一个是Red Hat上的RPM包管理系统;另一个是Debian和Ubuntu上的DPKG包管理系统。本帖讲的是Red Hat公司的CentOS Linux,所以我们主要讲解RPM包管理系统。不过这两个系列的二进制包管理的原理与形式大同小异,可以触类旁通。
说了这么多,到底源码包和二进制包哪个好呢?举个例子,我们想做一套家具,源码包就像所有的家具完全由自己动手手工打造(手工编译),想要什么样的板材、油漆、颜色和样式都由自己决定(功能自定义,甚至可以修改源代码)。想想就觉得爽,完全不用被黑心的厂商所左右,而且不用担心质量问题(软件更适合自己的系统,效率更高,更加稳定)。但是,所花费的时间大大超过了买一套家具的时间(编译浪费时间),而且我自己真的有做木工活这个能力吗(需要对源代码非常了解)?就算请别人定制好的家具,再由我自己组装,万一哪个部件不匹配(报错很难解决),怎么办?那么二进制包呢?也是我需要一套家具,可是我去商场买了一套(安装简单),家具都是现成的,不会有哪个部件不匹配,除非因为我没有量好尺寸而导致放不下(报错很少)。但是我完全不知道这套家具用的是什么材料、油漆是否合格,而且家具的样式也不能随意选择(软件基本不能自定义功能)。
好了,通过这个例子大家可以了解源码包和二进制包有什么区别了吧,后面会再解释一下每种包的特点。
1.2、初识源码包
1.2.1、源码包什么样
说了这么多的源码包,那源码包到底什么样?我们写一段简单的C语言源代码程序,如下:
[root@localhost ~] vim hello.c
#include <stdio.h>
int main (void)
{
printf ("hello world\n");
}
这段代码是我们学习所有语言都要学习的第一个程序“hello world”,需要注意第一行的“#”不是注释,不能省略。在Linux中不靠扩展名区分文件类型,但我们一般会把C语言的源程序文件用“.c”作为扩展名,这样管理员马上就能知道这是C语言的源代码;而且用“.c”作为扩展名,Vim也会有相应的颜色提示。
1.2.2、源码包的编译器安装
前面说过,源码包需要经过编译之后才能执行。我们在Linux中编译C语言源代码需要使用gcc编译器,但是默认安装的时候是没有安装gcc的,所以我们需要先安装gcc编译器。
[root@localhost ~] rpm -ivh /mnt/cdrom/Packages/gcc-4.4.6-4.el6.i686.rpm
我们在这里安装的是二进制包的gcc编译器,但是你的系统有可能没有gcc编译器的底层依赖包,这样一来,上面这条命令可能会报错。如果报错,则请参考1.3节。
注意:Linux中的大多数软件包是用C和C++语言开发的,所以,如果要安装源代码程序,则一定要安装编译器gcc和gcc-c++。但是请大家注意,我们的编译器只能使用二进制包方式安装,因为如果我们使用源码包安装gcc,那么它同样需要C语言编译器来解释,这样就会出现安装gcc但是需要gcc的无厘头错误。
1.2.3、源码包编译和执行
源代码有了,编译器也有了,我们就可以编译和执行了。
[root@localhost ~] gcc -c hello.c
#-c 生成“.o”头文件。这里会生成hello.o头文件,但是不会生成执行文件
[root@localhost ~] gcc -o hello hello.o
#-o 生成执行文件,并指定执行文件名。这里生成的hello就是执行文件
[root@localhost ~] ./hello
hello world
#执行hello文件
我们利用gcc编译hello.c生成hello.o头文件,然后用hello.o生成hello执行文件,执行hello文件就可以看到程序的结果了。
通过上面简单的C语言的源代码程序,我们可以简单地了解源代码程序是什么样子的、源代码程序该如何执行。
1.3、源码包的特点
源码包既然是软件包,就不会是一个文件,而是多个文件的集合。出于发行的需要,我们一般会把源码包打包压缩之后发布,而Linux中最常用的打包压缩格式是“*.tar.gz”,所以我们也把源码包叫作Tarball。源码包需要大家自己去软件的官方网站进行下载。
源码包的压缩包中一般会包含如下内容:
- 源代码文件。
- 配置和检测程序(如configure或config等)。
- 软件安装说明和软件说明(如INSTALL或README)。
源码包的优点如下:
- 开源。如果你有足够的能力,则可以修改源代码。
- 可以自由选择所需的功能。
- 因为软件是编译安装的,所以更加适合自己的系统,更加稳定,效率也更高。
- 卸载方便。
源码包的缺点如下:
- 安装过程步骤较多,尤其是在安装较大的软件集合时(如LAMP环境搭建),容易出现拼写错误。
- 编译过程时间较长,安装时间比二进制安装要长。
- 因为软件是编译安装的,所以在安装过程中一旦报错,新手很难解决。
1.4、二进制包的特点
二进制包是在软件发布的时候已经进行过编译的软件包,所以安装速度比源码包快得多(和Windows下软件安装速度相当)。但是因为已经进行过编译,大家也就不能再看到软件的源代码了。目前两大主流的二进制包系统是DPKG包和RPM包。
- DPKG包是由Debian Linux所开发的包管理机制,通过DPKG包,Debian Linux就可以进行软件包管理,主要应用在Debian和Ubuntu中。
- RPM包是由Red Hat公司所开发的包管理系统,功能强大,安装、升级、查询和卸载都非常简单和方便。目前很多Linux版本都在使用这种包管理方式,包括Fedora、CentOS、SuSE等。
Linux默认采用RPM包来安装系统,所以常用的RPM包都在安装光盘中。
RPM包的优点如下:
- 包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载。
- 安装速度比源码包安装快得多。
RPM包的缺点如下:
- 经过编译,不能再看到源代码。
- 功能选择不如源码包灵活。
- 依赖性。有时我们会发现,在安装软件包a时需要先安装b和c,而在安装b时需要先安装d和e。这就需要先安装d和e,再安装b和c,最后才能安装a。比如,我买了一个漂亮的灯具,打算安装到客厅里,可是在安装灯具之前,客厅总要有顶棚吧,顶棚总要刷好了油漆吧。装修和安装软件其实类似,总要有一定的顺序,但是有时依赖性会非常强。
2、RPM包管理——rpm命令管理
2.1、RPM包的命名规则
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 Linux)和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叫作包名。为什么要做出特殊说明呢?因为有些命令后面一定跟的是包全名,如安装和升级;而有些命令后面一定跟的是包名,如查询和卸载。如果弄错,命令就会报错。
2.2、RPM包的依赖性
我之所以不喜欢RPM包管理系统,是因为RPM包的依赖性。我们看看示意图,如下图所示:
刚刚说过,假设我们要安装软件包a,则可能需要先安装软件包d和e,再安装软件包b和c才行。有时这种依赖可能会有几十个之多,当然这也要看你的系统默认安装了哪些软件。
但这还不是最可怕的,最可怕的依赖性是什么呢?我们来安装一个RPM包mysql-connector-odbc。这里我们并非讲解安装命令,所以先不说安装命令,只是来看一下安装这个软件的报错:
[root@localhost ~] rpm -ivh \
/mnt/CentOS/mysql-connector-odbc-3.51.26r1127-1.el5.i386.rpm
#安装指定软件包。\代表一行命令没有完成,换行输入
warning: /mnt/CentOS/mysql-connector-odbc-3.51.26r1127-1.el5.i386.rpm: Header
V3 DSA signature: NOKEY, key ID e8562897
error: Failed dependencies:
libodbcinst.so.1 is needed by mysql-connector-odbc-3.51.26r1127-1.el5.i386
这个报错很明显是依赖性错误(error: Failed dependencies:),也就是说,在安装mysql-connector-odbc前需要先安装libodbcinst.so.1这个软件包。那还不简单,在光盘中找到这个软件包安装上不就行了吗?可是问题来了,我们找遍了两张光盘,发现居然没有叫libodbcinst.so.1的软件包。这是怎么回事?原因很简单,我们一直在说RPM软件包,既然是软件包,那么包中就不止有一个文件,而我们刚刚依赖的libodbcinst.so.1这个库文件只是包中的一个文件而已。如果想要安装libodbcinst.so.1这个库文件,就必须安装它所在的软件包。怎么知道这个库文件属于哪个软件包呢?因为库文件名不和它所属的软件包名类似,所以很难确定这个库文件属于哪个软件包。RPM包管理系统也发现了这个问题,它给我们提供的解决办法是一个网站www.rpmfind.net,如下图所示:
在搜索框中输入要查找的库文件名,如libodbcinst.so.1,单击“Search”按钮,网站会帮你查询出此库文件所在的软件包。如果在CentOS系统中,那么搜索结果是这个库文件属于unixODBC-libs-2.2.11-10.el5.i386.rpm软件包。所以,只要安装了unixODBC-libs-2.2.11-10.el5.i386.rpm软件包,那么库文件libodbcinst.so.1就会自动安装。
注意:并不是安装mysql-connector-odbc包一定会报缺少libodbcinst.so.1库文件的错误,这和你的系统安装方式有关。如果你的系统默认已经安装好了unixODBC-libs,就不会报刚刚的错误。
那什么是库文件呢?库文件是系统写好的实现一定功能的计算机程序,其他软件如果需要这个功能,就不用再自己写了,直接拿过来使用就可以了,大大加快了软件开发速度。比如,我喜欢玩高达模型,这个模型是已经做好的一个一个的零件,自己组装的时候,只要把这些零件组装在一起就可以了,而不用自己去制作这些零件,大大简化了模型组装的难度。
2.3、RPM包的安装与升级
说了这么多,终于可以开始安装了,我们先安装apache程序。之所以选择安装apache程序,是因为我们后续安装源码包时也计划安装apache程序,这样就能初步认识到源码包和RPM包的区别。不过需要注意的是,同一个程序的RPM包和源码包可以安装到一台服务器上,但是只能启动一个,因为它们需要占用同样的80端口。不过,如果真在生产服务器上,那么一定不会同时安装两个apache程序,容易把管理员搞糊涂,而且会占用更多的服务器磁盘空间。
2.3.1、RPM包默认安装路径
源码包和RPM包安装的程序为什么可以在一台服务器上呢?主要是因为安装路径不同,所以不会覆盖安装。RPM包一般采用系统默认路径安装,而源码包一般通过手工指定安装路径(一般安装到/usr/local/中)安装。
RPM包默认安装路径是可以通过命令查询的,一般安装在如下表所示的目录中:
RPM包难道就不能手工指定安装路径吗?当然是可以的,但是一旦手工指定安装路径,所有的安装文件就会安装到手工指定位置,而不会安装到系统默认位置。而系统的默认搜索位置并不会改变,依然会去默认位置之下搜索,当然系统就不能直接找到所需的文件,也就失去了作为系统默认安装路径的一些好处。所以我们一般不会指定RPM包的安装路径,而使用默认安装路径。
2.3.2、RPM包的安装
[root@localhost ~] rpm –ivh 包全名
#注意一定是包全名。如果是跟包全名的命令,则要注意路径,因为软件包在光盘当中
选项:
-i:安装(install)
-v:显示更详细的信息(verbose)
-h:打印#,显示安装进度(hash)
例如,安装apache软件包,注意出现两个100%才是正确安装,第一个100%仅是在准备,第二个100%才是正确安装。
例子1:
[root@localhost ~]# rpm -ivh \
/mnt/cdrom/Packages/httpd-2.2.15-15.el6.centos.1.i686.rpm
Preparing... ########################################### [100%]
1:httpd ########################################### [100%]
如果打算同时安装多个软件包呢?可以用一条命令同时安装,将多个软件包用空格分开就可以了。
例子2:
[root@localhost ~] rpm –ivh a.rpm b.rpm c.rpm
#一次安装多个软件包
如果还有其他安装要求,比如想强制安装某个软件包而不管它是否有依赖性,就可以通过选项进行调整。
- –nodeps:不检测依赖性安装。软件安装时会检测依赖性,确定所需的底层软件是否安装,如果没有安装则会报错。如果不管依赖性,想强制安装,则可以使用这个选项。注意:这样不检测依赖性安装的软件基本上是不能使用的,所以不建议这样做。
- –replacefiles:替换文件安装。如果要安装软件包,但是包中的部分文件已经存在,那么在正常安装时会报“某个文件已经存在”的错误,从而导致软件无法安装。使用这个选项可以忽视这个报错而覆盖安装。
- –replacepkgs:替换软件包安装。如果软件包已经安装,那么此选项可以把软件包重复安装一遍。
- –force:强制安装。不管是否已经安装,都重新安装。也就是–replacefiles和–replacepkgs的综合。
- –test:测试安装。不会实际安装,只是检测一下依赖性。
- –prefix:指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。注意:如果指定了安装路径,软件没有安装到系统默认路径中,那么系统会找不到这些安装的软件,需要进行手工配置才能被系统识别。所以,我们一般采用默认路径安装RPM包。
apache服务安装成功后,尝试启动。命令如下:
[root@localhost ~] service 服务名 start|stop|restart|status
参数:
start: 启动服务
stop: 停止服务
restart: 重启服务
status: 查看服务状态
例如:
[root@localhost ~]# service httpd start
#启动apache服务
服务启动之后,就可以查看端口号80是否出现。命令如下:
[root@localhost ~] netstat -tlun | grep 80
tcp 0 0 :::80 :::* LISTEN
我们也可以在浏览器中输入Linux服务器的IP地址,访问这个apache服务器。目前在apache中没有建立任何网页,所以看到的只是测试页,如下图所示:
注意: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-ppl >= 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
大家注意,英语语法是被动式的,依赖的软件在前面,我已经用下画线注明了,你千万不要以为出现安装gcc还依赖gcc的乌龙情况。
这里的依赖性很明显,需要我们先安装cloog-ppl、cpp和glibc-devel三个软件,其中“>=”表示版本要大于或等于所显示版本;“<=”表示版本要小于或等于所显示版本;“=”表示版本要等于所显示版本。我们当然可以手工安装,只是比较麻烦。那么,有办法让它自动解决依赖性,直接安装吗?有,我们可以使用yum在线安装工具,它会自动安装依赖的软件,帮助我们解决依赖性。所以,再卖一个关子,我们不在这里安装gcc,留到安装yum的时候让gcc自动安装。
2.3.3、RPM包的升级
[root@localhost ~] rpm –Uvh 包全名
选项:
-U(大写) 升级安装。如果没有安装过,则系统直接安装。如果安装过的版本较低,则
升级到新版本(upgrade)
[root@localhost ~]# rpm –Fvh 包全名
选项:
-F(大写) 升级安装。如果没有安装过,则不会安装。必须安装有较低版本才能升级(freshen)
2.4、RPM包查询
RPM包管理系统是非常强大和方便的包管理系统,它比源码包的方便之处就在于可以使用命令查询、升级和卸载。在查询的时候,其实是在查询/var/lib/rpm/这个目录下的数据库文件,那为什么不直接查看这些文件呢?你可以尝试使用Vim查看这些文件,会发现都是乱码。也就是说,这些文件其实都是二进制文件,不能直接用编辑器查看,所以才需要使用命令查看。
2.4.1、查询命令的格式
RPM查询命令采用如下格式:
[root@localhost ~] rpm 选项 查询对象
2.4.2、查询软件包是否安装
可以查询软件包是否安装,命令格式如下:
[root@localhost ~] rpm –q 包名
选项:
-q: 查询(query)
例如,查看一下apache包是否安装,可以执行如下命令:
[root@localhost ~] rpm -q httpd
httpd-2.2.15-15.el6.centos.1.i686
因为apache是已经安装完成的包,所以只需要给出“包名”,系统就可以识别。而没有安装的包就必须使用“绝对路径+包全名”格式才可以确定包。前面一直强调的包名和包全名不能写混乱就是这个原因。
2.4.3、查询系统中的所有安装软件包
可以查询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包名”会把包含包名称的所有包都列出来。
2.4.4、查询软件包的详细信息
可以查询已经安装的某个软件包的详细信息,命令格式如下:
[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分17秒
#发行版本和建立时间
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)
注意:没有安装的软件包是存放在光盘中的,而且因为没有安装,所以需要使用包全名。
2.4.5、查询软件包中的文件列表
可以查询已经安装的软件包中的文件列表和安装的完整目录,命令格式如下:
[root@localhost ~] rpm –ql 包名
选项:
-l: 列出软件包中所有的文件列表和软件所安装的目录(list)
例如,想要查看一下apache包中的文件的安装位置,可以执行如下命令:
[root@localhost ~] rpm -ql httpd
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
…省略部分输出…
那么,可以查询还没有安装的软件包中的文件列表和打算安装的位置吗?答案是可以,命令格式如下:
[root@localhost ~] rpm –qlp 包全名
选项:
-p: 查询没有安装的软件包信息(package)
想要查询还没有安装的bind软件包中的文件列表和打算安装的位置,可以执行如下命令:
[root@localhost ~] rpm -qlp /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm
/etc/NetworkManager/dispatcher.d/13-named
/etc/logrotate.d/named
/etc/named
/etc/named.conf
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
…省略部分输出…
2.4.6、查询系统文件属于哪个RPM包
既然可以知道每个RPM包中的文件的安装位置,那么可以查询系统文件属于哪个RPM包吗?当然可以,不过需要注意的是,手工建立的文件是不能查询的,因为这些文件不是通过RPM包安装的,当然不能反向查询它属于哪个RPM包。命令格式如下:
[root@localhost ~] rpm –qf 系统文件名
选项:
-f: 查询系统文件属于哪个软件包(file)
想查询一下ls命令是由哪个软件包提供的,可以执行如下命令:
[root@localhost ~] rpm -qf /bin/ls
coreutils-8.4-19.el6.i686
2.4.7、查询软件包所依赖的软件包
查询系统中和已经安装的软件包有依赖关系的软件包,命令格式如下:
[root@localhost ~] rpm –qR 包名
选项:
-R: 查询软件包的依赖性(requires)
例如,想查询一下apache包的依赖包,可以执行如下命令:
[root@localhost ~] rpm -qR httpd
/bin/bash
/bin/sh
/etc/mime.types
/usr/sbin/useradd
apr-util-ldap
chkconfig
config(httpd) = 2.2.15-15.el6.centos.1
httpd-tools = 2.2.15-15.el6.centos.1
initscripts >= 8.36
…省略部分输出…
可以查询没有安装的软件包的依赖性吗?加“-p”选项即可。例如,查看一下还没有安装的bind软件包的依赖包,可以执行如下命令:
[root@localhost ~] rpm -qRp /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm
/bin/bash
/bin/sh
bind-libs = 32:9.8.2-0.10.rc1.el6
chkconfig
chkconfig
config(bind) = 32:9.8.2-0.10.rc1.el6
grep
libbind9.so.80
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
…省略部分输出…
2.5、RPM包卸载
卸载也是有依赖性的。比如,在安装的时候,要先安装httpd软件包,再安装httpd的功能模块mod_ssl包。那么,在卸载的时候,一定要先卸载mod_ssl软件包,再卸载httpd软件包,否则就会报错。软件包卸载和拆除大楼是一样的,你要拆除2楼和3楼,一定要先拆除3楼;如果非要先拆除2楼,那么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
当然,卸载命令是支持“–nodeps”选项的,可以不检测依赖性直接卸载。但是,如果这样做,则很可能导致其他软件包无法正常使用,所以并不推荐这样卸载。
。。。。。。。
3、RPM包管理——yum在线管理
RPM包的安装虽然很方便和快捷,但是依赖性实在是很麻烦,尤其是库文件依赖,还要去rpmfind网站查找库文件到底属于哪个RPM包,从而导致RPM包的安装非常烦琐。那有没有可以自动解决依赖性、自动安装的方法呢?当然有,yum在线管理就可以自动处理RPM包的依赖性问题,从而大大简化RPM包的安装过程。但是大家需要注意:首先,yum安装安装的还是RPM包;其次,yum安装是需要有可用的yum服务器存在的,当然这个yum服务器可以在网上,也可以使用光盘在本地搭建。
yum可以方便地进行RPM包的安装、升级、查询和卸载,而且可以自动解决依赖性问题,非常方便和快捷。但是,一定要注意yum的卸载功能。yum在卸载软件的同时会卸载这个软件的依赖包,但是如果卸载的依赖包是系统的必备软件包,就有可能导致系统崩溃。除非你确实知道yum在自动卸载时会卸载哪些软件包,否则最好还是不要执行yum卸载。
3.1、yum源搭建
yum源既可以使用网络yum源,也可以使用本地光盘作为yum源。要使用网络yum源,那么你的主机必须是正常联网的。
当然,要使用yum进行RPM包安装,那么必须安装yum软件。查看命令如下:
[root@localhost ~] rpm -qa | grep yum
yum-metadata-parser-1.1.2-16.el6.i686
yum-3.2.29-30.el6.centos.noarch
yum-utils-1.1.30-14.el6.noarch
yum-plugin-fastestmirror-1.1.30-14.el6.noarch
yum-plugin-security-1.1.30-14.el6.noarch
如果没有安装,则需要手工使用RPM包方式安装。
3.3.1、网络yum源服务器搭建
在主机网络正常的情况下,CentOS的yum是可以直接使用的,不过我们需要了解一下yum源配置文件的内容。yum源配置文件保存在/etc/yum.repos.d/目录中,文件的扩展名一定是“.repo”。也就是说,yum源配置文件只要扩展名是“.repo”就会生效。
[root@localhost ~] ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-Media.repo CentOS-Debuginfo.repo.bak CentOS-Vault.repo
这个目录中有4个yum源配置文件,默认情况下CentOS-Base.repo文件生效。我们打开这个文件看看,命令如下:
[root@localhost yum.repos.d] vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/? release=$releasever&arch=$basearch&
repo=os
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
…省略部分输出…
在CentOS-Base.repo文件中有5个yum源容器,这里只列出了base容器,其他容器和base容器类似。我们解释一下base这个容器:
- [base]:容器名称,一定要放在[]中。
- name:容器说明,可以自己随便写。
- mirrorlist:镜像站点,这个可以注释掉。
- baseurl:我们的yum源服务器的地址。默认是CentOS官方的yum源服务器,是可以使用的。如果你觉得慢,则可以改成你喜欢的yum源地址。
- enabled:此容器是否生效,如果不写或写成enable=1则表示此容器生效,写成enable=0则表示此容器不生效。
- gpgcheck:如果为1则表示RPM的数字证书生效;如果为0则表示RPM的数字证书不生效。
- gpgkey:数字证书的公钥文件保存位置。不用修改。
yum源配置文件默认不需要进行任何修改就可以使用,只要网络可用就行。
3.3.2、以本地光盘作为yum源服务器
如果Linux主机不能联网,yum就不能使用吗?yum已经考虑到这个问题,所以在/etc/yum.repos.d/目录下还有一个CentOS-Media.repo文件,这个文件就是以本地光盘作为yum源服务器的模板文件,只需要进行简单的修改即可。
第一步:放入CentOS安装光盘,并挂载光盘到指定位置。命令如下:
[root@localhost ~] mkdir /mnt/cdrom
#创建cdrom目录,作为光盘的挂载点
[root@localhost ~] mount /dev/cdrom /mnt/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
#挂载光盘到/mnt/cdrom目录下
第二步:修改其他几个yum源配置文件的扩展名,让它们失效,因为只有扩展名是“*.repo”的文件才能作为yum源配置文件。当然也可以删除其他几个yum源配置文件,但是如果删除了,当你又想用网络作为yum源时,就没有了参考文件,所以最好还是修改扩展名。命令如下:
[root@localhost ~] cd /etc/yum.repos.d/
[root@localhost yum.repos.d] mv CentOS-Base.repo CentOS-Base.repo.bak
[root@localhost yum.repos.d] mv CentOS-Debuginfo.repo CentOS-Debuginfo.repo.bak
[root@localhost yum.repos.d] mv CentOS-Vault.repo CentOS-Vault.repo.bak
第三步:修改光盘yum源配置文件CentOS-Media.repo,参照以下方法修改:
[root@localhost yum.repos.d] vim CentOS-Media.repo
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///mnt/cdrom
#地址为你自己的光盘挂载地址
# file:///media/cdrom/
# file:///media/cdrecorder/
#注释这两个不存在的地址
gpgcheck=1
enabled=1
#把enabled=0改为enabled=1,让这个yum源配置文件生效
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
配置完成,现在可以感受一下yum的便捷了。
3.2、常用yum命令
3.2.1、查询
查询yum源服务器上所有可安装的软件包列表:
[root@localhost yum.repos.d]# yum list
#查询所有可用软件包列表
Installed Packages
#已经安装的软件包
ConsoleKit.i686 0.4.1-3.el6 @anaconda-CentOS-201207051201.i386/6.3
ConsoleKit-libs.i686 0.4.1-3.el6 @anaconda-CentOS-201207051201.i386/6.3
...省略部分输出...
Available Packages
#还可以安装的软件包
389-ds-base.i686 1.2.10.2-15.el6 c6-media
389-ds-base-devel.i686 1.2.10.2-15.el6 c6-media
#软件名 版本 所在位置(光盘)
...省略部分输出...
查询yum源服务器中是否包含某个软件包:
[root@localhost yum.repos.d] yum list 包名
#查询单个软件包
例如:
[root@localhost yum.repos.d]# yum list samba
Available Packages
samba.i686 3.5.10-125.el6 c6-media
搜索yum源服务器上所有和关键字相关的软件包:
[root@localhost yum.repos.d] yum search 关键字
#搜索服务器上所有和关键字相关的软件包
例如:
[root@localhost yum.repos.d]# yum search samba
#搜索服务器上所有和samba相关的软件包
========================N/S Matched: samba =============================
samba-client.i686 : Samba client programs
samba-common.i686 : Files used by both Samba servers and clients
samba-doc.i686 : Documentation for the Samba suite
…省略部分输出…
Name and summary matches only, use "search all" for everything.
查询指定软件包的信息:
[root@localhost yum.repos.d]# yum info samba
#查询samba软件包的信息
Available Packages ←还没有安装
Name : samba ←包名
Arch : i686 ←适合的硬件平台
Version : 3.5.10 ←版本
Release : 125.el6 ←发布版本
Size : 4.9 M ←大小
Repo : c6-media ←在光盘上
…省略部分输出…
3.2.2、安装
[root@localhost yum.repos.d] yum -y install 包名
选项:
install 安装
-y 自动回答yes。如果不加-y,那么每个安装的软件都需要手工回答yes
例如:
[root@localhost yum.repos.d]# yum -y install gcc
#使用yum自动安装gcc
在讲RPM包安装时提到,gcc是C语言的编译器,如果没有安装,那么2.4节的源码包就无法安装。但gcc依赖的软件包比较多,手工使用RPM包安装太麻烦了,所以使用yum安装。
yum安装可以自动解决依赖性,而且安装速度也比源码包快得多。不过,yum到底安装的还是RPM包,所以rpm命令还是必须学习和使用的。
3.2.3、升级
[root@localhost yum.repos.d] yum -y update 包名
#升级指定的软件包
选项:
update: 升级
-y: 自动回答yes
注意:在进行升级操作时,yum源服务器中软件包的版本要比本机安装的软件包的版本高。
[root@localhost yum.repos.d] yum -y update
#升级本机所有软件包
这条命令会升级系统中所有的软件包。不过我们的生产服务器是稳定优先的,所以这种全系统升级的情况并不多见。
3.2.4、卸载
再次强调一下,除非你确定卸载的软件的依赖包不会对系统产生影响,否则不要执行yum的卸载,因为很有可能在卸载软件包的同时卸载的依赖包也是重要的系统文件,这就有可能导致系统崩溃。卸载命令如下:
[root@localhost yum.repos.d] yum remove 包名
#卸载指定的软件包
例如:
[root@localhost yum.repos.d] yum remove samba
#卸载samba软件包
3.3、 yum软件组管理
在安装Linux的过程中,在选择软件包的时候,如果选择了“现在自定义”,就会看到Linux支持的许多软件组,比如编辑器、系统工具、开发工具等。那么,在系统安装完成后,是否可以利用yum安装这些软件组呢?当然可以,只需要利用yum的软件组管理命令:
1.查询可以安装的软件组:
[root@localhost ~] yum grouplist
#查询可以安装的软件组
2.查询软件组中包含的软件:
[root@localhost ~] yum groupinfo 软件组名
#查询软件组中包含的软件
例如:
[root@localhost ~]# yum groupinfo "Web Server"
#查询软件组“Web Server”中包含的软件
3.安装软件组:
[root@localhost ~] yum groupinstall 软件组名
#安装指定软件组,组名可以由grouplist查询出来
例如:
[root@localhost ~] yum groupinstall "Web Server"
#安装网页服务软件组
4.卸载软件组:
[root@localhost ~] yum groupremove 软件组名
#卸载指定软件组
软件组管理对于安装功能集中的软件集合非常方便。比如,在安装Linux的时候没有安装图形界面,但是后来发现需要图形界面的支持,这时可以手工安装图形界面软件组(X Window System和Desktop),就可以很方便地安装图形界面了。
4、源码包管理
4.1、源码包的安装准备
4.1.1、支持软件的安装
Linux下的绝大多数源码包都是用C语言编写的,还有少部分是用C++等其他程序语言编写的。所以,要想安装源码包,必须安装C语言编译器gcc(如果是用C++编写的程序,则还需要安装gcc-c++)。我们可以先检测一下gcc是否已经安装,命令如下:
[root@localhost ~] rpm -q gcc
gcc-4.4.6-4.el6.i686
如果没有安装gcc,则推荐大家采用yum安装方式安装。因为如果手工使用rpm命令安装,那么gcc所依赖的包太多了。命令如下:
[root@localhost yum.repos.d] yum -y install gcc
有了编译器,还需要考虑一个问题:刚刚写的“hello.c”只有一个源码文件,所以我们可以利用gcc手工编译。但是真正发布的源码包软件内的源码文件可能有成百上千个,而且这些文件之间都是有联系的,编译时有先后顺序。如果这样的源码文件需要手工编译,光想想就是一项难以完成的工作。这时就需要make命令来帮助我们完成编译,所以make也是必须安装的。我们也需要查看一下make是否已经安装,命令如下:
[root@localhost yum.repos.d] rpm -q make
make-3.81-20.el6.i686
4.1.2、源码包从哪里来
RPM包是保存在CentOS 6.3的安装光盘中的,那么源码包从哪里来呢?是从官方网站上下载的,我们依然以下载和安装apache为例。前面已经说过,源码包和RPM包都需要安装apache,目的是区分一下源码包和RPM包。