青蛙学Linux—软件安装
与Windows下通过双击EXE安装包安装软件不同,Linux下可以使用多种方法来安装软件。由于Linux开源的特性,所以在Linux上运行的很多软件都是开源软件,开源软件一般都会提供源码,有了源码我们就可以自己通过编译源码来安装软件;不同的Linux发行版提供了不同的软件包管理方式,如RedHat所使用的RPM和Debain使用的dpkg包管理器,通过包管理器就可以很方便的安装和管理相应的软件包;在Linux下还可以很方便的通过客户端/服务器架构的包管理器从远端服务器上下载并安装软件包,这些包管理器可以从软件源服务器上查找和下载指定的软件包,并自动安装指定软件包的依赖环境,通过一条命令就可以安装软件包和解决依赖,这些包管理器有RedHat使用的YUM和Debian使用的APT等;还有些软件提供了编译好的二进制程序,解压之后直接运行这些二进制程序即可,类似于Windows下的绿色软件。
这篇文章将在CentOS 7.5环境下介绍软件的安装。
1、通过源码安装软件
大部分在Linux下运行的开源软件都会提供源码的下载,我们可以下载源码之后自己编译安装软件。通过源码安装软件有很多的好处:通过源码安装可以将软件安装到指定的目录,而不像使用包管理器会将不同的文件放置在不同的位置,如可执行文件可能在/usr目录,配置文件可能在/etc目录,将所有文件放置在同一目录可以方便我们的管理,当需要卸载软件时只要将软件的安装目录删除即可;通过源码安装可以自定义需要安装的功能,不需要的功能就可以不用安装。但是源码安装也有它的缺点,比如编译时需要其他软件包的支持,也称为软件依赖;源码安装比较繁琐,编译时可能花费比较长的时间,中间还要解决软件依赖,安装起来比较困难。
1.1、源码安装的基本过程
1.1.1、搭建编译环境
在源码安装之前,需要把编译环境构建好。在源码编译过程中需要一些开发工具的支持,比如gcc、gcc-c++、libgcc、glibc、make、automake等开发工具和基础包;还要安装一些相应的开发包,一般是以包名-devel命名的软件包,如glibc-devel、gettext-devel等(如果源码安装过程中提示缺少某软件包但是该软件包已经安装,可以检查是否该包的开发包即包名-devel是否安装);还有一些开发库,比如以lib开头的开发库。这也是为什么在安装系统时需要选择安装开发工具等软件包的原因。
1.1.2、下载源码包
编译环境构建完毕后,就是下载源码包了。软件的源码包一般都是tar.gz格式的,下载下来后经过解压即可得到该软件的源码。
解压完成后,进入源码目录,一般都要README或INSTALL文件、Doc目录,这些都是源码的帮助文档,会提供安装使用等相应的帮助。
1.1.3、分析安装平台
源码目录下一般会存在一个名为configure的脚本文件,该文件用于对整个环境进行检测、指定安装位置以及选择安装的功能等。不同软件的configure支持的参数各不相同,具体参考软件的安装说明;--prefix参数指定软件的安装位置,该参数是通用的。使用以下命令运行该脚本:
./configure [参数]
configure将会检测环境中是否包含有编译安装所需的软件包,如果缺少软件包则会在运行结束时进行提示,安装好相应的软件包之后必须再次运行configure,直到configure运行结果不包含错误为止,才可以进行下一个步骤。
1.1.4、编译
configure运行无错误之后,就可以进入编译环节了。make是我们经常用到的编译命令,其主要功能是通过makefile文件来实现的。makefile文件是按照某种语法来进行编写的,文件中定义了各个源文件之间的依赖关系,并说明了如何编译源文件并生成可执行文件,它通过描述各个源程序之间的关系让make自动完成编译工作。
在编译过程一般使用以下命令:
使用make进行编译
make
make编译时不一定一次成功,在编译时也有可能会提示需要依赖某些软件包等,在解决错误提示之后,必须再执行make进行重新编译。此时重新编译生成的新文件将会覆盖上次编译的旧文件,但是经过多次make后可能会使这些文件产生错误,此时可以使用以下命令清除上次make产生的文件:
make clean
直到make执行完成无报错之后才能继续下面的步骤。
1.1.5、将编译后的文件移动到指定路径
源码安装的最后步骤就是将编译完成后生成的文件移动到指定的目录,该目录一般通过configure的--prefix参数指定。最后的步骤非常简单,只要执行以下命令即可:
make install
1.2、一个例子:源码安装Python 3.7
1.2.1、构建编译环境
系统在安装的时候已经选择了开发工具等基础软件包,所以这里先不进行,等configure的时候再看看是否有缺少的依赖包。
1.2.2、下载解压源码包
进入Python的官网,找到Python 3.7的下载链接,然后通过wget将源码包下载下来。这里已经将Python 3.7下载到当前目录:
[root@localhost ~]# ls anaconda-ks.cfg Python-3.7.1.tgz
这里下载的包为tgz包,其实就是tar.gz的缩写,使用以下命令解压这个包:
[root@localhost ~]# tar -zxvf Python-3.7.1.tgz
解压后我们得到了一个源码目录:
[root@localhost ~]# ls anaconda-ks.cfg Python-3.7.1 Python-3.7.1.tgz
进入Python-3.7.1目录,我们会看到以下文件:
这里可以看到前面介绍的configure、README.rst和Doc目录。Python还提供了install-sh安装脚本和通过Python安装的setup.py脚本。这里我们先打开README.rst文件,看看里面的内容(直接找到如何安装章节):
1.2.3、分析安装平台
这里将把Python 3.7安装到/usr/local目录下(一般都会将稳定使用的软件安装到该目录)的python37目录,所以这里对configure指定--prefix参数:
[root@localhost Python-3.7.1]# ./configure --prefix=/usr/loacl/python37
等待运行结束,查看输出的结果:
没有错误信息,说明configure执行成功,可以进入下一个步骤了。
1.2.4、编译
执行以下命名,并等待运行结束返回结果:
[root@localhost Python-3.7.1]# make
make运行需要一定的时间,耐心等待,完成之后返回以下信息:
没有错误信息,编译成功,可以进入下一个步骤了。
1.2.5、将编译后的文件移动到指定路径
执行以下命令:
[root@localhost Python-3.7.1]# make install
只要make阶段没有错误,一般来说make install就不会出错。等待make install执完毕。此时进入/usr/local/python37可以看到以下内容:
可执行文件一般都位于bin目录下,我们进入该目录查看内容:
其中的python3.7就是可执行文件了,运行该文件,就可以进入Python环境,这里我们来测试下经典的Hello World:
至此,Python 3.7的源码安装结束。如果想要卸载Python 3.7,只要执行以下命令删除python37这个目录即可:
[root@localhost local]# rm -rf python37
2、通过RPM包管理工具安装软件
RPM,Red Hat Package Manager,Red Hat软件包管理,由Red Hat公司开发的Linux软件包管理工具。由于该管理工具在软件安装和管理方面非常方便易用,逐渐被其他Linux发行版使用,现在已经成为Linux下通用的一种软件包管理方式。另外一种流行的工具为Debian开发的dpkg。
RPM软件包以.rpm结尾。每个RPM文件中包含了已完成编译的二进制可执行文件,本质为将源码进行编译安装然后封装成RPM文件。
优点:安装简单方便,因为软件已经编译完成打包完毕,安装只是个验证环境和解压的过程。
缺点:对操作系统环境的依赖非常大,它要求RPM包的安装环境必须与RPM包的封装环境一致或相当;另外还需满足安装时的软件包依赖关系。
2.1、RPM包的种类及命名方式
RPM包的封装格式一般有两种,分别是RPM和SRPM,SRPM包也是一种RPM,但是它包含了编译时的源码文件和一些编译指定的参数文件,因而在使用的时候需要重新进行编译,通常SRPM文件名称类似于xxx.src.rpm。
我们来看下当前环境下使用的SSH的RPM包,它的名称如下:
openssh-server-7.4p1-16.el7.x86_64.rpm
它的组成可以分为以下几个部分:
- openssh-server:软件名称
- 7.4p1:软件的版本号
- 16:软件更新发行的次数
- el7:这个RPM包适用的操作系统版本,el7代表以RHEL 7.x版本构建的系统,如CentOS 7.x版本
- x86_64:这个RPM包适用的硬件平台,如32位或者64位平台,这里的x86_64表示适用于64位平台
2.2、RPM包管理工具的常用命令
RPM包管理工具的命令语法如下:
rpm 动作[辅助选项] 需要操作的RPM包或二进制文件
- 动作:对这个RPM包进行的操作,如安装、删除等
- 辅助选项:为这个动作提供各种功能
2.2.1、安装
安装RPM包的命令语法如下:
rpm -i[辅助选项] 后缀为.rpm的RPM包
常用辅助选项:
- -v:显示附加信息
- -h:安装时输出“#”进度条
- --test:只对安装进行测试,并不实际安装
- --nodeps:不检查软件之间的依赖关系,加入此选项可能导致软件不可用
- --force:忽略软件包以及软件冲突
一个例子:安装telnet
当前环境中没有安装telnet,执行telnet命令将出现如下提示:
这时我们想通过RPM包来安装telnet。首先将telnet的RPM包下载下来,这里我们是CentOS 7.5的系统,所以要下载el7的RPM包:
接下来运行安装命令安装telnet的RPM包:
没有报错没有软件依赖,代表telnet已经安装成功了,我们执行telnet命令看看结果:
进入了telnet的交互环境,软件安装成功。
2.2.2、更新
更新RPM包的命令语法如下:
rpm -U[辅助选项] 后缀为.rpm的RPM包
常用辅助选项同安装RPM包。
2.2.3、查询
查询RPM包信息的命令语法如下:
rpm -q[辅助选项] 可执行二进制文件|系统中安装好的RPM包名|后缀为.rpm的RPM包
常用辅助选项:
- -f:查询某个可执行二进制文件对应的包名
- -p:查询以.rpm为后缀的软件包安装后对应的包名称
- -l:显示软件包中的所有文件列表。此选项后面跟软件包安装后对应的包名,而不是以.rpm为后缀的包
- -i:显示软件包的概要信息,例如软件名称、版本、适应平台、大小等等。此选项后面跟完整的包名,而不是以.rpm为后缀的包
- -a:查询系统中安装的全部软件包
两个例子:
我想知道命令ls是那个安装好的软件包提供的功能:
[root@localhost ~]# rpm -qf /usr/bin/ls coreutils-8.22-21.el7.x86_64
查看telnet安装好之后对应的软件包名:
[root@localhost ~]# rpm -qp telnet-0.17-64.el7.x86_64.rpm telnet-0.17-64.el7.x86_64
2.2.4、卸载
卸载一个已经安装好的RPM包的命令语法如下:
rpm -e[辅助选项] 系统中已安装的软件包名
常用辅助选项:
- -v:显示附加信息
- -h:卸载时显示“#”进度条
- --test:只执行卸载测试,而不真正卸载
- --nodeps:不检查依赖性
一个例子:删除刚才安装的telnet
首先查询出telnet对应的包名,然后执行卸载:
此时再执行telnet命令:
2.2.5、验证下载的RPM包
RPM包是否值得信任,是否损坏,可以通过RPM提供的选项进行验证。RPM软件包一般使用 Gnu 隐私卫士(GPG)来签名,从而帮助使用者验证下载的软件包是否可信。命令语法如下:
rpm -K 后缀为.rpm的RPM包
2.3、安装src.rpm包
- 执行命令rpm –i xxx.src.rpm
- 切换到目录/root/rpmbuild/SPECS(CentOS 5.x以前版本的路径是/usr/src/redhat/SPECS,从CentOS 6.x之后的版本路径变为/root/rpmbuild/SPECS)
- 执行命令rpmbuild –bb xxx.specs(xxx.specs是一个和软件包同名的specs文件)
- 在目录/root/rpmbuild/RPMS/x86_64下将会生成一个或多个RPM包,这些包是已经编译完成的RPM包
- 执行命令rpm –ivh安装这些生成的RPM包
3、通过YUM包管理器安装软件
YUM,Yellow dog Update,Modified,是一个RedHat以及基于RedHat的Linux发行版使用的基于客户端/服务器的软件包管理工具。通过YUM可以很方便的从服务器(YUM源)上下载指定软件的RPM包,并进行安装,YUM将自动处理该软件包的依赖关系,并且一次安装所有的软件包,无须繁琐地一次次下载安装。简单来说,就是在联网的主机上,只需要一条命令就可以安装软件,不用自己去下载软件包以及解决软件包的依赖问题。
3.1、安装YUM
一般来说,只要系统安装时选择了基础的软件包,则YUM就已经安装到你的系统里面。使用以下命令查看YUM是否已经安装(即查找YUM对应的RPM包是否存在):
rpm -qa|grep yum
如果以上命令无输出,则表示YUM尚未安装。YUM的RPM安装包可以在CentOS的安装介质上找到,使用以下命令安装YUM需要的软件包:
rpm -ivh yum-*.noarch.rpm
注意:yum的安装需要依赖python-elementtree、python-sqlite、urlgrabber、yumconf等软件包,这些包在CentOS的安装光盘中均可找到。
3.2、YUM配置文件和目录
YUM的主配置文件:
/etc/yum.conf
YUM源配置文件目录:
/etc/yum.repos.d
YUM源主配置文件:
/etc/yum.repos.d/CentOS-Base.repo
YUM缓存目录:
/var/cache/yum
3.3、YUM常用命令
YUM命令的基本语法如下:
yum [选项] 动作 [安装的软件]
常用选项:
- -q:静默执行
- -t:忽略错误
- -y:自动应答yes
- -C:完全从系统缓存运行,不升级缓存
- --skip-broken:忽略软件依赖
- --nogpgcheck:忽略GPG验证
3.3.1、安装/更新/删除软件包
安装|覆盖安装软件包:
yum install|reinstall 软件包
检查是否有可用的软件包更新:
yum check-update [软件包]
更新软件包|更新软件包同时考虑软件包取代关系:
yum update|upgrade [软件包]
更新软件包到指定版本:
yum upgrade-to [软件包]
已同步软件包到最新可用版本(YUM将根据情况选择是废弃|更新|降级软件包):
yum distribution-synchronization/distro-sync [软件包]
降级软件包:
yum downgrade [软件包]
删除软件包:
yum remove/erase 软件包
3.3.2、YUM缓存操作
清除缓存:
yum clean headers|packages|metadata|dbcache|plugins|expire-cache|rpmdb|all
重建缓存:
yum makecache
3.3.3、查看软件包信息/YUM源
列出软件包:
yum list 软件包
显示软件包的详细信息:
yum info 软件包
列出软件包的依赖关系:
yum deplist 软件包
显示已配置的YUM源:
yum repolist
3.3.4、搜索
查找提供指定内容的软件包:
yum provides 字符串
在软件包详细信息中搜索指定字符串:
yum search 字符串
3.4、YUM的常用插件
YUM的插件提供YUM的扩展功能。
3.4.1、YUM下载软件包插件
使用YUM的下载插件,可以只下载RPM而不进行安装。常用的有以下两种插件:
yumdownloader
该插件可以将软件包下载到当前目录,但仅下载指定的软件包,不会下载该软件包的依赖软件包。使用方法:
yumdownloader 软件包
注意:该插件位于软件包yum-utils中,默认没有安装。需要使用的话必须安装yum-utils软件包。
yum-downloadonly
该插件以yum命令的选项方式调用,会在下载指定软件包时一同下载该软件包的所有依赖软件包,同时可以下载到指定的目录。使用方法:
yum install --downloadonly --downloaddir=目录 软件包
3.4.2、YUM加速插件
YUM加速插件yum-fastestmirror可以自动选择最快的YUM源下载软件包。
插件配置文件:
/etc/yum/pluginconf.d/fastestmirror.conf
YUM源速度测试记录文件:
yum缓存目录下的timedhosts.txt
该插件默认安装,如果没有安装的话可以使用以下命令安装:
yum install yum-plugin-fastestmirror
3.5、更换YUM源
系统默认的YUM源服务器位于国外,可能会导致软件包下载速度缓慢,我们可以通过更换国内的一些YUM源来改善下载速度缓慢的问题。以下以CentOS 7.5更换默认YUM源为阿里云YUM源为例进行演示。
进入YUM源配置目录:
[root@localhost ~]# cd /etc/yum.repos.d
备份系统默认YUM源:
[root@localhost yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.backup
下载阿里云软件源配置文件,注意,下载的软件源配置文件必须与所用的系统对应:
wget -O CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
清理缓存:
yum clean all
生成新的缓存:
yum makecache
在运行yum命令时的回显中会显示当前使用的YUM源,在我们更换YUM源后的重新生成缓存阶段,通过回显即可看出当前正在使用的是阿里云的YUM源,说明YUM源的更换已经成功:
3.6、两个不错的YUM源
3.6.1、EPEL
EPEL,全称是企业版Linux附加软件包,是一个由特别兴趣小组创建、维护并管理的,针对红帽企业版Linux(RHEL)及其衍生发行版(例如CentOS、Scientific Linux)的一个高质量附加软件包项目。 其官方网址为:http://fedoraproject.org/wiki/EPEL/zh-cn, EPEL的软件包不会与企业版Linux官方源中的软件包发生冲突,或者互相替换文件。
EPEL提供RPM包,可以从EPEL的官网下载对应系统的RPM包进行安装以使用EPEL源,也可以通过YUM的方式安装EPEL源:
yum install epel-release
3.6.2、rpmforge
rpmforge是一个第三方的软件源仓库,也是CentOS官方社区推荐的第三方yum源,它为CentOS系统提供了超过10000个软件包,被CentOS社区认为是最安全也是最稳定的一个软件仓库。但是由于这个安装源不是CentOS本身的组成部分,因此要使用rpmforge,需要手动下载并安装。
rpmforge的官方网站是http://repoforge.org ,可以在http://repoforge.org/use/ 下载RHEL/CentOS各个版本的“rpmforge-release”包,这样就可以使用RPMForge提高的丰富软件了。
3.7、一个例子:安装telnet
当前系统未安装telnet,在命令行下执行:
[root@localhost ~]# telnet -bash: telnet: 未找到命令
下面我们要通过YUM来安装telnet。YUM安装软件非常简单,只要一条命令:
yum install telnet
命令执行之后,YUM连接服务器进行检查,并回显提示软件包的依赖关系、一共需要安装多少软件包,并提示是否进行安装:
输入”y“,安装就开始了:
测试:
进入telnet的交互环境,安装成功。接下来我们把telnet卸载掉,同样使用YUM进行:
yum remove telnet
YUM检查需要删除的软件包,并提示删除的软件包个数(删除时会同时删除该软件包的依赖包),输入y确认删除:
验证:
telnet已经无法使用,卸载成功。
4、二进制包方式使用软件
Linux下二进制格式的软件是指事先已经在各种平台编译安装好相关软件,然后压缩打包,在安装时只需解压或者执行安装可执行文件即可。二进制软件包的优点是安装简单、容易,缺点是缺乏灵活性,相应的软件包执行在对应平台下安装,离开这个环境软件就无法运行。
二进制软件包提供了很多类型的打包方式,如以tar.gz、tgz、tar.bz2等形式的压缩包。 这些格式的软件包,安装其实就是简单的解压过程,根据不同的软件打包格式,用对应的解压命令解压即可。解压完成后直接运行可执行的二进制文件就可以使用该软件了。