软件管理
软件运行和编译
在Windows上,我们可以通过exe或者msi格式的安装包来使用指引的方式将我们想要的软件按照我们的需求安装到我们的电脑上,同时还可以设置软件应该放置在哪。软件的全局变量、注册表配置、开机自启等功能都会一并自动配置。
但到了Linux上,也有相应的工具来帮助我们自动安装所需工具。但在Linux的安装却无法指定安装。为什么?
Linux的安装包打包后一般为rpm(rhel)或deb(debian)等后缀。在安装包其中已经指定好了二进制程序放置的路径在哪,不可更改。yum,apt,dnf等包管理工具只是执行找到的安装包里的命令,并不能更改其中的具体路径参数。所以Linux中的自动化安装也有自己的缺点。
但Linux中可以二进制安装。即下载对应的压缩包文件而不是安装包文件。自己放置到对应目录后再手动写出配置文件或修改其中自带的配置文件。然后完成安装,这样会提供更大的自定义空间,但操作会更麻烦。
本身使用Linux就是个麻烦 ( ´•̥̥̥ω•̥̥̥` )
软件接口概念
首先介绍一下应用程序的早期标准,也就是软件是怎么实现统一的。这个接口的作用是对软件的编译提供一个统一的标准。如果两台设备系统不同,但遵从一样的接口格式,那么在A设备可以编译后运行的代码,在B设备上同样可以编译后运行。
软件接口是连接软件与操作系统的底层桥梁
ABI
Application Binary Interface :应用程序二进制接口
注:在 windows 中与 linux 中的 ABI 格式是不兼容的(各自有各自的标准)
- windows 中的是 PE ( Portable Executable ) 格式
- Linux 中的是 ELF ( Executable and Linkable Format ) 格式
linux 中不同版本的 ABI 由于格式相同,所以程序也是互相通用的
(可能因为内核版本等原因可能会存在不支持的情况,但你一定能通过寻找旧版本软件去进行使用)
API
Application Programming Interface,API接口在现在、可以在 Windows 和 linux 提供完全相同的接口。虽然本身在这些系统上的实现却可能迥异。
早期的 API 在 Windows 上和 Linux 上其实也使用的不同标准。但后来因为软件移植需求日益增大, POSIX 标准被规定了出来。
POSIX:Portable Operating System Interface :可移植操作系统接口。定义了操作系统应该为应用程序提供的接口。现在 Linux 和 Windows 都要实现基本的 POSIX 标准。程序就可以在源码层面上可以移植了
注:但真正移植还是需要做兼容性调整。因为双方只是遵从基本的标准,但一些细小方面的实现方式还是不同。直接将代码移植编译只会导致出错。
软件包和包管理工具
Linux 中有着官方的包管理工具用于对软件进行管理。同时也得了解一下软件包的来源
软件包介绍
在接口标准等等没现在规范时,开源软件基本只提供 .tar.gz 打包的源码文件(这可以减少开发者的上传时间,源码的大小远远小于编译好后的程序大小)。同时那时候的包管理工具效果很差,它只会查看你要安装的程序需要什么依赖,然后需要你手动一个个下载,甚至有些依赖它根本不告诉你,只能去依靠询问作者或查找WIKI去确定问题所在。
现在网络发达后,其中基本都是编译好的二进制文件了,你只需要解压,放置在你想放置的目录下。然后配置变量和系统管理就可以像指令安装的程序一样使用了。
(有些作者可能会制作成rpm,deb包之类的,但不建议下载这个离线安装。因为可能还需要一些依赖之类的,使用更现代的包管理直接安装可以自动安装依赖)
包管理工具
软件包管理器功能:
将编译好的应用程序的各组成文件打包一个或几个程序包文件,利用包管理器可以方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
主流的程序包管理器:
- redhat:rpm文件, rpm 包管理器,rpm:Redhat Package Manager,RPM Package Manager
- debian:deb文件, dpkg 包管理器
包命名
源代码打包文件命名
1 | name-VERSION.tar.gz|bz2|xz |
rpm包命名方式
1 | name-VERSION-release.arch.rpm |
常见的arch:
- x86: i386, i486, i586, i686
- x86_64: x64, x86_64, amd64
- powerpc: ppc
- 跟平台无关:noarch
分类和拆包
软件包为了管理和使用的便利,会将一个大的软件分类,放在不同的子包中。
包的分类
- Application-VERSION-ARCH.rpm: 主包
- Application-devel-VERSION-ARCH.rpm 开发子包
- Application-utils-VERSION-ARHC.rpm 其它子包
- Application-libs-VERSION-ARHC.rpm 其它子包
包的依赖
软件包之间可能存在依赖关系,甚至循环依赖,即:A包依赖B包,B包依赖C包,C包依赖A包,安装软件包时,会因为缺少依赖的包,而导致安装包失败。
解决依赖包管理工具:
- yum:rpm包管理器的前端工具
- dnf:Fedora 18+ rpm包管理器前端管理工具,CentOS 8 版代替 yum
- apt:deb包管理器前端工具
- zypper:suse上的rpm前端管理工具
程序包管理器相关文件
1 包文件组成 (每个包独有)
- 包内的文件
- 元数据,如:包的名称,版本,依赖性,描述等
- 可能会有包安装或卸载时运行的脚本
2 数据库(公共):/var/lib/rpm
- 程序包名称及版本
- 依赖关系
- 功能说明
- 包安装后生成的各文件路径及校验码信息
获取程序包的途径
软件包需要事先将源码进行编译后打包形成,获取包的途径如下:
系统发版的光盘或官方网站
CentOS镜像:
https://www.centos.org/download/
Ubuntu 镜像:
http://cdimage.ubuntu.com/releases/
第三方组织提供
Fedora-EPEL:Extra Packages for Enterprise Linux
https://fedoraproject.org/wiki/EPEL
https://mirrors.aliyun.com/epel/?spm=a2c6h.13651104.0.0.3bc47dfaZpesAr
Rpmforge:RHEL推荐,包很全,即将关闭
Community Enterprise Linux Repository:支持最新的内核和硬件相关包
软件项目官方站点
http://yum.mariadb.org/10.4/centos8-amd64/rpms/
http://repo.mysql.com/yum/mysql-8.0-community/el/8/x86_64/
搜索引擎
注意:第三方包建议要检查其合法性,来源合法性程序包的完整性
自己制作
将源码文件,利用工具,如:rpmbuild,fpm等工具制作成rpm包文件
包管理器 rpm
CentOS系统上使用rpm命令管理程序包
功能:安装、卸载、升级、查询、校验、数据库维护
包安装
1 | rpm {-i|--install} [install-options] PACKAGE_FILE… |
升级和降级
1 | rpm {-U|--upgrade} [install-options] PACKAGE_FILE... |
升级注意项:
- 不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
- 如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件不会直接覆盖老版本的配置文件,而把旧版本文件重命名(FILENAME.rpmnew)后保留
包查询
1 | rpm {-q|--query} [select-options] [query-options] |
包卸载
1 | rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ... |
包校验
在安装包时,系统也会检查包的来源是否是合法的
检查包的完整性和签名
1 | rpm -K | checksig rpmfile |
检查前一定要确保自己有对应的公钥文件
数据库
rpm包安装时生成的信息,都放在rpm数据库中
1 | [root@rocky86 v]# ll /var/lib/rpm |
可以重建数据库
1 | rpm {--initdb|--rebuilddb} |
包更新日志
1 | rpm -q --changelog packageName |
yum和dnf
CentOS使用 yum, dnf 解决 rpm 的包依赖关系
YUM: Yellowdog Update Modififier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具
CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的
yum/dnf 工作原理
yum/dnf 是基于 C/S 模式 metadata
- yum 服务器存放rpm包和相关包的元数据库
- yum 客户端访问yum服务器进行安装或查询等
yum 实现过程
先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下),当yum客户端利用yum/dnf工具进行安装包时,会自动下载repodata中的元数据,查询元数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装。
创建新源
当使用yum install xxx 或 yum update xxx 时
先去看源能不能连上,如果能连上,则下载源里面的 repodata(如果不是新源,则直接查询本地己存在的repodata)
然后再去 repodata 里面查询,是否有 xxx 包,如果有,则去源的服务器下载 xxx.rpm(包括依赖包)
然后开始安装,完成后删除包信息
yum命令
yum命令的用法
1 | yum [options] COMMAND |
显示仓库列表
格式:
1 | yum repolist [options]. |
安装程序包
1 | yum install [options] PACKAGE [...] |
卸载程序包
1 | yum remove [options] PACKAGE [...] |
升级和降级
1 | yum update [options] PACKAGE [...] #升级 |
查询
1 | yum info [options] PACKAGE [...] #查看程序包的 information 信息 |
仓库缓存
缓存目录为
centos8:/var/cache/dnf/
centos7:/var/cache/yum/
1 | yum clean [options] {metadata,packages,dbcache,expire-cache,all} #清空缓存 |
查看yum事务历史
yum 执行安装卸载命令会记录到相关日志中
日志文件 /var/log/dnf.log ( /var/log/yum.log )
1 | yum history [options] [info|list|redo|undo] |
安装及升级本地程序包
1 | yum localinstall|install [options] rpmfile1 [...] #安装本地RPM包 |
包组管理的相关命令
1 | yum grouplist [options] #列出所有包组 |
Ubuntu 软件管理
Debian 软件包通常为预编译的二进制格式的扩展名“.deb”,类似 rpm 文件,因此安装快速,无需编译软件。包文件包括特定功能或软件所必需的文件、元数据和指令
- dpkg:package manager for Debian,类似于rpm, dpkg是基于Debian的系统的包管理器。可以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项
- apt:Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基于客户/服务器架构(c/s)
rhel 系列与 debian系列包管理对比
APT 工作原理
在服务器上先复制所有DEB包,然后用APT的分析工具genbasedir根据每个DEB 包的包头(Header)信息对所有的DEB包进行分析,并将该分析结果记录在文件夹base内的一个DEB 索引清单文件中,一旦APT 服务器内的DEB有所变动,要使用genbasedir产生新的DEB索引清单。
客户端在进行安装或升级时先要查询DEB索引清单,从而获知所有具有依赖关系的软件包,并一同下载到客户端以便安装。当客户端需要安装、升级或删除某个软件包时,客户端计算机取得DEB索引清单压缩文件后,会将其解压置放于 /var/cache/apt/,而客户端使用apt-get install或apt-get upgrade命令的时候,就会将这个文件夹内的数据和客户端计算机内的DEB数据库比对,知道哪些DEB已安装、未安装或是可以升级的。
dpkg 包管理器
1 | dpkg [<option> ...] <command> |
apt 命令用法
Debian 使用 apt 工具集来管理包系统,apt-get 是其中一个常用的命令行工具,另外一款较为流行的命令行与 GUI 兼顾的工具是 aptitude ,之前最常用的 Linux 包管理命令都被分散在了 apt-get、apt-cache 和 apt-config 这三条命令中。
在 2014 年apt 命令发布第一个稳定版,Ubuntu 16.04 引入新特性之一便是 apt 命令,apt 命令解决了命令过于分散的问题,它包括 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 apt-config 命令中很少用到的功能。在使用 apt 命令时,用户不必再由 apt-get 转到 apt-cache 或 apt-config,提供管理软件包所需的必要选项
apt 相当于 apt-get、apt-cache 和 apt-config 中最常用命令选项的集合
apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。此外,启用的几个特性也非常有帮助。例如:可以在使用 apt 命令安装或删除程序时看到进度条,apt 还会在更新存储库数据库时提示用户可升级的软件包个数
apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令,也即可用 apt 替换部分apt-get 系列命令,但不是全部

1 | apt [options] command |