3.1 Linux应用程序基础
3.1.1 Linux命令与应用程序的关系
在Linux操作系统中,一直以来命令和应用程序并没有特别明确的区别从长期使用习惯来看,可以通过以下描述来对两者进行区别。
- 应用程序命令的执行文件大多比较小,通常存放在/bin和/sbin目录中,对于内部命令,常集成在 Bash 程序内,而不是独立地执行文件;命令文件一般在安装操作系统时一起安装,用于辅助操作系统本身的管理;命令行大多适用于“命令字选项 参数”形式的一般格式;命令只在字符操作界面中运行。
- 应用程序的执行文件通常放在/usr/bin、/usr/sbin 和usr/local/bin、/usr/local/sbin等目录中;应用程序一般需要在操作系统之外另行安装,提供相对独立于操作系统的功能,有时候等同于“软件”的概念;应用程序一般没有固定的执行格式,运行方式由程序开发者自行定义:应用程序可能会用到图形界面,形式多样;有些应用程序提供的执行文件,能够使用像 Linux 命令一样的运行格式,所以也经常被称为程序命令。
3.1.2Linux 应用程序组成
- 普通的文件,一般存放在/usr/bin目录下,普通用户可执行。
- 服务器程序、管理程序文件:一般存放在/usr/sbin目录下,只有管理员能执行。
- 配置文件:一般保存在/etc目录中,配置文件较多时会建立相应的子目录。
- 日志文件:一般存放在/var/log下。
- 关于应用程序的参考文档等数据,一般保存在/usr/share/doc/目录中。
- 执行文件及配置文件的man手册页;一般保存在/usr/share/man目录下
下面以Centos中安装的postfix软件包为例,展示服务器应用程序的文件组成。执行“rpm -ql postfix”命令可以查看postfix在系统中安装的目录和文件清单。
3.1.3 软件包的封装类型
- RPM 软件包:这种软件包文件的扩展名为“.rpm”,只能在使用 RPM(RPM PackageManager,RPM 软件包管理器)机制的 Linux 操作系统中安装,如 RHEL、Fedora.CentOS 等。RPM 软件包一般针对特定版本的操作系统量身定制,因此依赖性较强。安装 RPM 软件包需要使用操作系统中的rpm 命令。
- DEB 软件包:这种软件包文件的扩展名为“.deb”,只能在使用 DPKG(DebianPackage,Debian 包管理器)机制的 Linux操作系统中进行安装,如 Debian、Ubuntu等。安装 DEB 软件包需要使用操作系统中的 dpkg 命令。
- 源代码软件包:这种软件包是程序员开发完成的原始代码,一般被制作成“.tar.gz或“.tar.bz2”等格式的压缩包文件,因多数使用 tar 命令打包而成,所以经常被称头'TarBal”。安装源代码软件包需要使用相应的编译工具,如 Linux 中的 C语言编译器 gcc。因此,在安装操作系统的时候尽量勾选“开发工具”一项来安装基本的编译环境
- 附带安装程序的软件包:这种软件包的扩展名不一,但仍以TarBal 格式的居多。软件包中会提供用于安装的可执行程序或脚本文件,如instal.sh、setup 等,有时候会以“.bin"格式的单个安装文件形式出现。安装时只需运行安装文件就可以根据向导程序的提示完成安装操作。
开源代码的自用软件绝大多数选择以TarBall的形式发布,而RPM软件包、DEP软件包则采用二进制的文件格式,代码相对封闭
3.2 使用RPM软件包管理工具
RPM软件包是各种Linux发行版本中应用较广泛的软件包之一。
3.2.1 RPM概述
RPM 软件包管理机制最早由 Red Hat 公司提出,后来随着版本的升级逐渐融入更多的优秀特性,成为众多 Linux发行版中公认的软件包管理标准。
RPM 软件包管理器通过建立统一的文件数据库,对在Linux 操作系统中安装、卸载、升级的各种.rpm 软件包进行详细的记录,并能够自动分析软件包之间的依赖关系,保持各应用程序在一个协调、有序的整体环境中运行。
3.2.2 使用RPM软件包管理命令——rpm
-
rpm的格式
- 使用rpm 命令能够实现几乎所有对 RPM 软件包的管理功能,执行"man rpm"命令可以获得关于 rpm 命令的详细帮助信息
- 查看rpm命令的手册页信息中可以看出,rpm具有非常强大的功能,结合不命令选项及子选项可以实现以下三种功能:
- 查询、验证RPM软件包的相关信息
- 安装、升级、卸载RPM软件包。
- 维护RPM数据库信息等综合操作。
-
查询RPM软件包信息
- 使用 rpm 命令的查询功能可以查看某个软件包是否已经安装,软件包的用途以及软件包复制到系统中的文件等相关信息,以便更好地管理 Lnux操作系统中的应用程序。
- rpm 命令的查询功能主要通过“-g"选项实现,主要针对当前系统中已经安装的软件包;通过“-qp"选项可以针对尚未安装的 RPM 软件包文件进行查询。根据所需查询的具体项目不同,还可以为这两个选项指定相关的子选项。
-
查询已安装的 RPM 软件包信息
- 不带子选项的“-g"选项可用于查询已知名称的软件包是否已经安装,需要使用准确的软件名作为参数(可以有多个)。结合不同的子选项使用时,可以实现更具体的查询。常用的几个子选项如下所述。
- -qa:显示当前系统中以RPM方式安装的所有 软件列表
- -qi:查看指定软件包的名称、版本、许可协议、用途描述等详细信息(--info)
- -ql:显示指定的软件包在当前系统中安装的所有目录、文件列表(--list)
- -qf:查看指定的文件或目录是由哪个软件包所安装的(--file)
- 直接执行“rpm -qa"命令将列出当前操作系统中以 RPM 方式安装的所有软件包清单,每行记录一个软件包的名称、版本等信息。结合管道操作和“wc-"命令,可以统计出系统中已安装的 RPM 软件的个数。
- 当需要查询某个软件包是否已经安装时,可以直接使用软件包名称作为查询参数。例如,执行以下的“rpm -g elinks lynx"操作可以査询是否已安装 elinks 和 lynx 软件包(这两个软件包都是文本模式下的网页浏览器工具)。
- 如果不知道准确的软件包名称,还可以对全部查询结果进行过滤,使用软件包的一部分名称进行模糊查询,根据查询结果再进行判断。例如,执行以下操作可以查询系统中是否安装了名称中包含“samba”的软件包,查询时不区分大小写。
- 对于系统中已经安装的各种软件程序,如果不知道其中某个软件的用途,同样可以通过rpm 工具进行査询。例如 samba-client 软件,可以执行“rpm -qi samba-client”命令来了解samba-client 软件包的摘要信息,具体操作如下:
- 当需要查看某个软件包安装的目录和文件清单时,可以使用“-q!"选项。例如,执行“rpm-ql wget"命令可以列出 wget 软件包安装的目录和文件清单,具体操作如下:
- 当需要知道系统中的某个文件是由哪一个软件包生成的时候,可以使用“-gf"选项。例如,执行以下操作可以获知 vim 编辑器程序是在安装 vim-enhanced 软件包时生成的。
- 注意:使用 rpm 命令只能查询通过 RPM 方式安装的软件包信息,对通过其他途径安装(如源码编译、手动复制等方式)到系统中的软件包,rpm命令则无法获取相关信意。
- 不带子选项的“-g"选项可用于查询已知名称的软件包是否已经安装,需要使用准确的软件名作为参数(可以有多个)。结合不同的子选项使用时,可以实现更具体的查询。常用的几个子选项如下所述。
-
查询RPM软件包文件中的相关信息
- 使用“-qp”选项时,必须以 RPM 软件包文件的路径作为参数(可以有多个),而不是软件包名称。其相关的子选项与使用“-q"查询时类似,常用的两个查询选项如下所述
- -qpi:查看指定软件包的名称、版本、许可协议、用途描述等详细信息
- -qpl:查看该软件包准备安装的所有目标目录、文件列表
- 使用“-qp”选项时,必须以 RPM 软件包文件的路径作为参数(可以有多个),而不是软件包名称。其相关的子选项与使用“-q"查询时类似,常用的两个查询选项如下所述
-
安装、升级、卸载RPM数据包
- 在日常系统管理工作中,安装、升级及卸载软件包是管理应用程序最基本的工作内容使用 rpm 命令实现这些操作时,基本的命令选项如下所述。
- -i:在当前系统安装(Install)一个新的RPM软件包。
- -e:卸载指定名称的软件包
- -U:检查并升级系统中的某个软件包,若该软件包原来并未安装,则等同于“-i”选项
- -F:检查并更新系统中的某个软件包,若该软件包原来并未安装,则放弃安装。
- -h:在安装或升级软件包的过程中,以“#”号显示安装进度
- -v:显示软件安装过程中的详细信息。
- --force:强制安装某个软件包,当需要替换已安装的软件包及文件,或者安装一个比当前使用的软件版本更旧的软件时,可以使用此选项。
- --nodeps:在安装或升级、卸载一个软件包时,不检查与其他软件包的依赖关系。
-
安装、升级软件包
- 使用 rpm 命令安装软件包时,一般需要指定完整的软件包文件名作为参数(可以有多个);而卸载软件包时,只需要指定软件名称即可。若要一次安装多个RPM 软件包,可以使用通配符"*”,这种方式在安装存在相互依赖关系的多个软件包时特别有用,系统将会自动检查依赖性并决定安装顺序,而无须管理员去判断应该先装哪一个包。
- 在安装一个新的软件包时,通常使用“-ivh"的组合选项,这样便于了解软件安装的过程信息,及时跟踪安装进度。若使用新版本的软件包替换旧的版本,则只需将“-i”换成"-U"即可例如,以下操作将从光盘目录中全新安装lynx软件包。
-
卸载软件包
- 当需要安装、卸载一个与其他程序存在依赖关系的软件包时,系统将提示存在依赖关系而放弃执行。这时可以结合“--nodeps"选项忽略依赖关系,而强行安装或卸载指定的软件包。忽略依赖关系可能会导致软件功能异常或失效,因此只在学习或者调试程序时使用,生产环境中应避免使用。
- 在日常系统管理工作中,安装、升级及卸载软件包是管理应用程序最基本的工作内容使用 rpm 命令实现这些操作时,基本的命令选项如下所述。
-
维护RPM数据库
操作步骤
- 重建RPM数据库
- 导入验证公钥
从源代码编译安装程序
1、源代码编译概述
Linux 操作系统之所以能够在十余年的时间里发展壮大以至风靡全球,其开放源代码和操作简单的特性是很重要的原因之一,即 Linux操作系统中包括内核在内的所有软件都可以获得源代码,并且可以经过定制修改后编译安装。
现代的 Linux 发行版本通常使用软件包管理机制对软件进行打包安装,这样省去了软件的编译安装过程,大大简化了 Linux 操作系统的安装和使用难度。但是在有些情况下,仍然需要使用源代码编译的方式为操作系统安装新的应用程序,如以下几种情况。
- 安装较新版本的应用程序时:大多数的 Linux 发行版都提供了相当丰富的应用程序而这些程序的版本往往滞后于该软件的最新源代码版本,因为大多数的开源软件总是以源代码的形式最先发布,之后才会逐渐出现.rpm、.deb 等二进制封装的版本。下载应用程序的最新源代码包并编译安装,可以在程序功能、安全补丁等方面得到及时更新。
- 当前安装的程序无法满足应用需求时:对于 RPM 格式封装的应用程序,一般只包含该软件所能实现的一小部分功能,而难以由用户自行修改、定制。通过对程序的源代码进行重新配置并编译安装后,可以定制更灵活、更丰富的功能。许多 Linux服务器程序都采用源代码编译的方式进行安装,以获得更适于企业实际应用需求的服务。
- 为应用程序添加新的功能时:当需要利用现有的程序源代码进行适当的修改以便增加新的功能时,必须释放出该软件的源代码,修改后再重新编译安装。
2、编译安装的基本过程
-
解包
- 开源软件的源代码包一般为 TarBal 形式,扩展名为“.tar.gz"或“.tar.bz2”,都可以使用 tar命令进行解压释放。对于只有“.gz”扩展名的源代码包,表示只经过压缩而并未使用 tar 归档,这样的文件只需使用 gzip 进行解压缩即可。在 Linux操作系统中,通常将各种软件的源代码目录保存到“/usr/src!"目录中,以便于集中管理。释放后的软件包目录一般包括软件名和版本信息(如 htpd-2.4.25)。解包前先安装编译环境和依赖包。
-
配置
- 在编译应用程序之前,需要进入源代码目录,通过目录下的脚本检查安装环境,并且对软件的安装目录、功能选择等参数进行预先配置,
- 如果软件的功能比较复杂,配置过程会需要一定的时间,期间会在屏幕中显示大量的输出信息,这些信息可以帮助管理员了解程序配置的过程。配置结果将保存到源代码目录的Makefile 文件中。如果配置过程出现错误,如包含“error”、“failed”或“not found”等关键字,通常是缺少相关的依赖软件包所致,此时只要根据提示安装对应的软件即可。
-
编译
- 编译的过程主要是根据 Makefile 文件内的配置信息(若上一步的配置操作失败,将无法进行编译),将源代码文件进行编译生成二进制的程序模块、动态链接库、可执行文件等。配置完成后,只要在源代码目录中执行“make”命令即可执行编译操作。编译的过程比配置过程需要更长的时间,期间同样会显示大量的执行过程信息。
-
安装
- 编译完成以后,就可以执行如下的“make instal!"命令将软件的执行程序、配置文件、帮助文档等相关文件复制到 Linux 操作系统中了,即应用程序的最后“安装”过程。安装过程需要的时间相对要短一些,期间也会显示安装的过程信息
-
使用