第5章 Linux软件安装
Linux软件包分类#
Linux 下的软件包众多,而且几乎都是经 GPL 授权的,也就是说这些软件都免费,振奋人心吧?而且更棒的是,这些软件几乎都提供源代码(开源的),只要你愿意,就可以修改程序源代码,以符合个人的需求和习惯。当然,你要具备修改这些软件的能力才可以。
源码包到底是什么呢?其实就是软件工程师使用特定的格式和语法所书写的文本代码,是人写的计算机语言的指令,一般由英文单词组成。是不是有点晕?
其实源代码程序是程序员写的计算机指令,符合特定的格式和语法。那么,众所周知,计算机可以识别的是机器语言,也就是二进制语言,所以需要一名翻译官把abed翻译成二进制机器语言。我们一般把这名翻译官称为编译器,它的作用就是把人能够识别的 abcd 翻译成二进制机器语言,让计算机可以识别并执行。
源码包不用担心收费问题,但是我并不会 C 语言怎么办?那一大堆的源代码程序到底如何使用呢?这个源码包容易安装吗?源码包的安装因为要把源代码编译为二进制语言,所以安装的时间较长。比如,在 Windows 下大家可能安装过 QQ,现在的 QQ 功能较多,程序相对较大,大概有 60 MB,但由于 QQ 并不是以源代码形式发布的,而是经过编译之后发布的,所以只需要几分钟并经过简单的配置就可以安装成功。安装时间较短(当然功能也基本不能自定义)。
在 Linux 中安装一个 MySQL 数据库,这个数据库的压缩包大概有 23 MB,需要多长时间呢?答案是 30 分钟左右(根据计算机硬件配置不同)。这样看来编译还是很浪费时间的,而且绝大多数用户并不熟悉写程序的语言,所以我们要祈祷程序不要报错,否则对初学者来讲很难解决。
为了解决源码包的这些问题,在 Linux 中就出现了二进制包,也就是源码包经过编译之后的包。这种包因为编译过程在发布之前已经完成,所以用户安装时速度较快(和 Windows 下安装软件速度相当),而且报错也大大减少。
二进制包是 Linux 下的默认安装软件包,所以有时我们也把二进制包称作默认安装软件包。目前主要有两个系列的二进制包管理系统:一个是 Red Hat 上的 RPM 包管理系统;另一个是 Debian 和 Ubuntu 上的 DPKG 包管理系统。本教程讲的是 Red Hat 公司的 CentOS Linux,所以我们主要讲解 RPM 包管理系统。不过这两个系列的二进制包管理的原理与形式大同小异,可以触类旁通。
说了这么多,到底源码包和二进制包哪个好呢?举个例子,我们想做一套家具,源码包就像所有的家具完全由自己动手手工打造(手工编译),想要什么样的板材、油漆、颜色和样式都由自己决定(功能自定义,甚至可以修改源代码)。想想就觉得爽,完全不用被黑心的厂商所左右,而且不用担心质量问题(软件更适合自己的系统,效率更高,更加稳定)。但是,所花费的时间大大超过了买一套家具的时间(编译浪费时间),而且我自己真的有做木工这个能力吗(需要对源代码非常了解)?就算请别人定制好的家具,再由我自己组装,万一哪个部件不匹配(报错很难解决),怎么办?
那么二进制包呢?也是我需要一套家具,可是我去商场买了一套(安装简单),家具都是现成的,不会有哪个部件不匹配,除非因为我没有量好尺寸而导致放不下(报错很少)。但是我完全不知道这套家具用的是什么材料、油漆是否合格,而且家具的样式不能随意选择(软件基本不能自定义功能)。
好了,通过这个例子大家可以了解源码包和二进制包之间的区别。
源码包的特点#
源码包既然是软件包,就不会是一个文件,而是多个文件的集合。出于发行的需要,我们一般会把源码包打包压缩之后发布,而 Linux 中最常用的打包压缩格式是"Mar.gz",所以我们也把源码包叫作 Tarball。源码包需要大家自己去软件的官方网站进行下载。
源码包的压缩包中一般会包含如下内容:
- 源代码文件。
- 配置和检测程序(如configure或config等)。
- 软件安装说明和软件说明(如INSTALL或 README)。
源码包的优点如下:
- 开源。如果你有足够的能力,则可以修改源代码。
- 可以自由选择所需的功能。
- 因为软件是编译安装的,所以更加适合自己的系统,更加稳定,效率也更高。
- 卸载方便。
源码包的缺点如下:
- 安装过程步骤较多,尤其是在安装较大的软件集合时(如 LAMP 环境搭建),容易出现拼写错误。
- 编译时间较长,安装时间比二进制安装要长。
- 因为软件是编译安装的,所以在安装过程中一旦报错,新手很难解决。
二进制包的特点#
二进制包是在软件发布的时候已经进行过编译的软件包,所以安装速度比源码包快得多(和 Windows 下软件安装速度相当)。但是因为已经进行通译,大家也就不能在看到软件的源代码了。目前两大主流的二进制包系统是 DPKG 包和 RPM 包。
- DPKG 包是由 Debian Linux 所开发的包管理机制,通过 DPKG 包,Debian Linux 就可以进行软件包管理,主要应用在 Debian 和 Ubuntu 中。
- RPM 包是由 Red Hat 公司所开发的包管理系统,功能强大,安装、升级、査询和卸载非常简单方便。
目前很多 Linux 版本都在使用这种包管理方式,包括 Fedora、CentOS、SuSE 等。Linux 默认采用 RPM 包来安装系统,所以常用的 RPM 包都在安装光盘中。
RPM 包的优点如下:
- 包管理系统简单,只通过几个命令就可以实现包的安装、升级、査询和卸载。
- 安装速度比源码包安装快得多。
RPM 包的缺点如下:
- 经过编译,不能在看到源代码。
- 功能选择不如源码包灵活。
- 依赖性。有时我们会发现,在安装软件包 a 时需要先安装 b 和 c,而在安装 b 时需要先安装 d 和 e。这就需要先安装 d 和 e,再安装 b 和 c,最后才能安装 a。比如,我买了一个漂亮的灯具,打算安装在客厅里,可是在安装灯具之前,客厅需要有顶棚,并且顶棚需要刷好油漆。安装软件和装修及其类似,需要有一定的顺序,但是有时依赖性会非常强。
Linux RMP包统一命令规则#
RPM 包的命名一般都会遵守统一的命名规则,例如:
httpd-2.2.15-15.el6.centos.1.i686.rpm
其中的各项代表的含义如下:
- httpd:软件包名。
- 2.2.15:软件版本。
- 15:软件发布的次数。
- el6:软件发行商。el6 是由 Red Hat 公司发布的,适合在 RHEL 6.x (Red Hat Enterprise Unux) 和 CentOS 6.x 上使用。
- i686:适合的硬件平台。RPM 包可以在不同的硬件平台上安装,选择适合不同 CPU 的软件版本,可以最大限度地发挥 CPU 性能,所以出现了所谓的 i386(386 以上的计算机都可以安装)、i586 (586 以上的计算机都可以安装)、i686(奔腾II以上的计算机都可以安装,目前所有的 CPU 是奔腾II以上的,所以这个软件版本居多)、x86_64 (64 位 CPU 可以安装)和 noarch(没有硬件限制)等文件名。
- rpm:RPM 包的扩展名。我们说过,Linux 下的文件不是靠扩展名区分文件类型的,也就是说 Linux 中的扩展名没有任何含义。可是这里怎么又出现了扩展名呢?原因很简单,如果不把 RPM 包的扩展名叫作".rpm",那么管理员很难知道这是一个 RPM 包,当然也就无法正确安装了。换句话说,如果 RPM 包不用".rpm"作为扩展名,那么系统可以正确识别,但是管理员很难识别这是一个什么样的软件。
注意,我们把 httpd-2.2.15-15.el6.centos.1.i686.rpm 叫作包全名,而把 httpd 叫作包名。为什么要做出特殊说明呢?因为有些命令后面一定跟的是包全名,如安装和升级;而有些命令后面一定跟的是包名,如查询和卸载。如果弄错,命令就会报错。
Linux rmp命令管理(安装、升级和卸载)RMP包#
通过前面章节对 rpm 命令的介绍,本节开始学习使用 rpm 命令安装、升级或卸载 RPM 包。
我们先安装 apache 程序。之所以安装 apache 程序,是因为我们后续安装源码包时也计划安装 apache 程序,这样就能初步认识到源码包和 RPM 包的区别。不过需要注意的是,同一个程序的RPM 包和源码包可以安装到一台服务器上,但是只能启动一个,因为它们需要占用同样的 80 端口。不过,如果真在生产服务器上,那么一定不会同时安装两个 apache 程序,容易把管理员搞糊涂,而且会占用更多的服务器磁盘空间。
RPM 包默认安装路径#
源码包和 RPM 包安装的程序为什么可以在一台服务器上呢?主要是因为安装路径不同,所以不会覆盖安装。RPM 包一般采用系统默认路径安装,而源码包一般通过手工指定安装路径(一般安装到 /usr/local/ 中)安装。
RPM 包默认安装路径是可以通过命令査询的,一般安装在如表 1 所示的目录中。
安装路径 | 含 义 |
---|---|
/etc/ | 配置文件安装目录 |
/usr/bin/ | 可执行的命令安装目录 |
/usr/lib/ | 程序所使用的函数库保存位置 |
/usr/share/doc/ | 基本的软件使用手册保存位置 |
/usr/share/man/ | 帮助文件保存位置 |
RPM 包难道就不能手工指定安装路径吗?当然是可以的,但是一旦手工指定安装路径,所有的安装文件就会安装到手工指定位置,而不会安装到系统默认位置。而系统的默认搜索位置并不会改变,依然会去默认位置之下搜索,当然系统就不能直接找到所需的文件,也就失去了作为系统默认安装路径的一些好处。所以我们一般不会指定 RPM 包的安装路径,而使用默认安装路径。
RPM包的安装#
[root@localhost ~]# rpm -ivh 包全名
#注意一定是包全名。如果是跟包全名的命令,则要注意路径,因为软件包在光盘当中
选项:
- -i:安装(install);
- -v:显示更详细的信息(verbose);
- -h:打印 #,显示安装进度(hash);
例如,安装 apache 软件包,注意出现两个 100% 才是正确安装,第一个 100% 仅是在准备,第二个 100% 才是正确安装。如下所示:
[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:指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。注意:如果指定了安装路径,软件没有安装到系统默认路径中,那么系统会找不到这些安装的软件,需要进行手工配置才能被系统识别。所以,我们一遍采用默认路径安装RPM包。
apache 服务安装成功后,尝试启动。命令如下:
[root@localhost ~]# service 服务名 start|stop| restart|status
参数:
- start:启动服务;
- stop:停止服务;
- restart:重启服务;
- status: 査看服务状态;
例如:
[root@localhost ~]# service httpd start #启动apache服务
服务启动之后,就可以査看端口号 80 是否出现。命令如下:
[root@localhost ~]# netstat -tlun | grep 80
tcp 0 0 :::80 :::* LISTEN
我们也可以在浏览器中输入 Linux 服务器的 IP 地址,访问这个 apache 服务器。目前在 apache 中没有建立任何网页,所以看到的只是测试页,如图 2 所示。

图 2 Apache测试页
注意,RPM 包默认保存在系统光盘的 Packages(注意 P 大写)目录中,所以在安装软件前需要挂载光盘。例如:
mkdir/mnt/cdrom <-建立挂载点
mount /dev/cdrom /mnt/cdrom <-挂载光盘
我们一直在说依赖性很麻烦,那么依赖性报错是什么样呢?我们来继续说说 gcc 这个软件,刚刚我们在写 hello.c 的时候假设这个软件已经安装成功了。其实,如果采用"基本服务器"方式安装 Linux 系统,那么 gcc 这个软件是没有安装的,需要我们手工安装,但是安装这个软件是会报依赖性错误的。
[root@localhost ~]# rpm -ivh /mnt/cdrom/Packages/ gcc-4.4.6-4.el6.i686.rpm
error: Failed dependencies: <―依赖性错误
cloog-ppi >= 0.15 is needed by gcc-4.4.6-4.el6.i686
cpp = 4.4.6-4.el6 is needed by gcc-4.4.6-4.el6.i686
glibc-devel >= 2.2.90-12 is needed by gcc-4.4.6-4.el6.i686
这里的依赖性很明显,需要我们先安装 cloog-ppl、cpp 和 glibc-devel 三个软件,其中:
- ">="表示版本要大于或等于所显示版本;
- "<="表示版本要小于或等于所显示版本;
- "="表示版本要等于所显示版本;
我们当然可以手工安装,只是比较麻烦。那么,有办法让它自动解决依赖性,直接安装吗?有,我们可以使用 yum 在线安装工具,它会自动安装依赖的软件,帮助我们解决依赖性。所以,再卖一个关子,我们不在这里安装 gcc,留到安装 yum 的时候让 gcc 自动安装。
RPM包的升级#
[root@localhost ~]# rpm -Uvh 包全名
选项:
- -U(大写):升级安装。如果没有安装过,则系统直接安装。如果安装过的版本较低,则升级到新版本(upgrade);
[root@localhost ~]# rpm -Fvh 包全名
选项:
- -F(大写):升级安装。如果没有安装过,则不会安装。必须安装有较低版本才能升级(freshen);
RPM包卸载#
卸载是有依赖性的。比如,在安装的时候,要先安装 httpd 软件包,再安装 httpd 的功能模块 mod_ssl 包。那么,在卸载的时候,一定要先卸载 mod_ssl 软件包,再卸载 httpd 软件包,否则就会报错。软件包卸载和拆除大楼是一样的,你要拆除 2 楼和 3 楼,一定要先拆除 3 楼。
删除格式非常简单,如下:
[root@localhost ~]# rpm -e 包名
选项:
- -e 卸载(erase);
如果不按依赖性卸载,就会报依赖性错误。例如:
[root@localhost ~]# rpm -e httpd
error: Failed dependencies:
httpd-mmn = 20051115 is needed by (installed) mod_wsgi-3.2-1.el6.i686
httpd-mmn = 20051115 is needed by (installed) php-5.3.3-3.el6_2.8.i686
httpd-mmn = 20051115 is needed by (installed) mod_ssl-1:2.2.15-15.el6.
centos.1.i686
httpd-mmn = 20051115 is needed by (installed) mod_perl-2.0.4-10.el6.i686
httpd = 2.2.15-15.el6.centos.1 is needed by (installed) httpd-manual-2.2.
15-15.el6.centos.1 .noarch
httpd is needed by (installed) webalizer-2.21_02-3.3.el6.i686
httpd is needed by (installed) mod_ssl-1:2.2.15-15.el6.centos.1.i686
httpd=0:2.2.15-15.el6.centos.1 is needed by(installed)mod_ssl-1:2.2.15-15.el6.centos.1.i686
当然,卸载命令是支持"--nocteps"选项的,可以不检测依赖性直接卸载。但是,如果这样做,则很可能导致其他软件包无法正常使用,所以并不推荐这样卸载。
Linux rpm命令查询软件包#
RPM 包管理系统是非常强大和方便的包管理系统,它比源码包的方便之处就在于可以使用命令查询、升级和卸载。在查询的时候,其实是在查询 /var/lib/rpm/ 这个目录下的数据库文件,那为什么不直接查看这些文件呢?你可以尝试使用 Vim 查看这些文件,会发现都是乱码。也就是说,这些文件其实都是二进制文件,不能直接用编辑器查看,所以才需要使用命令查看。
查询命令的格式#
RPM 查询命令采用如下格式:
[root@localhost ~]# rpm 选项 查询对象
查询软件包是否安装#
可以查询软件包是否安装,命令格式如下:
[root@localhost ~]# rpm -q 包名
选项:
- -q:查询(query)
例如,查看一下 apache 包是否安装,可以执行如下命令:
[root@localhost ~]# rpm -q httpd
httpd-2.2.15-15.el6.centos.1.i686
因为 apache 是已经安装完成的包,所以只需要给出"包名",系统就可以识别。而没有安装的包就必须使用"绝对路径+包全名"格式才可以确定包。前面一直强调的包名和包全名不能写混乱就是这个原因。
查询系统中的所有安装软件包#
可以查询 Linux 系统中所有已经安装的软件包,命令格式如下:
[root@localhost ~]# rpm -qa
libsamplerate-0.1.7-2.1.el6.i686
startup-notification-0.10-2.1.el6.i686
gnome-themes-2.28.1-6.el6.noarch
fontpackages-filesystem-1.41-1.1.el6.noarch
gdm-libs-2.30.4-33.el6_2.i686
gstreamer-0.10.29-1.el6.i686
redhat-lsb-graphics-4.0-3.el6.centos.i686
…省略部分输出…
当然,可以用管道符来查看所需的内容,比如:
[root@localhost ~]# rpm -qa | grep httpd
httpd-devel-2.2.15-15.el6.centos.1.i686
httpd-tools-2.2.15-15.el6.centos.1.i686
httpd-manual-2.2.15-15.el6.centos.1.noarch
httpd-2.2.15-15.el6.centos.1.i686
你会发现,使用"rpm-q包名"只能查看这个包是否安装,但是使用"rpm-qa|grep 包名"会把包含包名称的所有包都列出来。
查询软件包的详细信息#
可以查询已经安装的某个软件包的详细信息,命令格式如下:
[root@localhost ~]# rpm -qi 包名
选项:
- -i:查询软件信息(information)
例如,查看 apache 包的安装信息,可以使用以下命令:
[root@localhost ~]# rpm -qi httpd
Name : httpd Relocations:(not relocatable)
#包名
Version : 2.2.15 Vendor:CentOS
#版本和厂商
Release : 15.el6.centos.1 Build Date: 2012年02月14日星期二 06时27分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 包全名
选项:
- -p:查询没有安装的软件包(package)
注意,没有安装的软件包是存放在光盘中的,而且因为没有安装,所以需要使用包全名。
查询软件包中的文件列表#
可以查询已经安装的软件包中的文件列表和安装的完整目录,命令格式如下:
[root@localhost ~]# rpm -ql 包名
选项:
- -l:列出软件包中所有的文件列表和软件所安装的目录(list)
例如,想要查看一下问 apache 包文件的安装位置,可以执行如下命令:
[root@localhost ~]# rpm -ql httpd
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
…省略部分输出…
那么,可以查询还没有安装的软件包中的文件列表和打算安装的位置吗?答案是可以,命令格式如下:
[root@localhost ~]# rpm -qlp 包全名
选项:
- -p:查询没有安装的软件包信息(package)
想要查询还没有安装的 bind 软件包中的文件列表和打算安装的位置,可以执行如下命令:
[root@localhost ~]# rpm -qlp /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm
/etc/NetworkManager/dispatcher.d/13-named
/etc/logrotate.d/named
/etc/named
/etc/named.conf
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
…省略部分输出…
查询系统文件属于哪个RPM包#
既然可以知道每个 RPM 包中的文件的安装位置,那么可以查询系统文件属于哪个 RPM 包吗?当然可以,不过需要注意的是,手工建立的文件是不能查询的,因为这些文件不是通过 RPM 包安装的,当然不能反向查询它属于哪个 RPM 包。
命令格式如下:
[root@localhost ~]# rpm -qf 系统文件名
选项:
- -f:查询系统文件属于哪个软件包(file)
想查询一下 ls 命令是由哪个软件包提供的,可以执行如下命令:
[root@localhost ~]# rpm -qf /bin/ls
coreutils-8.4-19.el6.i686
查询软件包所依赖的软件包#
查询系统中和已经安装的软件包有依赖关系的软件包,命令格式如下:
[root@localhost ~]# rpm -qR 包名
选项:
- -R:查询软件包的依赖性(requires)
例如,想查询一下 apache 包的依赖包,可以执行如下命令:
[root@localhost ~]# rpm -qR httpd
/bin/bash
/bin/sh
/etc/mime.types
/usr/sbin/useradd
apr-util-ldap
chkconfig
config(httpd) = 2.2.15-15.el6.centos.1
httpd-tods = 2.2.15-15.el6.centos.1
initscripts >= 8.36
…省略部分输出…
可以查询没有安装的软件包的依赖性吗?加"-p"选项即可。例如,查看一下还没有安装的 bind 软件包的依赖包,可以执行如下命令:
[root@localhost ~]# rpm -qRp /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm
/bin/bash
/bin/sh
bind-libs = 32:9.8.2-0.10.rc1.el6
chkconfig
chkconfig
config(bind) = 32:9.8.2-0.10.rc1.el6
grep
libbind9.so.80
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
…省略部分输出…
Linux RPM包验证和数字证书#
系统中安装的 RPM 包数量众多,而每个 RPM 包中都包含大量的文件,万一某个文件被误删,或误修改某个文件中的数据,又或者有人恶意修改了某个文件,我们是否有监控和检测手段发现这些问题呢?
这时候,必须使用 RPM 包校验来确认文件是否被动过手脚。校验其实就是把已经安装的文件和 /var/lib/rpm/ 目录下的数据库内容进行比较,以确定是否有文件被修改。校验的格式如下:
[root@localhost ~]# rpm -Va
选项:
- -Va:校验本机已经安装的所有软件包
[root@localhost ~]# rpm -V 已安装的包名
选项:
- -V:校验指定RPM包中的文件(verity)
[root@localhost ~]# rpm -Vf 系统文件名
选项:
- -Vf:校验某个系统文件是否被修改
我们来查询一下 apache 服务是否被人做过手脚,命令如下:
[root@localhost -]# rpm -V httpd
没有任何提示信息,恭喜,你的 apache 服务没有做过任何修改,是"原包装"的。
如果 apache 包中的文件被修改过了,则是什么样的?我们修改一下 apache 的配置文件 /etc/httpd/conf/httpd.conf。其实对这个文件做任何更改验证都会变化,但是我们还没有学习 apache 配置,为了防止 apache 崩溃,我们只修改 apache 的默认网页文件。按照如下格式修改:
[root@localhost ~]#vim /etc/httpd/conf/httpd.conf
...省略部分内容...
Directorylndex index.html index.html.var index.php
#这句话是定义apache可以识别的默认网页文件名。在后面加入了index.php
#这句话大概有400行左右
…省略部分内容...
保存退出后,我们再来验证一下。
[root@localhost ~]# rpm -V httpd
S.5....T. c /etc/httpd/conf/httpd.conf
验证内容 文件类型 文件名
出现了提示信息,我们来解释一下:最前面共有 8 个信息,它们是表示验证内容的;文件名前面的 c 表示这是一个配置文件(configuration file);最后是文件名。
验证内容中的 8 个信息的具体含义如下。
- S:文件大小是否改变。
- M:文件的类型或文件的权限(rwx)是否改变。
- 5:文件MD5校验和是否改变(可以看成文件内容是否改变)。
- D:设备的主从代码是否改变。
- L:文件路径是否改变。
- U:文件的属主(所有者)是否改变。
- G:文件的属组是否改变。
- T:文件的修改时间是否改变。
apache 配置文件的文件类型是 c,那么,还有哪些文件类型呢?
- c:配置文件(configuration file)。
- d:普通文档(documentation)。
- g:"鬼"文件(ghost file),很少见,就是该文件不应该被这个RPM包包含。
- l:授权文件(license file)。
- r:描述文件(read me)。
刚刚 apache 配置文件的验证结果如下:
[root@localhost ~]# rpm -V httpd
S.5....T.c /etc/httpd/conf/httpd.conf
文件大小改变了,文件的内容改变了,文件的修改时间也改变了。也就是说,如果出现了相应的字母,则代表相关项被修改;如果只出现了".",则代表相关项没被修改。
是不是所有的文件在验证的时候都不能被修改?当然不是,一般情况下,配置文件被修改都是正常修改;但如果是二进制文件被修改,大家就要小心了。当然,如果能确定是自己修改的,则另当别论。
数字证书#
刚刚的校验方法只能对已经安装的 RPM 包中的文件进行校验,但如果 RPM 包本身就被动过手脚,那么 RPM 包校验就不能解决问题了,必须使用数字证书验证。
数字证书,也叫数字签名,它由软件开发商直接发布。只要安装了这个数字证书,如果 RPM 包被进行了修改,那么数字证书验证就不能匹配,软件也就不能安装。
数字签名,可以想象成人的签名,每个人的签名都是不能模仿的(厂商的数字证书是唯一的),只有我认可的文件才会签名(只要是厂商发布的软件,都符合数字证书验证);如果我的文件被人修改了,那么我的签名就会变得不同(如果软件改变,数字证书就会改变,从而通不过验证。当然,现实中人的手工签名不会直接改变,所以数字证书比手工签名还要可靠)。
数字证书有如下特点:
- 首先必须找到原厂的公钥文件,然后才能进行安装。
- 再安装 RPM 包,会去提取 RPM 包中的证书信息,然后和本机安装的原厂证书进行验证。
- 如果验证通过,则允许安装;如果验证不通过,则不允许安装并发出警告。
数字证书在 CentOS 6.3 的第一张光盘中,它默认也会放在系统中。
[root@localhost ~]# ll /mnt/cdrom/RPM-GPG-KEY-CentOS-6
-r--r--r-- 2 root root 1706 7月2 04:21 /mnt/cdrom/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----
要想卸载数字证书,可以使用 -e 选项。当然,我们并不推荐卸载。
[root@localhost ~]# rpm -e gpg-pubkey-c105b9de-4ead3a3
Linux提取RPM包文件#
在讲 RPM 包文件提取之前,先介绍一下 cpio 命令。
cpio 命令可以把文件或目录从文件库中提取出来,也可以把文件或目录复制到文件库中。可以把 cpio 命令看成备份或还原命令,它既可数据备份成 cpio 文件库,也可以把 cpio 文件库中的数据还原出来。
不过,cpio 命令最大的问题是不能自己指定备份或还原的文件是什么,而必须由其他命令告诉 cpio 命令要备份和还原哪个文件,这必须依赖数据流重定向的命令。
cpio 命令主要有三种基本模式:
- "-o"模式:指的是 copy-out 模式,就是把数据备份到文件库中;
- "-i"模式:指的是 copy-in 模式,就是把数据从文件库中恢复;
- "-p"模式:指的是复制模式,就是不把数据备份到 cpio 库中,而是直接复制为其他文件。
命令格式如下:
[root@localhost ~]# cpio -o[vcB] > [文件丨设备]
#备份
选项:
- -o:copy-out模式,备份;
- -v:显示备份过程;
- -c:使用较新的portable format存储方式;
- -B:设定输入/输出块为 5120Bytes,而不是模式的 512Bytes;
[root@localhost ~]# cpio -i[vcdu] < [文件|设备]
#还原
选项:
- -i:copy-in 模式,还原;
- -v:显示还原过程;
- -c:较新的 portable format 存储方式;
- -d:还原时自动新建目录;
- -u:自动使用较新的文件覆盖较旧的文件;
先来看一下使用 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文件生成
再来看看如何恢复 cpio 的备份数据,命令如下:
[root@localhost ~]# cpio -idvcu < /root/etc.cpio
#还原etc的备份
#如果大家査看一下当前目录/root/,就会发现没有生成/etc/目录。这是因为备份时/etc/目录使用的是绝对路径,所以数据直接恢复到/etc/系统目录中,而没有生成在/root/etc/目录中
在 CentOS 5.x 中可以利用上面的命令备份与恢复指定的文件,但是在 CentOS 6.x 中需要更加严谨。如果备份时使用绝对路径,则会恢复到绝对路径指定的路径中;如果需要把数据恢复到当前目录中,则需要使用相对路径。例如:
备份:
[root@localhost ~]# cd /etc
#进入/etc/目录
[root@localhost /etc]# 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/目录下
最后来演示一下 cpio 命令的"-p"复制模式,命令如下:
[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/目录
接下来介绍如何在 RPM 包中提取某个特定的文件。
假设在服务器使用过程中,我们发现某个系统文件被人动了手脚,或者不小心删除了某个系统重要文件,那么我们可以在 RPM 包中把这个系统文件提取出来修复有问题的源文件吗?
当然可以。RPM 包中的文件虽然众多,但也是可以逐个提取的。命令格式如下:
[root@localhost ~]# rpm2cpio 包全名|cpio -idv.文件 绝对路径
rpm2cpio <-将RPM包转换为cpio格式的命令
cpio <—这是一个标准工具,用于创建软件档案文件和从档案文件中提取文件
举个例子,假设把系统中的 /bin/ls 命令误删除了,可以修复吗?有两种方法修复:
- 使用 -force 选项覆盖安装一遍 coreutils-8.4-19.el6.i686 包;
- 先使用 cpio 命令提取出 /bin/ls 命令文件,再把它复制到对应位置。
不过,怎么知道 /bin/ls 命令属于 coreutils-8.4-19.el6.i686 软件包呢?还记得 -qt 选项吗?命令如下:
[root@localhost ~]# rpm -qf /bin/ls
coreutils-8.4-19.el6.i686
#查看ls文件属于哪个软件包
我们先使用 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命令又可以正常使用了
Linux SRPM包#
前面章节介绍了 RPM 包的安装,现在我们说说 SRPM 包。
SRPM 包是什么呢?SRPM 包中的软件不再是经过编译的二进制文件,而是源码文件,所以你可以认为 SRPM 包是软件以源码形式发布之后,再封装成 RPM 包格式的。
不过,既然是将源码文件封装成 RPM 包格式,那么它的安装方法既不和 RPM 包软件安装方法一致,也不和源码包软件安装方法一样,我们需要单独学习它的安装方法。
我们依然下载 apache 的 SRP M包,来看看 SRPM 包的安装方法。需要注意的是 SRPM 包的命名规则,其实和 RPM 包的命名规则是一致的,只是多了".src"这个标志。比如"MySQL-5.5.29-2.el6.src.rpm",采用"包名-版本-发行版本.软件发行商.src.rpm"这样的方式命名。
SRPM 包管理需要使用命令 rpmbuild,默认这个命令没有安装,需要手工安装。命令如下:
[root@localhost~]#rpm-ivh/mnt/cdroin/Packages/rpm-build-4.8.0-27.el6.i686.rpm
Preparing...
###################
[100%]
1:rpm-build
###################
[100%]
SRPM 包有两种安装方式:
- 利用 rpmbuild 命令直接安装;
- 利用 *.spec 文件安装。
我们分别介绍。
rpmbuild命令安装#
如果我们只想安装 SRPM 包,而不用修改源代码,那么它的安装方式还是比较简单的,命令如下:
[root@localhost ~]# rpmbuild [选项] 包全名
选项:
- -rebuild:编译 SRPM 包,不会自动安装,等待手工安装;
- -recompile:编译 SRPM 包,同时安装;
需要注意的是,虽然 SRPM 包内是源码包,但毕竟是采用 RPM 包封装的,所以依然会有依赖性,这时需要先安装它的依赖包,才能正确安装。我们使用如下命令编译 SRPM 包的 apache。
[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
exit 0 是编译成功的标志,同时命令会自动删除临时文件。编译之后生成的软件包在哪里呢?当然在当前目录下了。在当前目录下会生成一个 rpmbuild 目录,所有编译之后生成的软件包者都存在这里。
[root@localhost ~]# ls /root/rpmbuild/
BUILD RPMS SOURCES SPECS SRPMS
rpmbuild 目录下有几个子目录,我们用表格说明其中保存了哪些文件,如表 1 所示。
文件名 | 文件内容 |
---|---|
BUILD | 编译过程中产生的数据保存位置 |
RPMS | 编译成功后,生成的RPM包保存位置 |
SOURCES | 从SRPM包中解压出来的源码包(*.tar.gz)保存位置 |
SPECS | 生成的设置文件的安装位置。第二种安装方法就是利用这个文件进行安装的 |
SRPMS | 放置SRPM包的位置 |
编译好的 RPM 包已经生成在 /root/rpmbuild/RPMS/ 目录下。
[root@localhost ~]#ll /root/rpmbuild/RPMS/i386/ 总用量3620
-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
其实,rpmbuild 命令就是先把 SRPM 包解开,得到源码包;然后进行编译,生成二进制文件;最后把二进制文件重新打包生成 RPM 包。
利用*.spec文件安装#
想利用 *.spec 文件安装,当然需要先把 SRPM 包解开才能获取。可以利用 rpmbuild 命令解开 SRPM 包,但是这样不就和上一种方法冲突了吗?可以使用 rpm-i 命令解开 SRPM 包,命令如下:
[root@localhost ~]# rpm -i httpd-2.2.15-5.el6.src.rpm
选项:
- -i: 安装。不过对 *src.rpm 包只会解开后放置到当前目录下的 rpmbuild 目录下,而不会安装
这时在当前目录下也会生成 rpmbuild 目录,不过只有 SOURCES 和 SPECS 两个子目录。其中,SOURCES 目录中放置的是源码;SPECS 目录中放置的是设置文件,我们现在要利用设置文件进行安装。接下来生成 RPM 包文件,命令如下:
[root@localhost ~]# rpmbuild -ba/root/rpmbuild/SPECS/httpd.spec
选项:
- -ba: 编译,同时生成 RPM 包和 SRPM 包;
- -bb: 编译,仅生成 RPM 包;
命令执行完成后,也会在 /root/rpmbuild/ 目录下生成 BUILD、RPMS、SOURCES、SPECS 和 SRPMS 目录,RPM 包放在 RPMS 目录中,SRPM 包生成在 SRPMS 目录中。这时安装 RPM 包即可。
两种安装 SRPM 包的方法使用一种就行,大家可以选用白己喜欢的方式。
RPM包的深入应用#
查询软件包帮助信息#
有这样一个问题:在 Vim 的配置文件中如何注释?实际上,Vim 的配置文件存放于用户的宿主目录下,默认文件名为".vimrc",可以写入"set nu"等设置命令,问题是写入此配置文件中的命令如何注释使其不生效。
一般来讲,Linux 系统或系统软件的配置文件可以在行首使用"#"符号来注释,但是当用"#"注释了 Vim 的配置文件保存退出后,编辑文件时发生了这样的情况:
[root@localhost ~]# vi /etc/inittab
Error detected while processing /root/.vimrc: line 1:
E488: Trailing characters: # set nu
系统提示错误,所以并不是 Vim 的有效注释符号。
诸如此类问题,应如何查询得到结果?思路:Linux 中安装的软件包大多包含应用示例或说明文档,可以査找到其内容,就可以知道此问题的答案了。
1) 査找系统中所有Vim的安装包。
[root@localhost ~]# rpm -qa|grep vim
vim-minimal-7.0.109-3 vim-common-7.0.109-3 vim-enhanced-7.0.109-3
2) 査询安装包的内容,査找是否有应用示例文件,看英文含义,"minimal"为最小应用软件包,"common"为通用的基础软件包,"enhanced"为増强功能的软件包。我们在这里先査看"virrvcommon"软件包安装到系统中的文件是否有示例文件(如包含关键字"example"或"sample"的文件)。
[root@localhost ~]# rpm -ql vim-common|grep example
/usr/share/vim/vim70/gvimrc_example.vim
/usr/share/vim/vim70/macros/urm/examples
/usr/share/vim/vim70/vimrc_example.vim
根据査找到的文件名称,判断"vimrc_example.vim"应为 Vim 配置文件示例,査看其内容。
[root@localhost ~]# head -4 /usr/share/vim/vim70/ vimrc_example.vim
"An example for a vimrc file.
"
"Maintainer:
Bram Moolenaar <Bram@vim.org>
"Last change:
2006 Aug 12
当看到此文件中"作者""最后更新日期"等信息前面的双引号时,我们就清楚了它一定是 Vim 配置文件的注释符号。
这是一个在应用 Linux 时碰到的问题,很有代表性,像常见的配置网络服务器(如 DNS、DHCP 等),査找它们的配置文件示例,都可以采用类似方法。解决此类问题要多利用系统软件本身的帮助信息,使用 RPM 査询命令。
RPM数据库问题#
有时 RPM 数据库也会出现故障,其结果是当安装、删除、査询软件包时,请求无法执行,此时需要重建数据库。
首先,删除当前的 RPM 数据库。
[root@localhost ~]# rm -f/var/lib/rpm/_db.*
其次,重建数据库。
[root@localhost -]# rpm -rebuilddb
这一步需要花费一定的时间来完成。
黑客入侵系统后,有时为混淆雛,避免管理员通过 RPM 包校验功能检测出问题,会更改 RPM 数据库(从理论上来讲,当系统被入侵后,一切都将不再可信),此时我们可按照以下步骤对文件进行检测。
1) 对于要检査的文件或命令,找出它属于哪个软件包。
[root@localhost ~]# rpm -qf/etc/rc.d/init.d/smb
samba-3.0.23c-2
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
其中,"2087"为文件中最初的字符数,"b1c26e5292157a83cadabe851bf9b2f9"为 smb 文件内容的 MD5 校验值,"0755 root root"为文件权限及所有者、所属组。
3) 检査实际的文件,看内容是否被更改过。
[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
检测文件大小、所有者、所属组、权限、MD5 校验值是否匹配。
4) 在我们的实验中,系统的 /etc/rc.d/init.d/smb 文件的信息和通过 rpm-ql-dump Samba 命令获取的信息是一致的,所以我们系统中的文件并没有被入侵与更改。如果确信 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
如果得到的结果与基于 RPM 数据库运行的命令结果不同,就可以判断 RPM 数据库已被更改,需要修正文件错误和系统漏洞,重建 RPM 数据库。
Linux yum源搭建及配置#
RPM 包的安装虽然很方便和快捷,但是依赖性实在是很麻烦,尤其是库文件依赖,还要去 rpmfind 网站査找库文件到底属于哪个 RPM 包,从而导致 RPM 包的安装非常烦琐。那么,有没有可以自动解决依赖性、自动安装的方法呢?
答案是肯定的,yum 在线管理就可以自动处理 RPM 包的依赖性问题,从而大大简化 RPM 包的安装过程。但需要注意的是,首先,yum 安装的还是 RPM 包,其次,yum 安装是需要有可用的 yum 服务器存在的,当然这个 yum 服务器可以在网上,也可以使用光盘在本地搭建。
yum 可以方便地进行 RPM 包的安装、升级、査询和卸载,而且可以自动解决依赖性问题,非常方便和快捷。但是,一定要注意 yum 的卸载功能。yum 在卸载软件的同时会卸载这个软件的依赖包,但是如果卸载的依赖包是系统的必备软件包,就有可能导致系统崩溃。除非你确实知道 yum 在自动卸载时会卸载哪些软件包,否则最好不要执行 yum 卸载。
yum源搭建#
yum 源既可以使用网络 yum 源,也可以使用本地光盘作为 yum 源。要使用网络 yum 源,你的主机必须是正常联网的。
当然,要使用 yum 进行 RPM 包安装,那么必须安装 yum 软件。查看命令如下:
[root@localhost ~]# rpm -qa | grep yum
yum-metadata-parser-1.1.2-16.el6.i686
yum-3.2.29-30.el6.centos.noarch
yum-utils-1.1.30-14.el6.noarch
yum-plugin-fastestmirror-1.1.30-14.el6.noarch
yum-plugin-security-1.1.30-14.el6.noarch
如果没有安装,则需要手工使用 RPM 包方式安装。
网络yum源服务器搭建#
在主机网络正常的情况下,CentOS 的 yum 是可以直接使用的,不过我们需要了解一下 yum 源配置文件的内容。
yum 源配置文件保存在 /etc/yum.repos.d/ 目录中,文件的扩展名一定是"*.repo"。也就是说,yum 源配置 文件只要扩展名是"*.repo"就会生效。
[root@localhost ~]# ls /etc/yum.repos.d/
CentOS-Base.repo
CentOS-Media.repo
CentOS-Debuginfo.repo.bak、
CentOS-Vault.repo
这个目录中有 4 个 yum 源配置文件,默认情况下 CentOS-Base.repo 文件生效。我们打开这个文件看看,命令如下:
[root@localhost yum.repos.d]# vim /etc/yum.repos.d/ CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/? release= $releasever&arch=$basearch&repo=os
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
…省略部分输出…
在 CentOS-Base.repo 文件中有 5 个 yum 源容器,这里只列出了 base 容器,其他容器和 base 容器类似。
我们解释一下 base 这个容器:
- [base]:容器名称,一定要放在[]中。
- name:容器说明,可以自己随便写。
- mirrorlist:镜像站点,这个可以注释掉。
- baseurl:我们的 yum 源服务器的地址。默认是 CentOS 官方的 yum 源服务器,是可以使用的。如果你觉得慢,则可以改成你喜欢的 yum 源地址。
- enabled:此容器是否生效,如果不写或写成 enabled 则表示此容器生效,写成 enable=0 则表示此容器不生效。
- gpgcheck:如果为 1 则表示 RPM 的数字证书生效;如果为 0 则表示 RPM 的数字证书不生效。
- gpgkey:数字证书的公钥文件保存位置。不用修改。
yum 源配置文件默认不需要进行任何修改就可以使用,只要网络可用就行。
以本地光盘作为 yum 源服务器#
如果 Linux 主机不能联网,yum 就不能使用吗? yum 已经考虑到这个问题,所以在 /etc/yum.repos.d/ 目录下 还有一个 CentOS-Media.repo 文件,这个文件就是以本地光盘作为 yum 源服务器的模板文件,只需要进行简单的修改即可。
1) 放入 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目录下
2) 修改其他几个 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
3) 修改光盘 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的便捷了。
Linux yum命令#
yum提供了查询、安装、升级和卸载软件包的命令,一一给大家介绍。
查询#
査询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
#软件名 版本 所在位置(光盘)
…省略部分输出…
查询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 关键字
#搜索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.
查询指定软件包的信息#
[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 <-在光盘上
…省略部分输出…
安装#
[root@localhost yum.repos.d]# yum -y install 包名
选项:
- install:安装;
- -y:自动回答yes。如果不加 -y,那么每个安装的软件都需要手工回答yes;
例如:
[root@localhost yum jepos.d]#yum -y install gcc
#使用yum自动安装gcc
在讲 RPM 包安装时提到,gcc 是 C 语言的编译器,其依赖的软件包比较多,手工使用 RPM 包安装太麻烦了,所以使用 yum 安装。
yum 安装可以自动解决依赖性,而且安装速度也比源码包快得多。不过,yum 到底安装的还是 RPMS,所以 rpm 命令还是必须学习和使用的。
升级#
[root@localhost yum.repos.d]# yum -y update 包名
#升级指定的软件包
选项:
- update:升级;
- -y:自动回答yes;
注意,在进行升级操作时,yum 源服务器中软件包的版本要比本机安装的软件包的版本高。
[root@localhost yum.repos.d]# yum -y update
#升级本机所有软件包
这条命令会升级系统中所有的软件包。不过我们的生产服务器是稳定优先的,所以这种全系统升级的情况并不多见。
卸载#
再次强调一下,除非你确定卸载的软件的依赖包不会对系统产生影响,否则不要执行 yum 的卸载,因为很有可能在卸载软件包的同时卸载的依赖包也是很重要的系统文件,这就有可能导致系统崩溃。
卸载命令如下:
[root@localhost yum.repos.d]# yum remove 包名
#卸载指定的软件包
例如:
[root@localhost yum.repos.d]# yum remove samba
#卸载samba软件包
Linux yum管理软件组#
在安装 Linux 的过程中,在选择软件包的时候,如果选择了"现在自定义",就会看到 Linux 支持的许多软件组,比如编辑器、系统工具、开发工具等。那么,在系统安装完成后,是否可以利用 yum 安装这些软件组呢?
当然可以,只需要利用 yum 的软件组管理命令。
查询可以安装的软件组#
[root@localhost ~]#yum grouplist
#查询可以安装的软件组
查询软件组中包含的软件#
[root@localhost ~]#yum groupinfo 软件组名
#查询软件组中包含的软件
例如:
[root@localhost ~]#yum groupinfo "Web Server"
#查询软件组"Webserver"中包含的软件
安装软件组#
[root@localhost ~]#yum groupinstall 软件组名
#安装指定软件组,组名可以由grouplis查询出来
例如:
[root@localhost ~]#yum groupinstall "Web Server"
#安装网页服务软件组
卸载软件组#
[root@localhost ~]# yum groupremove 软件组名
#卸载指定软件组
软件组管理对于安装功能集中的软件集合非常方便。比如,在安装 Linux 的时候没有安装图形界面,但是后来发现需要图形界面的支持,这时可以手工安装图形界面软件组(X Window System 和 Desktop),就可以很方便地安装图形界面了。
Linux yum源码包安装和卸载#
Linux 下的绝大多数源码包都是用 C 语言编写的,还有少部分是用 C++ 等其他程序语言编写的。所以,要想安装源码包,必须安装 C 语言编译器 gcc(如果是用 C++ 编写的程序,则还需要安装 gcc-c++)。
我们可以先检测一下 gcc 是否已经安装,命令如下:
[root@localhost ~]# rpm -q gcc
gcc-4.4.6-4.el6.i686
如果没有安装 gcc,则推荐大家采用 yum 安装方式安装。因为如果手工使用 rpm 命令安装,那么 gcc 所依赖的包太多了。命令如下:
[root@localhost yum.repos.d]#yum -y install gcc
有了编译器,还需要考虑一个问题:刚刚写的"hello.c"只有一个源码文件,所以我们可以利用 gcc 手工编译。但是真正发布的源码包软件内的源码文件可能有成百上千个,而且这些文件之间都是有联系的,编译时有先后顺序。如果这样的源码文件需要手工编译,光想想就是一项难以完成的工作。
这时就需要 make 命令来帮助我们完成编译,所以make也是必须安装的。我们也需要査看一下 make 是否已经安装,命令如下:
[root@localhost yum. repos.d]# rpm -q make
make-3.81-20.el6.i686
源码包的获取#
RPM 包是保存在 CentOS 6.3 的安装光盘中的,那么源码包从哪里来呢?从官方网站上下载,我们依然以下载和安装 apache 为例。
源码包安装#
在安装之前,我们先来解释一下源码包的安装注意事项:
- 软件包是从互联网上下载的。比如 apache 是从北京理工大学开源软件镜像服务网站上下载的。
- 下载的软件包格式。下载格式一般都是压缩格式,常见的是".tar.gz"或".tar.bz2",选择你习惯的格式下载即可。
- 下载之后的源代码保存位置。Linux 是一个非常严谨的操作系统,每个目录的作用都是固定而且明确的,作为管理员,养成良好的操作习憤非常重要,在正确的目录中保存正确的数据就是一个约定俗成的习惯。系统中保存源代码的位置主要有两个:"/usr/src"和 "/usr/local/src"。其中,"/usr/src"用来保存内核源代码,"/usr/local/src"用来保存用户下载的源代码。
- 软件安装位置。我们刚说了 Linux 非常注意每个目录的作用,所以安装软件也有默认目录,即"/usr/local/软件名"。我们需要给安装的软件包单独规划一个安装目录,以便于管理和卸载。想象一下,如果我把每个软件都安装到"/usr/local/"目录下,但是没有给每个软件单独分配安装目录,那么以后还能分清哪 个软件是哪个软件吗?这样一来也就不能正确地卸载软件了。
- 软件安装报错。源码包如果安装不报错,那么安装还是很方便的。但是报错后的排错对刚学习的人来说还是有难度的,不过我们先要知道什么样的情况是报错。报错有两个典型特点,这两个特点必须都具备才是报错:其一是出现"error"或"warning"字样;其二是安装过程停止。如果没有停止但是出现警告信息,那么软件中的部分功能不能使用,而不是报错。
安装步骤#
我们来解释一下源码包安装的具体步骤:
1) 下载软件包。
2) 解压缩。
3) 进入解压目录。
4) ./configure 软件配置与检查。这一步主要有三个作用:
- 在安装之前需要检测系统环境是否符合安装要求。
- 定义需要的功能选项。"./configure"支持的功能选项较多,可以执行"./configure--help"命令査询其支持的功能。一般都会通过"./configure--prefix=安装路径"来指定安装路径。
- 把系统环境的检测结果和定义好的功能选项写入 Makefile 文件,后续的编译和安装需要依赖这个文件的内容。
需要注意的是,configure 不是系统命令,而是源码包软件自带的一个脚本程序,所以必须采用"./configure"方式执行("./"代表在当前目录下)。
5) make编译。make 会调用 gcc 编译器,并读取 Makefile 文件中的信息进行系统软件编译。编译的目的就是把源码程序转变为能被 Linux 识别的可执行文件,这些可执行文件保存在当前目录下。编程过程较为耗时,需要有足够的耐心。
6) make clean:清空编译内容(非必需步骤)。如果在"./configure"或"make"编译中报错,那么我们在重新执行命令前一定要记得执行 make clean 命令,它会清空 Makefile 文件或编译产生的".o"头文 件。
7) make install:安装。这才是真正的安装过程,一般会写清楚程序的安装位置。如果忘记指定安装目录,则可以把这个命令的执行过程保存下来,以备将来删除使用。
举例安装apache#
1) 下载。
2) 解压缩。
[root@localhost ~]#tar -zxvf httpd-2.2.9.tar.gz|more
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) 软件配置。
[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
…省略部分输出…
选项:
- --prefix: 指定安装目录
这里的安装选项没有加载其他功能,只是指定安装目录。"/usr/local/apache2"目录不需要手工建立,安装完成后会自动建立,这个目录是否生成也是检测软件是否正确安装的重要标志。
当然,在配置之前也可以查询一下 apache 支持的选项功能,命令如下:
[root@localhost httpd-2.2.9]#./configure --help|more
#查询apache支持的选项功能(不是必需步骤)
5) 编译。
[root@localhost httpd-2.2.9]# make
这一步命令较为简单,醒编译时间账,主要作用是把源码文件转换为二进制文件。
6)安装。
[root@localhost httpd-2.2.9]# make install
如果不报错,这一步完成后就安装成功了。
源码包卸载#
我们在说源码包卸载之前,先回顾一下 Windows 系列操作系统中的软件卸载。在 Windows 系统中是不能用鼠标右键单击安装之后的软件,选择直接删除的,因为这样做会遗留大量的垃圾文件。这些垃圾文件越多,会导致 Window 系统越不稳定。
那么, Linux 中删除源码包应该怎样操作呢?太简单了,只要找到软件的安装位置,然后直接删除就可以了。比如删除 apache,只需执行如下命令即可,而且不会遗留任何垃圾文件。
[root@localhost ~]# rm -rf /usr/local/apache2/
如果 apache 服务启动了,那么,记得先停止服务再删除。
Linux源码包升级#
我们的软件如果进行了数据更新,那么是否需要先把整个软件卸载,然后重新安装呢?当然不需要,我们只需要下载补丁、打上补丁,重新编译和安装就可以了(不用 ./configured 成新的 Makefile 文件,make 命令也只是重新编译数据),速度回比重新安装一次快得多。
补丁的生成与使用#
怎么知道两个软件之间的不同呢?难道需要手工比对两个软件吗?当然不是,Linux 有 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
比较一下两个文件的不同,并生成补丁文件"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
#后一个文件比前一个文件多两行(用+表示)
既然"new.txt"比"old.txf文件多了两行,那么我们能不能让"old.txt"文件按照补丁文件"txt.patch"进行更新呢?当然可以,使用命令 patch 即可。命令格式如下:
[root@localhost test]# patch -pn < 补丁文件
#按照补丁文件进行更新
选项:
- -pn:n为数字。代表按照补丁文件中的路径,指定更新文件的位置;
"-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打入补丁#
我们再举一个实际的例子。前面章节中我们安装了 httpd-2.2.9 这个版本的程序,在官网上有这个版本的一个补丁"mod_proxy_ftp_CVE-2008-2939.diff",这个补丁修补了 apache 代理 FTP 站点时,模块空指针引用拒绝服务攻击的漏洞。下面我们来看看如何安装这个补丁。
1) 下载补丁文件
2) 把补丁文件复制到 apache 源码包解压目录中
[root@localhost ~]# cp mod_proxy_ftp_CVE-2008-2939.diff httpd-2.2.9
3) 打入补丁
[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
#打入补丁
为什么是"-p0"呢?因为我当前在"/root/httpd-2.2.9"目录中,但是补丁文件中记录的目录是"modules/proxy/mod_proxy_ftp.c",这就在我当前所在目录中,一个"/"都不需要去掉,所以是"-p0"。
4) 重新编译
[root@localhost httpd-2.2.9]# make
5) 重新安装
[root@localhost httpd-2.2.9]# make install
打补丁的方法会比重新安装少了"./configure"步骤,而且编译时也只是编译变化的地方,所以编译速度也更快。但是如果没有安装过 httpd-2.2.9,就需要先打入补丁,再依次执行"./configure" "make" "make install"命令。
如果我不想要补丁中的内容呢?可以恢复吗?当然可以,命令如下:
[root@localhost httpd-2.2.9]# patch -R < modjDroxy_ftp_CVE-2008-2939.diff
选项:
- -R:还原补丁
Linux函数库#
函数库其实就是函数,只不过是系统所调用的函数。这样说吧,我写了一个软件,所有的功能都需要我自己完成吗?其实是不需要的,因为很多功能是别人已经写好的,我只需要拿来用就好了。这些有独立功能并且可以被其他程序调用的程序是函数。
函数库分类#
当其他程序调用函数时,根据是否把函数直接整合到程序中而分为静态函数和动态函数。我们分别看看这两种函数的优缺点。
静态函数库#
函数库文件一般以"*.a"扩展名结尾,这种函数库在被程序调用时会被直接整合到程序当中。
优点:程序执行时,不需要在调用外部数据,可以直接执行。
缺点:因为把所有内容都整合到程序中,所以编译文件会比较大,升级比较困难,需要把整个程序重新编译。
动态函数库#
函数库文件通常以"*.so"扩展名结尾,这种函数库在被程序调用时,并没有直接整合到程序当中,当程序需要用到函数库的功能时,再去读取函数库,在程序中只保存了函数库的指向,如图 1 所示。

图 1 函数库调用
优点:因为没有把整个函数库整合到程序中,所以文件较小,升级方便,不需要把整个程序重新编译,只需要重新编译安装函数库就好。
缺点:程序在执行时需要调用外部函数,如果这时函数出现问题,或指向位置不正确,那么程序将不能正确执行。
目前 Linux 中的大多数函数库是动态函数库,主要是因为升级方便;但是函数的存放位置非常重要,而且不能更改。目前被系统程序调用的函数主要存放在"/usr/lib"和"/lib"中,而 Linux 内核所调用的函数库主要存放在"/lib/modules"中。
安装函数库#
那么,系统中的可执行程序到底调用了哪些函数库呢?可以査询到吗?当然可以,命令如下:
[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)
新安装了一个函数库,如何让它被系统识别?其实软件如果是正常安装的,则是不需要手工调整函数库的。但是万一没有安装正确,需要手工安装呢?那也很简单,只要把函数库放入指定位置,一般放在"/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
#列出系统缓存中所有识别的函数库
Linux脚本程序包及安装方法#
脚本程序并不多见,所以在软件包分类中并没有把它列为一类。它更加类似于 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 软件,这里下载的是 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 中的绝大多数软件是没有这种脚本的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架