3.2 项目实施
3.2.1 任务1 管理Tarball
在我们了解了源码的相关信息之后,接下来就是如何使用具有源码的Tarball来创建一个属于自己的软件了。从前面几个小节的说明当中,我们知道其实Tarball的安装是可以跨平台的,因为C语言的程序代码在各个平台上面是相通的,只是需要的编译器可能并不相同,例如Linux上面用gcc而Windows上面也有相关的C编译器。所以,同样的一组源码,既可以在CentOS Linux上面编译,也可以在SuSE Linux上面编译,当然,也可以在大部分的Unix平台上面编译成功。
如果没有编译成功怎么办?很简单,通过修改小部分的程序代码(通常是很小部分的变动)就可以进行跨平台的移植了。也就是说,刚刚我们在Linux下面写的程序理论上是可以在Windows上面进行编译的,这就是源码的好处。
1.使用源码管理软件所需要的基础软件
要制作一个二进制程序需要很多东西。包括下面这些基础的软件。
1)gcc或cc等C语言编译器(compiler)
没有编译器怎么进行编译的操作?所以C compiler是一定要有的。Linux上面有众多的编译器,其中以GNU的gcc为首选的自由软件编译器。事实上很多在Linux平台上面发展的软件源码,均是以gcc为根据来设计的。
2)make及autoconfig等软件
一般来说,以Tarball方式发布的软件当中,为了简化编译的流程,通常都是配合make这个命令来依据目标文件的相关性而进行编译,而Make需要Makefile这个文件的规则。由于不同的系统里面具有的基础软件环境可能并不相同,所以就需要检测使用者的操作环境,以便自行创建一个Makefile文件。这个自行检测的小程序也必须借由autoconfig这个相关的软件来辅助。
3)Kernel提供的Library以及相关的Include文件
很多的软件在发展的时候是直接取用系统内核提供的函数库与Include文件的,这样才可以与操作系统兼容。尤其是在驱动程序方面的模块,例如网卡、声卡、U盘等驱动程序在安装的时候,常常需要内核提供相关信息。在Red Hat的系统当中(包含Fedora/CentOS等系列),内核相关的功能通常包含在kernel-source或kernel-header这些软件当中,所以需要安装这些软件。
假如已经安装好一台Linux主机,但是使用的是默认值安装的软件,所以没有make、gcc等,该如何解决这个问题?由于目前使用最广泛的CentOS/Fedora或Red Hat是使用RPM(很快会介绍)来安装软件的,所以,只要拿出当初安装Linux时的原版光盘,然后使用RPM安装到Linux主机里面就可以了。使用yum会更加方便地进行安装。
在RedHat当中,如果已经连上了Internet,那么就可以使用yum了。通过yum的软件群组安装功能,可以执行以下操作:
• 如果是要安装gcc等软件开发工具,请使用yum groupinstall“Development Tools”;
• 若待安装的软件需要图形界面支持,一般还需要yum groupinstall“X Software Development”;
• 若安装的软件较旧,可能需要yum groupinstall“Legacy Software Development”。
2.Tarball安装的基本步骤
以Tarball方式发布的软件需要重新编译可执行的二进制程序,而Tarball是以tar这个命令来打包与压缩文件,所以需要先将Tarball解压缩,然后到源码所在的目录下创建Makefile,再以make来进行编译与安装的操作。
整个安装的基本操作步骤如下。
(1)取得原始文件:将Tarball文件在/usr/local/src目录下解压缩。
(2)取得相关安装信息:进入新创建的目录下面,查阅INSTALL或README等相关文件内容(很重要的步骤!)。
(3)相关属性软件安装:根据INSTALL或README的内容查看并安装好一些相关的软件(非必要)。
(4)创建Makefile:以自动检测程序(configure或config)检测操作环境,并创建Makefile这个文件。
(5)编译:使用make这个程序并以该目录下的Makefile作为参数配置档,来进行make(编译或其他)的动作。
(6)安装:使用make程序和Makefile参数配置文件,依据install这个目标(target)指定安装到正确的路径。
安装时需重点注意步骤(2), INSTALL或README通常会记录这个软件的安装要求、软件的工作项目、软件的安装参数配置及技巧等,只要仔细的读完这些文件,基本上能正确安装Tarball的文件,不会出什么大问题。
Makefile在制作出来之后,里面会有很多的目标(target),最常见的就是install与clean。通常“make clean”代表着将目标文件(object file)清除掉,“make”则是将源码进行编译。
注意:编译完成的可执行文件与相关的配置文件还在源码所在的目录当中。因此,最后要进行“make install”来将编译完成的所有文件都安装到正确的路径,这样才可以使用该软件。
大部分Tarball软件的安装的命令执行方式如下。
1)./configure
这个步骤的结果是创建Makefile这个文件。通常程序开发者会写一个脚本(scripts)来检查Linux系统、相关的软件属性等,这个步骤相当重要,因为安装信息是这一步骤完成的。另外,这个步骤的相关信息需要参考该目录下的README或INSTALL相关的文件。
2)make clean
make会读取Makefile中关于clean的工作。这个步骤不一定会有,但是最好运行一下,因为这个步骤可以去除目标文件。在不确定源码里面是否包含上次编译过的目标文件(*.o)存在的情况下,所以清除一下比较妥当。
3)make
make会依据Makefile中的默认工作进行编译。编译的工作主要是使用gcc将源码编译成为可以被执行的目标文件(object files),但是这些object files通常需要函数库链接(link)后,才能产生一个完整的可执行文件。使用make的目的就是要将源码编译成可执行文件,而这个可执行文件会放置在目前所在的目录下,尚未被安装到预定安装的目录中。
4)make install
通常这是最后的安装步骤。make会依据Makefile这个文件里面关于install的项目,将上一个步骤所编译完成的数据安装到预定的目录中,最后完成安装。
以上步骤是逐步进行的,只要其中一个步骤无法成功完成,那么后续的步骤就完全没有办法进行。因此,要确定上一步骤是成功的才可以继续进行下一步骤。
举例来说,在make过程中无法成功,而表示原始文件无法被编译成可执行文件,而make install主要是将编译完成的文件放置到文件系统中,既然没有可用的执行文件,安装就无法进行。
此外,如果安装成功,并且安装在一个独立的目录中,例如,/usr/local/packages目录,那么需要手动将这个软件的man page写入/etc/man.config里面去。
3.Tarball软件安装的建议事项(如何删除与升级)
在默认的情况下,Linux distribution发布安装的软件大都是在/usr里面的,而使用者自行安装的软件则建议放置在/usr/local里面。这是基于管理使用者所安装软件的便利性所考虑的。因此,Tarbau要在/usr/local/src里面进行解压缩。
几乎每个软件都会提供线上说明的服务,即info与man的功能。在默认的情况下,man会去搜寻/usr/local/man里面的说明文件,因此,如果将软件安装在/usr/local下面,那么自然安装完成之后,该软件的说明文件就可以被找到了。
建议大家将安装的软件放置在/usr/local下,源码(Tarball)放置在/usr/local/src(src为source的缩写)下面。
以apache这个软件来说明(apache是WWW服务器软件)Linux distribution默认的安装软件的路径:
•/etc/httpd;
•/usr/lib;
•/usr/bin;
•/usr/share/man。
软件一般放置在etc、lib、bin、man目录中,分别代表配置文件、函数库、执行文件、线上说明文件。但使用Tarball来安装软件时,如果是放在默认的/usr/local里面,由于/usr/local原来就默认以上四个目录,所以数据的安放目录为:
•/usr/local/etc;
•/usr/local/bin;
•/usr/local/lib;
•/usr/local/man。
但是如果每个软件都选择在这个默认的路径下安装,那么所有软件的文件都会放置在这四个目录中,若以后想要升级或删除的时候,就会比较难以查找文件的来源。而如果在安装的时候选择的是单独的目录,例如,将apache安装在/usr/local/apache中,那么文件目录就会变成以下四种:
•/usr/local/apache/etc;
•/usr/local/apache/bin;
•/usr/local/apache/lib;
•/usr/local/apache/man。
单一软件的文件都在同一个目录之下,如果要删除该软件就简单多了,只要将该目录删除即可视为该软件已经被删除。例如,要删除apache只要执行“rm-rf/usr/local/apache”即可。当然,实际安装的时候还要依据该软件的Makefile里面的install信息来确定安装情况。
这个方式虽然有利于软件的9删除,但是在执行某些命令的时候,与该命令是否在PATH环境变量所记录的路径有关。例如,/usr/local/apache/bin肯定是不在PATH里面的,所以执行apache的命令就要利用绝对路径,否则就需要将/usr/local/apache/bin加入PATH里面。同样地,/usr/local/apache/man也需要加入man page搜寻的路径中。
由于Tarball在升级与安装上面具有这些特色,同时Tarball在反安装上面具有比较高的难度,所以为了方便Tarball的管理,建议使用者注意以下几点。
(1)最好将Tarball的原始数据解压缩到/usr/local/src当中。
(2)安装时,最好安装到/usr/local这个默认路径下。
(3)考虑未来的反安装步骤,最好可以将每个软件单独的安装在/usr/local下面。
(4)将安装到单独目录的软件的man page加入man path搜寻。
如果安装的软件路径为/usr/local/software/,那么man page搜寻的配置中,在/etc/man.config内的40~50行处,可用如下命令:
MANPATH /usr/local/software/man
这样才可以使用man来查询该软件的线上文件。
4.范例
通过安装网络时间协议服务器NTP(network time protocol)来讲解如何利用Tarball进行软件的安装。
请先到http://www.ntp.org/downloads.html这个目录去下载文件(ntp-4.2.6p5. tar.gz),请下载最新版本的文件。
假设软件安装的要求如下:
(1)ntp-4.2.6p5.tar.gz这个文件放置在/root目录下;
(2)源码解压缩在/usr/local/src下面;
(3)NTP服务器需要安装到/usr/local/ntp目录中。
下面是安装步骤。
(1)解压缩下载Tarball,并参阅README/INSTALL文件。
[root@www ~] # cd /usr/local/src <==切换目录 [root@www src] # tar -zxvf /root/ntp-4.2.6p5.tar.gz <==解压缩到此目录 ntp-4.2.6p5/ <==会创建这个目录 ntp-4.2.6p5/libopts/ ...(下面省略)... [root@www src] # cd ntp-4.2.6p5/ [root@www ntp-4.2.6p5] # vim INSTALL <==同时README也要参阅 #特别看一下 28行到 54行之间的安装简介。同时可以了解安装的流程
(2)检查configure支持参数,并实际建立Makefile规则文件。
[root@www ntp*]# ./configure --help |more <==查询可用的参数有哪些 --prefix=PREFIX install architecture-independent files in PREFIX --enable-all-clocks +include all suitable non-PARSE clocks: --enable-parse-clocks -include all suitable PARSE clocks: #上面列出的是比较重要的,或者是可能需要的参数功能 [root@www ntp*]#./configure --prefix=/usr/local/ntp \ #命令一行写不下,转义 >--enable-all-clocks --enable-parse-clocks #<==开始创建Makefile checking for a BSD-compatible install.../usr/bin/install -c checking whether build environment is sane...yes ...(中间省略)... checking for gcc...gcc <==gcc编译器 ...(中间省略)... config.status: creating Makefile config.status: creating config.h config.status: executing depfiles commands
一般来说,configure配置参数比较重要的是--prefix=/path, --prefix后面的路径即为软件未来要安装到的目录。如果没有指定--prefix=/path,通常默认参数就是/usr/local。其他的参数意义请参考./configure--help。这个操作完成之后会产生makefile或Makefile文件。当然,检测检查的过程会显示在屏幕上。请特别留意关于gcc的检查,以及成功地创建Makefile。
(3)编译与安装。
[root@www ntp*]# make clean; make [root@www ntp*]# make check [root@www ntp*]# make install #将数据安装在/usr/local/ntp下
3.2.2 任务2 使用RPM软件管理程序
RPM的使用其实不难,只要使用rpm这个命令即可。
1.RPM默认安装的路径
一般来说,RPM类型的文件在安装的时候,会先去读取文件内记载的配置参数内容,然后将该数据用来比对Linux系统的环境,以找出是否有属性依赖的软件尚未安装的问题。例如Openssh连接软件需要通过Openssl密软件,所以需要安装openssl之后才能安装openssh。
若环境检查合格,RPM文件就可以安装到Linux系统上。安装完毕后,该软件相关的信息就会被写入/var/lib/rpm/目录下的数据库文件中,这个目录内的数据很重要,因为未来有任何软件升级的需求,版本之间的比较就是来自于这个数据库,查询系统已经安装的软件,也是从这个数据库查询的。此外,目前的RPM也提供数字签名信息,这些数字签名也是在这个目录内记录的。所以,这个目录十分重要,不可轻易删除。
那么软件内的文件到底是存放在哪呢?当然与文件系统有关。表3-4是一些重要目录的意义,这里再次地强调。
表3-4 重要目录的含义
2.RPM安装(install)
因为安装软件是root的工作,因此只有root的身份才能够操作rpm命令。用rpm安装软件很简单。假设需要安装一个文件名为rp-pppoe-3.5-32.1.i386.rpm的文件,可用如下命令:
[root@www ~]# rpm -i rp-pppoe-3.8-32.1.i386.rpm
不过,这样的参数其实无法显示安装的进度,所以,通常会使用如下命令:
[root@www~]# rpm -ivh package_name
选项与参数:
-i:install。
-v:察看更细部的安装信息画面。
-h:以安装信息列显示安装进度。
【例3-1】 安装rp-pppoe-3.8-32.1.i386.rpm。
[root@www~]# rpm -ivh rp-pppoe-3.5-32.1.i386.rpm Preparing... ######################################[100%] 1:rp-pppoe ######################################[100%]
【例3-2】 安装两个以上的软件时,命令如上。
[root@www~]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm #后面直接接多种软件文件
【例3-3】 直接由网络上面的某个文件安装,以网址来安装。
[root@www ~]# rpm -ivh http://website.name/path/pkgname.rpm
另外,如果我们在安装的过程当中发现问题,或者已经知道会发生的问题,而还是需要“强行”安装这个软件时,可以使用如下的参数“强制”安装,如表3-5所示。
表3-5 rpm安装时常用的选项与参数说明
参数比较多,建议直接使用-ivh。如果安装的过程中发现问题,一个一个去将问题找出来,尽量不要使用“暴力安装法”,即通过--force去强制安装。因为可能会发生很多不可预期的问题。
【例题】 在没有网络的前提下,如果要安装一个名为pam-devel的软件,但是却只有原版光盘,该如何操作?
答案:可以通过挂载原版光盘来进行数据的查询与安装。请将原版光盘放入光驱,尝试将光盘挂载到/media当中,然后进行软件下载操作。
(1)挂载光盘,使用如下命令:
mount /dev/cdrom /media
(2)找出文件的实际路径:
find /media-name 'pam-devel*'
(3)测试此软件是否具有依赖性:
rpm -ivh pam-devel...--test
(4)直接安装:
rpm -ivh pam-devel...
(5)卸载光盘:
umount /dev/cdrom
该实例在RHEL6中的运行如下所示。
[root@localhost ~]# mount /dev/cdrom /media mount: block device /dev/cdrom is write-protected, mounting read-only [root@localhost ~]# cd /media/Server [root@localhost Server]# find /media -name 'pam-devel*' /media/Server/pam-devel-0.99.6.2-6.el5.i386.rpm [root@localhost Server]# rpm -ivh pam-devel-0.99.6.2-6.el5.i386.rpm --test warning: pam-devel-0.99.6.2-6.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 897da07a Preparing... ###########################################[100%] [root@localhost Server]# rpm -ivh pam-devel-0.99.6.2-6.el5.i386.rpm warning: pam-devel-0.99.6.2-6.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 897da07a Preparing... ###########################################[100%] 1:pam-devel ###########################################[100%]
在RHEL6系统中,刚好这个软件没有属性依赖的问题,因此软件可以顺利地进行安装。
3.RPM升级与更新(upgrade/freshen)
使用RPM升级的操作相对简单,以-Uvh或-Fvh来升级即可,而-Uvh与-Fvh可用的选项与参数,跟install是一样的。不过,-U与-F的意义还是有所不同,基本的差别如表3-6所示。
表3-6-Uvh和-Fvh两个参数的含义
由以上说明可知,如果需要大量地升级系统旧版本的软件时,使用-Fvh是比较好的选择,因为没有安装的软件不会被不小心安装进系统中。但是需要注意的是,如果使用的是-Fvh,而系统中没有这个软件,那么该软件不能直接安装在Linux主机上,必须重新以ivh来安装。
在进行整个操作系统的旧版软件修补与升级时,一般进行如下操作:
• 先到各开发商的errata网站或者是国内的FTP映像站下载最新的RPM文件。
• 使用-Fvh来将系统内曾安装过的软件进行修补与升级。
另外,升级也可以利用--nodeps/--force等参数。
4.RPM查询(query)
对于系统中已经安装的软件,RPM实查询的是/var/lib/rpm/这个目录下的数据库文件。另外,RPM也可以查询系统中未安装软件的RPM文件内的信息。RPM查询命令如下。
[root@www ~]# rpm -qa <==已安装软件 [root@www ~]# rpm -q[licdR]已安装的软件名称 <==已安装软件 [root@www ~]# rpm -qf存在于系统上面的某个文件名 <==已安装软件 [root@www ~]# rpm -qp[licdR]未安装的某个文件名称 <==查阅RPM文件
选项与参数的含义如下。
1)查询已安装软件的信息
-q:仅查询后面接的软件名称是否安装。
-qa:列出所有的已经安装在本机Linux系统上面的所有软件名称。
-qi:列出该软件的详细信息(information),包含开发商、版本与说明等。
-ql:列出该软件所有的文件与目录所在完整文件名(list)。
-qc:列出该软件的所有配置文件(找出在/etc/下面的文件名)。
-qd:列出该软件的所有说明文件(找出与man有关的文件)。
-qR:列出与该软件有关的依赖软件所含的文件(Required)。
-qf:由后面接的文件名称找出该文件属于哪一个已安装的软件。
2)查询某个RPM文件内含有的信息
-qp[icdlR]:-qp后面接的所有参数与(1)中说明一致。但用途仅在于找出某个RPM文件内的信息,而非已安装的软件信息。
在查询的部分,所有的参数之前都需要加上-q。查询主要分为两部分,一个是查询已安装到系统上面的软件信息,这部分的信息都是由/var/lib/rpm/所提供。另一个则是查某个rpm文件内容,即在RPM文件内找出一些要写入数据库内的信息,这部分就要使用-qp(p是package的意思)。示例如下所示。
【例3-4】 找出你的Linux是否安装logrotate这个软件。
[root@www ~]# rpm -q logrotate logrotate-3.7.8-9 [root@www ~]# rpm -q logrotating package logrotating is not installed #注意到,系统会去找是否安装了后面接的软件名称。注意,没有必要加上版本!通过显示的结果, 可以判定有没有安装logrotate这个软件
【例3-5】 列出例3-4中属于该软件所提供的所有目录与文件。
[root@www ~]# rpm -ql logrotate /etc/cron.daily/logrotate /etc/logrotate.conf ...(以下省略)... #可以看出该软件到底提供了多少文件与目录,也可以追踪软件的数据
【例3-6】 列出logrotate这个软件的相关说明数据。
[root@www~]# rpm -qi logrotate Name : logrotate Relocations: (not relocatable) Version : 3.7.4 Vendor: CentOS Release : 8 Build Date: Sun 02 Dec 2007 08:38:06 AM CST Install Date: Sat 09 May 2009 11:59:05 PM CST Build Host: builder6 Group : System Environment/Base Source RPM: logrotate-3.7.8-8.src.rpm Size : 53618 License: GPL Signature : DSA/SHA1, Sun 02 Dec 2007 09:10:01 AM CST, Key ID a8a447dce8562897 Summary : Rotates, compresses, removes and mails system log files. Description: The logrotate utility is designed to simplify the administration of log files on a system which generates a lot of log files. Logrotate allows for the automatic rotation compression, removal and mailing of log files. Logrotate can be set to handle a log file daily, weekly, monthly or when the log file gets to a certain size. Normally, logrotate runs as a daily cron job. Install the logrotate package if you need a utility to deal with the log files on your system. #列出该软件的information (信息),包括了软件名称、版本、开发商、SRPM文件名称、打包次数、 简单说明信息、软件打包者、安装日期等。如果想要详细地知道该软件的数据,可以用这个参数来 了解一下
【例3-7】 分别找出logrotate的配置文件与说明文件。
[root@www ~]# rpm -qc logrotate [root@www ~]# rpm -qd logrotate
【例3-8】 若要成功安装logrotate,还需要以下代码。
[root@www ~]# rpm -qR logrotate /bin/sh config(logrotate) =3.7.4-8 libc.so.6 ...(以下省略)... #由这里看,还需要很多文件的支持!
【例3-9】 由例3-8找出/bin/sh是哪个软件提供的?
[root@www ~]# rpm -qf /bin/sh bash-3.2-24.el5 #这个参数后面接的是"文件"!不像前面都是接软件! #这个功能是查询系统的某个文件属于哪一个软件。在解决依赖关系时用处很大(知道所依赖的模 块属于哪个软件才能安装这个软件)
【例3-10】 假设下载了一个RPM文件,想要知道该文件的需求文件,该如何操作?
[root@www~]# rpm -qpR filename.i386.rpm # 加上 -qpR,找出该文件需求的数据
常见的查询就是以上这些。需要特别说明的是,在查询本机上面的RPM软件相关信息时,不需要加上版本的名称,只要加上软件名称即可,因为它会到/var/lib/rpm这个数据库里面去查询。但是查询某个RPM文件就不同了,必须要列出整个文件的完整文件名才行。这一点读者朋友们常常会搞错。下面我们就来做几个简单的练习来巩固下所学的知识。
【习题】
(1)想要知道系统当中,以c开头的软件有几个,如何操作?
(2)WWW服务器为Apache, RPM软件文件名为httpd。如果想要知道这个软件的所有配置文件放在何处,可以怎么操作?
(3)承上题,如果查出来的配置文件已经被改过,但是忘记了曾经修改过哪些地方,所以想要直接重新安装一次该软件,该如何操作?
(4)如果误删了某个重要文件,例如,/etc/crontab,却不知道它属于哪一个软件,该怎么办?
分析:
(1)rpm-qa|grep ^c|wc-l。
(2)rpm-qc httpd。
(3)假设该软件在网络上的网址为:http://web.site.name/path/httpd-x.x.xx. i386.rpm。
则解决方案为:
rpm -ivh http://web.site.name/path/httpd-x.x.xx.i386.rpm --replacepkgs
(4)虽然已经没有这个文件了,不过没有关系,因为RPM在/var/lib/rpm数据库当中有记录。所以执行:
rpm -qf /etc/crontab
就可以知道是哪个软件了,重新安装一次该软件即可。
5.RPM反安装与重建数据库(erase/rebuilddb)
反安装就是将软件卸载。要注意的是,反安装的过程一定要由最上一级往下删除。以rp-pppoe为例,这一软件主要是依据ppp这个软件来安装的,所以当要卸载ppp的时候,就必须要先卸载rp-pppoe才行,否则就会发生结构上的问题。正如要拆除五、六楼,由六楼拆起是一个道理。
移除的选项很简单,通过-e即可移除。不过,通常发生软件属性依赖导致无法移除某些软件的问题。以下面的例子来说明。
【例3-11】 找出与pam有关的软件名称,并尝试移除pam这个软件。
[root@www ~]# rpm -qa |grep pam pam_krb5-2.2.14-10 pam-0.99.6.2-6.el5 pam_pkcs11-0.5.3-23 pam-devel-0.99.6.2-6.el5 pam_ccreds-3-5 pam_passwdqc-1.0.2-1.2.2 pam_smb-1.1.7-7.2.1 [root@www ~]# rpm -e pam error: Failed dependencies: <==这里提到的是依赖性的问题 libpam.so.0 is needed by (installed) coreutils-5.97-14.el5.i386 libpam.so.0 is needed by (installed) libuser-0.54.7-2.el5.5.i386 ...(以下省略)...
【例3-12】 仅移除例3-11安装上的软件pam-devel。
[root@www~]# rpm -e pam-devel <==不会出现任何信息! [root@www~]# rpm -q pam-devel package pam-devel is not installed
从例3-11知,pam所提供的函数库是很多软件共同使用的,因此不能移除pam,除非将其他依赖软件同时也全部移除。当然也可以使用--nodeps来强制移除,不过,如此一来所有会用到pam函数库的软件,都将成为无法运行的程序,主机也就不能用了!由例3-12可知,由于pam-devel是依赖于pam的开发工具,可以单独安装与单独移除。
由于RPM文件常常会被安装、移除或升级等,某些操作可能会导致RPM数据库(/var/lib/rpm/)内的文件受损。如果是这样,那该如何挽救呢?可以使用--rebuilddb这个选项来重建一下数据库。命令如下:
[root@www~]# rpm --rebuilddb <==重建数据库
3.2.3 任务3 使用yum
在项目三开始的地方谈到过yum, yum是通过分析RPM的标题数据后,根据各软件的相关性制作出属性依赖时的解决方案,然后可以自动处理软件的依赖属性问题,以解决软件安装、移除或升级的问题。详细的yum服务器与用户端之间的沟通,可以参见图3-1的说明。
由于distributions必须先发布软件,然后将软件放在yum服务器上面,供用户端进行安装与升级之用。因此想要使用yum的功能,必须要先找到适合的yum server。而每个yum server可能会提供许多不同的软件功能,即之前谈到的“容器”。因此,必须前往yum server查询到相关的容器网址后,再继续处理后续的配置工作。
事实上RHEL发布出软件时已经制作出多部映射站点(mirror site)提供给全世界的用户进行软件升级之用。所以,理论上不需要处理任何配置值,只要能够连上Internet,就可以使用yum。下面作详细介绍。
1.制作本地yum源
其实rhel6系统安装的时候已经有yum了,但如果没有花钱购买软件,也就无法注册,红帽官方的yum源也将不能应用。那么有什么解决方法呢?
第一种方法是把yum的更新地址改成开源的即可。限定yum更新地址的文件在/etc/yum.repos.d/里。具体的内容请参考相关资料。
第二种方法是利用已有的ISO镜像制作本地yum源。
下面以第二种方法为例介绍。
(1)挂载ISO安装镜像。
//挂载光盘到 /iso下 [root@rhel6~]# mkdir /iso [root@rhel6~]# mount /dev/cdrom /iso
(2)制作用于安装的yum源文件。
[root@rhel6~]# vim /etc/yum.repos.d/dvd.repo
dvd.repo文件的内容如下:
#/etc/yum.repos.d/dvd.repo #or for ONLY the media repo, do this: #yum --disablerepo=\* --enablerepo=c8-media [command] [dvd] name=dvd baseurl=file:///iso //特别注意本地源文件的表示,3个“/”。 gpgcheck=0 enabled=1
各选项的含义如下所示。
•[base]:代表容器的名字。中括号一定要存在,里面的名称则可以随意取。但是不能有两个相同的容器名称,否则yum会不知道该到哪里去找容器相关软件的清单文件。
• name:只是说明一下这个容器的意义,重要性不高。
• mirrorlist=:列出这个容器可以使用的映射站点,如果不想使用,可以注解这行。
• baseurl=:这个最重要,因为后面接的就是容器的实际网址。mirrorlist是由yum程序自行去搜寻映射站点,baseurl则是指定固定的一个容器网址。上例中使用了本地地址。如果使用网址,格式为baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/。
• enable=1:让这个容器启动。如果不想启动可以使用enable=0。
• Xgpgcheck=1:指定是否需要查阅RPM文件内的数字签名。
• gpgkey=:数字签名的公钥文件所在位置,使用默认值即可。
提示:如果没有购买RHEL的服务,请一定配置本地yum源。或者配置开源的yum源。
2.修改容器产生的问题与解决方法
我们首先看一下系统默认的配置文件。
[root@localhost yum.repos.d]#vim rhel-debuginfo.repo [rhel-debuginfo] name=Red Hat Enterprise Linux $releasever-$basearch-Debug baseurl=ftp://ftp.redhat.com/pub/redhat/linux/enterprise/$releasever/en/os/ $basearch/Debuginfo/ enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
如果修改系统默认的配置文件,比如修改了网址却没有修改容器名称(中括号内的文字),可能就会造成本机的清单与yum服务器的清单不同步,此时就会出现无法升级的问题了。
那该如何解决?很简单,通过清除掉本机上面的旧数据即可!不需要手动处理,通过yum的clean项目来处理即可。
[root@www~]#yum clean [packages|headers|all]
选项与参数如下。
packages:将已下载的软件文件删除;
headers:将下载的软件文件头删除;
all:将所有容器数据都删除。
【例3-13】 删除已下载过的所有容器的相关数据(含软件本身与清单):
[root@www~]#yum clean all
注意:“yum clean all”是经常使用的一个命令。
3.利用yum进行查询、安装、升级与移除功能
1)查询功能
yum [list|info|search|provides|whatprovides]参数
利用yum来查询原版distribution所提供的软件,或已知某软件的名称,想知道该软件的功能,可以利用yum提供的相关参数。
[root@www~]#yum [option] [查询工作项目] [相关参数]
其中[option]主要的选项包括以下几种。
•--y:当yum需要等待使用者输入时,这个选项可以自动提供yes的回应。
•--installroot=/some/path:将软件安装在/some/path而不使用默认路径[查询工作项目][相关参数],这方面的参数如下所示。
• search:搜寻某个软件名称或者是描述(description)的重要关键字。
• list:列出目前yum所管理的所有的软件名称与版本,有点类似rpm-qa。
• info:同上,不过有点类似rpm-qai的运行结果。
• provides:从文件去搜寻软件,类似rpm-qf的功能。
【例3-14】 搜寻磁盘阵列(raid)相关的软件有哪些。
[root@www~]# yum search raid ...(前面省略)... mdadm.i386 : mdadm controls Linux md devices (software RAID arrays) lvm2.i386 : Userland logical volume management tools ...(后面省略)... #在冒号(:)左边的是软件名称,右边的则是在RPM内的name配置(软件名)
【例3-15】 找出mdadm这个软件的功能。
[root@www ~〗# yum info mdadm Installed Packages <==这说明该软件是已经安装的 Name : mdadm <==这个软件的名称 Arch : i386 <==这个软件的编译架构 Version: 2.6.4 <==此软件的版本 Release: 1.el5 <==发布的版本 Size : 1.7 M <==此软件的文件总容量 Repo : installed <==容器回应已安装 Summary: mdadm controls Linux md devices (software RAID arrays) Descript:ion <==与rpm -qi的作用相同 mdadm is used to create, manage, and monitor Linux MD(software RAID)devices.As such, it provides similar functionality to the raidtools package. However, mdadm is a single program, and it can perform almost all functions without a configuration file, though a configuration file can be used to help with some common tasks.
【例3-16】 列出yum服务器上面提供的所有软件名称。
[root@www ~]#yum list Installed Packages <==已安装软件 Deployment_Guide-en-US.noarch 5.2-9.el5.centos installed Deployment_Guide-zh-CN.noarch 5.2-9.el5.centos installed Deployment_Guide-zh-TW.noarch 5.2-9.el5.centos installed ...(中间省略)... Available Packages <==还可以安装的其他软件 Cluster_Administration-as-IN.noarch 5.2-1.el5.centos base Cluster_Administration-bn-IN.noarch 5.2-1.el5.centos base ...(下面省略)... #上面提供的意义为:"软件名称 版本 在哪个容器内 "
【例3-17】 列出目前服务器上可供本机进行升级的软件有哪些。
[root@www ~]# yum list updates <==一定要是updates Updated Packages Deployment_Guide-en-US.noarch 5.2-11.el5.centos base Deployment_Guide-zh-CN.noarch 5.2-11.el5.centos base Deployment_Guide-zh-TW.noarch 5.2-11.el5.centos base ...(下面省略)... #上面列出在哪个容器内可以提供升级的软件与版本
【例3-18】 列出提供passwd这个文件的软件有哪些。
[root@www ~]# yum provides passwd passwd.i386 :The passwd utility for setting/changing passwords using PAM #就是上面的这个软件提供了passwd这个程序
结合以上示例,通过习题来实际应用一下yum在查询上的功能。
【习题】 利用yum的功能,找出以pam为开头的软件名称有哪些?而其中尚未安装的又有哪些?
分析:可以通过如下的方法来查询。
[root@www~]# yum list pam* Installed Packages pam.i386 0.99.6.2-3.27.el5 installed pam_ccreds.i386 3-5 installed pam_krb5.i386 2.2.14-1 installed pam_passwdqc.i386 1.0.2-1.2.2 installed pam_pkcs11.i386 0.5.3-23 installed pam_smb.i386 1.1.7-7.2.1 installed Available Packages <==下面则是“可升级”的或“未安装”的 pam.i386 0.99.6.2-4.el5 base pam-devel.i386 0.99.6.2-4.el5 base pam_krb5.i386 2.2.14-10 base
如上所示,所以可升级的有pam、pam_krb5这两个软件,完全没有安装的则是pam-devel这个软件。
2)安装/升级功能
yum [install|update]软件
既然可以查询,那么安装与升级呢?很简单,利用install与update参数。
[root@www~]#yum [option] [查询工作项目] [相关参数]
选项与参数如下。
install:后面接要安装的软件。
update:后面接要升级的软件,若要整个系统都升级,直接update即可。
【例3-19】 将上面习题中找到的未安装的pam-devel安装起来。
[root@www~]#yum install pam-devel Setting up Install Process Parsing package install arguments Resolving Dependencies <==先检查软件的属性依赖问题 -->Running transaction check --->Package pam-devel.i386 0:0.99.6.2-4.el5 set to be updated -->Processing Dependency:pam=0.99.6.2-4.el5 for package:pam-devel -->Running transaction check --->Package pam.i386 0:0.99.6.2-4.el5 set to be updated filelists.xml.gz 100%|==================|1.6 MB 00:05 filelists.xml.gz 100%|==================|138 kB 00:00 ->Finished Dependency Resolution Dependencies Resolved =============================================================== Package Arch Version Repository Size =============================================================== Installing: pam-devel i386 0.99.6.2-4.el5 base 186 k Updating: pam i386 0.99.6.2-4.el5 base 965 k Transaction Summary =============================================================== Install 1 Package(s) <==结果发现要安装此软件需要升级另一个依赖软件 Update 1 Package(s) Remove 0 Package(s) Total download size: 1.1 M Is this ok [y/N]: y <==确定要安装 Downloading Packages: <==先下载 (1/2): pam-0.99.6.2-4.el5100%|================|965 kB 00:05 (2/2): pam-devel-0.99.6.2100%|================|186 kB 00:01 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction <==开始安装 Updating : pam #########################[1/3] Installing: pam-devel #########################[2/3] Cleanup : pam #########################[3/3] Installed: pam-devel.i386 0:0.99.6.2-4.el5 Updated: pam.i386 0:0.99.6.2-4.el5 Complete!
3)移除功能
yum [remove]软件
【例3-20】 将例3-19中软件移除,查看会出现什么结果。
[root@www~]#yum remove pam-devel Setting up Remove Process Resolving Dependencies <==同样地,先解决属性依赖的问题 -->Running transaction check --->Package pam-devel.i386 0:0.99.6.2-4.el5 set to be erased -->Finished Dependency Resolution Dependencies Resolved ============================================================== Package Arch Version Repository Size ============================================================== Removing: pam-devel i386 0.99.6.2-4.el5 installed 495 k Transaction Summary ============================================================== Install 0 Package(s) Update 0 Package(s) Remove 1 Package(s)<==还好,并没有属性依赖的问题,单纯移除一个软件 Is this ok [y/N]: y Downloading Packages: Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Erasing : pam-devel #########################[1/1] Removed: pam-devel.i386 0:0.99.6.2-4.el5 Complete!