软件包基础
软件包运行环境
硬件、内核、应用程序的关系
包管理器
程序包管理器
Linux不同系统上的包管理器
RPM的优点
rpm包命名方式
一般源代码的命名
rpm包的命名
rpm包的分类与拆包
包管理工具
RPM包管理器:
程序包管理器:
获取程序包的途径:
rpm包管理
CentOS系统上使用rpm
命令管理程序包:
安装
升级:
降级
降级实例
more
软件包基础
包管理过程中,最常用的操作有:安装、卸载、检查
软件包运行环境
硬件、内核、应用程序的关系
-
应用程序运行在内核之外,其中/bin/bash就是各种应用程序之一。
-
内核运行在计算机硬件与应用程序直接。主要工作就是CPU进程、内存的管理,磁盘输入输出等工作。
-
应用程序和内核直接的沟通需要接口。
区分以下两种接口: -
API:应用程序接口。
-
现成的开发包的工具,其动态的库以so结尾,静态的库以a结尾。这种接口中包含C语言中的stdio.h或者math.h这种文件,开发者在math.h中定义了sin()函数,所以在写C程序时,可以直接引入math.h文件,之后直接调用sin()函数。
-
ABI:应用程序二进制接口(application Binary interface)。
windows系统和linux系统在数据存储等方面,都存在差异性。所以如果想在windows上模拟linux环境,或者是在linux系统上模拟windows环境,需要编写模拟的是ABI的应用程序。也就是库级别的虚拟化:
-
它定义了一组在PowerPC系统软件上编译应用程序所需要遵循的一套规则。主要包括基本数据类型,通用寄存器的使用,参数的传递规则,以及堆栈的使用等等。它涵盖了各种细节:如数据类型、大小和对齐;调用约定(控制着函数的参数如何传送以及如何接受返回值);系统调用的编码和一个应用如何向操作系统进行系统调用;以及在一个完整的操作系统ABI中,目标文件的二进制格式、程序库等等。
API与ABI的不同
Java的代码可以在各个平台转移。这是因为java的代码是二次编译。
二进制文件hello.class可以在win或linux上运行。主要依靠jvm。jvm将windows命令转化成它同一的,在linux上也是。
所以二进制文件hello.class可以转移
包管理器
二进制应用程序的组成部分
二进制文件
库文件
配置文件
帮助文件
库文件:共用的程序模块(可无)
程序包管理器
Linux不同系统上的包管理器
系统名 | 包文件类型 | 包管理器 | 使用命令 | 线上升级机制(命令) |
---|---|---|---|---|
debian/Ubuntu | deb文件 | dpkg包管理器 | dpkg | APT(apt-get) |
redhat | rpm文件 | rpm包管理器(RPM Package Manager) | rpm,rpmbuild,rpmdb(centos7) | YUM(yum) |
RPM的优点
-
rpm包是通过预先编译并打包而成的,所以免除了重新编译的困扰
-
避免错误安装:rpm包安装前,会检查系统的硬盘容量,操作版本等。
-
更了解软件:该包本身提供软件版本资讯、依赖性软件名称、软件用途说明、软件所含文件等资讯
-
数据库。RPM的管理方式使用数据库记录RPM文件的相关参数,便于升级、移除、查询与验证。
rpm包命名方式
-
实例:yum-plugin-security-1.1.30-37.el6.noarch.rpm
其中: -
noarch和硬件平台无关
-
i686支持32位(也可以装在64位)
-
x86支持64位
一般源代码的命名
一般源代码名:name-VERSION.tar.gz|bz2|xz
其中,VERSION=major.minor.release
rpm包的命名
rpm包命名方式:
– name-VERSION-release.arch.rpm
其中
– VERSION=major.minor.release
– release:release.OS
– OS:上例中,el7是表示OS的,代表RHEL7
– 常见的arch有:
架构系列 | 常见架构 | 说明 |
---|---|---|
x86系列 | i386,i486, i586, i686 | i针对的是intel兼容的CPU的意思,后面的XXX表示不同的等级,不同的等级的CPU在针脚等方面或许会有不同 |
x86_64系列 | x64, x86_64, amd64 | 针对64位的CPU进行最佳化编译配置。包括Intel Core2以上等级,AMD Athlon64以上等级,都是这类。 |
powerpc | ppc | |
noarch | 没有硬件等级上的限制(跟平台无关) | 一般来说,这类型的RPM文件,里面应该没有二进制文件的存在,较常出现的就是属于Shell Script方面的软件 |
-
软件版本号:
主版本号,此版本号,修正版本号:在主版本的架构下,更动部分原始码内容,而释放出一个新的版本,就是次版本号。在此版本中,修正一些bug等,就是修正版本号。
-
软件的编译次数:
为何会有重新编译?因为某些原因(比如某些bug或者安全上的考虑),必须要进行小幅度的打补丁或重设一些编译参数。配置完成后重新编译打包,形成了新的rpm包。不同的打包数就出现了。
-
硬件平台
RPM可以适用在不同的操作平台上,但是不同的平台配置的参数还是有所差异的。针对性能比较高的CPU进行最佳化参数的配置,这样才能够适用高性能CPU所带来的硬件加速功能。这就是不同的arch。
rpm包的分类与拆包
如果将所有的功能与模块,放在同一个包中,不利于后来的管理和排错。所以最好将包按照功能等分类或拆开:
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm:开发子包
Application-utils-VERSION-ARHC.rpm:其它子包
Application-libs-VERSION-ARHC.rpm:其它子包
包管理工具
在包与包之间,若是有循环依赖的关系,需要有工具来解决以来关系,并安装。这种循环依赖的安装,如果只是一步一步的安装解决依赖关系,那就太耗费人力物力了,这时,就需要使用一些前端工具来自动解决依赖关系。
解决依赖包管理工具:
工具 | 作用 |
---|---|
yum | rpm包管理器的前端工具 |
apt-get | deb包管理器前端工具 |
zypper | suse上的rpm前端管理工具 |
dnf | Fedora 22+ rpm包管理器前端管理工具 |
RPM包管理器:
程序包管理器:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
-
1、包文件组成(每个包独有)
RPM包内的文件
RPM的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本 -
2、数据库(公共) <===已经安装了的包的详细信息,记录这些东西,以后可能检查会用到。检查现在的程序是否有改变,比如有效用户等。
程序包名称及版本
依赖关系
功能说明包
安装后生成的各文件路径及校验码信息 -
管理程序包的方式:
-
使用包管理器:rpm
使用前端工具:yum,dnf
获取程序包的途径:
(1)系统发版的光盘或官方的服务器;
CentOS镜像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2)项目官方站点
(3)第三方组织:Fedora-EPEL:Extra Packages for EnterpriseLinux
Rpmforge:RHEL推荐,包很全
搜索引擎:(专门用于搜索软件包)
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
(4)自己制作
需要对源码分析了解,才能够制作rpm包
** 注意:检查其合法性:来源合法性;程序包的完整性**
rpm包管理
CentOS系统上使用rpm
命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护
安装
rpm {-i|--install} [install -options] PACKAGE_FILE...
-
-v: verbos
-
-vv
-
-vvv
-
-h:以#显示程序包管理执行进度(50个)
常用命令:
rpm -ivh PACKAGE_FILE ...
选项:
-
–test:测试安装,但不真正执行安装;dry run模式
-
–nodeps:忽略依赖关系
-
–replacepkgs|replacefiles ##保存原来修改过的配置文件,(除非某配置文件没有,才会写入)
-
replacepkgs:原来损坏的软件和现在要装的包,版本等是相同的。
-
replacefiles:包名都不一样。原来的和现在的,有些库等,会重复,可以用这个。有点类似于升级了。
-
–nosignature:不检查来源合法性
由于现在网络等问题,无法检测signature时,也会说不合法 -
–nodigest:不检查包完整性
-
–noscipts 参数:不执行程序包脚本片断
脚本 | 名称 | 对应选项 |
---|---|---|
%pre | 安装前脚本 | –nopre |
%post | 安装后脚本 | –nopost |
%preun | 卸载前脚本 | –nopreun |
%postun | 卸载后脚本 | –nopostun |
升级:
-
使用格式:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE... rpm {-F|--freshen} [install-options] PACKAGE_FILE...
-
二者区别
-
upgrade:安装有旧版程序包,则“升级”(升级意味着,如果有新版本,老版本就没了)
– 如果不存在旧版程序包,则“安装” -
freshen:安装有旧版程序包,则“升级”
– 如果不存在旧版程序包,则不执行升级操作 -
常用命令
rpm -Uvh PACKAGE_FILE ... rpm -Fvh PACKAGE_FILE ...
-
内核的升级
往往不是升级,而是安装新的内核
这样新旧内核就可以同时存在,使用新内核过程中出现问题,就继续使用旧内核。 -
内核也可以降级
notes:
(1)不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核
(2)如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
降级
常在新包不稳定的时候使用降级,获得稳定的版本使用
-
–oldpackage:降级(这个得配置i才能够装的上-i –oldpackage)
-
–force:强行(可以省去好多其他选项:–replacepkgs…..等 )
降级实例
6.8—>6.7
需要安装的是这两个包
当前系统内核:
可以看出,爆出来的这个问题,并不是那么严重
装完后,系统中同时存在原来的和现在的,这主要是因为原来版本和现在版本安装时,很多文件是相同的,冲突了。所以不会直接覆盖。看/boot启动目录中,都是两个了。
more
rpm -l可以查看包的文件列表,但是看不到脚本
原创文章,作者:m20-吴清玲,如若转载,请注明出处:http://www.178linux.com/39858