Linux的各个release版本开发商,在发布各种应用程序,以及一些团体发布应用程序时,通常会根据发布的程序所适应的开发语言,使用环境,预设参数等,事先编译完成一个可以在相应平台上安装的程序包供使用者直接使用,该程序包含有安装前(preinstall)操作系统环境检测的脚本,程序包中所有文件的相关信息,程序预定义的配置参数文件,程序运行时的解释器库文件,程序的二进制文件,以及程序安装后(postinstall)把相应信息写入程序管理平台的预设脚本,以方便于后续程序自身升级,卸载等,最终上述一个完整的程序包被release发布。
针对此类发布的程序包目前常见有两种管理方式:
1、DPKG方式:主要由Debian系列的release版本使用,如Ubuntu;
2、RPM方式:主要由RedHat系列,如RHEL,CentOS,Fedora以及Slackware系列的S.u.S.E等等;
此外由于程序包在preinstall时会根据脚本检查是否满足安装条件,例如安装本程序前需要预先存在其他一个或多个程序(程序的相互依赖性),如果满足则进行后续安装过程,如果不满足则退出安装过程;所以,为了简化方便程序包的安装,Linux的开发商同时提供了一种面向使用者的程序包管理的前端工具,目的就是为了解决程序的依赖性安装,以及程序的更新升级,卸载,查询等日常管理使用。针对上述两种方式分别使用1、apt-get工具;2、yum工具。
RPM和SRPM区别
1、RPM(RedHat Packages Manager):是由Distribution厂商预先根据release版本已编译打包完成的程序包;
2、SRPM(Source RPM):是由Distribution厂商提供的未编译的,含有原始码的程序包;
程序包的命名定义格式
程序名-主版本号.次版本号.修正号-release发布号.Distribution版本.arch架构(i386/i586/i686/x86_64等)
YUM工具
由于RPM程序包在安装前会检查程序依赖性,如果不符合,则无法正常安装,此时,其前端工具YUM程序应运而生。YUM原理机制如下:
1、YUM服务器端,含有全部或者大部分RPM程序包,并生成所有程序包的清单列表(repository仓库清单);
2、客户端主机安装指定程序包时,首先根据RPM包中的preinstall脚本检查主机硬件以及OS内核是否满足安装环境要求,其次检查安装程序的其他软件依赖性要求,从YUM服务器下载程序包清单列表,对照依赖性要求检查主机是否满足,如果存在未安装的依赖性程序包软件,则向YUM服务器提交下载相应程序包的请求,并安装完成,通过依赖性检查后,正式安装指定的程序包,安装完成以后,把该程序包的相应信息记录在主机本地的RPM数据库中,供日后查询,升级,卸载等操作使用;
YUM服务器保存清单列表的路径:…./repodata/
主机保存本地清单的路径:/var/cache/yum/
主机RPM程序包管理数据库路径
RPM管理程序
一、RPM安装
rpm {-i|–install} [install-options] PACKAGE_FILE …
-i:install 安装
-v:verbose 详细过程信息
-vv:更详细的过程信息,类似debug信息
-h:hash 以hash进度条的方式显示安装进行,默认是2%一个进度步长
–nodeps:忽略程序包依赖性检查
–test:测试性安装,dry run模式,并非实际的真实安装
–noscripts:安装时不执行预设置的脚本,更细化的脚本(禁用)
–nopre
–nopost
–nopreun
–nopostun
–nosignature:忽略数字签名检查
–justdb:RPM数据库破坏或者有错误存在,可以利用此选项来更新程序包在RPM数据库中的信息
–percent:如果程序包是被打包压缩的形式提供,则此选项可以在安装时显示解包的进度百分比信息
–force:强制安装,如果已存在相应文件或者程序包则覆盖安装,同时包含replacefiles以及replacepkgs两个选项功能
–replacefiles:如果已存在需安装的文件,则直接覆盖原文件
–replacepkgs:如果存在需安装的程序,则直接覆盖原程序
–prefix NEWPATH:安装程序到指定的路径(而非程序包预先配置的默认路径)
二、RPM更新与升级
rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
rpm {-F|–freshen} [install-options] PACKAGE_FILE …
upgrade:无则安装,有则更新
freshen:无则错误,有则更新
option可选项基本与install操作相同
三、RPM查询,如果是已经被安装过的程序包,实际就是查询/var/lib/rpm下的数据库;如果是尚未安装的程序包,则是查询repository仓库中的数据库
rpm {-q|–query} [select-options] [query-options] PACKAGE_NAME
-q:仅查询package_name指定的程序
-qa:查询package_name指定的所有程序
-qf:查询后面指定的file是属于哪个已经安装的程序
-qi:列出查询程序的详细信息(information),包括Distribution,release,说明等等
-ql:列出程序中完整的文件与目录信息(list)
-qc:列出程序包的所有配置文件(configure files),主要就是/etc下的配置文件
-qd:列出程序包的所有帮助文件(doc files)
-qR:列出程序包相依赖性的程序文件(Requires)
-q –scripts:列出程序包安装或者卸载进程指定的脚本
-q –provides:列出程序包自身能提供的功能
-qp[iflcdR….]:查询未安装的程序包
四、RPM验证与数字签名
rpm {-V|–verify} [select-option] [verify-option] PACKAGE_NAME
-V Package_Name:验证指定的程序包所包含的文件是否被改动过
-Va 不加任何参数:验证所有可能被改动的程序包
-Vp Package_File_Name:验证指定的程序包是否被改动过
-Vf file_Name:验证指定的文件是否被改动过
如果相应的程序或者文件发生改变,通过Verify验证后,会提示如下改变的参数:
S:size-文件大小
M:Mode-文件类型或者文件的属性
5:MD5-文件内容
D:Device的Major/Minor改变
L:Link路径改变
U:owner改变
G:group改变
T:modify Time改变
P:caPabilities功能改变
c:configure文件
d:document文件
l:license文件
r:read me文件
g:ghost文件,鬼文件,通常指该文件不被某个程序所包含,较少见的一种情况
数字签名:
GNU Privacy Guard(GPG)系统,使用不对称技术实现,RPM发布者拥有私钥,RPM使用者利用发布者提供的公钥来验证数字签名的有效性,并信任其发布的程序包;
数字签名验证步骤:
1、从正规途径获得发布者的公钥
途径:官网,授权镜像站点,DVD光盘等
2、导入(安装)公钥到本地主机操作系统
导入命令:rpm –import /PATH/……GPG-KEY…..(GPG-KEY关键字)
查询导入的公钥:rpm -qi | grep *pubkey*(pubkey关键字)
3、利用导入的公钥验证数字签名的有效性
4、通过数字签名验证,接受其发布的RPM程序包,执行后续的安装,升级等操作
五、RPM删除或者卸载
rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts] [–notriggers] [–test] PACKAGE_NAME …
RPM数据库重建:用户本地/var/lib/rpm下数据库的重建
rpm –rebuilddb
YUM前端程序管理工具
一、安装与升级操作
yum {install|update|upgrade}
-y:yes,安装时不需要交互式确认
–installroot=/path:指定程序包安装的路径,而非默认的程序路径
update (空):后面未指定任何程序包或者文件,则升级更新当前所有已安装的程序包
update PACKAGES_NAME:更新指定的程序包
upgrade 除了更新升级已安装的程序包之外,连陈旧的淘汰程序包也升级
二、查询操作
yum {list|info|search|provides|whatprovides}
list:显示已安装的程序包信息,类似rpm -qa
search:以某个程序包或者描述的关键字搜索程序包
info:显示指定程序包的详细信息,类似rpm -qi
provides:以文件为关键字搜索程序包,类似rpm -qf
三、删除卸载操作
yum remove PACKAGES_NAME
四、YUM仓库
yum工具使用仓库清单方式找到所需的程序包,对于YUM服务而言,清单主要是指repodata目录中的数据,对于客户端主机而言,安装,升级,卸载程序包以后,会在本地/var/cache/yum目录下保存记录本地的程序包清单;
此外,如果使用rpm方式安装,升级,卸载程序包,会在主机/var/lib/rpm目录下生成一个rpm的数据库,供rpm方式进行程序包的管理(查询,升级,卸载等操作);
创建YUM仓库步骤:
1、在yum程序配置文件目录下,增加或者新建.repo后缀的仓库名录(可以在系统原有的repo仓库中新增或者完全新建一个.repo后缀的仓库)
2、通过vim编辑仓库清单配置文件
3、清空主机原有仓库清单信息
4、重新生成最新的清单
通过上述步骤配置,后续就可以直接通过YUM方式进行程序包的安装,升级,查询,卸载操作了,通过YUM方式很好的解决了程序包相互依赖性的问题,对于不需要额外自定义配置参数的程序包生成并安装的使用者大大方便了RPM程序包的管理操作。
有时候,源仓库的可靠性对系统而言是非常重要的,一般我们都使用官方或者可信任的第三方所提供的仓库镜像点进行在线方式的YUM管理使用,但是针对临时性的第三方或者自定义的仓库资源,我们可以采用临时启用生效的模式进行操作,例如,上文中我通过临时挂载DVD光盘方式制定了一个repo程序包仓库资源,如果不希望其永久生效的话,可以采用如下方式进行操作:
1、首先挂载DVD设备
2、创建repo临时性的仓库资源配置文件
3、临时使用时通过yum命令选项启用
SRPM程序包如何使用
当我们从受信任的站点资源获得含有原始代码的SRPM程序包后,如何重新编译?
1、首先,通过受信任的站点资源下载src.rpm程序包
2、通过rpm -ivh xxxx.src.rpm解开程序包(并非实际意义上的安装),命令执行之后解开(安装)的路径默认是指向/root/rpmbuild
一般在此路径下会存在如下几个目录,分别代表不同的含义
SOURCES:主要存放原始码的tar包,补丁包patch,以及config配置文件等
SPECS:主要存放程序包的相应信息文件
BUILD:主要存放源代码编译过程中生成的文件
RPMS:主要存放编译完成以后生成的.rpm程序包
SRPMS:主要存放编译完成以后生成的.srpm程序包
3、SPECS下的.spec文件主要是该程序包的详细信息文件
[root@localhost rpmbuild]# cat ~/rpmbuild/SPECS/cloud-utils-growpart.spec
Name: cloud-utils-growpart
Version: 0.27
Release: 13%{?dist}
License: GPLv3
Group: System Environment/Base
Source0: https://launchpad.net/cloud-utils/trunk/%{version}/+download/cloud-utils-%{version}.tar.gz
URL: https://launchpad.net/cloud-utils
Source1: LICENSE
BuildArch: noarch
Summary: Script for growing a partition
Group: System Environment/Base
———上述说明此程序包的基本信息————–
Requires: gawk
Requires: util-linux
———此程序包的依赖性信息————
# gdisk is only required for resizing GPT partitions and depends on libicu
# (25MB). We don't make this a hard requirement to save some space in non-GPT
# systems.
#Requires: gdisk
# patches_base=0.27
Patch0001: 0001-suppress-partx-usage-error.patch
———-下面以%开始的分段落信息表示在编译过程中的处理脚本—————
%description
This package provides the growpart script for growing a partition. It is
primarily used in cloud images in conjunction with the dracut-modules-growroot
package to grow the root partition on first boot.
%prep
%setup -q -n cloud-utils-%{version}
%patch0001 -p1
%build
%install
cp %{SOURCE1} LICENSE
# Create the target directories
mkdir -p $RPM_BUILD_ROOT/%{_bindir}
mkdir -p $RPM_BUILD_ROOT/%{_mandir}/man1
# Install the growpart binary and man page
cp bin/growpart $RPM_BUILD_ROOT/%{_bindir}/
cp man/growpart.* $RPM_BUILD_ROOT/%{_mandir}/man1/
————该程序生成的文件—————
%files
%doc ChangeLog LICENSE
%{_bindir}/growpart
%doc %{_mandir}/man1/growpart.*
———–该程序的日志改变记录————
%changelog
* Tue Mar 18 2014 Lars Kellogg-Stedman <lars@redhat.com> – 0.27-13
– suppress partx usage error
* Tue Jan 14 2014 Lars Kellogg-Stedman <lars@redhat.com> – 0.27-11
– import into RHEL
[root@localhost rpmbuild]#
4、编译过程
命令 rpmrebuild [ba|bb] xxxx.spec
-ba:编译并同时生成rpm以及srpm程序包
-bb:编译并仅生成rpm程序包
原创文章,作者:N24_shishen,如若转载,请注明出处:http://www.178linux.com/61605