13 Linux 软件包介绍
13.1 软件包分类
软件包分类
-
源码包
-
二进制包
13.1.1 源码包
-
开源,如果有足够的能力,可以修改源代码
-
可以自由选择所需的功能
-
软件是编译安装,所以更加适合自己的系统,更加稳定也效率更高
-
卸载方便
源码包的缺点:
-
安装过程步骤较多,尤其安装较大的软件集合时(如LAMP环境搭建),容易出现拼写错误
-
编译过程时间较长,安装比二进制安装时间长
-
因为是编译安装,安装过程中一旦报错新手很难解决
13.1.2 二进制包
二进制包分类
-
DPKG包:是由Debian Linux所开发出来的包管理机制,通过DPKG包,Debian Linux就可以进行软件包管理。主要应用在Debian和unbuntu中。
-
RPM包:是由Red Hat公司所开发的包管理系统。功能强大,安装、升级、查询和卸载都非常简单和方便。目前很多Linux都在使用这种包管理方式,包括Fedora、CentOS、SuSE等。我们学习的是CentOS 6.3,所以我们将要学习RPM包管理系统
RPM包的优点:
-
包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载
-
安装速度比源码包安装快的多
RPM包的缺点:
-
经过编译,不再可以看到源代码
-
功能选择不如源码包灵活
-
依赖性。有时我们会发现需要安装软件包a时需要先安装b和c,而安装b时需要安装d和e。这是需要先安装d和e,再安装b和c,最后才能安装a包。比如说,我买了个漂亮的灯具,打算安装到我们家客厅,可是在安装灯具之前我们家客厅总要有顶棚吧,顶棚总要是做好了防水和刷好油漆了吧,这个装修和安装软件其实类似总要有一定的顺序的。可是有时依赖性会非常繁琐
13.2 rpm包安装
13.2.1 rpm包命名规则
httpd-2.2.15-15.el6.centos.1.i686.rpm
httpd | 软件包名 |
---|---|
2.2.15 | 软件版本 |
15 | 软件发布的次数 |
el6 | 软件发行商。 |
i686 | 适合的硬件平台。 |
rpm | rpm包的扩展名 |
包全名:如果操作的是未安装软件包,则使用包全名,而且需要注意绝对路径
包名:如果操作的是已经安装的软件包,则使用包名即可,系统会生产RPM包的数据库/var/lib/rpm/),而且可以在任意路径下操作
13.2.2 依赖性
1)树形依赖 a---->b---->c 2)环形依赖 a---->b---->c---->a 3)函数库依赖 什么是模块依赖?我们举一个例子,尝试安装以下文件:
[root@localhost Packages]# rpm -ivh mysql-connector-odbc-5.2.5-7.el7.x86_64.rpm
错误:依赖检测失败:
libodbc.so.2()(64bit) 被 mysql-connector-odbc-5.2.5-7.el7.x86_64 需要
libodbcinst.so.2()(64bit) 被 mysql-connector-odbc-5.2.5-7.el7.x86_64 需要
发现报错,需要安装“libodbc.so.2”函数库文件,这时会发现在光盘中根本找不到这个文件。那是因为函数库没有单独成包,是包含在某一个软件包中的。而如果要知道在哪个软件包中,需要查询网站www.rpmfind.net,如图:
13.2.3 rpm包手工命令安装
1)默认安装位置
安装目录 | 描述 |
---|---|
/etc/ | 配置文件安装目录 |
/usr/bin/ | 可执行的命令安装目录 |
/usr/lib/ | 程序所使用的函数库保存位置 |
/usr/share/doc/ | 基本的软件使用手册保存位置 |
/usr/share/man/ | 帮助文件保存位置 |
2)RPM包安装
安装命令:
[root@localhost ~]# rpm -ivh httpd-2.2.15-15.el6.centos.1.i686.rpm
#注意一定是包全名。如果跟包全名的命令要注意路径,因为软件包在光盘当中
选项:
-i install安装(install)
-v 显示更详细的信息(verbose)
-h 打印"#"显示安装进度(hash)
服务启动:
[root@localhost ~]# systemctl restart httpd
3)RPM包升级
[root@localhost ~]# rpm –Uvh 包全名
选项:
-U(大写) 升级安装,如果没有安装过,系统直接安装。如果安装过的版本较旧,则升级到新版本(upgrade)
-F(大写) 升级安装,如果没有安装过,则不会安装。必须安装有较旧版本,才能升级(freshen)
4)卸载
[root@localhost ~]# rpm -e 包名
选项:
--nodeps 不检查依赖性
-e 卸载
5)查询
查询软件包是否安装
[root@localhost ~]# rpm –q 包名
选项:
-q: 查询(query)
查询系统中的所有安装软件包
[root@localhost ~]# rpm -qa
选项:
-a:所有(all)
查询软件包的详细信息
[root@localhost ~]# rpm –qi 包名
选项:
-i: 查询软件信息(information)
-p: 查询没有安装的软件包(package)
查询软件包中的文件列表
[root@localhost ~]# rpm –ql 包名
选项:
-l: 列出软件包中所有的文件列表和软件所安装的目录(list)
-p: 查询没有安装的软件包信息(package)
查询系统文件属于哪个RPM包
[root@localhost ~]# rpm –qf 系统文件名
选项:
-f: 查询系统文件属于哪个软件包(file)
查询软件包所依赖的软件包
[root@localhost ~]# rpm –qR 包名
选项:
-R: 查询软件包的依赖性(requires)
6)验证
[root@localhost ~]# rpm –Va
选项:
-a 校验本机已经安装的所有软件包
-V 校验指定RPM包中的文件(verify)
-f 校验某个系统文件是否被修改
验证内容 | 描述 |
---|---|
S | 文件大小是否改变 |
M | 文件的类型或文件的权限(rwx)是否被改变 |
5 | 文件MD5校验和是否改变(可以看成文件内容是否改变) |
D | 设备的主从代码是否改变 |
L | 文件路径是否改变 |
U | 文件的属主(所有者)是否改变 |
G | 文件的属组是否改变 |
T | 文件的修改时间是否改变 |
配置文件类型 | 描述 |
---|---|
c | 配置文件(config file) |
d | 普通文档(documentation) |
g | “鬼”文件(ghost file),比较少见 |
l | 授权文件(license file) |
r | 描述文件(read me) |
7)数字证书
传统的校验方法只能对已经安装的RPM包中的文件进行校验,但是如果RPM包本身就被动过手脚,那么校验就不能解决问题了。安全性较高的场景下就必须使用数字证书验证
数字证书有如下特点:
-
首先必须找到原厂的公钥文件,然后进行安装
-
再安装RPM包是,会去提取RPM包中的证书信息,然后和本机安装的原厂证书进行验证
-
如果验证通过,则允许安装;如果验证不通过,则不允许安装并警告
数字证书位置
#系统中的数字证书位置
[root@localhost ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
数字证书导入
[root@localhost ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
选项:
--import 导入数字证书
查询系统已安装证书
[root@localhost ~]# rpm -qa | grep gpg-pubkey
13.2.4 rpm包在线安装(yum安装)
1)yum源文件解析
yum源配置文件保存在/etc/yum.repos.d/目录中,文件的后缀名一定是“.repo”。也就是说,yum源配置文件只要扩展名是“.repo”就会生效。
[root@localhost ~]# ll /etc/yum.repos.d/
total 40
-rw-r--r--. 1 root root 1664 Oct 23 2020 CentOS-Base.repo
-rw-r--r--. 1 root root 649 Oct 23 2020 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root 314 Oct 23 2020 CentOS-fasttrack.repo
-rw-r--r--. 1 root root 630 Oct 23 2020 CentOS-Media.repo
-rw-r--r--. 1 root root 8515 Oct 23 2020 CentOS-Vault.repo
这个目录中有5个yum源配置文件,默认情况下CentOS-Base.repo文件生效。我们打开这个文件看看,命令如下
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
…省略部分输出…
-
[base]:容器名称,一定要放在[ ]中。
-
name:容器说明,可以自行更改。
-
baseurl:我们的yum源服务器的地址。默认是CentOS官方的yum源服务器
-
enabled:此容器是否生效,如果不写或写成enabled=1则表示此容器生效,写成enabled=0则表示此容器不生效
-
gpgcheck:如果为1则表示RPM的数字证书生效;如果为0则表示RPM的数字证书不生效。
-
gpgkey:数字证书的公钥文件保存位置。不用修改。
2)搭建阿里云网络yum源
[root@localhost ~]# vim /etc/yum.repos.d/aliyun.repo
[Aliyun]
name = Aliyun
enable = 1
baseurl = http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck = 1
gpgkey = http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[root@localhost ~]# yum clean all &&yum repolist
3)yum命令
查询
# 查询yum源服务器上所有可安装的软件包列表。
[root@localhost ~]# yum list
# 查询yum源服务器中是否包含某个软件包
[root@localhost ~]# yum list 包名
# 搜索yum源服务器上所有和关键字相关的软件包。
[root@localhost ~]# yum search 关键字
# 查询指定软件包的信息
[root@localhost ~]# yum info 包名
安装
[root@localhost ~]# yum -y install 包名
选项:
install 安装
-y 自动回答yes。如果不加-y,那么每个安装的软件都需要手工回答yes
升级
[root@localhost ~]# yum -y update 包名
选项:
update: 升级
-y: 自动回答yes
卸载
[root@localhost ~]# yum remove 包名
4)yum组管理命令
查询可以安装的软件组
[root@localhost ~]# yum grouplist
查询软件组内包含的软件
[root@localhost ~]# yum groupinfo 软件组名
安装软件组
[root@localhost ~]# yum groupinstall 软件组名
卸载软件组
[root@localhost ~]# yum groupremove 软件组名
13.3 源码包安装
13.3.1 如何选择哪种软件包
-
如果软件包是给大量客户提供访问,建议使用源码包安装,如LAMP环境搭建,因为源码包效率更高。
-
如果软件包是给Linux底层使用,或只给少量客户访问,建议使用rpm包安装,因为rpm包简单。
13.3.2 源码包是从哪里来
rpm包是光盘中直接包含的,所以不需要用户单独下载。而源码包是通过官方网站下载的,如果需要使用,是需要单独下载的。
13.3.3 安装过程
13.3.4 删除
源码包没有删除命令,如果需要删除,直接删除安装目录即可。
13.3.5 打入补丁
1)补丁的生成
[root@localhost ~]# diff 选项 old new
#比较old和new文件的不同
选项:
-a 将任何文档当做文本文档处理
-b 忽略空格造成的不同
-B 忽略空白行造成的不同
-I 忽略大小写造成的不同
-N 当比较两个目录时,如果某个文件只在一个目录中,则在另一个目录中视作空 文件
-r 当比较目录时,递归比较子目录
-u 使用同一的输出格式
2)示例
[root@localhost ~]# mkdir test
#建立测试目录
[root@localhost ~]# cd test
#进入测试目录
[root@localhost test]# vi old.txt
our
school
is
atguigu
#文件old.txt,为了一会输出便于比较,每行分开
[root@localhost test]# vi new.txt
our
school
is
atguigu
in
Beijing
#文件new.txt
比较下两个文件的不同,并生成补丁文件“txt.patch”,命令如下:
[root@localhost test]# diff -Naur /root/test/old.txt /root/test/new.txt > txt.patch
#比较两个文件的不同,同时生成txt.patch补丁文件
[root@localhost test]# vi txt.patch
#查看下这个文件
--- /root/test/old.txt 2021-6-4 05:51:14.347954373 +0800
#前一个文件
+++ /root/test/new.txt 2021-6-4 05:50:05.772988210 +0800
#后一个文件
@@ -2,3 +2,5 @@
school
is
atguigu
+in
+beijing
#后一个文件比前一个文件多两行(+表示)
3)打入补丁
[root@localhost test]# patch –pn < 补丁文件
#按照补丁文件进行更新
选项:
-pn n为数字。代表按照补丁文件中的路径,指定更新文件的位置。
“-pn”说明下。补丁文件是要打入旧文件的,但是你当前所在的目录和补丁文件中的记录的目录是不一定匹配的,所以就需要“-pn”来同步两个目录。
比如我当前是在“/root/test”目录中(我要打补丁的旧文件就在当前目录下),补丁文件中记录的文件目录为“/root/test/old.txt”,这时如果写入“-p1”(在补丁文件目录中取消一级目录)那么补丁文件就会打入“/root/test/root/test/old.txt”文件中,这显然是不对的。那如果写入的是“-p2”(在补丁文件目录中取消二级目录)那么补丁文件打入的就是“/root/test/test/old.txt”,这显然也不对。如果写入的是“-p3”(在补丁文件目录中取消三级目录)那么补丁文件就是打入的“/root/test/old.txt”,我们的old.txt文件就在这个目录下,所以就应该是“-p3”。
那么更新下“old.txt”文件,命令如下:
[root@localhost test]# patch -p3 < txt.patch
patching file old.txt
#给old.txt文件打补丁
[root@localhost test]# cat old.txt
#查看下old.txt的内容吧。
our
school
is
atguigu
in
Beijing
#多出来了in Beijing两行
13.4 脚本安装程序
脚本程序包并不多见,所以在软件包分类中并没有把它列为一类。它更加类似于Windows下的程序安装,有一个可执行的安装程序,只要运行安装程序,然后进行简单的功能定制选择(比如指定安装目录等),就可以安装成功,只不过是在字符界面下完成的。
目前常见的脚本程序以各类硬件的驱动居多。Atlassian 系列软件均是采用脚本安装程序
可以参考: