Linux软件包安装

一、软件包分类

1. 软件包分类

Linux下的软件包众多,且几乎都是经 GPL 授权、免费开源(无偿公开源代码)的。这意味着如果你具备修改软件源代码的能力,只要你愿意,可以随意修改。

GPL,全称 General Public License,中文名称“通用性公开许可证”,简单理解 GPL 就是一个保护软件自由的一个协议,经 GPL 协议授权的软件必须开源。

Linux下的软件包可细分为两种:

  • 源码包
  • 二进制包

2. 源码包

源码包就是一大堆源代码程序,是由程序员按照特定的格式和语法编写出来的。程序员当初编写的是什么样子,源码包就是什么样子。

我们都知道,计算机只能识别机器语言,也就是二进制语言,所以源码包的安装需要编译器将“abcd”翻译成01011110这样的二进制语言,让计算机识别并运行。

“编译”指的是从源代码到直接被计算机(或虚拟机)执行的目标代码的翻译过程。

2.1 源码包特点

优点

  • 开源,如果有足够的能力,可以修改源代码。
  • 可以自由选择所需的功能。
  • 软件是编译安装,所以更加适合自己的系统,更加稳定也效率更高。
  • 卸载方便,只需删除安装的文件即可。

缺点

  • 安装过程步骤较多,尤其安装较大的软件集合时(如LAMP环境搭建),容易出现拼写错误。
  • 编译过程时间较长,安装比二进制安装时间长。
  • 因为是编译安装,安装过程中一旦报错新手很难解决。

注意:另外,由于源码包的安装需要把源代码编译为二进制代码,因此安装时间较长。比如,大家应该都在 Windows下安装过 QQ,(有 80 MB左右),但由于其并非是以源码包的形式发布,而是编译后才发布的,因此只需几分钟(经过简单的安装配置)即可安装成功。但如果我们以源码包安装的方式在 Linux 中安装一个 MySQLopen in new window 数据库,即便此软件的压缩包仅有 23 MB左右,也需要 30 分钟左右的时间(根据硬件配置不同,略有差异)。

为了解决使用源码包安装方式的这些问题,Linux 软件包的安装出现了使用二进制包的安装方式。

3. 二进制包

二进制包,也就是源码包经过成功编译之后产生的包。由于二进制包在发布之前就已经完成了编译的工作,因此用户安装软件的速度较快,且安装过程报错几率大大减小。

3.1 二进制包分类

二进制包是Linux下默认的软件安装包,因此二进制包又被称为默认安装软件包。目前主要有以下两大主流的二进制包管理系统:

  • DPKG包管理系统:是由Debian Linux所开发出来的包管理机制,通过DPKG包,Debian Linux就可以进行软件包管理。主要应用在Debian和ubuntu中。
  • RPM包管理系统:是由Red Hat公司所开发的包管理系统。功能强大,安装、升级、查询和卸载都非常简单和方便。目前很多Linux都在使用这种包管理方式,包括Fedora、CentOS、SuSE等。

3.2 二进制包特点

优点

  • 包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载
  • 安装速度比源码包安装快的多

缺点:

  • 经过编译,不再可以看到源代码。
  • 功能选择不如源码包灵活。
  • 依赖性。有时我们会发现需要安装软件包a时需要先安装b和c,而安装b时需要安装d和e。这是需要先安装d和e,再安装b和c,最后才能安装a包。依赖性有时会非常繁琐。

3.3 RPM包依赖性

RPM 包管理系统和 DPKG 管理系统的原理和形式大同小异,可以触类旁通。这里用到的是RedHat旗下的CentOS,所以以下介绍的是RPM包管理系统。

  1. 树形依赖:a---->b---->c
  2. 环形依赖:a---->b---->c---->a
  3. 函数库依赖

什么是模块依赖?我们举一个例子,尝试安装以下文件:

[root@localhost Packages]# rpm -ivh mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm
错误:依赖检测失败:
libodbc.so.2()(64bit) 被 mysql-connector-odbc-5.2.5-7.el7.x86_64 需要
libodbcinst.so.2()(64bit) 被 mysql-connector-odbc-5.2.5-7.el7.x86_64 需要

发现报错,需要安装“libodbc.so.2”函数库文件,这时会发现在光盘中根本找不到这个文件。那是因为函数库没有单独成包,是包含在某一个软件包中的。而如果要知道在哪个软件包中,需要查询网站www.rpmfind.net,如图:

4. 软件包选择建议

源码包:服务是给大量客户端提供访问的,建议使用源码包,源码包效率更高。

二进制包:程序是给少量用户使用,或者本地使用的,建议二进制包(RPM包),因为管理方便。

二、rpm

1. rpm包命名规则

RPM 二进制包的命名需遵守统一的命名规则,用户通过名称就可以直接获取这类包的版本、适用平台等信息。

RPM 二进制包命名的一般格式如下:

httpd-2.2.15-15.el6.centos.1.i686.rpm
#包名-版本号-发布次数-发行商-Linux平台-适合的硬件平台-包扩展名
  • httped:软件包名。这里需要注意,httped 是包名,而 httpd-2.2.15-15.el6.centos.1.i686.rpm 通常称为包全名,包名和包全名是不同的,在某些 Linux 命令中,有些命令(如包的安装和升级)使用的是包全名,而有些命令(包的查询和卸载)使用的是包名,一不小心就会弄错。

  • 2.2.15:包的版本号,版本号的格式通常为主版本号.次版本号.修正号

  • 15:二进制包发布的次数,表示此 RPM 包是第几次编程生成的。

  • el6:软件发行商。el6是RedHat公司发布,适合RHEL6.x(Red Hat Enterprise Linux)和CentOS6.x下使用。

  • centos:表示此包适用于 CentOS 系统。

  • i686:表示此包使用的硬件平台,RPM包可以在不同的硬件平台安装,选择适合不同CPU的软件版本,可以最大化的发挥CPU性能,目前的 RPM 包支持的平台如表所示:

平台名称适用平台信息
i386386 以上的计算机都可以安装
i586686 以上的计算机都可以安装
i686奔腾 II 以上的计算机都可以安装,目前所有的 CPU 是奔腾 II 以上的,所以这个软件版本居多
x86_6464 位 CPU 可以安装
noarch没有硬件限制
  • rpm:RPM 包的扩展名,表明这是编译好的二进制包,可以使用 rpm 命令直接安装。此外,还有以 src.rpm 作为扩展名的 RPM 包,这表明是源代码包,需要安装生成源码,然后对其编译并生成 rpm 格式的包,最后才能使用 rpm 命令进行安装。

注意

1.Linux下文件不是靠扩展名区分文件类型,也就是Linux中扩展名没有任何含义。可是这里怎么又出现了扩展名呢?原因很简单,如果我不把RPM的扩展名叫做“.rpm”,管理员很难知道这是一个RPM包,当然也就无法正确安装了。也就是说如果RPM包不用“.rpm”作为扩展名,系统可以正确识别没有问题,可是管理员很难识别这是个什么样的软件。

2.包全名:如果操作的是未安装软件包,则使用包全名,而且需要注意绝对路径。 3.包名:如果操作的是已经安装的软件包,则使用包名即可,系统会生产RPM包的数据库( /var/lib/rpm/ ),而且可以在任意路径下操作。

2. rpm包命令

2.1 默认安装位置

通常情况下,RPM 包采用系统默认的安装路径,所有安装文件会按照类别分散安装到表 所示的目录中。

默认安装位置功能
/etc/配置文件安装目录
/usr/bin/可执行的命令安装目录
/usr/lib/程序所使用的函数库保存位置
/usr/share/doc/基本的软件使用手册保存位置
/usr/share/man/帮助文件保存位置

除此之外,RPM 包也支持手动指定安装路径,但此方式并不推荐。因为一旦手动指定安装路径,所有的安装文件会集中安装到指定位置,且系统中用来查询安装路径的命令也无法使用(需要进行手工配置才能被系统识别),得不偿失。

与 RPM 包不同,源码包的安装通常采用手动指定安装路径(习惯安装到 /usr/local/ 中)的方式。既然安装路径不同,同一 apache 程序的源码包和 RPM 包就可以安装到一台 Linux 服务器上(但同一时间只能开启一个,因为它们需要占用同一个 80 端口)。但实际情况中,一台服务器几乎不会同时包含两个 apache 程序,管理员不好管理,还会占用过多的服务器磁盘空间。

2.2 rpm包安装

安装命令

rpm –ivh 包全名
#注意一定是包全名。如果跟包全名的命令要注意路径,因为软件包在光盘当中
选项:
-i install安装(install)
-v 显示更详细的信息(verbose)
-h 打印#显示安装进度(hash)

如果还有其他安装要求(比如强制安装某软件而不管它是否有依赖性),可以通过以下选项进行调整:

  • --nodeps 不检测依赖性安装。软件时会检测依赖性,确定所需的底层软件是否安装。如果没有安装则会报错。如果我不管依赖性,想强行安装,可以使用这个选项。注意:这样不检测依赖性安装的软件基本是不能使用的,所以不建议这样做
  • --replacefiles 替换文件安装。如果安装软件包,可是包中部分文件已经存在,那么正常安装时候,会报错“某个文件已经存在”从而导致软件无法安装,使用这个选项可以忽视这个报错,而覆盖安装
  • --replacepkgs 替换软件包安装。如果软件包已经安装,此选项可以把软件包重复安装一遍。
  • --force 强制安装。不管是否已经安装,都重新安装。就是—replacefiles和—replacepkgs的综合。
  • --test 测试安装。不会实际安装,只是检测一下依赖性。
  • --prefix 指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。注意:如果指定了安装路径,软件没有安装到系统默认路径中的话,系统会找不到这些安装的软件,需要进行手工配置才能被系统识别。所以rpm包我们一般都采用默认路径安装。

服务安装完成后,可以尝试启动:

[root@localhost ~]# service 服务名 start|stop|restart|status
各参数含义:
start:启动服务;
stop:停止服务;
restart:重启服务;
status: 查看服务状态;

2.3 rpm包升级

使用如下命令即可实现 RPM 包的升级:

[root@localhost ~]# rpm –Uvh 包全名
选项:
-U(大写) 升级安装,如果没有安装过,系统直接安装。如果安装过的版本较旧,则
升级到新版本(upgrade)
[root@localhost ~]# rpm –Fvh 包全名
选项:
-F(大写) 升级安装,如果没有安装过,则不会安装。必须安装有较旧版本,才能升级(freshen)

2.4 rpm包卸载

RPM 软件包的卸载要考虑包之间的依赖性。例如,我们先安装的 httpd 软件包,后安装 httpd 的功能模块 mod_ssl 包,那么在卸载时,就必须先卸载 mod_ssl,然后卸载 httpd,否则会报错。

[root@localhost ~]# rpm -e 包名
选项:
--nodeps 不检测依赖性直接卸载
-e 卸载,也就是 erase 的首字母

2.5 rpm包查询

2.5.1 查询软件包是否安装
[root@localhost ~]# rpm –q 包名
选项:
-q: 查询(query)
2.5.2 查询系统中的所有安装软件包
[root@localhost ~]# rpm -qa
选项:
-a:所有(all)

当然,可以结合管道符来查看所需的内容,比如:

[root@localhost ~]# rpm -qa | grep 包名

使用“rpm -q 包名”只能查看这个包是否安装,但是使用“rpm -qa | grep 包名”会把包含包名称的所有包都列出来。

2.5.3 查询软件包的详细信息

可以查询已经安装的某个软件包的详细信息,命令格式如下:

[root@localhost ~]# rpm –qi 包名
选项:
-i: 查询软件信息(information)

也可以查询还没有安装的软件包的详细信息,命令格式如下:

[root@localhost ~]# rpm –qip 包全名
选项:
-p: 查询没有安装的软件包(package
2.5.4 查询软件包中的文件列表

可以查询已经安装的软件包中的文件列表和安装的完整目录,命令格式如下:

[root@localhost ~]# rpm –ql 包名
选项:
-l: 列出软件包中所有的文件列表和软件所安装的目录(list)

也可以查询还没有安装的软件包中的文件列表和打算安装的位置,命令格式如下:

[root@localhost ~]# rpm –qlp 包全名
选项:
-p: 查询没有安装的软件包信息(package

注意,由于软件包还未安装,因此需要使用“绝对路径+包全名”的方式才能确定包。

2.5.5 查询系统文件属于哪个RPM包

rpm 还支持反向查询,即查询某系统文件所属哪个 RPM 软件包。其命令格式如下:

[root@localhost ~]# rpm –qf 系统文件名
选项:
-f: 查询系统文件属于哪个软件包(file)
2.5.6 查询软件包所依赖的软件包

查询系统中和已经安装的软件包有依赖关系的软件包,命令格式如下:

[root@localhost ~]# rpm –qR 包名
选项:
-R: 查询软件包的依赖性(requires)

也可以查询没有安装的软件包的依赖性,加“-p”选项即可。例如,查看一下还没有安装的bind软件包的依赖包,可以执行如下命令:

[root@localhost ~]# rpm -qRp /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm

注意,这里使用的是“绝对路径+包全名”的方式。

3. rpm包验证和数字证书

执行 rpm -qa 命令可以看到,Linux 系统中装有大量的rpm包,且每个包都含有大量的安装文件。因此,为了能够及时发现文件误删、误修改文件数据、恶意篡改文件内容等问题,Linux 提供了以下两种监控(检测)方式:

  • rpm 包校验:其实就是将已安装文件和 /var/lib/rpm/ 目录下的数据库内容进行比较,确定文件内容是否被修改。
  • rpm 包数字证书校验:用来校验 rpm 包本身是否被修改。

3.1 rpm包校验

rpm包校验可用来判断已安装的软件包(或文件)是否被修改,此方式可使用的命令格式分为以下 3 种。

[root@localhost ~]# rpm –V 已安装的包名
#选项:-V 校验指定RPM包中的文件(verify)

[root@localhost ~]# rpm -Va
#选项:-Va 校验本机已经安装的所有软件包

[root@localhost ~]# rpm –Vf 系统文件名
#选项:-Vf 校验某个系统文件是否被修改

注意:必须是通过rpm安装的软件包,源码包不能进行rpm包校验。

例如我们校验 apache 软件包中所有的安装文件是否被修改,可执行如下命令:

[root@localhost ~]# rpm -V httpd
[root@localhost ~]#

可以看到,执行后无任何提示信息,表明所有用 apache 软件包安装的文件均未改动过,还和从原软件包安装的文件一样。

接下来尝试对 apache 的配置文件 /etc/httpd/conf/httpd.conf 做适当修改(加一行空白行)后再进行校验:

[root@localhost ~]# rpm -V httpd
S.5....T. c /etc/httpd/conf/httpd.conf
#验证内容 文件类型 文件名

可以看到,结果显示了文件被修改的信息。该信息可分为以下 3 部分:

  1. 最前面的 8 个字符(S.5....T)都属于验证信息,各字符的具体含义如下:
    • S:文件大小是否改变。
    • M:文件的类型或文件的权限(rwx)是否改变。
    • 5:文件MD5校验和是否改变(可以看成文件内容是否改变)。
    • D:设备的主从代码是否改变。
    • L:文件路径是否改变。
    • U:文件的属主(所有者)是否改变。
    • G:文件的属组是否改变。
    • T:文件的修改时间是否改变。
    • .:若相关项没发生改变,用 . 表示。
  2. 被修改文件类型,大致可分为以下几类:
    • c:配置文件(configuration file)。
    • d:普通文档(documentation)。
    • g:"鬼"文件(ghost file),很少见,就是该文件不应该被这个 RPM 包包含。
    • l:授权文件(license file)。
    • r:描述文件(read me)。
  3. 被修改文件所在绝对路径(包含文件名)。

由此,S.5....T. c S.5....T. c /etc/httpd/conf/httpd.conf 表达的完整含义是:配置文件 httpd.conf 的大小、内容、修改时间被人为修改过。

并非所有对文件做修改的行为都是恶意的。通常情况下,对配置文件做修改是正常的,比如说配置 apache 就要修改其配置文件,而如果验证信息提示对二进制文件做了修改,这就需要小心,除非是自己故意修改的。

3.2 rpm数字证书验证

rpm 包校验方法只能用来校验已安装的 rpm 包及其安装文件,如果 rpm 包本身就被动过手脚,此方法将无法解决问题,需要使用 rpm 数字证书验证方法。

简单的理解,RPM 包校验其实就是将现有安装文件与最初使用 rpm 包安装时的初始文件进行对比,如果有改动则提示给用户,因此这种方式无法验证 rpm 包本身被修改的情况。

数字证书,又称数字签名,由软件开发商直接发布。Linux 系统安装数字证书后,若 rpm 包做了修改,此包携带的数字证书也会改变,将无法与系统成功匹配,软件无法安装。

数字证书有如下特点:

  • 首先必须找到原厂的公钥文件,然后进行安装。
  • 安装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 428 19:30 /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 包,因此可以用 rpm 命令查询数字证书的详细信息,也可以将其卸载。虽然数字证书可以手动卸载,但不推荐将其卸载。

4. RPM包文件提取

如果一个rpm包中文件被删除并且不知道删除的文件是哪一个,那么我们可以使用之前讲过的rpm -ivh --force 全包名命令进行强制覆盖安装。但是如果rpm中某个文件被修改了但不知道改了什么,在这种情况下想靠强制安装覆盖此文件恢复初始内容是做不到的,因为linux强制覆盖安装并不会覆盖掉文件里的内容。

但在服务器使用过程,如果系统文件被误修改或误删除,可以考虑使用 cpio 命令提取出原 rpm 包中所需的系统文件,从而修复被误操作的源文件。

4.1 cpio命令

在讲解如何从 rpm 包中提取文件之前,先来系统学习一下 cpio 命令。cpio 命令用于从归档包中存入和读取文件,换句话说,cpio 命令可以从归档包中提取文件(或目录),也可以将文件(或目录)复制到归档包中。

归档包,也可称为文件库,其实就是 cpio 或 tar 格式的文件,该文件中包含其他文件以及一些相关信息(文件名、访问权限等)。归档包既可以是磁盘中的文件,也可以是磁带或管道。

cpio 命令可以看做是备份或还原命令,因为它可以将数据(文件)备份到 cpio 归档库,也可以利用 cpio 文档库对数据进行恢复。

使用 cpio 命令备份或恢复数据,需注意以下几点:

  • 使用 cpio 备份数据时如果使用的是绝对路径,那么还原数据时会自动恢复到绝对路径下;同理,如果备份数据使用的是相对路径,那么数据会还原到相对路径下。
  • cpio 命令无法自行指定备份(或还原)的文件,需要目标文件(或目录)的完整路径才能成功读取,因此此命令常与 find 命令配合使用。
  • cpio 命令恢复数据时不会自动覆盖同名文件,也不会创建目录(直接解压到当前文件夹)。

cpio命令主要有三种基本模式:

“-o”模式:指的是copy-out模式,就是把数据备份到文件库中。

“-i”模式:指的是copy-in模式,就是把数据从文件库中恢复。

“-p”模式:指的是复制模式,就是不把数据备份到cpio库中,而是直接复制为其他文件。

4.1.1 备份
[root@localhost ~]# cpio -o[vcB] > [文件|设备]
#备份
选项:
-o:copy-out模式,备份
-v:显示备份过程
-c:使用较新的portable format存储方式
-B:设定输入输出块为5120bytes,而不是模式的512bytes

例子:利用find命令找到文件,备份:

[root@localhost ~]# find /etc -print | cpio -ocvB > /root/etc.cpio
#利用find指定要备份/etc/目录,使用>导出到etc.cpio文件
[root@localhost ~]# ll -h etc.cpio
-rw-r--r--. 1 root root 21M 429 21:29 etc.cpio
#etc.cpio文件生成
4.1.2 还原
[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中。

如果备份时使用绝对路径,则恢复的数据会直接到绝对路径指定的路径中,如果需要把数据恢复到当前目录中,则需要使用相对路径,例如:

备份:
[root@localhost ~]# cd /etc
#进入/etc目录
[root@localhost ~]# find . -print | cpio -ocvB > /root/etc.cpio
#利用find指定要备份/etc/目录,使用>导出到etc.cpio文件
恢复:
[root@localhost ~]# cd /root
#回到/root目录中
[root@localhost ~]# mkdir etc_test
#建立恢复测试目录
[root@localhost ~]# cd etc_test
#进入测试目录,数据恢复到此
[root@localhost etc_test]# cpio -idvcu < /root/etc.cpio
#还原/etc目录的数据,因为备份时使用的是相对路径,则会还原到/root/etc_test/目录下
4.1.3 复制
[root@localhost ~]# cd /tmp/
#进入/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可以用来备份还原数据,但不推荐用cpio来备份和还原数据。

4.2 提取rpm包中文件

在服务器使用过程,如果系统文件被误修改或误删除,可以考虑使用 cpio 命令提取出原 rpm 包中所需的系统文件,从而修复被误操作的源文件。

rpm 包允许逐个提取包中文件,使用的命令格式如下:

[root@localhost ~]# rpm2cpio 包全名 | cpio -idv .文件绝对路径
rpm2cpio :将rpm包转换为cpio格式的命令
cpio :是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件

**举例:**现在我假设把系统中的/bin/ls命令不小心误删除了,那么我可以修复回来吗?这时有两种方法修复。

1.使用—force选项覆盖安装一遍coreutils-8.4-19.el6.i686包,

2.可以使用cpio命令提取出/bin/ls命令文件,再把它拷贝到对应位置就可以了。

我们选择第2种方式,结合rpm -qf选项找出ls 命令隶属于的 rpm 包coreutils-8.4-19.el6.i686,命令如下:

[root@localhost ~]# rpm -qf /bin/ls
coreutils-8.4-19.el6.i686
#查看ls文件属于哪个软件包

在此基础上,我们只需从此 rpm 包使用 cpio 命令提取出 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
./bin/ls
24772 块
#提取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命令又可以正常使用了

总结:虽然rpm包文件误删除或误修改后有方法进行复原,但建议平时修改重要数据前,先将数据备份一份,养成良好习惯 。

5. yum

rpm包安装要手动解决包之间具有依赖性的问题,尤其是库文件依赖,需要自行去 http://www.rpmfind.netopen in new window 网站上查找相关的 RPM 包。今天介绍一种可自动安装软件包(自动解决包之间依赖关系)的安装方式。

yum,是一个专门为了解决包的依赖关系而存在的软件包管理器。就像java中的maven或者nodejs中的npm,Linux 系统也提供有这样的工具,就是 yum。

可以这么说,yum 是改进型的 rpm 软件管理器,它很好的解决了 RPM 所面临的软件包依赖问题。yum 在服务器端存有所有的 rpm 包,并将各个包之间的依赖关系记录在文件中,当管理员使用 yum 安装 rpm 包时,yum 会先从服务器端下载包的依赖性文件,通过分析此文件从服务器端一次性下载所有相关的 rpm 包并进行安装。

使用 yum 安装软件包之前,需指定好 yum 下载 rpm 包的位置,此位置称为 yum 源。换句话说,yum 源指的就是软件安装包的来源。

5.1 yum源文件解析

yum源配置文件保存在/etc/yum.repos.d/目录中,文件的扩展名一定是“.repo”。也就是说,yum源配置文件只要扩展名是“.repo”就会生效。

这个目录中有5个yum源配置文件,每个yum源配置文件作用用途不一样,默认情况下CentOS-Base.repo文件生效。我们打开这个文件看看。

在CentOS-Base.repo文件中有5个yum源容器,这里只列出了base容器,其他容器和base容器类似。我们解释一下base这个容器。

  • [base]:容器名称,一定要放在[]中。
  • name:容器说明,可以自己随便写。
  • mirrorlist:镜像站点,这个可以注释掉。
  • baseurl:我们的yum源服务器的地址。默认是CentOS官方的yum源服务器,是可以使用的。如果你觉得慢,则可以改成你喜欢的yum源地址。
  • enabled:此容器是否生效,如果不写或写成enabled=1则表示此容器生效,写成enabled=0则表示此容器不生效。(没写默认为1)
  • gpgcheck:如果为1则表示RPM的数字证书生效;如果为0则表示RPM的数字证书不生效。
  • gpgkey:数字证书的公钥文件保存位置。不用修改。

5.2 搭建本地光盘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的便捷了。

5.3 yum命令

5.3.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 search ifconfig
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
=========================================================== ===========================================================
net-tools.x86_64 : Basic networking tools

yum search搜索可以用于确定某个软件在哪个相关包当中。此例子可以确定“ifconfig”命令需要安装“net-tools”包。

查询指定软件包的信息。

[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 在光盘上
…省略部分输出…
5.3.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
5.3.3 升级
[root@localhost yum.repos.d]# yum -y update 包名
#升级指定的软件包
选项:
update: 升级
-y: 自动回答yes

注意:在进行升级操作时,yum源服务器中软件包的版本要比本机安装的软件包的版本高。

[root@localhost yum.repos.d]# yum -y update
#升级本机所有软件包

这条命令会升级系统中所有的软件包。不过我们的生产服务器是稳定优先的,所以这种全系统升级的情况并不多见。

5.3.4 卸载

强调一下,除非你确定卸载的软件的依赖包不会对系统产生影响,否则不要执行yum的卸载,使用 yum 卸载软件包时,会同时卸载所有与该包有依赖关系的其他软件包,即便有依赖包属于系统运行必备文件,也会被 yum 无情卸载,带来的直接后果就是使系统崩溃。卸载命令如下:

[root@localhost yum.repos.d]# yum remove 包名
#卸载指定的软件包
例如:
[root@localhost yum.repos.d]# yum remove samba
#卸载samba软件包

5.4 yum组管理命令

linux 本身有许多软件包组,例如编辑器、系统工具、开发工具等。在此页面,我们可以根据需要选择要安装的软件包。

yum 命令除了可以对软件包进行查询、安装、升级和卸载外,还可完成对软件包组的查询、安装和卸载操作。

5.4.1 查询

查询可以安装的软件组

[root@localhost ~]# yum grouplist
#列出所有可用的软件组列表

查询软件组内包含的软件

[root@localhost ~]# yum groupinfo 软件组名
#列出软件组中包含的软件
例如:
[root@localhost ~]# yum groupinfo "Web Server"
#查询软件组"Web Server"中包含的软件
5.4.2 安装

安装软件组

[root@localhost ~]# yum groupinstall 软件组名
#安装指定软件组,组名可以由grouplist查询出来
例如:
[root@localhost ~]# yum groupinstall "Web Server"
#安装网页服务软件组
5.4.3 卸载

卸载软件组

[root@localhost ~]# yum groupremove 软件组名
#卸载指定软件组

注意:yum 软件包组管理命令更适合安装功能相对集中的软件包集合。例如,在初始安装 Linux 时没有安装图形界面,但后来发现需要图形界面的支持,这时可以手工安装图形界面软件组(X Window System 和 Desktop),就可以使用图形界面了。

三、源码包安装

1. 注意事项

1.1 软件包选择

  • 如果软件包是给大量客户提供访问,建议使用源码包安装,如LAMP环境搭建,因为源码包效率更高。
  • 如果软件包是给Linux底层使用,或只给少量客户访问,建议使用rpm包安装,因为rpm包简单。

1.2 源码包来源

rpm包是光盘中直接包含的,所以不需要用户单独下载。而源码包是通过官方网站下载的,如果需要使用,是需要单独下载的。

1.3 同一软件的源码包和二进制包是否共存

答案是可以,因为两种安装方法安装的Apache,安装位置是不一样的,例如:

rpm包:不建议指定安装位置的,建议安装在默认位置(RPM包安装的服务有标准卸载命令,不怕文件到处安装)
配置文件: /etc/httpd/conf/httpd.conf
网页位置: /var/www/html/
日志位置: /var/log/httpd/
启动方法: 1) service httpd restart
2/etc/rc.d/init.d/httpd restart
源码包:必须制定安装位置(源码包没有安装数据库,没有删除命令)
配置文件: /usr/local/apache2/conf/httpd.conf
网页文件: /usr/local/apache2/htdocs/
日志位置: /usr/local/apache2/logs/
启动方法: /usr/local/apache2/bin/apachectl start

1.4 生产服务器上是否会同时运行两种Apache

不会,因为系统中只有一个80端口,所以你只能启动一个Apache,装多个只能浪费资源。建议安装源码包的Apache。

服务是否可以修改端口:

  • 如果服务是给大量客户端访问的,不建议更换端口,不方便用户查找。
  • 如果服务是给内部人员使用,建议改端口号,因为更加安全。

2. 安装前准备

软件的源代码,也就是软件的原始数据,任何人都可以通过源代码查看该软件的设计架构和实现方法,但软件源代码无法再计算机中直接运行安装,需要将源代码通过编译转换为计算机可以识别的机器语言,然后才可以安装。

Linux 系统中,绝大多数软件的源代码都是用 C 语言编写的,少部分用 C++open in new window(或其他语言)编写。因此要想安装源码包,必须安装 gcc 编译器(如果涉及 C++ 源码程序,还需要安装 gcc-c++)。

安装 gcc 之前,可先使用如下命令看看是否已经安装:

[root@localhost ~]# rpm -q gcc
gcc-4.4.6-4.el6.i686

如果未安装,考虑到安装 gcc 所依赖的软件包太多,推荐大家使用 yum 安装 gcc。

[root@localhost ~]# yum -y install gcc

除了安装编译器,还需要安装 make 编译命令。要知道,编译源码包可不像编译一个 hello.c 文件那样轻松,包中含大量的源码文件,且文件之间有着非常复杂的关联,直接决定着各文件编译的先后顺序,因此手动编译费时费力,而使用 make 命令可以完成对源码包的自动编译。

同样,在安装 make 命令之前,可使用如下命令查看其是否已经安装:

[root@localhost yum. repos.d]# rpm -q make
make-3.81-20.el6.i686

如果未安装,可使用yum命令直接安装 make。

[root@localhost ~]# yum -y install make

安装好了 gcc 编译器和 make 编译工具,接下来使用源码包安装软件。

3. 安装

以安装 apache 为例,源码包安装的具体步骤分为如下几步:

1.下载 apache 源码包。

该软件的源码包可通过官方网站 http://httpd.apache.org/download.cgi#apache24 下载,得到的源码包格式为压缩包( ".tar.gz" 或 ".tar.bz2" )。

2.解压缩

[root@localhost ~]#tar -zxvf httpd-2.2.9.tar.gz

3.进入解压目录

[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

4. ./configure(编译前准备)这一步主要有三个作用:

  • 在安装之前需要检测系统环境是否符合安装要求。
  • 定义需要的功能选项。“./configure”支持的功能选项较多,可以执行“./configure --help”命令查询其支持的功能。一般都会通过“./configure --prefix=安装路径”来指定安装路径。
  • 把系统环境的检测结果和定义好的功能选项写入Makefile文件,后续的编译和安装需要依赖这个文件的内容。

**注意:**configure不是系统命令,而是源码包软件自带的一个脚本程序,所以必须采用“./configure”方式执行(“./”代表在当前目录下)。

[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
…省略部分输出…

5.make 编译

make会调用gcc编译器,并读取Makefile文件中的信息进行系统软件编译。编译的目的就是把源码程序转变为能被Linux识别的可执行文件,这些可执行文件保存在当前目录下。编译过程较为耗时,需要有足够的耐心。

[root@localhost httpd-2.2.9]# make

6.make clean:清空编译内容(非必需步骤) 如果在“./configure”或“make”编译中报错,那么我们在重新执行命令前一定要记得执行make clean命令,它会清空Makefile文件或编译产生的“.o”头文件。

7.make install: 编译安装 这才是真正的安装过程,一般会写清楚程序的安装位置。如果忘记指定安装目录,则可以把这个命令的执行过程保存下来,以备将来删除使用。

[root@localhost httpd-2.2.9]# make install

安装源码包过程中,如果出现“error”(或“warning”)且安装过程停止,表示安装失败;反之,如果仅出现警告信息,但安装过程还在继续,这并不是安装失败,顶多使软件部分功能无法使用。整个过程不报错,即为安装成功。

4. 卸载

源码包的卸载,只需要找到软件的安装位置,直接删除所在目录即可,不会遗留任何垃圾文件。在删除软件之前,应先将软件停止服务。

以删除 apache 为例,只需关闭 apache 服务后执行如下命令即可:

[root@localhost ~]# rm -rf /usr/local/apache2/

/usr/local/apache2/为Apache源码包安装时指定的文件目录。

5. 升级(打补丁)

Linux 系统中更新用源码包安装的软件,除了卸载重装这种简单粗暴的方法外,还可以下载补丁文件更新源码包,用新的源码包重新编译安装软件。比较两种方式,后者更新软件的速度更快。

使用补丁文件更新源码包,省去了用 ./configured 生成新的 Makefile 文件,还省去了大量的编译工作,因此效率更高。

5.1 生成补丁

Linux 系统中可以使用 diff 命令对比出新旧软件的不同,并生成补丁文件。diff 命令基本格式为:

[root@localhost ~]# diff 选项 old new
#比较old和new文件的不同
选项:
-a:将任何文档当作文本文档处理;
-b:忽略空格造成的不同;
-B:忽略空白行造成的不同;
-I:忽略大小写造成的不同;
-N:当比较两个目录时,如果某个文件只在一个目录中,则在另一个目录中视作空文件;
-r:当比较目录时,递归比较子目录;
-u:使用同一输出格式;

**举例:**从生成补丁文件,到使用其实现更新软件的目的,下面创建两个文件(分别模拟旧软件和新软件),通过对比新旧文件生成补丁文件,最后利用补丁文件更新旧文件,具体步骤如下:

1.创建两个文件

[root@localhost ~]# mkdir test
#建立测试目录
[root@localhost ~]# cd test
#进入测试目录
[root@localhost test]# vi old.txt
hello
chunqiurusi
#文件old.txt,为了一会输出便于比较,每行分开
[root@localhost test]# vi new.txt
hello
chunqiurusi
!!!!!
#文件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 2021-05-01 09:50:14.347954373 +0800
#前一个文件
+++ /root/test/new.txt 2021-05-01 09:51:05.772988210 +0800
#后一个文件
@@ -2,3 +2,5 @@
hello
chunqiurusi
+!!!!!

#后一个文件比前一个文件多两行(+表示)

5.2 打入补丁

[root@localhost test]# patch –pn < 补丁文件
#按照补丁文件进行更新
选项:
-pn n为数字。代表按照补丁文件中的路径,指定更新文件的位置。

“-pn”不好理解,我们说明下。补丁文件是要打入旧文件的,但是你当前所在的目录和补丁文件中的记录的目录是不一定匹配的,所以就需要“-pn”来同步两个目录。 比如我当前是在“/root/test”目录中(我要打补丁的旧文件就在当前目录下),补丁文件中记录的文件目录为“/root/test/old.txt”,这时如果写入“-p1”(在补丁文件目录中取消一级目录)那么补丁文件就会打入“/root/test/root/test/old.txt”文件中,这显然是不对的。那如果写入的是“-p2”(在补丁文件目录中取消二级目录)那么补丁文件打入的就是“/root/test/test/old.txt”,这显然也不对。如果写入的是“-p3”(在补丁文件目录中取消三级目录)那么补丁文件就是打入的“/root/test/old.txt”,我们的old.txt文件就在这个目录下,所以就应该是“-p3”。

那么我们更新下“old.txt”文件,命令如下:

[root@localhost test]# patch -p3 < txt.patch
patching file old.txt
#给old.txt文件打补丁
[root@localhost test]# cat old.txt
#查看下old.txt的内容吧。
hello
chunqiurusi
!!!!!
#多出来了!!!!!一行

四、脚本安装程序

1. 脚本程序简介

脚本程序包并不多见,所以在软件包分类中并没有把它列为一类。它更加类似于Windows下的程序安装,有一个可执行的安装程序,只要运行安装程序,然后进行简单的功能定制选择(比如指定安装目录等),就可以安装成功,只不过是在字符界面下完成的。 目前常见的脚本程序以各类硬件的驱动居多,我们需要学习一下这类软件的安装方式,以备将来不时之需。

2. Webmin安装

2.1 简介

我们来看看脚本程序如何安装和使用。安装一个叫作Webmin的工具软件,Webmin是一个基于Web的系统管理界面。借助任何支持表格和表单的浏览器(和File Manager 模块所需要的Java),你就可以设置用户账号、apache、DNS、文件共享等。Webmin包括一个简单的Web服务器和许多CGI程序,这些程序可以直接修改系统文件,比如/etc/inetd.conf 和/etc/passwd。Web服务器和所有的CGI程序都是用Perl 5编写的,没有使用任何非标准Perl 模块。也就是说,Webmin是一个用Perl语言写的、可以通过浏览器管理Linux的软件。

2.2 安装步骤

首先下载Webmin软件,地址为http://sourceforge.net/projects/webadmin/files/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 perl (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.
#安装完成