七、Linux系统软件安装
7.1 Linux软件包(源码包和二进制包)
GPL,全称 General Public License,中文名称“通用性公开许可证”,简单理解 GPL 就是一个保护软件自由的一个协议,经 GPL 协议授权的软件必须开源。
Linux下的软件包可细分为两种,分别是源码包和二进制包。
Linux源码包
实际上,源码包就是一大堆源代码程序,是由程序员按照特定的格式和语法编写出来的。我们都知道,计算机只能识别机器语言,也就是二进制语言,所以源码包的安装需要一名“翻译官”将“abcd”翻译成二进制语言,这名“翻译官”通常被称为编译器。
“编译”指的是从源代码到直接被计算机(或虚拟机)执行的目标代码的翻译过程,编译器的功能就是把源代码翻译为二进制代码,让计算机识别并运行。
虽然源码包免费开源,但用户不会编程怎么办?一大堆源代码程序不会使用怎么办?源码包容易安装吗?等等这些都是使用源码包安装方式无法解答的问题。
另外,由于源码包的安装需要把源代码编译为二进制代码,因此安装时间较长。比如,大家应该都在 Windows下安装过 QQ,QQ 功能较多,程序相对较大(有 70 MB左右),但由于其并非是以源码包的形式发布,而是编译后才发布的,因此只需几分钟(经过简单的配置)即可安装成功。但如果我们以源码包安装的方式在 Linux 中安装一个 MySQL 数据库,即便此软件的压缩包仅有 23 MB左右,也需要 30 分钟左右的时间(根据硬件配置不同,略有差异)。
通过对比你会发现,源码包的编译是很费时间的,况且绝多大数用户并不熟悉程序语言,在安装过程中我们只能祈祷程序不要报错,否则初学者很难解决。
为了解决使用源码包安装方式的这些问题,Linux 软件包的安装出现了使用二进制包的安装方式。
Linux二进制包
二进制包,也就是源码包经过成功编译之后产生的包。由于二进制包在发布之前就已经完成了编译的工作,因此用户安装软件的速度较快(同 Windows下安装软件速度相当),且安装过程报错几率大大减小。二进制包是 Linux 下默认的软件安装包,因此二进制包又被称为默认安装软件包。目前主要有以下 2 大主流的二进制包管理系统:
- RPM 包管理系统:功能强大,安装、升级、査询和卸载非常简单方便,因此很多 Linux 发行版都默认使用此机制作为软件安装的管理方式,例如 Fedora、CentOS、SuSE 等。
- DPKG 包管理系统:由 Debian Linux 所开发的包管理机制,通过 DPKG 包,Debian Linux 就可以进行软件包管理,主要应用在 Debian 和 Ubuntu 中。
RPM 包管理系统和 DPKG 管理系统的原理和形式大同小异,可以触类旁通。由于本教程使用的是 CentOS 6.x 版本,因此本节主要讲解 RPM 二进制包。
源码包 VS RPM二进制包
源码包一般包含多个文件,为了方便发布,通常会将源码包做打包压缩处理,Linux 中最常用的打包压缩格式为“tar.gz”,因此源码包又被称为 Tarball。Tarball 是 Linux 系统的一款打包工具,可以对源码包进行打包压缩处理,人们习惯上将最终得到的打包压缩文件称为 Tarball 文件。
- 源代码文件。
- 配置和检测程序(如 configure 或 config 等)。
- 软件安装说明和软件说明(如 INSTALL 或 README)。
总的来说,使用源码包安装软件具有以下几点好处:
- 开源。如果你有足够的能力,则可以修改源代码。
- 可以自由选择所需的功能。
- 因为软件是编译安装的,所以更加适合自己的系统,更加稳定,效率也更高。
- 卸载方便。
但同时,使用源码包安装软件也有几点不足:
- 安装过程步骤较多,尤其是在安装较大的软件集合时(如 LAMP 环境搭建),容易出现拼写错误。
- 编译时间较长,所以安装时间比二进制安装要长。
- 因为软件是编译安装的,所以在安装过程中一旦报错,新手很难解决。
相比源码包,二进制包是在软件发布时已经进行过编译的软件包,所以安装速度比源码包快得多(和 Windows 下软件安装速度相当)。也正是因为已经进行通译,大家无法看到软件的源代码。
使用 RMP 包安装软件具有以下 2 点好处:
- 包管理系统简单,只通过几个命令就可以实现包的安装、升级、査询和卸载。
- 安装速度比源码包安装快得多。
与此同时,使用 RMP 包安装软件有如下不足:
- 经过编译,不能在看到源代码。
- 功能选择不如源码包灵活。
- 依赖性。有时我们会发现,在安装软件包 a 时需要先安装 b 和 c,而在安装 b 时需要先安装 d 和 e。这就需要先安装 d 和 e,再安装 b 和 c,最后才能安装 a。比如,我买了一个漂亮的灯具,打算安装在客厅里,可是在安装灯具之前,客厅需要有顶棚,并且顶棚需要刷好油漆。安装软件和装修及其类似,需要有一定的顺序,但是有时依赖性会非常强。
如何选择
通过源码包和 RMP 二进制包的对比,在 Linux 进行软件安装时,我们应该使用哪种软件包呢?为了更好的区别两种软件包,这里举个例子。假设我们想做一套家具,源码包就像所有的家具完全由自己动手手工打造(手工编译),想要什么样的板材、油漆、颜色和样式都由自己决定(功能自定义,甚至可以修改源代码)。想想就觉得爽,完全不用被黑心的厂商所左右,而且不用担心质量问题(软件更适合自己的系统,效率更高,更加稳定)。但是,所花费的时间大大超过了买一套家具的时间(编译浪费时间),而且自己真的有做木工这个能力吗(需要对源代码非常了解)?就算请别人定制好的家具,再由自己组装,万一哪个部件不匹配(报错很难解决),怎么办?
那么二进制包呢?也是我们需要一套家具,去商场买了一套(安装简单),家具都是现成的,不会有哪个部件不匹配,除非因为自身问题没有量好尺寸而导致放不下(报错很少)。但是我们完全不知道这套家具用的是什么材料、油漆是否合格,而且家具的样式不能随意选择(软件基本不能自定义功能)。
7.2 Linux RPM包统一命名规则
RPM 二进制包命名的一般格式如下:
包名-版本号-发布次数-发行商-Linux平台-适合的硬件平台-包扩展名
例如,RPM 包的名称是
httpd-2.2.15-15.el6.centos.1.i686.rpm
,其中:
- httped:软件包名。这里需要注意,httped 是包名,而 httpd-2.2.15-15.el6.centos.1.i686.rpm 通常称为包全名,包名和包全名是不同的,在某些 Linux 命令中,有些命令(如包的安装和升级)使用的是包全名,而有些命令(包的查询和卸载)使用的是包名,一不小心就会弄错。
- 2.2.15:包的版本号,版本号的格式通常为
主版本号.次版本号.修正号
。 - 15:二进制包发布的次数,表示此 RPM 包是第几次编程生成的。
- el*:软件发行商,el6 表示此包是由 Red Hat 公司发布,适合在 RHEL 6.x (Red Hat Enterprise Unux) 和 CentOS 6.x 上使用。
- centos:表示此包适用于 CentOS 系统。
- i686:表示此包使用的硬件平台,目前的 RPM 包支持的平台如表 1 所示:
表 1 RPM 包适用的硬件平台 平台名称 适用平台信息 i386 386 以上的计算机都可以安装 i586 686 以上的计算机都可以安装 i686 奔腾 II 以上的计算机都可以安装,目前所有的 CPU 是奔腾 II 以上的,所以这个软件版本居多 x86_64 64 位 CPU 可以安装 noarch 没有硬件限制 - rpm:RPM 包的扩展名,表明这是编译好的二进制包,可以使用 rpm 命令直接安装。此外,还有以 src.rpm 作为扩展名的 RPM 包,这表明是源代码包,需要安装生成源码,然后对其编译并生成 rpm 格式的包,最后才能使用 rpm 命令进行安装。
有读者可能会问,Linux 系统不靠扩展名分区文件类型,那为什么包全名中要包含 .rpm 扩展名呢?其实,这里的扩展名是为系统管理员准备的,如果我们不对 RPM 包标注扩展名,管理员很难知道这是一个 RPM 包,当然也就无法正确使用。
7.3 Linux RPM包安装、卸载和升级(rpm命令)详解
我们以安装 apache 程序为例。因为后续章节还会介绍使用源码包的方式安装 apache 程序,读者可以直观地感受到源码包和 RPM 包的区别。
RPM包默认安装路径
通常情况下,RPM 包采用系统默认的安装路径,所有安装文件会按照类别分散安装到表 1 所示的目录中。安装路径 | 含 义 |
---|---|
/etc/ | 配置文件安装目录 |
/usr/bin/ | 可执行的命令安装目录 |
/usr/lib/ | 程序所使用的函数库保存位置 |
/usr/share/doc/ | 基本的软件使用手册保存位置 |
/usr/share/man/ | 帮助文件保存位置 |
RPM 包的默认安装路径是可以通过命令查询的。
除此之外,RPM 包也支持手动指定安装路径,但此方式并不推荐。因为一旦手动指定安装路径,所有的安装文件会集中安装到指定位置,且系统中用来查询安装路径的命令也无法使用(需要进行手工配置才能被系统识别),得不偿失。
与 RPM 包不同,源码包的安装通常采用手动指定安装路径(习惯安装到 /usr/local/ 中)的方式。既然安装路径不同,同一 apache 程序的源码包和 RPM 包就可以安装到一台 Linux 服务器上(但同一时间只能开启一个,因为它们需要占用同一个 80 端口)。
实际情况中,一台服务器几乎不会同时包含两个 apache 程序,管理员不好管理,还会占用过多的服务器磁盘空间。
RPM 包的安装
安装 RPM 的命令格式为:[root@localhost ~]# rpm -ivh 包全名
此命令中各选项参数的含义为:
- -i:安装(install);
- -v:显示更详细的信息(verbose);
- -h:打印 #,显示安装进度(hash);
例如,使用此命令安装 apache 软件包,如下所示:
[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:指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。
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
![apache测试页](http://c.biancheng.net/uploads/allimg/181009/2-1Q009123ZWD.jpg)
图 2 apache测试页
RPM包的升级
使用如下命令即可实现 RPM 包的升级:[root@localhost ~]# rpm -Uvh 包全名
[root@localhost ~]# rpm -Fvh 包全名
RPM包的卸载
RPM 软件包的卸载要考虑包之间的依赖性。例如,我们先安装的 httpd 软件包,后安装 httpd 的功能模块 mod_ssl 包,那么在卸载时,就必须先卸载 mod_ssl,然后卸载 httpd,否则会报错。软件包卸载和拆除大楼是一样的,本来先盖的 2 楼,后盖的 3 楼,那么拆楼时一定要先拆除 3 楼。
[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
RPM 软件包的卸载很简单,使用如下命令即可:
[root@localhost ~]# rpm -e 包名
RPM 软件包的卸载命令支持使用“-nocteps”选项,即可以不检测依赖性直接卸载,但此方式不推荐大家使用,因为此操作很可能导致其他软件也无法征程使用。
7.4 Linux rpm命令查询软件包(-q、-qa、-i、-p、-l、-f、-R)
- 查询软件包是否已安装;
- 查询系统中所有已安装的软件包;
- 查看软件包的详细信息;
- 查询软件包的文件列表;
- 查询某系统文件具体属于哪个 RPM 包。
使用 rpm 做查询命令的格式如下:
[root@localhost ~]# rpm 选项 查询对象
rpm -q:查询软件包是否安装
用 rpm 查询软件包是否安装的命令格式为:[root@localhost ~]# rpm -q 包名
-q 表示查询,是 query 的首字母。
例如,查看 Linux 系统中是否安装 apache,rpm 查询命令应写成:
[root@localhost ~]# rpm -q httpd httpd-2.2.15-15.el6.centos.1.i686
rpm -qa:查询系统中所有安装的软件包
使用 rpm 查询 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 -qi:查询软件包的详细信息
通过 rpm 命令可以查询软件包的详细信息,命令格式如下:[root@localhost ~]# rpm -qi 包名
例如,想查看 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 包全名
注意,这里用的是包全名,且未安装的软件包需使用“绝对路径+包全名”的方式才能确定包。
rpm -ql:命令查询软件包的文件列表
通过前面的学习我们知道,rpm 软件包通常采用默认路径安装,各安装文件会分门别类安放在适当的目录文件下。使用 rpm 命令可以查询到已安装软件包中包含的所有文件及各自安装路径,命令格式为:[root@localhost ~]# rpm -ql 包名
例如,查看 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 包全名
注意,由于软件包还未安装,因此需要使用“绝对路径+包全名”的方式才能确定包。
比如,我们想查看 bing 软件包(未安装,绝对路径为:/mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm)中的所有文件及各自打算安装的位置,可以执行如下命令:
[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 …省略部分输出…
rpm -qf:命令查询系统文件属于哪个RPM包
rpm -ql 命令是通过软件包查询所含文件的安装路径,rpm 还支持反向查询,即查询某系统文件所属哪个 RPM 软件包。其命令格式如下:[root@localhost ~]# rpm -qf 系统文件名
注意,只有使用 RPM 包安装的文件才能使用该命令,手动方式建立的文件无法使用此命令。
例如,查询 ls 命令所属的软件包,可以执行如下命令:
[root@localhost ~]# rpm -qf /bin/ls coreutils-8.4-19.el6.i686
rpm -qR:查询软件包的依赖关系
使用 rpm 命令安装 RPM 包,需考虑与其他 RPM 包的依赖关系。rpm -qR 命令就用来查询某已安装软件包依赖的其他包,该命令的格式为:[root@localhost ~]# rpm -qR 包名
例如,查询 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-tods = 2.2.15-15.el6.centos.1 initscripts >= 8.36 …省略部分输出…
例如,bind 软件包尚未安装(绝对路径为: /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm),查看此软件包的依赖性可执行如下命令:
[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) …省略部分输出…
7.5 Linux RPM包验证和数字证书(数字签名)
rpm -qa
命令可以看到,Linux 系统中装有大量的 RPM 包,且每个包都含有大量的安装文件。因此,为了能够及时发现文件误删、误修改文件数据、恶意篡改文件内容等问题,Linux 提供了以下两种监控(检测)方式:
- RPM 包校验:其实就是将已安装文件和 /var/lib/rpm/ 目录下的数据库内容进行比较,确定文件内容是否被修改。
- RPM 包数字证书校验:用来校验 RPM 包本身是否被修改。
Linux RPM 包校验
RPM 包校验可用来判断已安装的软件包(或文件)是否被修改,此方式可使用的命令格式分为以下 3 种。[root@localhost ~]# rpm -Va
[root@localhost ~]# rpm -V 已安装的包名
[root@localhost ~]# rpm -Vf 系统文件名
例如我们校验 apache 软件包中所有的安装文件是否被修改,可执行如下命令:
[root@localhost -]# rpm -V httpd
接下来尝试对 apache 的配置文件 /etc/httpd/conf/httpd.conf 做适当修改,修改格式如下:
[root@localhost ~]#vim /etc/httpd/conf/httpd.conf ...省略部分内容... Directorylndex index.html index.html.var index.php #这句话是定义apache可以识别的默认网页文件名。在后面加入了index.php #这句话大概有400行左右 …省略部分内容...
rpm -V
命令对 apache 软件包进行验证:[root@localhost ~]# rpm -V httpd S.5....T. c /etc/httpd/conf/httpd.conf
- 最前面的 8 个字符(S.5....T)都属于验证信息,各字符的具体含义如下:
- S:文件大小是否改变。
- M:文件的类型或文件的权限(rwx)是否改变。
- 5:文件MD5校验和是否改变(可以看成文件内容是否改变)。
- D:设备的主从代码是否改变。
- L:文件路径是否改变。
- U:文件的属主(所有者)是否改变。
- G:文件的属组是否改变。
- T:文件的修改时间是否改变。
- .:若相关项没发生改变,用 . 表示。
- 被修改文件类型,大致可分为以下几类:
- c:配置文件(configuration file)。
- d:普通文档(documentation)。
- g:"鬼"文件(ghost file),很少见,就是该文件不应该被这个 RPM 包包含。
- l:授权文件(license file)。
- r:描述文件(read me)。
- 被修改文件所在绝对路径(包含文件名)。
由此,S.5....T. c S.5....T. c /etc/httpd/conf/httpd.conf 表达的完整含义是:配置文件 httpd.conf 的大小、内容、修改时间被人为修改过。
注意,并非所有对文件做修改的行为都是恶意的。通常情况下,对配置文件做修改是正常的,比如说配置 apache 就要修改其配置文件,而如果验证信息提示对二进制文件做了修改,这就需要小心,除非是自己故意修改的。
Linux RPM数字证书验证
RPM 包校验方法只能用来校验已安装的 RPM 包及其安装文件,如果 RPM 包本身就被动过手脚,此方法将无法解决问题,需要使用 RPM 数字证书验证方法。简单的理解,RPM 包校验其实就是将现有安装文件与最初使用 RPM 包安装时的初始文件进行对比,如果有改动则提示给用户,因此这种方式无法验证 RPM 包本身被修改的情况。
数字证书,又称数字签名,由软件开发商直接发布。Linux 系统安装数字证书后,若 RPM 包做了修改,此包携带的数字证书也会改变,将无法与系统成功匹配,软件无法安装。可以将数字证书想象成自己的签名,是不能被模仿的(厂商的数字证书是唯一的),只有我认可的文件才会签名(只要是厂商发布的软件,都符合数字证书验证);如果我的文件被人修改了,那么我的签名就会变得不同(如果软件改变,数字证书就会改变,从而通不过验证。当然,现实中人的手工签名不会直接改变,所以数字证书比手工签名还要可靠)。
使用数字证书验证 RPM 包的方法具有如下 2 个特点:
- 必须找到原厂的公钥文件,然后才能进行安装。
- 安装 RPM 包会提取 RPM 包中的证书信息,然后和本机安装的原厂证书进行验证。如果验证通过,则允许安装;如果验证不通过,则不允许安装并发出警告。
数字证书默认会放到系统中
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
位置处,通过以下命令也可验证:
#系统中的数字证书位置
[root@localhost ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 -rw-r--r--.1 root root 1706 6 月 26 17:29 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
安装数字证书的命令如下:
[root@localhost ~]# rpm --import /efc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 --import表示导入数字证书
数字证书安装完成后,可使用如下命令进行验证:
[root@localhost ~]# rpm -qa|grep gpg-pubkey
gpg-pubkey-c105b9de-4e0fd3a3
数字证书本身也是一个 RPM 包,因此可以用 rpm 命令查询数字证书的详细信息,也可以将其卸载。查询数字证书详细信息的命令如下:
[root@localhost ~]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3
#查询数字证书包的详细信息
Name : gpg-pubkey
Relocations: (not relocatable)
Version : c105b9de Vendor: (none)
Release : 4e0fd3a3 Build Date: 2012年11月12日 星期一 23时05分20秒
Install Date: 2012年11月12日星期一23时05分20秒 Build Host: local host
Group : Public Keys
Source RPM: (none)
Size : 0
License: pubkey
…省略部分输出…
-----END PGP PUBLIC KEY BLOCK----
[root@localhost ~]# rpm -e gpg-pubkey-c105b9de-4ead3a3
7.6 Linux提取RPM包文件(cpio命令)详解
cpio 命令用于从归档包中存入和读取文件,换句话说,cpio 命令可以从归档包中提取文件(或目录),也可以将文件(或目录)复制到归档包中。
归档包,也可称为文件库,其实就是 cpio 或 tar 格式的文件,该文件中包含其他文件以及一些相关信息(文件名、访问权限等)。归档包既可以是磁盘中的文件,也可以是磁带或管道。
cpio 命令可以看做是备份或还原命令,因为它可以将数据(文件)备份到 cpio 归档库,也可以利用 cpio 文档库对数据进行恢复。使用 cpio 命令备份或恢复数据,需注意以下几点:
- 使用 cpio 备份数据时如果使用的是绝对路径,那么还原数据时会自动恢复到绝对路径下;同理,如果备份数据使用的是相对路径,那么数据会还原到相对路径下。
- cpio 命令无法自行指定备份(或还原)的文件,需要目标文件(或目录)的完整路径才能成功读取,因此此命令常与 find 命令配合使用。
- cpio 命令恢复数据时不会自动覆盖同名文件,也不会创建目录(直接解压到当前文件夹)。
cpio 命令主要有以下 3 种基本模式:
- "-o" 模式:指的是 copy-out 模式,就是把数据备份到文件库中,命令格式如下:
[root@localhost ~]# cpio -o[vcB] > [文件丨设备]
- -o:copy-out模式,备份;
- -v:显示备份过程;
- -c:使用较新的portable format存储方式;
- -B:设定输入/输出块为 5120Bytes,而不是模式的 512Bytes;
比如,使用 cpio 备份数据的命令如下:
[root@localhost ~]#find /etc -print | cpio -ocvB > /root/etc.cpio #利用find命令指定要备份/etc/目录,使用>导出到etc.cpio文件 [root@localhost ~]# II -h etc.cpio -rw--r--r--.1 root root 21M 6月5 12:29 etc.cpio #etc.cpio文件生成
- "-i" 模式:指的是 copy-in 模式,就是把数据从文件库中恢复,命令格式如下:
[root@localhost ~]# cpio -i[vcdu] < [文件|设备]
- -i:copy-in 模式,还原;
- -v:显示还原过程;
- -c:较新的 portable format 存储方式;
- -d:还原时自动新建目录;
- -u:自动使用较新的文件覆盖较旧的文件;
比如,使用 cpio 恢复之前备份的数据,命令如下:[root@localhost ~]# cpio -idvcu < /root/etc.cpio #还原etc的备份 #如果大家査看一下当前目录/root/,就会发现没有生成/etc/目录。这是因为备份时/etc/目录使用的是绝对路径,所以数据直接恢复到/etc/系统目录中,而没有生成在/root/etc/目录中
- "-p" 模式:指的是复制模式,使用 -p 模式可以从某个目录读取所有文件,但并不将其备份到 cpio 库中,而是直接复制为其他文件。
例如,使用 -p 将 /boot/ 复制到 /test/boot 目录中可以执行如下命令:[root@localhost ~]# cd /tmp/ #进入/tmp/目录 [root@localhost tmp]#rm -rf* #删除/tmp/目录中的所有数据 [root@localhost tmp]# mkdir test #建立备份目录 [root@localhost tmp]# find /boot/ -print | cpio -p /tmp/test #备份/boot/目录到/tmp/test/目录中 [root@localhost tmp]# ls test/boot #在/tmp/test/目录中备份出了/boot/目录
使用 cpio 命令提取 RPM 包中指定文件
在服务器使用过程,如果系统文件被误修改或误删除,可以考虑使用 cpio 命令提取出原 RPM 包中所需的系统文件,从而修复被误操作的源文件。RPM 包允许逐个提取包中文件,使用的命令格式如下:
[root@localhost ~]# rpm2cpio 包全名|cpio -idv .文件绝对路径
举个例子,假设我们不小心把 /bin/ls 命令删除了,通常有以下 2 种方式修复:
- 将 coreutils-8.4-19.el6.i686 包(包含 ls 命令的 RPM 包)通过 -force 选项再安装一遍;
- 使用 cpio 命令从 coreutils-8.4-19.el6.i686 包中提取出 /bin/ls 文件,然后将其复制到相应位置;
这里我们选择第 2 种方式。有读者可能会问,如何知道 ls 命令隶属于那个 RPM 包呢?很简单,使用
rpm -qf
命令即可,如下所示:
[root@localhost ~]# rpm -qf /bin/ls coreutils-8.4-19.el6.i686 #查看ls文件属于哪个软件包
[root@localhost ~]# mv /bin/ls /root/ #把/bin/ls命令移动到/root/目录下,造成误删除的假象 [root@localhost ~]# ls -bash: ls: command not found #这时执行ls命令,系统会报"命令没有找到"错误 [root@localhost ~]# rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm |cpio -idv ./bin/ls #提取ls命令文件到当前目录下 [root@localhost ~]# cp /root/bin/ls /bin/ #把提取出来的ls命令文件复制到/bin/目录下 [root@localhost ~]#ls anaconda-ks.cfg bin inittab install.log install.log.syslog ls #可以看到,ls命令又可以正常使用了
7.7 Linux SRPM源码包安装(两种方式)
SRPM 包,比 RPM 包多了一个“S”,是“Source”的首字母,所以 SRPM 可直译为“源代码形式的 RPM 包”。也就是说,SRPM 包中不再是经过编译的二进制文件,都是源代码文件。可以这样理解,SRPM 包是软件以源码形式发布后直接封装成 RPM 包的产物。
表 1 列出了 RPM 包与 SRPM 包的几点不同。
文件格式 | 文件名格式 | 直接安装与否 | 内含程序类型 | 可否修改参数并编译 |
---|---|---|---|---|
RPM | xxx.rpm | 可 | 已编译 | 不可 |
SRPM | xxx.src.rpm | 不可 | 未编译的源代码 | 可 |
从表中可以看到,SRPM 包的命名与 RPM 包基本类似,唯一区别在于 SRPM 包多了“src”标志,即 SRPM 包采用“包名-版本号-发布次数-发行商-src.rpm”的方式进行命名,比如“MySQL-5.5.29-2.el6.src.rpm”。
此外,SRPM 包是未经编译的源码包,无法直接用来安装软件,需要经过以下 2 步:
- 将 SRPM 包编译成二进制的 RPM 包;
- 使用编译完成的 RPM 包安装软件;
前面章节已经介绍了如何使用 RPM 包安装软件,因此使用 SRPM 包安装软件的关键在于第一步,也就是如何将 SRPM 包编译为 RPM 包。
本节依然以安装 apache 为例,使用 SRPM 包安装软件(编译 SRPM 包)的方式有以下 2 种:
- 利用 rpmbuild 命令可以直接使用 SRPM 包安装软件,也可以先将 SRPM 包编译成 RPM 包,再使用 RPM 包安装软件;
- 利用 *.spec 文件可实现将 SRPM 包编译成 RPM 包,再使用 RPM 包安装软件;
rpmbuild 命令的安装
rpmbuild 命令也是一个程序,但是这个程序不会默认安装,所以要想使用 rpmbuild 命令就必须提前安装。这里我们使用 rpm 命令来安装 rpmbuild 命令,如下所示:[root@localhost~]#rpm -ivh /mnt/cdroin/Packages/rpm-build-4.8.0-27.el6.i686.rpm Preparing... ################### [100%] 1:rpm-build ################### [100%]
rpmbuild命令安装SRPM包
如果我们只想安装 SRPM 包,而不用修改源代码,那么直接使用 rpmbuild 命令即可。使用 rpmbuild 安装 SRPM 包的命令格式如下:[root@localhost ~]# rpmbuild [选项] 包全名
- -rebuild:编译 SRPM 包生成 RPM 二进制包;
- -recompile:编译 SRPM 包,同时安装。
需要注意的是,SRPM 本质上仍属于 RPM 包,所以安装时仍需考虑包之间的依赖性,要先安装它的依赖包,才能正确安装。
这里我们选择使用 -rebuild 选项先将 SRPM 包编译成 RPM 二进制包,命令如下所示:
[root@localhost ~]# rpmbuild -rebuild httpd-2.2.15-5.el6.src.rpm warning: InstallSourcePackage at: psm.c:244: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY warning: user mockbuild does not exist - using root warning: group mockbuild does not exist - using root #警告为mockbuild用户不存在,使用root代替。这里不是报错,不用紧张 …省略部分输出… Wrote: /root/rpmbuild/RPMS/i386/ httpd-2.2.15-5.el6.i386.rpm Wrote: /root/rpmbuild/RPMS/i386/httpd-devel-2.2.15-5.el6.i386.rpm Wrote: /root/rpmbuild/RPMS/noarch/httpd-manual-2.2.15-5.el6.noarch.rpm Wrote: /root/rpmbuild/RPMS/i386/httpd-tools-2.2.15-5.el6.i386.rpm Wrote: /root/rpmbuild/RPMS/i386/ mod_ssl-2.2.15-5.el6.i386.rpm #写入RPM包的位置,只要看到,就说明编译成功 Executing(%clean): /bin/sh -e/var/tmp/rpm-tmp.Wb8TKa + umask 022 + cd/root/rpmbuild/BUILD + cd httpd-2.2.15 + rm -rf /root/rpmbuild/BUILDROOT/httpd-2.2.15-5.el6.i386 + exit 0 Executing(-clean): /bin/sh -e/var/tmp/rpm-tmp.3UBWql + umask 022 + cd/root/rpmbuild/BUILD + rm-rf httpd-2.2.15 + exit 0
[root@localhost ~]# ls /root/rpmbuild/
BUILD RPMS SOURCES SPECS SRPMS
文件名 | 文件内容 |
---|---|
BUILD | 编译过程中产生的数据保存位置 |
RPMS | 编译成功后,生成的 RPM 包保存位置 |
SOURCES | 从 SRPM 包中解压出来的源码包(*.tar.gz)保存位置 |
SPECS | 生成的设置文件的安装位置。第二种安装方法就是利用这个文件进行安装的 |
SRPMS | 放置 SRPM 包的位置 |
可以看到,编译好的 RPM 包保存在 /root/rpmbuild/RPMS/ 目录下,可以使用如下命令进行验证:
[root@localhost ~]#ll /root/rpmbuild/RPMS/i386/ -rw--r--r-- 1 root root 3039035 11月19 06:30 httpd-2.2.15-5.el6.i386.rpm -rw--r--r-- 1 root root 154371 11月19 06:30 httpd-devel-2.2.15-5.el6.i386.rpm -rw--r--r-- 1 root root 124403 11月19 06:30 httpd-tools-2.2.15-5.el6.i386.rpm -rw--r--r-- 1 root root 383539 11月19 06:30 mod_ssl-2.2.15-5.el6.i386.rpm
- 先把 SRPM 包解开,得到源码包;
- 对源码包进行编译,生成二进制文件;
- 把二进制文件重新打包生成 RPM 包。
利用 *.spec 文件安装
想利用 .spec 文件安装软件,需先将 SRPM 包解开。当然,我们可以使用 rpmbuild 命令解开 SRPM 包,但这里选择另一种方式,即使用rpm -i
命令,如下所示:[root@localhost ~]# rpm -i httpd-2.2.15-5.el6.src.rpm
通过此命令,也可以在当前目录下生成 rpmbuild 目录,但与表 2 不同,此 rpmbuild 目录中仅有 SOURCES 和 SPECS 两个子目录。其中,SOURCES 目录中放置的是源码,SPECS 目录中放置的是设置文件。
接下来使用 SPECS 目录中的设置文件生成 RPM 包,命令如下:
[root@localhost ~]# rpmbuild -ba /root/rpmbuild/SPECS/httpd.spec
命令执行完成,会在 /root/rpmbuild/ 目录下生成 BUILD、RPMS、SOURCES、SPECS 和 SRPMS 目录,RPM 包放在 RPMS 目录中,SRPM 包生成在 SRPMS 目录中。
以上两种方式都可实现将 SRPM 包编译为 RPM 二进制包,剩下的工作就是使用 RPM 包安装软件,这部分内容已在前面章节中讲过,因此不再赘述。
7.8 Linux重建RPM数据库(RPM数据库损坏的解决方案)
但并非所有的用户操作都“按常理出牌”,例如 RPM 包在升级过程被强行退出、RPM 包安装意外中断等误操作,都可能使 RPM 数据库出现故障,后果是当安装、删除、査询软件包时,请求无法执行,如图 1 所示:
![RPM数据库出现故障](http://c.biancheng.net/uploads/allimg/190327/2-1Z32G523055J.gif)
图 1 RPM数据库出现故障
这时就需要重建 RPM 数据库,执行如下 2 步操作:
- 删除当前系统中已损坏的RPM数据库,执行如下命令:
[root@localhost ~]# rm -f /var/lib/rpm/_db.*
- 重建 RPM 数据库,执行如下命令:
[root@localhost -]# rpm -rebuilddb
除了用户误操作导致 RPM 数据库崩溃,有些黑客入侵系统后,为避免系统管理员通过 RPM 包校验功能检测出问题,会更改 RPM 数据库。
理论上,系统一旦被黑客“光顾”,则做的任何操作都将不可信。
对于这种情况,我们可以按照以下步骤对文件进行检测:- 对于要校验的文件或命令,找到它属于哪个软件包,如下命令所示:
[root@localhost ~]# rpm -qf/etc/rc.d/init.d/smb samba-3.0.23c-2
- 使用 -dump 选项查看每个文件的信息,使用 grep 命令提取对应文件信息:
[root@localhost ~]# rpm -ql -dump samba|grep /etc/rc.d/init.d/smb /etc/rc.d/init.d/smb 2087 1157165946 b1c26e5292157a83cadabe851bf9b2f9 0100755 root root 1 0 0X
- 查看实际的文件,通过对比文件大小,所有人、所属组、权限、MD5 校验值等数据,判断文件是否被改动过:
[root@localhost ~]# ls -l /etc/rc.d/init.d/smb -rwxr-xr-x 1 root root 2087 Sep 2 2006/etc/rc.d/init.d/smb [root@localhost ~]# md5sum /etc/rc.d/init.d/smb b1c26e5292157a83cadabe851bf9b2f9 /etc/rc.d/init.d/smb
注意,如果确信 RPM 数据库遭到了修改,就要基于从光盘或者其他值得信赖的来源处获得的 Samba RPM 文件进行检査。
[root@localhost~]# rpm -ql --dump -p /mnt/cdrom/Fedora/RPMS/samba-3.0.23c-2.i386.rpm | grep /etc/rc.d/init.d/smb warning: samba-3.0.23c-2.i386.rpm: Header V3 DSA signature: NOKEY, key ID 412a&62 /etc/rc.d/init.d/smb 2087 1157165946 b1c26e5292157a83cadabe851 bf9b2f9 0100755 root root 1 0 0 X
7.9 RPM包的依赖性及其解决方案
常用RPM的朋友们都知道,RPM简单易用,但是它的依赖关系是最头疼的!有时候比方说A包需要B包,B包需要C包,C包需要A包,好了。这就是最常见的死锁了(类似数据库有木有?)。这个时候有以下几种方式可以解决:
A、强制安装 ----暴力型
使用rpm -i --force --nodeps 强制安装。忽略依赖关系。这种方法你可以先装A包,再装B包,再装C包。这样还是有点隐患的,感觉不是很踏实(虽然其实目前没发现什么不好)。安装后使用成功的前提是:你要搞清楚依赖关系,并且把这些包都装好。好处是:不用管它们的具体依赖关系先后顺序。
B、一次性全装上--- 一网打尽型
可以把依赖的几个包拷出来放在同一个文件夹里 然后 rpm -ivn *.rpm 这样也可以 前提也是一个都不能少。
C、 使用yum技术安装 --使用服务器方式
yum是一个服务器资源技术。通过在线下载服务器资源的方式。 缺点:太繁琐。要设置一堆的东西。优点:设置以后,很方便,需要的大多数资源都可以从服务器上找到。这点感觉很像maven2有木有?
D、使用redhat提供的解决方案,安装依赖关系库(强烈推荐)
例子:先安装rpmdb,之后使用
# rpm -ivh --aid samba*.rpm (一定要安装rpmdb后才可以用这种方式安装排除依赖关系) 该命令会自动把依赖关系中需要安装的包都安装上,包括: cups-libs-1.1.17-13.3.6.rpm samba-common-3.0.0-14.3E.i386.rpm samba-3.0.0-14.3E.i386.rpm samba-client-3.0.0-14.3E.i386.rpm
可以很简单地解决直接安装samba-3.0.0-14.3E.i386.rpm或者samba-client-3.0.0-14.3E.i386.rpm对samba-common-3.0.0-14.3E.i386.rpm 的依赖,而安装 sambacommon-3.0.0-14.3E.i386.rpm 出现对都libcups.so.2库文件的依赖,而且该库文件所在的rpm包无法很快确定
上述方法可以很快解决依赖关系
7.10 Linux yum是什么,yum源配置(网络yum源和本地yum源)
yum,全称“Yellow dog Updater, Modified”,是一个专门为了解决包的依赖关系而存在的软件包管理器。就好像 Windows 系统上可以通过 360 软件管家实现软件的一键安装、升级和卸载,Linux 系统也提供有这样的工具,就是 yum。
可以这么说,yum 是改进型的 RPM 软件管理器,它很好的解决了 RPM 所面临的软件包依赖问题。yum 在服务器端存有所有的 RPM 包,并将各个包之间的依赖关系记录在文件中,当管理员使用 yum 安装 RPM 包时,yum 会先从服务器端下载包的依赖性文件,通过分析此文件从服务器端一次性下载所有相关的 RPM 包并进行安装。
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 命令安装 yum 的具体方式可查看Linux rpm安装一节。
使用 yum 安装软件包之前,需指定好 yum 下载 RPM 包的位置,此位置称为 yum 源。换句话说,yum 源指的就是软件安装包的来源。使用 yum 安装软件时至少需要一个 yum 源。yum 源既可以使用网络 yum 源,也可以将本地光盘作为 yum 源。接下来就给大家介绍这两种 yum 源的搭建方式。
网络 yum 源搭建
一般情况下,只要你的主机网络正常,可以直接使用网络 yum 源,不需要对配置文件做任何修改,这里对 yum 源配置文件做一下简单介绍。网络 yum 源配置文件位于 /etc/yum.repos.d/ 目录下,文件扩展名为"*.repo"(只要扩展名为 "*.repo" 的文件都是 yum 源的配置文件)。
[root@localhost ~]# ls /etc/yum.repos.d/ CentOS-Base.repo CentOS-Media.repo CentOS-Debuginfo.repo.bak CentOS-Vault.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 …省略部分输出…
- [base]:容器名称,一定要放在[]中。
- name:容器说明,可以自己随便写。
- mirrorlist:镜像站点,这个可以注释掉。
- baseurl:我们的 yum 源服务器的地址。默认是 CentOS 官方的 yum 源服务器,是可以使用的。如果你觉得慢,则可以改成你喜欢的 yum 源地址。
- enabled:此容器是否生效,如果不写或写成 enabled 则表示此容器生效,写成 enable=0 则表示此容器不生效。
- gpgcheck:如果为 1 则表示 RPM 的数字证书生效;如果为 0 则表示 RPM 的数字证书不生效。
- gpgkey:数字证书的公钥文件保存位置。不用修改。
本地 yum 源
在无法联网的情况下,yum 可以考虑用本地光盘(或安装映像文件)作为 yum 源。Linux 系统安装映像文件中就含有常用的 RPM 包,我们可以使用压缩文件打开映像文件(iso文件),进入其 Packages 子目录,如图 1 所示:
![安装映像文件的 Packages 子目录](http://c.biancheng.net/uploads/allimg/190328/2-1Z32P9423J01.gif)
图 1 安装映像文件的 Packages 子目录
可以看到,该子目录下含有几乎所有常用的 RPM 包,因此使用系统安装映像作为本地 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/srO 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
7.11 Linux yum命令详解(查询、安装、升级和卸载软件包)
yum查询命令
使用 yum 对软件包执行查询操作,常用命令可分为以下几种:- yum list:查询所有已安装和可安装的软件包。例如:
[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 #软件名 版本 所在位置(光盘) …省略部分输出…
- yum list 包名:查询执行软件包的安装情况。例如:
[root@localhost yum.repos.d]# yum list samba Available Packages samba.i686 3.5.10-125.el6 c6-media #查询 samba 软件包的安装情况
- yum search 关键字:从 yum 源服务器上查找与关键字相关的所有软件包。例如:
[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.
- yum info 包名:查询执行软件包的详细信息。例如:
[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安装命令
yum 安装软件包的命令基本格式为:[root@localhost yum.repos.d]# yum -y install 包名
- install:表示安装软件包。
- -y:自动回答 yes。如果不加 -y,那么每个安装的软件都需要手工回答 yes;
例如使用此 yum 命令安装 gcc:
[root@localhost yum jepos.d]#yum -y install gcc
#使用yum自动安装gcc
yum 升级命令
使用 yum 升级软件包,需确保 yum 源服务器中软件包的版本比本机安装的软件包版本高。yum 升级软件包常用命令如下:
yum -y update
:升级所有软件包。不过考虑到服务器强调稳定性,因此该命令并不常用。yum -y update 包名
:升级特定的软件包。
yum 卸载命令
使用 yum 卸载软件包时,会同时卸载所有与该包有依赖关系的其他软件包,即便有依赖包属于系统运行必备文件,也会被 yum 无情卸载,带来的直接后果就是使系统崩溃。除非你能确定卸载此包以及它的所有依赖包不会对系统产生影响,否则不要使用 yum 卸载软件包。
yum 卸载命令的基本格式如下:
[root@localhost yum.repos.d]# yum remove 包名
#卸载指定的软件包
[root@localhost yum.repos.d]# yum remove samba
#卸载samba软件包
7.12 Linux yum管理软件组方法详解
![](http://c.biancheng.net/uploads/allimg/190328/2-1Z32Q4411N38.jpg)
图 1 设置自定义安装软件包
选择“Customize now”,会进入图 2 所示的页面:
![](http://c.biancheng.net/uploads/allimg/190328/2-1Z32Q44132534.jpg)
图 2 自定义选择软件包
图 2 中所示为 Linux 列出的许多软件包组,例如编辑器、系统工具、开发工具等。在此页面,我们可以根据需要选择要安装的软件包。
除了像图 1、图 2 这样在系统安装过程中自选软件包组进行安装之外,当系统安装完成后,我们也可以通过 yum 命令来管理图 2 中的这些软件包组。
yum 命令除了可以对软件包进行查询、安装、升级和卸载外,还可完成对软件包组的查询、安装和卸载操作。
yum查询软件组包含的软件
既然是软件包组,说明包含不只一个软件包,通过 yum 命令可以查询某软件包组中具体包含的软件包,命令格式如下:[root@localhost ~]#yum groupinfo 软件组名
#查询软件组中包含的软件
[root@localhost ~]#yum groupinfo "Web Server" #查询软件组"Webserver"中包含的软件
yum安装软件组
使用 yum 安装软件包组的命令格式如下:[root@localhost ~]#yum groupinstall 软件组名
#安装指定软件组,组名可以由grouplist查询出来
[root@localhost ~]#yum groupinstall "Web Server" #安装网页服务软件组
yum命令卸载软件组
yum 卸载软件包组的命令格式如下:[root@localhost ~]# yum groupremove 软件组名
#卸载指定软件组
7.13 Linux源码包安装和卸载教程(以apache为例)
注意,本节使用的源码包,指的是软件所有源代码的压缩包,其后缀名为 ".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
除了安装编译器,还需要安装 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 编译工具,接下来学习使用源码包安装软件。
Linux源码包安装软件
本节仍然以安装 apache 为例,安装过程分为如下几步:- 下载 apache 源码包。该软件的源码包可通过官方网站 http://httpd.apache.org/download.cgi#apache24 下载,得到的源码包格式为压缩包( ".tar.gz" 或 ".tar.bz2" )。
将各种文件分门别类保存在对应的目录中,应该成为合格 Linux 管理员约定俗成的习惯。Linux 系统中用于保存源代码的位置主要有 2 个,分别是 "/usr/src" 和 "/usr/local/src",其中 "/usr/src" 用来保存内核源代码,"/usr/local/src" 用来保存用户下载的源代码。 - 将源码包进行解压缩,使用命令如下:
[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
- ./configure 软件配置与检查。这一步主要完成以下 3 项任务:
- 检测系统环境是否符合安装要求。
- 定义需要的功能选项。通过 "./configure--prefix=安装路径" 可以指定安装路径。注意,configure 不是系统命令,而是源码包软件自带的一个脚本程序,所以必须采用 "./configure" 方式执行("./" 代表在当前目录下)。
"./configure" 支持的功能选项较多,可执行 "./configure--help" 命令查询其支持的功能,例如:[root@localhost httpd-2.2.9]#./configure --help|more
#查询apache支持的选项功能(不是必需步骤) - 把系统环境的检测结果和定义好的功能选项写入 Makefile 文件,因为后续的编译和安装需要依赖这个文件的内容。
此步具体执行代码如下:
[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 …省略部分输出…
此命令没有加载其他功能,只是指定安装目录。需要说明的是,"/usr/local/apache2" 目录不需要手工建立,安装完成后会自动建立(这个目录是否生成也是检测软件是否正确安装的重要标志)。 - make 编译。make 会调用 gcc 编译器,并读取 Makefile 文件中的信息进行系统软件编译。编译的目的就是把源码程序转变为能被 Linux 识别的可执行文件,这些可执行文件保存在当前目录下。
执行的编译命令如下:[root@localhost httpd-2.2.9]# make
- 正式开始安装软件,这里通常会写清程序的安装位置,如果没有,则建议读者把安装的执行过程保存下来,以备将来删除软件时使用。安装指令如下:
[root@localhost httpd-2.2.9]# make install
安装源码包过程中,如果出现“error”(或“warning”)且安装过程停止,表示安装失败;反之,如果仅出现警告信息,但安装过程还在继续,这并不是安装失败,顶多使软件部分功能无法使用。
make clean
命令,它会清空 Makefile 文件或编译产生的 ".o" 头文件。Linux源码包卸载
通过源码包方式安装的各个软件,其安装文件独自保存在 /usr/local/ 目录下的各子目录中。例如,apache 所有的安装文件都保存在 /usr/local/apache2 目录下。这就为源码包的卸载提供了便利。源码包的卸载,只需要找到软件的安装位置,直接删除所在目录即可,不会遗留任何垃圾文件。需要读者注意的是,在删除软件之前,应先将软件停止服务。
以删除 apache 为例,只需关闭 apache 服务后执行如下命令即可:
[root@localhost ~]# rm -rf /usr/local/apache2/
7.14 Linux源码包快速升级方法详解
使用补丁文件更新源码包,省去了用 ./configured 生成新的 Makefile 文件,还省去了大量的编译工作,因此效率更高。学完本节会对比有更深入的理解。
Linux补丁文件的生成和使用
Linux 系统中可以使用 diff 命令对比出新旧软件的不同,并生成补丁文件。diff 命令基本格式为:
[root@localhost ~]# diff 选项 old new
#比较old和new文件的不同
- -a:将任何文档当作文本文档处理;
- -b:忽略空格造成的不同;
- -B:忽略空白行造成的不同;
- -I:忽略大小写造成的不同;
- -N:当比较两个目录时,如果某个文件只在一个目录中,则在另一个目录中视作空文件;
- -r:当比较目录时,递归比较子目录;
- -u:使用同一输出格式;
从生成补丁文件,到使用其实现更新软件的目的,为了让读者清楚地了解整个过程的来龙去脉,下面我们自己创建两个文件(分别模拟旧软件和新软件),通过对比新旧文件生成补丁文件,最后利用补丁文件更新旧文件,具体步骤如下:
- 创建两个文件,执行如下命令:
[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
- 利用 diff 命令,比较两个文件(old.txt 和 new.txt)的不同,并生成补丁文件(txt.patch),执行代码如下:
[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 #后一个文件比前一个文件多两行(用+表示)
- 利用补丁文件 txt.patch 更新 old.txt 旧文件,实现此步操作需利用 patch 命令,该命令基本格式如下:
[root@localhost test]# patch -pn < 补丁文件 #按照补丁文件进行更新
这里对 -pn 选项的使用做一下额外说明。我们知道,补丁文件是要打入旧文件的,但是当前所在目录和补丁文件中记录的目录不一定是匹配的,需要 "-pn" 选项来同步两个目录。
例如,当前位于 "/root/test/" 目录下(要打补丁的旧文件就在当前目录下),补丁文件中记录的文件目录为 "/root/test/dd.txt",如果写入 "-p1"(在补丁文件目录中取消一级目录),那么补丁文件会打入 "root/test/root/test/old.txt" 文件中,这显然是不对的;如果写入的是 "-p2"(在补丁文件目录中取消二级目录),补丁文件会打入 "/root/test/test/old.txt" 文件中,这显然也不对。如果写入的是 "-p3"(在补丁文件目录中取消三级目录),补丁文件会打入 "/root/test/old.txt" 文件中,old.txt 文件就在这个目录下,所以应该用 "-p3" 选项。
如果当前所在目录是 "/root/" 目录呢?因为补丁文件中记录的文件目录为 "/root/test/old.txt",所以这里就应该用 "-p2" 选项(代表取消两级目录),补丁打在当前目录下的 "test/old.txt" 文件上。
因此,-pn 选项可以这样理解,即想要在补丁文件中所记录的目录中取消几个 "/",n 就是几。去掉目录的目的是和当前所在目录匹配。
现在更新 "old.txt" 文件,命令如下:[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两行
通过这个例子,大家要明白以下两点:
- 给旧文件打补丁依赖的不是新文件,而是补丁文件,所以即使新文件被删除也没有关系。
- 补丁文件中记录的目录和当前所在目录需要通过 "-pn" 选项实现同步,否则更新可能失败。
给apache打入补丁
本节仍以 apache 为例,通过从官网上下载的补丁文件 "mod_proxy_ftp_CVE-2008-2939.diff",更新 httpd-2.2.9 版本的 apache。这里使用的补丁文件,修补了 apache 代理 FTP 站点时,模块空指针引用拒绝服务攻击的漏洞(了解即可,不用深究)。
具体更新步骤如下:- 从 apache 官网上下载补丁文件;
- 复制补丁文件到 apache 源码包解压目录中,执行命令如下:
[root@localhost ~]# cp mod_proxy_ftp_CVE-2008-2939.diff httpd-2.2.9
- 给旧 apache 打入补丁,具体执行命令如下:
[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 #打入补丁
- 重新编译 apache 源码包,执行如下命令:
[root@localhost httpd-2.2.9]# make
- 安装 apache,执行如下命令:
[root@localhost httpd-2.2.9]# make install
通过对比《Linux源码包安装和卸载》一节中安装源码包的过程,不难发现,打补丁更新软件的过程比安装软件少了 "./configure" 步骤,且编译时也只是编译变化的位置,编译速度更快。
注意,如果未安装过 httpd-2.2.9,就需要先打入补丁,再依次执行 "./configure"、"make"、
"make install" 命令。
patch 命令不仅可以给就文件打入补丁,还可以执行反操作,即恢复用补丁文件修改过的源文件,例如:
[root@localhost httpd-2.2.9]# patch -R < modjDroxy_ftp_CVE-2008-2939.diff
7.15 RPM包和源码包,选择哪种安装方式更好?
注意,由于 SRPM 包本质上依然为 RPM 包,因此本节将 SRPM 包安装归属于 RPM 包安装方式。
软件安装方式的选择,涉及到的因素有很多,本节总结了以下几点建议。1) 优先选择系统自带的 RPM 包
通常情况下,开发商提供的软件都具有一段时间的维护期,比如说,RHEL 和 CentOS 每个版本都至少提供 5 年以上的升级期限,对我们的系统安全性来说,有极大的好处。借助 yum 自动升级,再加上系统持续维护软件(不断进行软件升级),可以保证我们的系统始终保持在最新的状态,当然系统安全性就会好很多。
不仅如此,使用 yum 安装的 RPM 软件包具有容易安装、卸载和升级的特点,而且还提供查询和验证的功能,安装时更有数字证书的保护,这些无疑会使软件管理变得更轻松!综合以上因素,建议大家安装软件的首选方式是利用系统自带的 RPM 包安装。
2) 选择软件官网提供的 RPM 包(或者存储此包不同版本的网址)
某些特殊软件,Linux(及其发行版)系统可能并不会提供其 RPM 软件包,例如 CentOS 不提供 NTFS 的相关模块。这种情况下,就需要我们自行去该软件官网上搜索,看是否提供有和自己 Linux 系统相匹配的 RPM 安装包。除此之外,如果官网上提供有可下载该软件不同版本的网址,可以直接将其作为 yum 源,从而实现软件的自动安装和升级。3) 用源码包安装特殊软件
对于有某些特殊用途的软件,开发商根本不提供 RPM 包,这里也不建议你自行制作 SRPM 包从而得到 RPM 包,毕竟多数初学者只使用一台电脑,如果你管理相同的 100 台电脑,则此方式才能凸显它的价值。对于安装此类特殊软件,例如并发编程常会用到的 MPICH/PVM 等并行运算函数库,建议使用源码包的安装方式。
4) 用源码包安装新版软件
有时候可能需要使用最新版的软件,而 Linux 系统中只提供旧版。例如 CentOS 服务更多的是企业,因此对很多软件的要求是稳而不是新。如果我们就是需要安装新软件,但又担心安装新软件后无法再回到旧版软件,该怎么办呢?这种情况下,可以使用源码包将新软件安装到 /usr/local/ 目录中,因为 Linux 系统允许同一软件的 2 个版本同时存在,且多数软件的不同版本之间不会相互干扰。唯一需要注意的是,你要确定所使用的命令作用于哪一版软件。
总的来说,使用 RPM 包安装和使用源码包安装软件各有优缺点,不过,如果有 RPM 包的话,还是建议优先选择 RPM 包安装软件,毕竟后期管理起来更方便。当然,如果软件的架构差异太大,或者无法解决软件依赖性的问题,与其花大把的时间和精力解决软件之间的依赖,不如直接使用源码包的方式安装软件。
7.16 Linux函数库(静态函数库和动态函数库)及安装过程
需要注意的是,函数库中的函数并不是以源代码的形式存在的,而是经过编译后生成的二进制文件,这些文件无法独立运行,只有链接到我们编写的程序中才可以运行。
- 静态函数库在程序编译时就会整合到程序中,换句话说,程序运行前函数库就已经被加载。这样做的好处是程序运行时不再需要调用外部函数库,可直接执行;缺点也很明显,所有内容都整合到程序中,编译文件会比较大,且一旦静态函数库改变,程序就需要重新编译。
- 动态函数库在程序运行时才被加载(如图 1 所示),程序中只保存对函数库的指向(程序编译仅对其做简单的引用)。
图 1 函数库调用
使用动态函数库的好处是,程序生成的可执行程序体积比较小,且升级函数库时无需对整个程序重新编译;缺点是,如果程序执行时函数库出现问题,则程序将不能正确运行。
Linux 系统中,静态函数库文件扩展名是 ".a",文件通常命令为 libxxx.a(xxx 为文件名);动态函数库扩展名为 ".so",文件通常命令为 libxxx.so.major.minor(xxx 为文件名,major 为主版本号,minor 为副版本号)。
目前,Linux 系统中大多数都是动态函数库(主要考虑到软件的升级方便),其中被系统程序调用的函数库主要存放在 "/usr/lib" 和 "/lib" 中;Linux 内核所调用的函数库主要存放在 "/lib/modules" 中。
注意,函数库(尤其是动态函数库)的存放位置非常重要,轻易不要做更改。
Linux 函数库的安装
Linux 发行版众多,不同 Linux 版本安装函数库的方式不同。CentOS 中,安装函数库可直接使用 yum 命令。例如,安装 curses 函数库命令如下:
[root@Linux ~]# yum install ncurses-devel
正常情况下,函数库安装完成后就可以直接被系统识别,但凡事都有万一。这里先想一个问题,如何查看可执行程序调用了哪些函数库呢?通过以下命令即可:
[root@localhost ~]# ldd -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)
- 将函数库文件放入指定位置(通常放在 "/usr/lib" 或 "/lib" 中),然后把函数库所在目录写入 "/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/目录默认已经被识别)
- 使用 ldconfig 命令重新读取 /etc/ld.so.conf 文件,把新函数库读入缓存。命令如下:
[root@localhost ~]# ldconfig #从/etc/ld.so.conf文件中把函数库读入缓存 [root@localhost ~]# ldconfig -p #列出系统缓存中所有识别的函数库
7.17 Linux脚本程序包及安装方法(以webmin安装为例)详解
目前常见的脚本程序以各类硬件的驱动居多,我们需要学习一下这类软件的安装方式,以备将来不时之需。
我们来看看脚本程序如何安装和使用。安装一个叫作 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 软件,这里下载的是 webmin-1.610.tar.gz。接下来解压缩软件,命令如下:
[root@localhost ~]# tar -zxvf webmin-1.610.tar.gz
[root@localhost ~]# cd webmin-1.610
[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://c.biancheng.net/uploads/allimg/181010/2-1Q010132HW15.jpg)
图 1 Webmin登录界面
当然,我们并不是要讲解 Webmin 管理界面如何使用,而是要讲解脚本程如何安装,所以工作已经完成。这种脚本安装简单快速,不过需要软件开商发布安装脚本。但是 Linux 中的绝大多数软件是没有这种脚本的。