Windows 里安装软件通过扩展名 .exe 的应用程序来安装,那 Linux 中安装软件包是通过的应用程序是带有可执行权限的二进制程序。这些软件包是如何生成的?

应用程序:在 Linux 中没有扩展名的概念,在 Linux 中是带有 x 权限的就是可执行程序。

应用程序的生成首先从源码开始后编译成二进制文件(可执行文件)与我们 CPU 架构进行匹配,再进行链接,链接是指一个应用程序与内核上的 .so 库文件(shared object)进行引用。库文件还分静态库与动态库,链接也分静态链接过程和动态链接过程,静态链接是把库文件集成到应用程序中不需要再,动态是直接引用库文件。

程序是数据加上指令,当应用程序运行时,申请CPU和内存资源,内存的地址空间有 TEXT(存放运行的指令)、DATE((存放数据))+BSS(block system of symbol用于初始化为0的变量)、堆(heap存放运行中的临时文件)、栈(stack存放应用程序的变量和函数等)。

应用程序中会包含二进制文件(可执行程序)、库、配置文件、帮助文件

RPM介绍

RPM全称为Red Hat Package Manager的缩写,由 RedHat 公司开发,并不是所有发行版中都使用 RPM,Redhat 与 SUSE 是使用 RPM 而 Debian 使用的是 dpt。

软件包依赖关系它们是由依赖关系的, A---B---C 安装软件时需要先安装被依赖软件包,卸载时需先卸载依赖的软件。也就是说安装的先安装 C 再安装 B 最后安装 A,卸载时则先卸载 A 再卸载 B 再卸载 C。

这么多依赖关系我们如何解决,在 Linux 中有前端工具与后端工具,前端工具有 yum(这个我们前面就使用过)、apt-get(Debian中使用的),这些工具不需要我们关注依赖关系。后端有有 RPM、dpt(纯手动解决依赖关系)。

那我们为什么要学 RPM 呢?直接使用 yum 不是更方便吗?来看看 RPM 优点

  1. RPM 软件包中包含了编译过的程序与配置文件,用户不用重新编译源码。
  2. RPM 在安装之前首先会检查硬盘容量,操作系统版本等信息,避免被错误安装
  3. RPM 使用 RPM 数据库管理,数据库中记录了一些应用程序的参数(权限配置文件等等),便于升级、卸载、查询、验证等。(数据库路径:/var/lib/rpm)
  4. RPM 会提供应用程序版本信息,相关属性,软件名称,用途等,便于用户连了解这个软件。

RPM 包中还分主包与子包的区分,主包是主要功能,子包是提供扩展功能。要使用子包必须得先有主包,没有主包就没有子包。

RPMpackge.png

主包

  • yum-3.4.3-154.el7.centos.noarch.rpm

子包

  • yum-cron-3.4.3-154.el7.centos.noarch.rpm

yum 是包名,3 是主版本号,4 是此版本号,3 发行版本号(释放版本也叫编译版本),154 是指发布次数,el7代表发行版本(这个包适用于 Enterprise Linux 7.x版本),x86_64 架构信息代表适用于 64 位CPU架构上,32 位是 i386、i586、i686,有些包没有具体平台写的是 noarch 则代表都兼容,rpm 是扩展名。而子包在主包名后面会跟上子包名

  • name-version-release.arch.rpm
  • bind-major.minor.release-release.arch.rpm

主版本号是功能指有了重大才修改 ,此版本号是指某个子功能发生重大改变,发行号是修正了bug或调整了一些功能。

在Linux中有两种常见的软件包,第一个种是RPM在前面介绍过它,它是已经编译好的软件包,第二种是.tar.gz这种则是源码包。

RPM 命令

安装

语法:rpm -ivh name.rpm

一些选项

  • -i(install),安装软件包
  • -h(hash),用#显示进度,每个#表示2%。
  • -v,显示进度
  • -vv,显示一堆调试信息扩进度

当我们用 RPM 安装时会提示失败的依赖关系,前面我们说了 RPM 是后端工具,并不是像 yum 一样是前端工具,可以解决依赖关系,那这样是不是无法安装了呢?

install-error.png

我们可以加上:

  • --nodeps,忽略依赖关系,可能导致软件安装的不完整。
  • --replacepkgs,重新安装与--force差不多
  • --force,强制安装,可以实现重装替换原有安装。

nodeps.png

查询
语法:rpm -q Path/package_name

  • -q(query),查询包是否安装
  • -a(all),查询系统上所有安装的包
  • -i(information),查询包的说明信息
  • -f(file),查文件(一般是查二进制程序当然也可查其他文件)属于哪个软件包,例如:rpm -qf which /usr/bin/ls
  • -l,查询包安装后生成的文件列表
  • -c,查询安装包的配置文件
  • -d,查询包帮助文档
  • --scripts,查询指定包中包含的脚本,包含软件包安装前(preinstall),安装后(postinstall),卸载前(preuninstall),卸载后(postuninstall)执行的脚本

一些包没安装,如果要查它说明信息、以及安装后会生成的文件可以用下面的选项:

  • -qpi,p是packge,用于查询未安装包的信息
  • -qpl,查询未安装包列表

升级:

  • -U(upgrade),如果有装老版本就升级,没有就安装一个相当于-i。
  • -F(freshen),仅仅升级,以前没有安装就退出。
  • --oldpackage,降级(用得少)

降级可能有依赖关系可以用--nodeps不检查依赖关系

卸载
-e(erase) #卸载指定包

卸载可能有依赖关系可以用 --nodeps 不检查依赖关系

校验

  • -V(verify) #校验包的完整性

我把配置文件修改和删了

verify.png

它会检查安装文件的完整性,出了错会显示它的状态码,下面是手册中的状态码。

c %config configuration file.
d %doc documentation file.
g %ghost file (i.e. the file contents are not included in the package payload).
l %license license file.
r %readme readme file.
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
P caPabilities differ

重建数据库

我们在前面说过 RPM 是有数据库的,在 /var/lib/rpm 下,如果没数据库我们的操作会无法进行。

  • --rebuilddb,重建数据库,把数据库重新建立一遍。
  • --initdb,初始化数据库(类似修复),没有数据库才建立。

校验来源合法性与软件包完整性

  • rpm -K packge_file

在每安装一个安装包后会在/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7文件中检验包的完整性

rpm-K.PNG

DSA,RSA,PGP用于验证来源合法性,也就是验证签名;可以用 --nosignture,略过此项
sha1,md5 验证软件包完整性;可用 --nodigest 略过此项

如果其中有不合法可以导入密钥文件,用 rpm --import FileName 导入到目录中,文件是在 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7,Red Hat中是 /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

最近更新:

发布时间:

摆哈儿龙门阵