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的缩写,由Red Hat公司开发,并不是所有发行版中都使用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

标签: none

讨论讨论讨论!