![Linux运维之道(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/228/33692228/b_33692228.jpg)
2.5 软件管理
2.5.1 Linux常用软件包类型
Linux中的软件包类型种类就像Linux发行版本一样丰富多样,但这种多样性也给用户带来了不少烦恼,终端用户需要考虑哪个软件包的格式适用于相应的Linux发行版本,因为很多特定的软件包格式仅适用于特定的发行版本。目前比较流行的软件包格式有:可直接执行的RPM与DEB、源代码形式的gzip与bzip2压缩包。
2.5.2 RPM软件包管理
RPM是RedHat Package Manager的简写,也即是红帽软件包工具。RPM格式的软件包最早在1997年被用在红帽的操作系统上,RPM设计思路是提供一种可升级、具有强大查询功能、支持安全验证的通用型Linux软件包管理工具。现在RPM软件包已经被应用到很多GNU/Linux发行版本中,包括Red Hat Enterprise Linux、Fedora、Novell SUSE Linux Enterprise、openSUSE、CentOS、Mandriva Linux等。CentOS 7光盘中的所有软件包均采用RPM格式。
1.安装与卸载RPM包
对于RPM软件包的安装,我们可以使用<rpm-i 软件包名称>这样的方式进行安装,但该命令默认选项为静默式安装,如果需要了解安装过程的信息,则需要使用-v来显示详细的信息,-h显示安装进度(安装进度以#符号标识)。
这里我们安装CentOS 7光盘中的ftp-0.17-51.1.el6.x86_64.rpm软件:
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_120.jpg?sign=1738856778-t7s9KfMfschl0LfnLm8H7nlIJN8i4hKP-0-55fdd10222d42abf4e1f562a70ecfb58)
如果安装时提示:package ftp-0.17-51.1.el6.x86_64 is already installed,则表示该软件包已经被安装。
某些软件在安装时,可以能提示缺少依赖软件包,如安装时提示:libenchant.so.1()(64bit) is needed by evolution-2.28.3-24.el6.x86_64,则表示安装evolution软件需要依赖libenchant.so.1文件,此时我们需要先安装相应的依赖软件包后才可以成功安装evolution软件。
对于RPM格式软件包的卸载,可以使用<rpm-e 软件包名称>这样的格式完成。
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_121.jpg?sign=1738856778-79ydM5UDX1YdZeA9hEnhPUxklW9nLpb0-0-e0e948df6b04d0902e9c48049b76c9b8)
RPM还提供了升级功能,使用<rpm-U 软件名称>这种方式,rpm会删除旧版本软件(仅保留配置文件),再安装新的软件版本。
2.软件包信息查询
RPM命令工具提供了强大的软件查询功能,使用<rpm-q >这样的格式可以进行大量的查询工作。查询时可以使用很多选项,具体描述如下。
-q 查询指定软件包是否已经安装,如果已安装则显示详细名称,否则显示package xxx[1] is not installed。
-qa 查询系统中已经安装的所有软件。
-qi 查询指定安装软件包的详细信息。
-ql 查询指定软件的安装路径与文件列表。
-qc 查询指定软件的配置文件。
-qf 查询指定文件由哪个软件所安装。
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_122.jpg?sign=1738856778-TqjMTMabLregiYjihb5lglqVUyWpNGID-0-f592c1e188f1324c355de4b24942d606)
使用rpm-q格式进行的查询仅针对已经安装的软件,如果你希望知道某个尚未安装的软件包的详细信息,则可以使用rpm-qp进行查询,如rpm-qpi ftp-0.17-51.1.el6.x86_64.rpm。
3.安全验证
RPM提供的验证功能可以随时追踪软件的状态,当软件被人篡改时,使用rpm-V命令就会提示该软件的哪些状态被修改,未被篡改的软件使用该命令将无任何提示。
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_123.jpg?sign=1738856778-FJ9VrNJiwvcMTIzf9zZ803v6TgzMYC2H-0-1dc947bd41f1cd0ff8970285cfa3bcea)
下面列出所有可能出现的提示字符及其含义。
◎ 5 —— MD5值已经改变。
◎ S —— 文件大小已经改变。
◎ L —— 链接文件的源已经改变。
◎ T —— 文件最后修改时间已经改变。
◎ D —— 设备改变。
◎ U —— 用户发生改变。
◎ G —— 组发生改变。
◎ M —— 包括权限与类型在内的模式已经改变。
◎ ? —— 不可读的文件。
2.5.3 使用YUM安装软件包
YUM是Yellow dog Update Modified的简写形式。YUM是改进版的RPM软件管理器,YUM很好地解决了RPM所面临的软件包依赖问题,大量的软件依赖会让RPM成为恶魔。YUM可以从很多源中搜索软件以及它们的依赖包,并自动安装相应的依赖软件。使用YUM安装软件时至少需要一个YUM源,YUM源就是存放有很多RPM软件的文件夹,用户可以使用HTTP、FTP或本地文件夹的方式访问YUM源。
1.设置YUM源
CentOS 7默认的YUM源定义文件存放在/etc/yum.repos.d/目录下,用户可以自行定义任意可以使用的YUM源,但文件名的扩展名必须是repo,其文件格式如表2-7所示。
表2-7
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_124.jpg?sign=1738856778-jjQVJ5IEgiG2VxAZBHif7tlyYzIDrPIx-0-e3498692b9a4b71b4f4a4c7867d0a071)
续表
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_125.jpg?sign=1738856778-beqPw6dXaLTWjcnJG75QqIr4rgJG2PH9-0-da248664fbac7f4316f986cd339c8b5d)
查看CentOS 7默认的YUM源/etc/yum.repos.d/CentOS-Base.repo的内容如下:
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_126.jpg?sign=1738856778-dKtiSLJokZFP4o8spDmHvgjrFCVMNQDH-0-3296a731b2d35ea9a7cda3f77053e1c2)
上面的yum源需要通过http协议连接互联网中的CentOS对应的软件共享服务器,如果你的计算机可以连接互联网的话,可以直接使用CentOS的这些资源免费安装各种软件包。但有时我们的主机可能无法连接外网,这是需要我们定义自己的yum源,下面我们通过创建media.repo文件,使用CentOS 7系统光盘作为YUM源,这里有个前提是,我们已经将光盘挂载到了/media/CentOS7目录下。修改YUM配置文件文件内容如下:
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_127.jpg?sign=1738856778-WSnM882AQqPLB3cNCDhqPTIPr7pay9vX-0-154dcd944a4dca0dca62e7c9a2cfec60)
2.YUM命令
描述:基于RPM的包管理工具。
用法:yum[选项][指令][软件包…]
选项:-y 执行非交互式安装,假定安装过程中出现的所有提示回答为YES。
指令: install package1[package2][...] 使用yum源安装软件包。
update[package1][package2][...] 使用yum源升级软件包。
check-update 检查yum源中所有可用的升级。
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_128.jpg?sign=1738856778-y1wLvsEyxwch2djj7GZJCLHzJA7hlOU9-0-a7d0967094340af7702d5f2e6193f309)
实例:
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_129.jpg?sign=1738856778-s4iwO2ASG0KrM0ebqL9GRQqBP6RcukRi-0-f66f0f7ac2325d2152ea9b4c0bfe772d)
2.5.4 YUM使用技巧
1.创建YUM源
当我们自己收集的软件越来越多时,有必要将这些软件汇总并创建属于自己的yum源,最终实现软件的高效、集中管理。实现步骤如下。
首先,需要安装createrepo。
其次,将所有的软件包保存在某个目录下,如/mysoft/。
最后,运行createrepo /mysoft即可。
2.YUM变量
有时你会在一个yum文件中看到类似$basearch这样的变量,以下给出了可以使用或参考的yum命令和yum配置文件内置的变量说明。
$releasever 代表系统发行版本号
$arch 代表CPU架构
$basearch 代表系统架构
$YUM0-9 使用Shell对应的0~9个同名变量替换
2.5.5 源码编译安装软件
软件的源代码是软件的原始数据,任何人都可以通过源代码查看该软件的设计架构与实现方法,但软件源代码不可以在计算机中直接运行安装。我们需要通过配置软件功能,然后将软件源代码通过编译转换为计算机可以识别的机器语言,最后才可以执行安装操作。不同于RPM或其他的二进制软件包的安装方式,通过源码编译安装的软件,使得安装者可以根据自己的需要定制自己的软件,这是实际工作中所需要的关键因素。
通过源码安装软件的具体步骤如下。
(1)我们所获得的软件源码一般都会被打包并压缩,常见的格式有.tar.gz或.tar.bz2格式。此时,我们需要使用前面所学的tar命令将压缩包解压,具体参数及功能可以参考2.1.4节“压缩及解压”的内容。
(2)运行configure脚本,通过特定的选项修改软件设置与功能,该脚本一般可以用来指定安装路径、开启关闭软件的特定功能等。脚本选项可以通过阅读安装说明或./configure--help查看软件支持的功能选项。而有些软件没有提供configure脚本,直接提供了makefile文件,则可以直接执行make编译步骤。
(3)运行make命令将软件源代码编译为计算机可以直接识别的机器语言。由于需要相应的编译软件才可以将源代码编译为机器语言,所以在执行configure脚本时就会检查对应的开发工具是否已安装,常用的开发工具有:gcc、python、perl、make、automake等,如果没有安装,则提示error错误。
(4)通过make install根据配置阶段指定的路径和功能将软件以特定的方式安装到指定位置。
下面从网络上下载Nginx软件作为演示案例。Nginx是当今流行的Web服务器软件,由于安装Nginx需要相关依赖软件,所以我们连同相关依赖包一起安装。
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_130.jpg?sign=1738856778-iUbweULuNgPOi2HqE0WppY8CfEuJpTTm-0-a8736d77a0c727cc9e78fff5421d32b8)
提示
configure的具体选项可以通过./configure--help了解详情,每个软件支持的选项功能不尽相同。
现在你可以通过浏览器输入如下本地IP地址浏览默认测试页面,如果一切正常,你会看到浏览器显示的页面信息。
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_131.jpg?sign=1738856778-mfVlDIoCKue6dGxh7JcveiGuf1neXQUH-0-50efae20574664ececfe7653bf987df2)
2.5.6 常见问题分析
1.软件包依赖问题
使用RPM安装时,如果系统提示软件之间有相互依赖关系,但当没有相关依赖包软件的情况下,则可以使用--nodeps选项来忽略依赖关系,在此,并不提倡用该选项来安装软件。此外,使用RPM卸载软件时,有时也会提示其他软件依赖于正要卸载的软件,一般提示如:libpcre.so.0()(64bit) is needed by (installed) grep-2.6.3-3.el6.x86_64这样的信息,同样可以使用--nodeps选项忽略依赖关系。
2.RPM数据库损坏
RPM软件包的相关数据库存放在/var/lib/rpm/目录下,如果数据库出现损坏,可以用rpm--rebuilddb修复数据库资料。
3.软件安装的时间问题
在安装软件时,系统有时会提示“warning:clock skew detected.”错误,这说明系统时间发生了严重的错误,可以通过date-s "2016-11-12 14:00"这种命令格式修改系统时间,并通过命令hwclock-w更新写入CMOS时间。
4.YUM繁忙问题
当我们使用yum命令进行安装、查询时,系统有时会提示如下信息:
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_132.jpg?sign=1738856778-QW2M9n6oSFWEE4DTr2n1NicIHUDcsOcx-0-9ef59b37462ab4be3eda82451ac54f88)
该提示说明有另外一个程序在使用YUM而导致了YUM被锁。有时候系统在后台进行自动升级时就会提示该信息,如果你确实想终止该YUM程序,可以使用kill命令杀死提示信息中的pid号,上面的提示信息说明pid为16613的进程正在使用YUM,执行kill 16613即可终止该进程。或者通过重启计算机的方式也可以关闭正在调用yum的进程。
5.GCC编译器问题
使用源码安装软件的时候最常出现的就是相关依赖包没有安装的错误,一般会在运行configure脚本阶段检查并提示错误,经常由于没有安装gcc而报错,而很多软件需要gcc编译才可以安装,解决方法是使用yum安装gcc后,再次执行configure脚本即可。
2.5.7 服务管理
服务是被放置在后台运行的进程,有些是系统服务,有些则是独立的网络服务。对于这些服务,我们可以通过运行主程序来启动或关闭服务,也可以通过系统提供的systemctl命令来管理大量的服务,下面介绍这些不同的服务管理方法。
1.通过主程序管理服务
我们可以通过手动执行主程序来启动服务,例如,手动启动Nginx,仅需要知道其对应主程序的存储路径即可,我们可以通过执行/usr/local/nginx/sbin/nginx开启服务,并通过执行/usr/local/nginx/sbin/nginx-s stop来关闭服务。只要我们知道主程序的路径,就可启动相应的进程服务。大多数通过源码安装的软件都需要我们手动指定路径启动服务,或者自己编写脚本调用这些程序来实现更简单方便的服务管理。
2.通过systemctl管理服务
如果是通过RPM或者YUM安装,则应用程序一般会在/usr/lib/systemd/system/目录下创建对应的配置文件,我们可以通过系统提供的systemctl命令来管理这些服务。下面我们通过systemctl来管理ssh远程连接服务。
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_133.jpg?sign=1738856778-YzNEMrIM6UAlS3IcCkJbir4QnzB0i8sv-0-b9e45edb17dd695e7e78d1653b28e05f)
有时修改了服务的配置后,又不想关闭服务的情况下使新的配置生效,还可以通过reload参数来重新加载配置文件,甚至当你修改完配置文件后不知道新的设置是否正确,或者重启服务后是否会导致服务无法启动,可以使用condrestart选项,此时系统会测试新的配置文件是否有问题,没问题的情况下才会重启,否则不会使用新的配置来重启服务。
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_134.jpg?sign=1738856778-IXVu51KNzXRxckID1QCVXlPcEhZqcdpX-0-8c47877c4ea691e03a85badc7809efcd)
3.开机启动服务
由于Linux是服务器版的操作系统,所以我们需要将很多服务设置为开机启动,比如,我们希望计算机开机便可以提供Web网站服务、FTP下载服务、NFS共享服务等。
在CentOS 7系统中可以通过systemctl命令来管理开机启动项,该命令语法格式如下。
描述:更新与查询系统服务的运行级别信息。
用法:systemctl[选项]指令[服务名称]
指令:start 启动服务。
stop 关闭服务。
restart 重启服务。
enable 设置服务默认为开机启动服务。
disable 设置服务默认为开机禁用服务。
示例:
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_135.jpg?sign=1738856778-P4VJ0oAWlXnYCvm76J8YT6UBzjEFg8QC-0-55cb77e2b46ec64ca6a071e68b255948)
![img](https://epubservercos.yuewen.com/EC10C6/18002370908016406/epubprivate/OEBPS/Images/txt003_136.jpg?sign=1738856778-5hcWUa8zbjAFwy2CIonjo3l2bPEwNzMY-0-871bf65cf29c6633242369dbc967c6fd)