软件包分类
- 源码包
- 优点:开放的源程序,安全透明,可以修改,自由选择功能,更加适合安装的系统,运行效率高。
- 缺点:编译安装,安装慢,如果出现报错处理起来很困难。
- 二进制包
- 优点:和 Windows 中的
.exe文件一样,安装快,管理方便。 - 缺点:因为已经编译成二进制了,所以不再能看见源代码,依赖性,手工安装十分繁琐。
- 优点:和 Windows 中的
二进制包
- DPKG包:主要应用在 Debian 和 unbuntu 等系列中。
- RPM包: 应用在 Red Hat系列中。
我学习使用的是 RedHat 系列中的 CentOS 所以下面主要说明RPM包:
RPM包依赖
所谓的依赖,就是指安装一个文件需要另一个文件提供的一些功能或者库支持,缺少了这些支持,文件就不能正常安装。依赖主要有以下三种:
- 树形依赖 :a------>b------->c
- 解决办法:从末尾往前装
- 环形依赖 :a------>b------->c------->a
- 解决办法:三个同时装
- 模块依赖
其中模块安装是依赖中最麻烦的一块。
模块依赖
例如,安装一个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包安装方法
- 手工安装:一步一步使用安装命令,解决依赖性进行安装。
- 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 包建议安装在默认路径中(作者决定)因为:
- 默认安装位置是系统的习惯位置。
- 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)数字证书位置
- 系统的安装光盘中
[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
- 系统中
[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源
步骤如下
- 放入 CentOS 安装光盘,并挂载光盘。
- 修改其他几个 yum 源配置文件的扩展名,让他们失效,因为只有扩展名为
*.repo的文件才能作为yum源配置文件,不建议删除,不然以后想改回来就麻烦了。 - 修改光盘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 - 使用
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
安装流程
- 下载源码包
- 解压缩
- 进入解压目录
./configure进行编译前准备- 在安装之前需要检测系统环境是否符合安装要求。
- 定义需要的功能选项。一般通过
./configure --prefix=安装路径来制定安装路径。 - 把系统环境的检测结果和定义好的功能选项写入
Makefile文件,后续的编译和安装需要依赖这个文件的内容。
- 注意:
configure不是系统命令,而是源码包软件自带的一个脚本程序,所以必须采用./configure的方式执行。
make编译
make会调用 gcc 编译器,并读取Makefile文件中的信息进行系统软件编译。这个目的是为了把源码程序转变成能被 Linux 识别的可执行文件。make clean清空编译内容
如果在步骤4,5 时报错,需要清空产生的Makefile文件或编译产生的.o头文件make install编译安装
真正的安装过程,会看见安装位置的创建等等。
源码包报错
源码包是否报错可以通过如下情况判断,有时候可能只是警告之类的,并没有报错。
- 安装过程必须停止。
- 是否出现no、warning、error 等关键字。
报错之后需要执行 make clean 命令,清空错误编译产生的文件。
源码包的卸载只需要删除安装目录即可
打入补丁
在软件需要进行更新和修复的时候,可以采用打入补丁的方式。但是现在采用这种方式的软件很少见。
补丁的生成
# 比较old和new文件的不同
diff 选项 old new
选项:
-a 将任何文档当做文本文档处理
-b 忽略空格造成的不同
-B 忽略空白行造成的不同
-I 忽略大小写造成的不同
-N 比较两个目录时,如果某个文件只在一个目录中,则在另一个目录中视作空文件
-r 当比较目录时,递归比较子目录
-u 使用同一输出格式
old 和 new 一定要是绝对路径。
生成的补丁文件内容如下:
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中安装软件一样,根据提示输入信息,下一步就行。