Linux系统程序包管理之rpm

==============================================================================

概述:

  本章内容:软件的运行环境,软件包基础,rpm包管理,yum管理,定制yum仓库,编译安装

==============================================================================

软件运行环境

API:Application Programming Interface (应用程序开发接口)

POSIX:Portable OS(国际标准)

  • 程序源代码--> 预处理--> 编译--> 汇编--> 链接

ABI:Application Binary Interface(应用二进制程序接口)

Windows与Linux不兼容

  • linux:文件格式:ELF(Executable and Linkable Format)

  • win:文件格式:exe,msl PE(Portable Executable)

库级别虚拟化

  • Linux:WINE(提供模拟windows的库,运行win环境)

  • Windows:Cywin(提供linux的运行环境)

开发语言:

系统级开发:

  • C/C++(依赖于c库);

  • httpd,nginx,vsftpd,go

应用级开发:

  • java(依赖于jvm虚拟机)

  • Python(openstack云站),php,perl(依赖于per解释器),ruby

程序格式

c/c++

  • 源代码:文本格式的程序代码;

  • 编译开发环境:编译器,头文件,开发库

  • 二进制格式:文本格式的程序代码-->编译器-->二进制格式(二进制程序、库文件、配置文件、帮助文件)、

java/Python

  • 源代码:编译能够在其虚拟机(jvm/pvm)运行的格式;

  • 开发环境:编译器、开发库;

  • 二进制

项目构建工具

  • c/c++:make

  • jave:maven

包管理

 1.概述:

二进制应用程序的组成部分:

  • 二进制文件、库文件、配置文件、帮助文件

程序包管理:

  • 源代码-->目标二进制格式(二进制程序、库文件、配置文件、帮助文件)-->组织成为一个或有限几个“包文件”(安装,升级,卸载,查询,校验)

程序包管理器:

  • deblan:dpt,dpkg  以".deb"后缀;

  • redhat:rpm (redhat package manager) 以 ".rpm"后缀 ;

  • S.u.S.E:rpm, ".rpm"命令

包命名格式

源代码name-VERSION.tar.gz|bz2|xz

  • ERSION: major(主版本号).minor(次版本号).release(发行号)

rpm包命名格式:name-VERSION-release.arch.rpm

  • VERSION:major.minor.release.arc

  • release:rpm包发行号

  • changelog文档(内容修复改进的相关文档)

  • 常见的arch:

      x86: i386, i486, i586, i686

      x86_64: x64, x86_64, amd64powerpc: ppc

      跟平台无关:noarch (适用于所有平台)

包.png


示例:

bash-4.2.46-19.el7.x86_64.rpm

release:release.OS

包:分类和拆包

  • Application-VERSION-ARCH.rpm:主包

  • Application-devel-VERSION-ARCH.rpm:开发子包

  • Application-utils-VERSION-ARHC.rpm:其它子包

  • Application-libs-VERSION-ARHC.rpm:其它子包

主支包.png

包之间:可能存在依赖关系,甚至循环依赖

     自动解决依赖包管理前端工具

  • yum:rpm包管理器的前端工具;

  • apt-get:deb包管理器前端工具;

  • zypper:suse上的rpm前端管理工具;

  • dnf:Fedora 18+ rpm包管理器前端管理工具

 2.库文件:

查看二进制程序所依赖的库文件

  • ldd /PATH/TO/BINARY_FILE

管理及查看本机装载的库文件:

  • ldconfig;

  • /sbin/ldconfig-p: 显示本机已经缓存的所有可用库文件名及文件路径映射关系

  • 配置文件/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf

  • 缓存文件:/etc/ld.so.cache

 3.包管理器:

程序包管理器:

功能:

  • 将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作

程序包的组成清单:(每个程序包单独实现)

  • RPM包内的文件清单

  • RPM的元数据,如名称,版本,依赖性,描述等

  • 安装或卸载时运行的脚本

数据库(公共)

    路径:/var/lib/rpm

  • 程序包名称及版本;

  • 依赖关系;

  • 功能说明;

  • 包安装后生成的各文件路径及校验码信息

 3.程序包的来源:

管理程序包的方式:

  • 使用包管理器:rpm

  • 使用前端工具:yum, dnf

获取程序包的途径

系统开发版的光盘或官方的服务器(或CentOS镜像站点)

项目官方站点

第三方组织

Fedora-EPEL:Extra Packages for Enterprise Linux

  • Rpmforge:RHEL推荐,包很全

搜索引擎:

自己制作

  • 注意:检查其合法性:来源合法性,程序包的完整性

rpm 命令管理程序包详解

 1.rpm语法及选项概述:

rpm:

  • 安装、升级、卸载、查询和校验、数据库维护(都是通过rpm命令来实现的)

语法:

  • rpm [OPTIONS] [PACKAGE_FILE]

选项:

  • -i,--install:安装

  • -U,--update,-F,--freshen:升级

  • -e,--erase:卸载

  • -q,--query:查询

  • -V,--verify:校验

  • --builddb,--initdb:数据库维护

 2.安装及子选项:

语法:

  • rpm {-i|--install} [install-options] PACKAGE_FILE…

选项:

  • -v:verbose 显示详细信息;

  • -vv:更详细的输出;

  • -h: hash marks 输出进度条;每个#号表示2%的进度

  • --test:测试安装,检查并报告依赖关系及冲突关系,但不真正执行安装;称为dry run(干跑)模式;

  • --nodeps:忽略依赖关系,不建议;

  • --replacepkgs:替代原来的包,重新安装(先把由原来的配置文件删除再重装)

  • --nosignature:不检查包签名信息,不检查来源合法性

  • --nodigest:不检查包完整性

     注意:rpm自带四类脚本(--noscripts)

       %pre:安装前脚本;   --nopre

       %post:安装后脚本;  --nopost

       %preun:卸载前脚本; --nopreun

       %postun:卸载后脚本;--nopostun

真正安装执行操作使用的命令

  • rpm -ivh PACKAGE_FILE

 3.升级及子选项:

语法:

  • rpm {-U|--upgrade} [install-options] PACKAGE_FILE...

  • rpm {-F|--freshen} [install-options] PACKAGE_FILE...

注意:

  • -U(upgrade):安装有旧版程序包,则“升级”如果不存在旧版程序包,则“安装”

  • -F(freshen):安装有

  • 旧版程序包,则“升级”如果不存在旧版程序包,则不执行升级操作

升级命令:

  • rpm -Uvh PACKAGE_FILE ...

  • rpm -Fvh PACKAGE_FILE ...

  • --oldpackage:降级(回滚操作)

  • --force: 强行升级

注意:

  • 不要对内核做升级操作;Linux支持多内核版本并存,因此,可以直接安装新版本内核;

  • 如果源程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留。

 4.卸载及子选项:

作用:

  • 移除已安装的程序包

语法:

  • rmp {-e|--erase}[--allmatches][--nodeps][--test] PACKAGE_NAME

注意:

  • 卸载和查询是包的名,因为包已经存在了;而安装和升级,包是不存在的,所以是包的文件路径

简单用法

  • rpm -e PACKAGE_NAME...

选项:

  • --allmatches:卸载所有匹配名称的程序包各版本

  • --nodeps:忽略依赖关系

  • --test:测试卸载,dry run 模式

 5.查询:

语法:

  • rpm {-q|--query} [select-options] [query-options]

[select-options] 挑选选项

  • -q PACKAGE_NAME:查询某包或某些包是否安装

  • -qa:查询已安装的所有包

  • -qf FILE:查看指定的文件由哪个程序包安装生成

  • -p PACKAGE_FILE:针对尚未安装的程序包文件做查询操作

  • --whatprovides CAPABILITY(能力):查询指定的CAPABILITY由哪个包所提供

  • --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖

  • rpm2cpio 包文件|cpio–itv预览包内文件

  • rpm2cpio 包文件|cpio–id “*.conf”释放包内文件

[query-options] 查询选项

  • --changelog:查询rpm包的changelog(变更记录)

  • -c:查询指定的程序包的配置文件

  • -d:查询程序包安装完成后所生成的帮助文档

  • -qi,-info:程序包相关的信息,版本号,大小,所属的包组等

  • -l,--list:查看指定的程序包安装后生成的所有文件列表;

  • --scripts:查看程序包自带的脚本片断

  • -R,--requires:查询指定的程序包所依赖的CAPABILITY;

  • --provides:列出指定程序包所提供的CAPABILITY

常用组合用法:

  • -qi PACKAGE-qf FILE;-qc PACJAGE;-ql PACKAGE;-qd PACKAGE ;-qpi PACKAGE_FILE;-qpl PACKAGE_FILE;-qpc PACKAGE_FILE,.. 

演示:

[root@centos7 ~]# rpm -q tree
tree-1.6.0-10.el7.x86_64

[root@centos7 ~]# rpm -ql tree
/usr/bin/tree
/usr/share/doc/tree-1.6.0
/usr/share/doc/tree-1.6.0/LICENSE
/usr/share/doc/tree-1.6.0/README
/usr/share/man/man1/tree.1.gz

[root@centos7 ~]# rpm -qf /etc/fstab 
setup-2.8.71-6.el7.noarch

[root@centos7 ~]# rpm -qc bash
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc

[root@centos7 ~]# rpm -qi bash
Name        : bash
Version     : 4.2.46
Release     : 19.el7
Architecture: x86_64
Install Date: 2016年11月06日 星期日 18时31分30秒
Group       : System Environment/Shells
Size        : 3663618
License     : GPLv3+
Signature   : RSA/SHA256, 2015年11月25日 星期三 22时14分53秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : bash-4.2.46-19.el7.src.rpm
Build Date  : 2015年11月20日 星期五 13时04分53秒
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.gnu.org/software/bash
Summary     : The GNU Bourne Again shell
Description :
The GNU Bourne Again shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C shell
(csh). Most sh scripts can be run by bash without modification.

[root@centos7 ~]# rpm -qc httpd
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d/00-base.conf
/etc/httpd/conf.modules.d/00-dav.conf
/etc/httpd/conf.modules.d/00-lua.conf
/etc/httpd/conf.modules.d/00-mpm.conf
/etc/httpd/conf.modules.d/00-proxy.conf
/etc/httpd/conf.modules.d/00-systemd.conf
/etc/httpd/conf.modules.d/01-cgi.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd

[root@centos7 ~]# rpm -qd httpd
/usr/share/doc/httpd-2.4.6/ABOUT_APACHE
/usr/share/doc/httpd-2.4.6/CHANGES
/usr/share/doc/httpd-2.4.6/LICENSE
/usr/share/doc/httpd-2.4.6/NOTICE
/usr/share/doc/httpd-2.4.6/README
/usr/share/doc/httpd-2.4.6/VERSIONING
/usr/share/doc/httpd-2.4.6/httpd-dav.conf
/usr/share/doc/httpd-2.4.6/httpd-default.conf
/usr/share/doc/httpd-2.4.6/httpd-info.conf
/usr/share/doc/httpd-2.4.6/httpd-languages.conf
/usr/share/doc/httpd-2.4.6/httpd-manual.conf
/usr/share/doc/httpd-2.4.6/httpd-mpm.conf
/usr/share/doc/httpd-2.4.6/httpd-multilang-errordoc.conf
/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf
/usr/share/doc/httpd-2.4.6/proxy-html.conf
/usr/share/man/man8/apachectl.8.gz
/usr/share/man/man8/fcgistarter.8.gz
/usr/share/man/man8/htcacheclean.8.gz
/usr/share/man/man8/httpd.8.gz
/usr/share/man/man8/rotatelogs.8.gz
/usr/share/man/man8/suexec.8.gz

 6.校验:

语法:

  • rpm {-V|--verify} [select-options] [verify-options]

常见用法:

  • rpm -V PACHAGE_NAME

当没有输出结果时表示软件包完整ok,当有相应的结果输出表明对应的内容有修改,及具体如下:

  • 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:mTimediffers 文件的创建时间已被改变;

  • P:capabilities differ 

包来源合法性验正及完整性验正

  • 完整性验正:SHA256

  • 来源合法性验正:RSA

获取并导入信任的包制作者的秘钥

  • 对于CentOS发行版来说:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 

验证:

  • 安装此组织签名的程序时,会自动执行验证;

  • 手动验证:rpm -K PACKAGE_FILE

加密方法:  

  • 公钥加密:

  • 对称加密:加密、解密使用同一密钥;

  • 非对称加密:密钥是成对儿的

      public key:公钥,公开所有人

      secret key:私钥, 不能公开

导入所需要的公钥:  

  • rpm -K |checksigrpmfile:检查包的完整性和签名

  • rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

  • CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7

  • rpm -qagpg-pubkey*

演示:

[root@centos7 ~]# rpm -V httpd
遗漏   c /etc/httpd/conf.d/welcome.conf
S.5....T.  c /etc/httpd/conf/httpd.conf

      

 7.数据库重建:

rpm数据库路经:

  • /var/lib/rpm

  • 查询操作:通过此处得到数据库进行

用法:

  • rpm {--initdb|--rebuilddb}

选项:

  • --initdb: 初始化数据库。当前无任何数据库,则新建之;当前有时不执行任何操作。

  • --rebuilddb:重新构建。无论当前存在与否,都会直接重新创建数据库。

获取帮助

  • CentOS6 man rpm

  • CentOS7 man rpmdb