在《十、Linux yum是什么,yum源配置(网络yum源和本地yum源)》一节的基础上,本节学习如何使用 yum 命令实现查询、安装、升级和卸载 RPM 包。
使用 yum 对软件包执行查询操作,常用命令可分为以下几种:
[root@localhost yum.repos.d]# yum list
#查询所有可用软件包列表
Installed Packages
#已经安装的软件包
ConsdeKit.i686 0.4.1-3.el6
@anaconda-CentOS-201207051201 J386/6.3
ConsdeKit-libs.i686 0.4.1-3.el6 @anaconda-CentOS-201207051201 J386/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
#软件名 版本 所在位置(光盘)
…省略部分输出…
[root@localhost yum.repos.d]# yum list samba
Available Packages samba.i686 3.5.10-125.el6 c6-media
#查询 samba 软件包的安装情况
[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.9M <—大小
Repo : c6-media <-在光盘上
…省略部分输出…
yum 安装软件包的命令基本格式为:
[root@localhost yum.repos.d]# yum -y install 包名
其中:
例如使用此 yum 命令安装 gcc:
[root@localhost yum jepos.d]#yum -y install gcc
#使用yum自动安装gcc
gcc 是 C 语言的编译器,鉴于该软件包涉及到的依赖包较多,建议使用 yum 命令安装。
使用 yum 升级软件包,需确保 yum 源服务器中软件包的版本比本机安装的软件包版本高。
yum 升级软件包常用命令如下:
yum -y update
:升级所有软件包。不过考虑到服务器强调稳定性,因此该命令并不常用。yum -y update
包名
:升级特定的软件包。使用 yum 卸载软件包时,会同时卸载所有与该包有依赖关系的其他软件包,即便有依赖包属于系统运行必备文件,也会被 yum 无情卸载,带来的直接后果就是使系统崩溃。
除非你能确定卸载此包以及它的所有依赖包不会对系统产生影响,否则不要使用 yum 卸载软件包。
yum 卸载命令的基本格式如下:
[root@localhost yum.repos.d]# yum remove 包名
#卸载指定的软件包
例如,使用 yum 卸载 samba 软件包的命令如下:
[root@localhost yum.repos.d]# yum remove samba
#卸载samba软件包
在安装 Linux 系统时,我们可以根据需要自定义安装软件包,如图 1 所示:
图 1 设置自定义安装软件包
选择“Customize now”,会进入图 2 所示的页面:
图 2 自定义选择软件包
图 2 中所示为 Linux 列出的许多软件包组,例如编辑器、系统工具、开发工具等。在此页面,我们可以根据需要选择要安装的软件包。
除了像图 1、图 2 这样在系统安装过程中自选软件包组进行安装之外,当系统安装完成后,我们也可以通过 yum 命令来管理图 2 中的这些软件包组。
yum 命令除了可以对软件包进行查询、安装、升级和卸载外,还可完成对软件包组的查询、安装和卸载操作。
既然是软件包组,说明包含不只一个软件包,通过 yum 命令可以查询某软件包组中具体包含的软件包,命令格式如下:
[root@localhost ~]#yum groupinfo 软件组名
#查询软件组中包含的软件
例如,查询 Web Server 软件包组中包含的软件包,可使用如下命令:
[root@localhost ~]#yum groupinfo "Web Server"
#查询软件组"Webserver"中包含的软件
使用 yum 安装软件包组的命令格式如下:
[root@localhost ~]#yum groupinstall 软件组名
#安装指定软件组,组名可以由grouplist查询出来
例如,安装 Web Server 软件包组可使用如下命令:
[root@localhost ~]#yum groupinstall "Web Server"
#安装网页服务软件组
yum 卸载软件包组的命令格式如下:
[root@localhost ~]# yum groupremove 软件组名
#卸载指定软件组
yum 软件包组管理命令更适合安装功能相对集中的软件包集合。例如,在初始安装 Linux 时没有安装图形界面,但后来发现需要图形界面的支持,这时可以手工安装图形界面软件组(X Window System 和 Desktop),就可以使用图形界面了。
由于 Linux 操作系统开放源代码,因此在其上安装的软件大部分也都是开源软件,例如 Apache、Tomcat 和PHP等。开源软件基本都提供源码下载,可采用源码安装的方式安装软件。
注意,本节使用的源码包,指的是软件所有源代码的压缩包,其后缀名为 ".tar.gz" 或 ".tar.bz2";而 SRPM 源码包本质上属于 RPM 包,也就是源码的RPM包,其文件后缀为 ".src.rpm"。虽然都叫源码包,但不是一码事。
软件的源代码,也就是软件的原始数据,任何人都可以通过源代码查看该软件的设计架构和实现方法,但软件源代码无法在计算机中直接运行安装,需要将源代码通过编译转换为计算机可以识别的机器语言,然后才可以安装。
Linux 系统中,绝大多数软件的源代码都是用 C 语言编写的,少部分用C++(或其他语言)编写。因此要想安装源码包,必须安装 gcc 编译器(如果涉及 C++ 源码程序,还需要安装 gcc-c++)。
安装 gcc 之前,可先使用如下命令看看是否已经安装:
[root@localhost ~]# rpm -q gcc
gcc-4.4.6-4.el6.i686
如果未安装,考虑到安装 gcc 所依赖的软件包太多,推荐大家使用 yum 安装 gcc。具体安装方式可阅读《十一、Linux yum命令详解》一节。
除了安装编译器,还需要安装 make 编译命令。要知道,编译源码包可不像编译一个 hello.c 文件那样轻松,包中含大量的源码文件,且文件之间有着非常复杂的关联,直接决定着各文件编译的先后顺序,因此手动编译费时费力,而使用 make 命令可以完成对源码包的自动编译。
同样,在安装 make 命令之前,可使用如下命令查看其是否已经安装:
[root@localhost yum. repos.d]# rpm -q make
make-3.81-20.el6.i686
如果未安装,可使用 yum -y install make
命令直接安装 make。
安装好了 gcc 编译器和 make 编译工具,接下来学习使用源码包安装软件。
本节仍然以安装 apache 为例,安装过程分为如下几步:
[root@localhost ~]#tar -zxvf httpd-2.2.9.tar.gz|more
[root@localhost ~]# ls
anaconda-ks.cfg httpd-2.2.9 httpd-2.2.9.tar.gz install.log install.log.syslog
[root@localhost ~]# cd httpd-2.2.9
[root@localhost httpd-2.2.9]#./configure --help|more
#查询apache支持的选项功能(不是必需步骤)
--prefix 选项的含义为指定安装目录。[root@localhost httpd-2.2.9]# ./configure --prefix=/usr/local/apache2
checking for chosen layout...Apache
checking for working mkdir -p…yes
checking build system type...i686-pc-linux-gnu
checking host system type...i686-pc-linux-gnu
checking target system typa...i686-pc-linux-gnu
…省略部分输出…
编程过程较为耗时,需要有足够的耐心。[root@localhost httpd-2.2.9]# make
整个过程不报错,即为安装成功。[root@localhost httpd-2.2.9]# make install
注意,如果在 "./configure" 或 "make" 编译中报错,则在重新执行命令前一定要执行 make clean
命令,它会清空 Makefile 文件或编译产生的 ".o" 头文件。
通过源码包方式安装的各个软件,其安装文件独自保存在 /usr/local/ 目录下的各子目录中。例如,apache 所有的安装文件都保存在 /usr/local/apache2 目录下。这就为源码包的卸载提供了便利。
源码包的卸载,只需要找到软件的安装位置,直接删除所在目录即可,不会遗留任何垃圾文件。需要读者注意的是,在删除软件之前,应先将软件停止服务。
以删除 apache 为例,只需关闭 apache 服务后执行如下命令即可:
[root@localhost ~]# rm -rf /usr/local/apache2/
Linux 系统中更新用源码包安装的软件,除了卸载重装这种简单粗暴的方法外,还可以下载补丁文件更新源码包,用新的源码包重新编译安装软件。比较两种方式,后者更新软件的速度更快。
使用补丁文件更新源码包,省去了用 ./configured 生成新的 Makefile 文件,还省去了大量的编译工作,因此效率更高。学完本节会对比有更深入的理解。
Linux 系统中可以使用 diff 命令对比出新旧软件的不同,并生成补丁文件。
diff 命令基本格式为:
[root@localhost ~]# diff 选项 old new
#比较old和new文件的不同
此命令中可使用如下几个选项:
从生成补丁文件,到使用其实现更新软件的目的,为了让读者清楚地了解整个过程的来龙去脉,下面我们自己创建两个文件(分别模拟旧软件和新软件),通过对比新旧文件生成补丁文件,最后利用补丁文件更新旧文件,具体步骤如下:
[root@localhost ~]# mkdir test
#建立测试目录
[root@localhost ~]# cd test
#进入测试目录
[root@localhost test]# vi old.txt
our
school
is
lampbrother
#文件old.txt,为了便于比较,将每行分开
[root@localhost test]# vi new.txt
our
school
is
lampbrother
in
Beijing
#文件new.txt
[root@localhost test]# diff -Naur /root/test/old.txt /root/test/new.txt > txt. patch
#比较两个文件的不同,同时生成txt.patch补丁文件
[root@localhost test]#vi txt.patch
#查看一下这个文件
--/root/test/old.txt 2012-11-23 05:51:14.347954373 +0800
#前一个文件
+ + + /root/test/new.txt 2012-11-23 05:50:05.772988210 +0800
#后一个文件
@@-2, 3+2, 5@@
school
is
lampbrother
+in
+beijing
#后一个文件比前一个文件多两行(用+表示)
-pn 选项中,n 为数字(例如 p1、p2、p3 等),pn 表示按照补丁文件中的路径,指定更新文件的位置。[root@localhost test]# patch -pn < 补丁文件
#按照补丁文件进行更新
可以看到,通过使用补丁文件 txt.patch 对旧文件进行更新,使得旧文件和新文件完全相同。[root@localhost test]# patch -p3 < txt.patch
patching file old.txt
#给old.txt文件打补丁
[root@localhost test]# cat old.txt
#查看一下dd.txt文件的内容
our
school
is
lampbrother
in
Beijing
#多出了in Beijing两行
通过这个例子,大家要明白以下两点:
本节仍以 apache 为例,通过从官网上下载的补丁文件 "mod_proxy_ftp_CVE-2008-2939.diff",更新 httpd-2.2.9 版本的 apache。
这里使用的补丁文件,修补了 apache 代理 FTP 站点时,模块空指针引用拒绝服务攻击的漏洞(了解即可,不用深究)。
具体更新步骤如下:
[root@localhost ~]# cp mod_proxy_ftp_CVE-2008-2939.diff httpd-2.2.9
为什么是 "-p0" 呢?因为当前在 "/root/httpd-2.2.9" 目录中,但补丁文件中记录的目录是 "modules/proxy/mod_proxy_ftp.c",就在当前所在目录中,因此一个 "/" 都不需要去掉,所以是 "-p0"。[root@localhost ~]# cd httpd-2.2.9
#进入apache源码目录
[root@localhost httpd-2.2.9]# vi mod_proxy_ftp_CVE-2008-2939.diff
#查看补丁文件
--modules/proxy/mod_proxy_ftp.c (Revision 682869)
+ + + modules/proxy/mod_proxy_ftp.c (Revision 682870)
…省略部分输出…
#查看一下补丁文件中记录的目录,以便一会儿和当前所在目录同步
[root@localhost httpd-2.2.9]# patch - p0 < mod_proxy_ftp_CVE-2008-2939.diff
#打入补丁
[root@localhost httpd-2.2.9]# make
[root@localhost httpd-2.2.9]# make install
通过对比《十三、Linux源码包安装和卸载教程(以apache为例)》一节中安装源码包的过程,不难发现,打补丁更新软件的过程比安装软件少了 "./configure" 步骤,且编译时也只是编译变化的位置,编译速度更快。
注意,如果未安装过 httpd-2.2.9,就需要先打入补丁,再依次执行 "./configure"、"make"、
"make install" 命令。
patch 命令不仅可以给旧文件打入补丁,还可以执行反操作,即恢复用补丁文件修改过的源文件,例如:
[root@localhost httpd-2.2.9]# patch -R < modjDroxy_ftp_CVE-2008-2939.diff
-R(大写)选项表示还原补丁。
通过前面的学习我们知道,使用 RPM 包(或 SRPM 包)和源码包都可以实现软件的安装和升级。那么,如果要对软件进行升级,又或是安装新的软件,应该选择哪种安装方式呢?
注意,由于 SRPM 包本质上依然为 RPM 包,因此本节将 SRPM 包安装归属于 RPM 包安装方式。
软件安装方式的选择,涉及到的因素有很多,本节总结了以下几点建议。
通常情况下,开发商提供的软件都具有一段时间的维护期,比如说,RHEL 和 CentOS 每个版本都至少提供 5 年以上的升级期限,对我们的系统安全性来说,有极大的好处。
借助 yum 自动升级,再加上系统持续维护软件(不断进行软件升级),可以保证我们的系统始终保持在最新的状态,当然系统安全性就会好很多。
不仅如此,使用 yum 安装的 RPM 软件包具有容易安装、卸载和升级的特点,而且还提供查询和验证的功能,安装时更有数字证书的保护,这些无疑会使软件管理变得更轻松!
综合以上因素,建议大家安装软件的首选方式是利用系统自带的 RPM 包安装。
某些特殊软件,Linux(及其发行版)系统可能并不会提供其 RPM 软件包,例如 CentOS 不提供 NTFS 的相关模块。这种情况下,就需要我们自行去该软件官网上搜索,看是否提供有和自己 Linux 系统相匹配的 RPM 安装包。除此之外,如果官网上提供有可下载该软件不同版本的网址,可以直接将其作为 yum 源,从而实现软件的自动安装和升级。
对于有某些特殊用途的软件,开发商根本不提供 RPM 包,这里也不建议你自行制作 SRPM 包从而得到 RPM 包,毕竟多数初学者只使用一台电脑,如果你管理相同的 100 台电脑,则此方式才能凸显它的价值。
对于安装此类特殊软件,例如并发编程常会用到的 MPICH/PVM 等并行运算函数库,建议使用源码包的安装方式。
有时候可能需要使用最新版的软件,而 Linux 系统中只提供旧版。例如 CentOS 服务更多的是企业,因此对很多软件的要求是稳而不是新。如果我们就是需要安装新软件,但又担心安装新软件后无法再回到旧版软件,该怎么办呢?
这种情况下,可以使用源码包将新软件安装到 /usr/local/ 目录中,因为 Linux 系统允许同一软件的 2 个版本同时存在,且多数软件的不同版本之间不会相互干扰。唯一需要注意的是,你要确定所使用的命令作用于哪一版软件。
总的来说,使用 RPM 包安装和使用源码包安装软件各有优缺点,不过,如果有 RPM 包的话,还是建议优先选择 RPM 包安装软件,毕竟后期管理起来更方便。当然,如果软件的架构差异太大,或者无法解决软件依赖性的问题,与其花大把的时间和精力解决软件之间的依赖,不如直接使用源码包的方式安装软件。
Linux 系统中存在大量的函数库。简单来讲,函数库就是一些函数的集合,每个函数都具有独立的功能且能被外界调用。我们在编写代码时,有些功能根本不需要自己实现,直接调用函数库中的函数即可。
需要注意的是,函数库中的函数并不是以源代码的形式存在的,而是经过编译后生成的二进制文件,这些文件无法独立运行,只有链接到我们编写的程序中才可以运行。
Linux 系统中的函数库分为 2 种,分别是静态函数库(简称静态库)和动态函数库(也称为共享函数库,简称动态库或共享库),两者的主要区别在于,程序调用函数时,将函数整合到程序中的时机不同:
图 1 函数库调用
使用动态函数库的好处是,程序生成的可执行程序体积比较小,且升级函数库时无需对整个程序重新编译;缺点是,如果程序执行时函数库出现问题,则程序将不能正确运行。Linux 系统中,静态函数库文件扩展名是 ".a",文件通常命令为 libxxx.a(xxx 为文件名);动态函数库扩展名为 ".so",文件通常命令为 libxxx.so.major.minor(xxx 为文件名,major 为主版本号,minor 为副版本号)。
目前,Linux 系统中大多数都是动态函数库(主要考虑到软件的升级方便),其中被系统程序调用的函数库主要存放在 "/usr/lib" 和 "/lib" 中;Linux 内核所调用的函数库主要存放在 "/lib/modules" 中。
注意,函数库(尤其是动态函数库)的存放位置非常重要,轻易不要做更改。
Linux 发行版众多,不同 Linux 版本安装函数库的方式不同。CentOS 中,安装函数库可直接使用 yum 命令。
例如,安装 curses 函数库命令如下:
[root@Linux ~]# yum install ncurses-devel
正常情况下,函数库安装完成后就可以直接被系统识别,但凡事都有万一。这里先想一个问题,如何查看可执行程序调用了哪些函数库呢?通过以下命令即可:
[root@localhost ~]# ldd -v 可执行文件名
-v 选项的含义是显示详细版本信息(不是必须使用)。
例如,查看 ls 命令调用了哪些函数库,命令如下:
[root@localhost ~]# ldd /bin/ls
linux-gate.so.1 => (0x00d56000)
libselinux.so.1 =>/lib/libselinux.so.1 (0x00cc8000)
librt.so.1 =>/lib/librt.so.1 (0x00cb8000)
libcap.so.2 => /lib/libcap.so.2 (0x00160000)
libacl.so.1 => /lib/libacl.so.1 (0x00140000)
libc.so.6 => /lib/libc.so.6 (0x00ab8000)
libdl.so.2 => /lib/libdl.so.2 (0x00ab0000)
/lib/ld-linux.so.2 (0x00a88000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00c50000)
libattr.so.1 =>/lib/libattr.so.1 (0x00158000)
如果函数库安装后仍无法使用(运行程序时会提示找不到某个函数库),这时就需要对函数库的配置文件进行手动调整,也很简单,只需进行如下操作:
注意,这里写入的是函数库所在的目录,而不单单是函数库的文件名。另外,如果自己在其他目录中创建了函数库文件,这里也可以直接在 "/etc/ld.so.conf" 文件中写入函数库文件所在的完整目录。[root@localhost ~]# cp *.so /usr/lib/
#把函数库复制到/usr/lib/目录中
[root@localhost ~]# vi /etc/ld.so.conf
#修改函数库配置文件
include ld.so.conf.d/*.conf
/usr/lib
#写入函数库所在目录(其实/usr/lib/目录默认已经被识别)
[root@localhost ~]# ldconfig
#从/etc/ld.so.conf文件中把函数库读入缓存
[root@localhost ~]# ldconfig -p
#列出系统缓存中所有识别的函数库
脚本程序并不多见,所以在软件包分类中并没有把它列为一类。它更加类似于 Windows 下的程序安装,有一个可执行的安装程序,只要运行安装程序,然后进行简单的功能定制选择(比如指定安装目录等),就可以安装成功,只不过是在字符界面完成的。
目前常见的脚本程序以各类硬件的驱动居多,我们需要学习一下这类软件的安装方式,以备将来不时之需。
我们来看看脚本程序如何安装和使用。安装一个叫作 Webmin 的工具软件,Webmin 是一个基于 Web 的系统管理界面,借助任何支持表格和表单的浏览器(和 File Manager 模块所需要的Java),你就可以设置用户账号、apache、DNS、文件共享等。
Webmin 包括一个简单的 Web 服务器和许多 CGI 程序,这些程序可以直接修改系统文件,比如 /etc/inetd.conf 和 /etc/passwd。Web 服务器和所有的 CGI 程序都是用 Perl 5 编写的,没有使用任何非标准 Perl 模块。也就是说,Webmin 是一个用 Perl 语言写的、可以通过浏览器管理 Linux 的软件。
首先下载 Webmin 软件,这里下载的是 webmin-1.610.tar.gz。
接下来解压缩软件,命令如下:
[root@localhost ~]# tar -zxvf webmin-1.610.tar.gz
进入解压目录,命令如下:
[root@localhost ~]# cd webmin-1.610
执行安装程序 setup.sh,并指定功能选项,命令如下:
[root@localhost webmin-1.610]# ./setup.sh
**************************
* Welcome to the Webmin setup script,version 1.610 *
**************************
Webmin is a web-based interface that allows Unix-like operating
systems and common Unix services to be easily administered.
Installing Webmin in /root/webmin-1.610...
**************************
Webmin uses separate directories for configuration files and log files.
Unless you want to run multiple versions of Webmin at the same time
you can just accept the defaults.
Config file directory [/etc/webmin]:
#选择安装位置,默认安装在/etc/webmin目录下。
如果安装到默认位置,则直接回车
Log file directory [/var/webmin]:
#日志文件保存位置,直接回车,选择默认位置
**************************
Webmin is written entirely in Perl.Please enter the full path to the
Perl 5 interpreter on your system.
Full path to peri (default /usr/bin/perl):
#指定Perl语言的安装位置,直接回车,选择默认位置,Perl默认就安装这里
Testing Perl...
Perl seems to be installed ok
**************************
Operating system name: CentOS Linux Operating system version: 6.3
**************************
Webmin uses its own password protected web server to provide access to the administration programs.
The setup script needs to know:
-What port to run the web server on.There must not be another web server already using this port.
-The login name required to access the web server.
-The password required to access the web server.
-If the Webserver should use SSL (if your system supports it).
-Whether to start webmin at boot time.
Web server port (default 10000):
#指定Webmin监听的端口,直接回车,默认选定 10000
Login name (default admin):admin #输入登录Webmin的用户名
Login password:
Password again:
#输入登陆密码
The Perl SSLeay library is not installed.SSL not available.
#apache默认没有启动SSl功能,所以SSl没有被激活
Start Webmin at boot time (y/n):y
#是否在开机的同时启动Webmin
…安装过程省略…
Webmin has been installed and started successfully.Use your web browser to go to
http://localhost:10000/
and login with the name and password you entered previously.
#安装完成
在浏览器地址栏中输入"http://192.168.2.199:10000/ ",然后输入用户名和密码,就可以登录到 Webmin 界面,如图 1 所示。
图 1 Webmin登录界面
当然,我们并不是要讲解 Webmin 管理界面如何使用,而是要讲解脚本程如何安装,所以工作已经完成。这种脚本安装简单快速,不过需要软件开商发布安装脚本。但是 Linux 中的绝大多数软件是没有这种脚本的。