本章掌握目标:
1.熟悉Linux中的软件封装类型
2.会使用rpm包管理工具
3.会用源码包编译安装程序
一、Linux应用程序基础
内容包括:
Linux命令与程序的关系
应用程序的组成部分
软件包的封装类型
1.Linux命令与程序的关系
应用程序命令的执行文件通常较小,常置于/bin和/sbin目录。内部命令则集成于Bash程序内,非独立执行文件。这些命令文件在安装操作系统时一并安装,主要用于辅助操作系统管理,遵循“命令字 选项 参数”的格式,且仅在字符操作界面运行。
相比之下,应用程序的执行文件多放在/usr/bin、/usr/sbin、/usr/local/bin及/usr/local/sbin等目录。它们需在操作系统外另行安装,提供独立于操作系统的功能,有时等同于“软件”。应用程序无固定执行格式,运行方式由开发者定义,可能采用图形界面,形式多样。部分应用程序的执行文件,虽采用类似Linux命令的运行格式,但仍被视为程序命令。
总结:
命令:简单、直接、适合快速操作或自动化脚本。
应用程序:功能复杂、适合长期运行或交互式任务。
关系:两者互相配合,就像“螺丝刀和电钻”一起帮你修家具一样,Linux 的命令和应用程序共同构建了系统的强大功能。
2.应用程序的组成部分
普通的可执行程序文件 保存在/usr/bin目录中,普通用户即可执行 服务器程序、管理程序文件 保存在/usr/sbin目录中,只有管理员能执行 配置文件 保存在/etc目录中,配置文件较多时会建立相应的子目录 日志文件 保存在/var/log目录中 应用程序的参考文档 保存在/usr/share/doc目录中 执行文件及配置文件的man手册 保存在/usr/share/man目录中
3.软件包的封装类型
RPM软件包 这种软件包文件的扩展名为“.rpm”,只能在使用RPM(RPM PackageManager,RPM软件包管理器)机制的Linux操作系统中安装,如RHEL、Fedora、CentOS、OpenEuler等。RPM软件包一般针对特定版本的操作系统量身定制,因此依赖性较强。安装RPM软件包需要使用操作系统中的rpm命令。 DEB软件包 这种软件包文件的扩展名为“.deb”,只能在使用DPKG(DebianPackage,Debian包管理器)机制的Linux操作系统中进行安装,如Debian、Ubuntu等。安装DEB软件包需要使用操作系统中的dpkg命令。 源代码软件包 这种软件包是程序员开发完成的原始代码,一般被制作成“.tar.gz”或“.tar.bz2”等格式的压缩包文件,因多数使用tar命令打包而成,所以经常被称为“TarBall”。安装源代码软件包需要使用相应的编译工具,如Linux中的C语言编译器gcc。因此,在安装操作系统的时候尽量勾选“开发工具”一项来安装基本的编译环境。 附带安装程序的软件包 这种软件包的扩展名不一,但仍以TarBall格式居多。软件包中会提供用于安装的可执行程序或脚本文件,如install.sh、setup等,有时候会以“.bin”格式的单个安装文件形式出现。安装时只需运行安装文件就可以根据向导程序的提示完成安装操作。
开放源代码的自由软件绝大多数选择以TarBall的形式发布,而RPM软件包、DEB软件包等则使用了二进制文件格式,代码相对比较封闭。
并不安全
二、使用RPM包管理工具
RPM软件包是各种Linux发行版本中应用较广泛的软件包之一。
以其强大的功能得到多数Linux发行版本的支持和广大Linux使用者的拥护。
在本节中将学习RPM软件包的常用管理操作。
1.RPM概述
RPM软件包管理机制最早由Red Hat公司提出,后来随着版本的升级逐渐融入更多的优秀特性,成为众多Linux发行版中公认的软件包管理标准。在其官方站点http://www.rpm.org中,可以了解到关于RPM包管理机制的详细资料。
RPM软件包管理器通过建立统一的文件数据库,对在Linux操作系统中安装、卸载、升级的各种rpm软件包进行详细的记录,并能够自动分析软件包之间的依赖关系,保持各应用程序在一个协调、有序的整体环境中运行。
使用RPM机制封装的软件包文件拥有约定俗成的命名格式,一般使用“软件名-软件版本-发布次数.操作系统类型.硬件架构类型.rpm”的文件名形式,如“bash-4.2.46-20.el7_2.x86_64.rpm”。其中硬件平台通常为“i386”或“i686”等,表示适用于Intel公司的处理器,“x86_64”表示适用于64位的系统,如果是“noarch”表示不区分硬件架构(支持不同硬件体系的处理器)。
OpenEuler的DVD安装光盘携带的大部分软件包都在Packages目录中,通过该目录中的文件可以熟悉RPM软件包的一般命名格式。例如,以下操作用于查看DVD光盘设备中携带的bash和fontconfig-devel软件包(分别是Shell解释器、字体配置和定制库)。
mkdir /media/cdrom #创建挂载点 mount /dev/cdrom /media/cdrom #挂在系统光盘 cd /media/cdrom/Packages/ #切换目录 ls -lh #长格式人性化显示目录下内容
例子:
2.使用RPM包管理命令——rpm
2.1查询已安装的RPM软件包信息
格式:rpm [选项] [软件名]
-q 查询软件包是否已经安装 -qi 查询指定软件包的详细信息 -qa 查询系统中已安装的所有RPM软件包 -ql 查询指定软件包所安装的目录,文件列表 例子:
rpm -q net-tools #查询文件是否安装 rpm -qi net-tools #查询软件包的详细信息 rpm -ql net-tools #查询软件包的安装目录 rpm -qa #查询系统中全部的rpm包
2.2查询未安装的RPM包文件中的信息
格式:rpm 【选项】 RPM包文件路径
-qpi 查看未安装软件包的详细信息 -qpl 查看未安装软件包内所包含的目录、文件列表 例子:
ls -l /media/cdrom/Packages #查看目录下内容 rpm -q zziplib #查看软件包是否安装
#查询未安装软件包的详细信息 rpm -pqi zziplib-help-0.13.72-4.oe2403sp1.noarch.rpm #查询未安装软件包安装时文件的所在位置 rpm -pql zziplib-help-0.13.72-4.oe2403sp1.noarch.rpm
3.安装、升级、卸载RPM软件包
格式:rpm [选项] RPM包完整文件名
-i 安装一个新的RPM软件包 -v 显示安装过程中的详细信息 -h 以“#”号显示安装的进度 -e 删除一个RPM包 -U 升级某个rpm软件,若原本未装,则进行安装 -F 更新某个rpm软件,若原来未装,则不安装 --force 强制安装所指定的rpm软件包 --nodeps 安装、升级或卸载软件时,忽略依赖关系
例子:
3.1安装软件包
#安装软件包,显示过程和进度 rpm -ivh ethtool-6.6-3.oe2403sp1.x86_64.rpm
3.2卸载软件包
首先要确认该软件包是否被其他RPM包依赖,如果存在依赖关系则会出现下面这种情况:
#删除一个软件包(不用写完整的名字) rpm -e ethtool
我们可以用下面这种方式来卸载软件包:
#忽略依赖关系卸载软件包 rpm -e --nodeps ethtool
4.维护RPM数据库
4.1 rpm数据库
RPM数据库用于记录在Linux操作系统中安装、卸载、升级应用程序的相关信息,由RPM软件包管理系统自动完成维护,一般不需要用户干预。当RPM数据库发生损坏(可能由误删文件、非法关机、病毒破坏等导致),且Linux操作系统无法自动完成修复时,将导致无法使用rpm命令正常地安装、卸载及查询软件包。这时可以使用rpm命令的“-rebuilddb”或“-initdb”功能对RPM数据库进行重建。
代码如下:
#重建数据库 rpm --rebuilddb #初始化数据库 rpm --initdb
4.2 导入验证公钥
安装某些包会报错“warning:·············:NOKEY”(起警告作用、不影响正常使用)
4.2.1 出现原因:
在Linux/UNIX应用领域,相当一部分软件厂商会对发布的软件包进行数字签名,以确保软件的完整性、合法性。对于用户来说,可以利用官方提供的公钥文件,自动对下载的软件包进行验证,若在安装软件时出现验证失败的提示,则表示该软件包可能已经被非法篡改。
OpenEuler的DVD光盘中默认已经提供了用于数字签名验证的公钥文件,该文件位于光盘根目录下,文件名为RPM-GPG-KEY-openEuler。在没有导入公钥文件之前,安装OpenEuler光盘中的一部分RPM软件包时,可能会出现“warning:……x86_64.rpm:Header V3 RSA/SHA256 signature, key ID……:NOKEY”的警告信息,但一般不影响正常使用。
4.2.2 解决方法:
向RPM数据库中导入公钥文件时,需要用到“--import”选项。例如,可以执行相关操作把光盘目录中的公钥文件导入RPM数据库中。
#导入公钥文件 rpm --import /media/cdrom/RPM-GPG-KEY-redhat-release
三、源代码编译安装程序
在Linux操作系统中搭建一些大型服务时,考虑兼容性与功能的扩展,通常会选择源代码安装软件。其实最早的Linux操作系统整体上都是编译安装而成的。本节将学习如何从源代码编译安装应用程序。
1.源代码编译安装程序的优势
Linux 操作系统之所以能够在十余年的时间里发展壮大以至风靡全球,其开放源代码和操作简单的特性是很重要的原因之一。即Linux操作系统中包括内核在内的所有软件都可以获得源代码,并且可以经过定制修改后编译安装。
现代的Linux发行版本通常使用软件包管理机制对软件进行打包安装,这样省去了软件的编译安装过程,大大简化了Linux操作系统的安装和使用难度。但是在有些情况下,仍然需要使用源代码编译的方式为操作系统安装新的应用程序,如以下几种情况:
安装较新版本的应用程序时:大多数的Linux发行版都提供了相当丰富的应用程序,而这些程序的版本往往滞后于该软件的最新源代码版本。下载应用程序的最新源代码包并编译安装,可以在程序功能、安全补丁等方面得到及时更新。
当前安装的程序无法满足应用需求时:对于RPM格式封装的应用程序,一般只包含该软件所能实现的一小部分功能,而难以由用户自行修改、定制。通过对程序的源代码进行重新配置并编译安装后,可以定制更灵活、更丰富的功能。许多Linux服务器程序都采用源代码编译的方式进行安装,以获得更适于企业实际应用需求的服务。
为应用程序添加新的功能时:当需要利用现有的程序源代码进行适当的修改以便增加新的功能时,必须释放出该软件的源代码,修改后再重新编译安装。
从以上几点可以看出,应用程序的源代码编译安装为使用者提供了更加灵活的程序功能定制途径,这也是开放源代码软件的魅力所在。
2.编译安装的基本过程
大前提编译源代码需要有相应的开发环境
接下来我们将以安装Apache为实例来理解编译安装
当前目录下有一个源码包
2.1安装我们编译安装的大前提:开发环境
例子:
#安装开发环境 yum -y install gcc* pcre* apr*
2.2解压源码包
例子:
#用生成的值和官网发布版本时生成的校验值作对比,判断源码包是否被篡改 md5sum httpd-2.2.15.tar.gz
#解压Apache的源码包 tar zxvf httpd-2.4.25.tar.gz
2.3 配置
在Linux操作系统中通过源代码方式安装软件时,也可以将所有程序文件安装到同一个文件夹(如./configure --prefix=/usr/local/Apache)中,这样当需要卸载软件时,只要直接将该文件夹删除即可,非常方便(某些软件也可以在源代码目录中执行“make uninstall”命令完成卸载)。如果软件的功能比较复杂,配置过程会需要一定的时间,期间会在屏幕中显示大量的输出信息。这些信息可以帮助管理员了解程序配置的过程。配置结果将保存到源代码目录的Makefile文件中。如果配置过程中出现错误,如包含“error”、“failed”或“not found”等关键字,通常是缺少相关的依赖软件包所致,此时只要根据提示安装对应的软件即可。
#切换到httpd-2.4.25目录下查找文件configure cd httpd-2.4.25/ ./configure --prefix=/usr/local/httpd
2.4 编译
编译的过程主要是根据Makefile文件内的配置信息(若上一步的配置操作失败,将无法进行编译),将源代码文件进行编译生成二进制的程序模块、动态链接库、可执行文件等。配置完成后,只要在源代码目录中执行“make”命令即可进行编译操作。编译的过程比配置过程需要更长的时间,期间同样会显示大量的执行过程信息。
./config 后查看是否生成二进制文件:make
#执行二进制程序 make
2.5 安装
编译完成以后,就可以执行如下的“make install”命令将软件的执行程序、配置文件、帮助文档等相关文件复制到Linux操作系统中了,即应用程序的最后“安装”过程。安装过程需要的时间相对要短一些,期间也会显示安装的过程信息。
安装 make install
总体的命令可以写为:
tar zxvf httpd-2.4.25.tar.gz && cd httpd-2.4.25/ && ./configure --prefix=/usr/local/httpd && make && make install
tar zxvf httpd-2.4.25.tar.gz && cd httpd-2.4.25/ && ./configure --prefix=/usr/local/httpd && make && make install
四、使用
1.启动
/usr/local/httpd/bin/apachectl start
2.编辑配置文件
vim /usr/local/httpd/conf/httpd.conf
3.重新启动
3.1
netstat
Linux 系统自带的网络状态分析工具,用于显示网络连接、路由表、接口统计等信息参数组合
-anpt
-a 显示所有活动的网络连接和监听端口 -n
以数字形式显示 IP 地址和端口号(而非主机名和服务名) -p 显示与连接关联的进程 ID(PID)和进程名称 -t 仅显示 TCP 协议相关的连接
3.2
(文章中多次提到)管道符:|
将前边命令的输出作为后边命令的输入
3.3
验证
curl 127.0.0.1
浏览器中访问: