Linux 软件包安装

599 阅读14分钟

软件包分类

  • 源码包
    • 优点:开放的源程序,安全透明,可以修改,自由选择功能,更加适合安装的系统,运行效率高。
    • 缺点:编译安装,安装慢,如果出现报错处理起来很困难。
  • 二进制包
    • 优点:和 Windows 中的.exe文件一样,安装快,管理方便。
    • 缺点:因为已经编译成二进制了,所以不再能看见源代码,依赖性,手工安装十分繁琐。

二进制包

  • DPKG包:主要应用在 Debian 和 unbuntu 等系列中。
  • RPM包: 应用在 Red Hat系列中。

我学习使用的是 RedHat 系列中的 CentOS 所以下面主要说明RPM包:

RPM包依赖

所谓的依赖,就是指安装一个文件需要另一个文件提供的一些功能或者库支持,缺少了这些支持,文件就不能正常安装。依赖主要有以下三种:

  1. 树形依赖 :a------>b------->c
    • 解决办法:从末尾往前装
  2. 环形依赖 :a------>b------->c------->a
    • 解决办法:三个同时装
  3. 模块依赖

其中模块安装是依赖中最麻烦的一块。

模块依赖

例如,安装一个mysql-connector-odbc-5.2.5-8.el7.x86_64.rpm

[root@localhost Packages]# rpm -ivh mysql-connector-odbc-5.2.5-8.el7.x86_64.rpm 
警告:mysql-connector-odbc-5.2.5-8.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
错误:依赖检测失败:
        libodbcinst.so.2()(64bit) 被 mysql-connector-odbc-5.2.5-8.el7.x86_64 需要

从上面可以看见安装这个rpm包需要一个叫做libodbcinst.so.2()(64bit)的文件,那么这个文件是什么呢?

.so.2 数据库文件

这种以 .so.number 结尾的文件一般都是数据库文件,这种文件是不能直接在Linux下面直接安装的,它是包含在另外一个包里面的一个单独的文件,所以如果我们需要安装这个文件,就需要找到他在哪个包里面,将那个包进行安装。

这里我们可以通过 www.rpmfind.net 网站, 输入文件名查找它属于哪一个包里面,然后进行安装。

RPM包安装方法

  1. 手工安装:一步一步使用安装命令,解决依赖性进行安装。
  2. yum:二进制包的在线安装方法

1)手工安装

手工安装主要就是使用rpm安装命令进行安装。
rpm包命名规则下:
httpd-2.2.15-15.el6 centos.1.i686.rpm

编号 意义
httpd 软件包名
2.2.15 软件版本
15 软件发布次数
el6 软件发行商。el6 是 RedHat 公司发布,适合 Rhel6.x 和 CentOS6.x 下使用。
i686 适合的硬件平台。选择适合不同 CPU 的软件版本,可以最大化的发挥 CPU 性能,所以出现了所谓的 i386、i5 86、i686(奔腾II以上的计算机都可以安装,目前所有的CPU都是奔腾II以上)、x86_64(64为cpu)和 no arch(没有硬件限制)等文件名了。

rpm 相关命令

在介绍 rpm 的命令之前,先说两个概念需要着重区分:

包全名(带.xxx) 如果操作的是未安装的软件包,则使用包全名,而且必须是绝对路径。
包名(不带.xxx) 如果操作的是已经安装的软件包,则使用包名即可,系统会生产RPM包的数据库(/var/lib/rpm/)。

rpm 包安装

rpm -ivh 包全名
选项:
    -i          install 安装(install)
    -v          显示详细的信息(verbose)
    -h          打印#显示安装进度(hash)
    --prefix    指定安装路径
    --nodeps    不检测依赖性安装,此方法强行安装的软件是无法使用的,十分不推荐使用
    --force     强制安装,不管是否安装,都重复安装一次。主要用于误删除的情况下使用,不会修改已存在文件内容
    --test      测试安装。不会实际安装,只会检测一下依赖性

rpm -ivh --prefix=指定位置 ,但是 rpm 包的安装不建议指定安装路径。
rpm 包建议安装在默认路径中(作者决定)因为:

  1. 默认安装位置是系统的习惯位置。
  2. rpm 包管理系统是有卸载命令的(数据库记录安装位置),可以很方便的卸载。

rpm 包升级

rpm -Uvh 包全名
选项:
    -U      升级安装,如果没有安装过,系统直接安装。如果安装过的版本较旧,则升级到新版本(upgrade)
    -F      升级安装,如果没有安装过,则不会安装(freshen)。

rpm 包卸载

rpm -e 包名
选项:
    --nodeps    不检查依赖性
    -e          卸载

卸载也有依赖性。。

rpm 包查询

1)查询软件包是否安装

rpm -q 包名
选项:
    -q: 查询(queery)

2)查询本机系统中的所有安装软件包

rpm -qa
选项:
    -a:所有(all)

rpm -qa | grep 关键字
使用管道符来配合其他命令方便的查看所需的内容。
rpm -qa | wc -l
显示已安装包的数量

3)查询软件包的详细信息

rpm -qi 包名
选项:
    -i: 查询软件信息(info)
rpm -qip 包全名
选项:
    -p: 查询没有安装的软件包(package)

4)查询软件包中的文件列表

rpm -ql 包名
选项:
    -l: 列出软件包中所有的文件列表和软件所安装的目录(list)
rpm -qlp 包全名
选项:
    -p: 查询未安装软件包信息(package)

5)查询系统文件输入哪个rpm包

rpm -qf 系统文件名
选项:
    -f: 查询系统文件属于哪个软件包(file)

6)查询软件包所依赖的软件包

rpm -qR 包名
选项:
    -f: 查询软件包的依赖性(requires)

这会列出所有依赖的包,不作任何区分,用处不大。

rpm包验证

rpm -Va
选项:
    -Va 校验本机已安装的所有软件包     

这个指令不经常使用,太耗费时间。

rpm -V 包名
选项:
    -V 校验指定rpm包中的文件(verify)

这个指令比较常用。

rpm -Vf 系统文件名
选项:
    -Vf 校验某个系统文件是否被修改

例如:

[root@localhost Packages]# rpm -V httpd
S.5....T.  c /etc/httpd/conf/httpd.conf

最前面共有8个信息内容,是表示验证内容的。文件名前面的 c 表示这是个配置文件(configuration)。最后是文件名。那么验证内容中的8个信息的具体内容如下:

标识 意义
S 文件大小是否改变
M 文件的类型或文件的权限(rwx)是否改变
5 文件的MD5校验和是否改变(可以看出文件内容是否改变)
D 设备的主从代码是否改变
L 文件路径是否改变
U 文件的所有者是否改变
G 文件的属组是否改变
T 文件的修改时间是否改变
标识 文件类型
c 配置文件(config file)
d 普通文档(documentation)
g “鬼”文件(ghost file)很少见,就是该文件不应该被这个 rpm 包包含
l 授权文件(license file)
r 描述文件(read me)

rpm 包数字证书

刚刚的校验方法只能对已安装的 rpm 包中的文件进行校验,但是如果 rpm 包本身被动过手脚那么这种校验就是无效的。这时我们必须使用数字证书进行校验。 数字证书有如下特点:

  • 首先必须找到原厂的公钥文件,然后进行安装
  • 再安装rpn包时,会先去提取RPM包中的证书信息,然后和本机暗转打个原厂证书进行验证
  • 如果通过,则允许安装;若不通过则不允许安装并警告

1)数字证书位置

  1. 系统的安装光盘中
[root@localhost cdrom]# ll /mnt/cdrom/RPM-GPG-KEY-CentOS-7
-rw-rw-r--. 3 root root 1690 12月 10 2015 /mnt/cdrom/RPM-GPG-KEY-CentOS-7
  1. 系统中
[root@localhost cdrom]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 
-rw-r--r--. 1 root root 1690 4月   8 06:01 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

2)数字证书的导入:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
查询已安装好的数字证书:

[root@localhost cdrom]# rpm -qa | grep gpg-pubkey
gpg-pubkey-f4a80eb5-53a7ff4b

提取rpm包中文件

使用 cpio 命令,这个命令原本是用来备份还原文件的,但是用于使用起来太过于麻烦所以并不会使用。但是想要从 rpm 包中提取文件只能使用这个命令,所以这里着重学习他的提取功能。

将文件提取到当前目录下
rpm2cpio 包全名 | cpio -idv .文件绝对路径
rpm2cpio 是将 rpm 包转换为 cpio 格式的命令 cpio 是一个标准工具,用于创建软件档案文件和从档案文件中提取文件
例如:

rpm2cpio /mnt/cdrom/Packages/httpd-2.4.6-93.el7.centos.x86_64.rpm | cpio -idv ./etc/httpd/conf/httpd.conf

注意: 这里命令中的 . 是必须的,如果不写的话,他会将文件提取到 rpm 包的默认安装目录,从而将源文件直接覆盖,这是不被允许的。

2)rpm 包在线安装(yum 安装)

yum 源 文件解析
yum 源都存放在 /etc/yum.repos.d/ 下面,

[root@localhost yum.repos.d]# ls
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo    CentOS-Vault.repo
CentOS-CR.repo    CentOS-fasttrack.repo  CentOS-Sources.repo  CentOS-x86_64-kernel.repo

默认使用的是 CentOS-Base.repo 基础库,这个是需要联网的。
下面是源文件内容说明:

 13 [base]
 14 name=CentOS-$releasever - Base
 15 mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
 16 #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
 17 gpgcheck=1
 18 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
名字 意义
[base] 容器名称,一定要放在[]中。
name 容器说明,可以自己随便写。
mirrorlist 镜像站点,这个可以注释掉。
baseurl 我们的yum源服务器地址。默认是CentOS官方的yum源服务器。可以自定义,改成自己喜欢的yum源地址。
enabled 此容器是否生效,如果不写或 enabled=1 则表示该容器生效,enabled=0 则表示该容器不生效。
gpgcheck 如果为1则表示rpm的数字证书生效;如果为0则表示不生效。
gpgpkey 数字证书的公钥文件保存位置。不用修改。

搭建本地光盘yum源
步骤如下

  1. 放入 CentOS 安装光盘,并挂载光盘。
  2. 修改其他几个 yum 源配置文件的扩展名,让他们失效,因为只有扩展名为 *.repo 的文件才能作为yum源配置文件,不建议删除,不然以后想改回来就麻烦了。
  3. 修改光盘yum源配置文件 CentOS-Media.repo
     14 [c7-media]
     15 name=CentOS-$releasever - Media
     16 # 修改下面的地址为光盘挂载路径
     17 baseurl=file:///mnt/cdrom/
     18 # 注释掉下面两个地址
     19 #        file:///media/cdrom/
     20 #        file:///media/cdrecorder/
     21 gpgcheck=1
     22 # 修改enabled=1
     23 enabled=1
     24 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    
  4. 使用 yum list 命令查看是否生效 zziplib.x86_64 0.13.62-12.el7 c7-media 最后一列为 c7-media 则代表生效了。

yum命令

命令 意义
yum list 查询yum源服务器上所有已安装和可安装的的软件包列表。
yum list 包名 查询单个软件包
yum search 关键字 查询所有包含关键字的软件包,也可以用来某个命令在哪个包中。
yum info 包名 查询指定软件包的信息。
yum -y install 包名 安装,-y 自动回答yes。
yum -y update 包名 如果不加包名则会升级系统中的所有软件包。
yum remove 包名 卸载指定的软件包。

注意: 因为 yum 卸载会自动处理依赖关系,所以他会卸载掉所有依赖要卸载包的软件包,就是把他上级的软件包都卸载,这有可能照成系统奔溃。使用 yum 卸载的时候需要慎重。

yum组管理命令

命令 意义
yum group list 查询可用的软件组。
yum group search 关键字 搜索软件组。
yum group install 软件组名 安装软件组。
yum group remove 软件组名 卸载软件组。

注意: 在 CentOS7 中已经没有单独的语言组了,现在被包含在 Fonts 这个软件组当中。

源码包安装

如果软件包是给大量用户提供访问,建议使用源码包安装,如 LAMP 环境搭建,因为源码包效率更高。
如果软件包给 Linux 底层使用,或只给少量客户访问,建议使用 rpm 包安装,因为 rpm 包安装简单。

源码包的安装必须指定安装位置(源码包没有安装数据库,没有删除命令),不然卸载的时候会非常难办。
例如 Apache 的源码包安装目录:

配置文件:/usr/local/apache2/conf/httpd.conf
网页位置:/usr/local/apache2/htdocs/
日志位置:/usr/local/apache2/log/
启动方法:/usr/local/apache2/bin/apachectl start

安装流程

  1. 下载源码包
  2. 解压缩
  3. 进入解压目录
  4. ./configure 进行编译前准备
    1. 在安装之前需要检测系统环境是否符合安装要求。
    2. 定义需要的功能选项。一般通过 ./configure --prefix=安装路径 来制定安装路径。
    3. 把系统环境的检测结果和定义好的功能选项写入 Makefile 文件,后续的编译和安装需要依赖这个文件的内容。
    • 注意configure 不是系统命令,而是源码包软件自带的一个脚本程序,所以必须采用 ./configure 的方式执行。
  5. make 编译
    make 会调用 gcc 编译器,并读取 Makefile 文件中的信息进行系统软件编译。这个目的是为了把源码程序转变成能被 Linux 识别的可执行文件。
  6. make clean 清空编译内容
    如果在步骤4,5 时报错,需要清空产生的 Makefile 文件或编译产生的 .o 头文件
  7. make install 编译安装
    真正的安装过程,会看见安装位置的创建等等。

源码包报错

源码包是否报错可以通过如下情况判断,有时候可能只是警告之类的,并没有报错。

  1. 安装过程必须停止。
  2. 是否出现no、warning、error 等关键字。

报错之后需要执行 make clean 命令,清空错误编译产生的文件。

源码包的卸载只需要删除安装目录即可

打入补丁

在软件需要进行更新和修复的时候,可以采用打入补丁的方式。但是现在采用这种方式的软件很少见。

补丁的生成

# 比较old和new文件的不同
diff 选项 old new
选项:
    -a      将任何文档当做文本文档处理
    -b      忽略空格造成的不同
    -B      忽略空白行造成的不同
    -I      忽略大小写造成的不同
    -N      比较两个目录时,如果某个文件只在一个目录中,则在另一个目录中视作空文件
    -r      当比较目录时,递归比较子目录
    -u      使用同一输出格式

oldnew 一定要是绝对路径。
生成的补丁文件内容如下:

  1 --- /root/test/old.txt  2020-05-06 15:46:41.175431592 +0800
  2 +++ /root/test/new.txt  2020-05-06 15:27:13.104330578 +0800
  3 @@ -2,6 +2,3 @@
  4  1231254125612
  5  klasdjflkasjdf
  6  1251252255
  7 -1111111111111
  8 -222222222
  9 -33333

内容前面的 +- 代表了更新内容的删除和增加。

打入补丁

patch -pn < 补丁文件
选项:
    -pn n位数字。代表按照补丁文件中的路径,指定更新文件的位置。

例如当前在 /root/test 目录中(需要打补丁的旧文件就在当前目录下),补丁文件中记录的文件目录为 /root/test/old.txt ,如果写入 -p1(在补丁文件目录中取消一级目录)这里就是取消了 / 根目录,那么补丁文件会打入 /root/test/root/test/old.txt 文件中,这显然不对,所以我们应该写 -p3(在补丁文件目录中取消三级目录),那么补丁文件会打入 /root/test/old.txt ,这就对了,所以参数应该是 -p3

不过一般来说需要打补丁的软件都会告诉你如何去执行这个命令,不需要我们自己来考虑。

脚本安装包

这个包其实就是一个 Shell 脚本,它把所有安装源码包或者二进制包的手工命令都写入这个脚本,然后执行脚本就会自动执行这些命令,本质上还是安装的二进制包或源码包。安装过程基本上就和Windows中安装软件一样,根据提示输入信息,下一步就行。