一、程序包管理器概念
rpm包的生成过程大体会经历几个步骤:源代码程序—>目标二进制格式(二进制文件、库文件、配置文件、帮助文件)—>组织成为一个或有限的几个“包“文件,管理工具提供的功能:安装、升级、卸载、查询、校验
不同Linux发行版本的程序包管理器
1)debain:dpt,dpkg,”.deb”
2)RHEL:redhat package manager,rpm,”.rpm”;
3)S.u.S.E:rpm,”.rpm”
4)Gentoo:ports
功能:将编译好的应用程序的各个组件文件打包成一个或者几个程序包文件,从而更加方便实现程序的安装、升级、卸载和查询等管理操作
1)程序包的组成清单(每个程序包都单独实现)
文件清单
安装或者卸载时运行的脚本
2)数据库(公共),描述了下面这些信息
程序包的名称和版本
依赖关系
功能说明
安装生成的各文件的文件路径以及校验码信息
/var/lib/rpm/
二、包命名规范
源码包:name-VERSION.tar.gz<br /> VERSION:major.minor.release<br /> rpm包命名格式:<br /> name-Version-release.arch.rpm<br /> VERSION:Major.minor.release<br /> relase.arch:rpm包的发行号<br /> release.os:3.el7.i386.rpm<br /> 3:第三次制作rpm包,el7:表示兼容redhat7<br />archetecture:i386,x64(amd64),ppc,noarch(可以适用全部平台)<br /> changelog:<br />主包和其他支包<br /> 主包:name-VERSION-release.arch.rpm<br /> 支包:name-function-VERSION-release.arch.rpm<br /> function:devel,utils(工具),libs,...<br /> <br />前端工具(YUM)<br />自动解决依赖关系<br /> yum:rhel系列系统上rpm包管理器的前端工具;<br /> apt-get(apt-cache):deb包管理器的前端工具<br /> zypper:suse的rpm管理器前端工具<br /> dnf:Fedora 22+系统上rpm包管理器的前端工具<br />
三、程序包获取途径
1、系统发行版的光盘或者官方文件服务器或镜像站点
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
2、项目的官方站点
如www.zabbix.com
3、第三方组织:
a)EPEL:
b)搜索引擎
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
4、自己动手做
四、CentOS系统上rpm包命令管理程序包
安装、升级、卸载、查询和校验、数据库维护<br /> rpm命令:rpm [OPTIONS] [PACKAGES_FILE]<br /> 安装:-i ,--install<br /> 升级:-U ,--update ,-F ,--freshen<br /> 卸载:-e,--erase<br /> 查询:-q,--query<br /> 校验:-V,--verify<br /> 数据库维护:--buliddb,--initdb
1、安装
rpm {-i|--install} [install-options] PACKAGES_FILE<br /> rpm -ivh PACKAGE_FILE ...<br /> GENRERAL OPTIONS:<br /> -v:verbose,详细信息<br /> -vv:g更详细的输出<br /> 安装选项:<br /> -h hash marks输出进度条,每个#表示2%的进度<br />--test 测试安装,不是真实的安装,检查并报告依赖关系,以及冲突消息<br /> --nodeps 忽略依赖关系,强制安装,不建议这样使用<br /> --replacepkgs 重新安装,比如在丢失配置文件时,我们可以这样操作<br />--nosignature 不做包签名检查,不检查来源的合法性<br /> --nodigest :不检查包完整性信息<br />列子:
[root@localhost ~]# rpm -ivh zsh-5.0.2-33.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:zsh-5.0.2-33.el7 ################################# [100%]
--test
[root@localhost ~]# rpm -ivh --test zsh-5.0.2-33.el7.x86_64.rpm
Preparing... ################################# [100%]
--nodeps
[root@localhost ~]# rpm -ivh --nodeps zsh-5.0.2-33.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:zsh-5.0.2-33.el7 ################################# [100%]
--replacepkgs
[root@localhost ~]# rpm -ivh --replacepkgs zsh-5.0.2-33.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:zsh-5.0.2-33.el7 ################################# [100%]
--nosignature
[root@localhost ~]# rpm -ivh --nosignature zsh-5.0.2-33.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:zsh-5.0.2-33.el7 ################################# [100%]
--nodigest
[root@localhost ~]# rpm -ivh --nodigest zsh-5.0.2-33.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:zsh-5.0.2-33.el7 ################################# [100%]
注意:rpm可以自带脚本
四类:—noscripts
preinstall:安装过程开始之前运行的脚本,%pre,—nopre
postinstall:安装完成之后运行的脚本,%post —nopost
preuninstall:卸载过程真正开始执行之前运行的脚本,%preun —nopreun
postuninstall:卸载过程完成之后运行的脚本,%postun —noposun
2、升级
rpm {-U|—upgrade} [upgrade-options] PACKAGES_FILE
rpm {-F|—freshen} [upgrade-options] PACKAGES_FILE
-U 升级或安装
-F 升级
rpm -Uvh PACKAGES_FILE
rpm -Fvh PACKAGES_FILE
—oldpackage:降级安装
—force:强制升级
注意:1、不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核
2、如果某个程序包的配置文件安装后曾被需改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有的版本的配置文件,而是把新版本配置文件重命名(FILENAME.rpmnew)后提供
[root@localhost ~]# rpm -Uvh zsh-5.0.2-33.el7.x86_64.rpm
Preparing... ################################# [100%]
package zsh-5.0.2-33.el7.x86_64 is already installed
--force
[root@localhost zsh]# rpm -Fvh --force zsh-5.0.2-34.el7_7.2.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:zsh-5.0.2-34.el7_7.2 ################################# [ 50%]
Cleaning up / removing...
2:zsh-5.0.2-33.el7 ################################# [100%]
--oldpackages
[root@localhost ~]# rpm -Uvh --oldpackage zsh-5.0.2-33.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:zsh-5.0.2-33.el7 ################################# [ 50%]
Cleaning up / removing...
2:zsh-5.0.2-34.el7_7.2 ################################# [100%]
3、删除
rpm {-e|—erase} [—allmatches][—noscripts[—test] PACKAGES_NAME …
—allmatches:卸载所有匹配指定名称的程序包的各种版本
—nodeps:忽略依赖关系
—test:测试卸载,dry run模式
[root@localhost ~]# rpm -e zsh
4、查询
rpm {-q|—query} [select-options][query-options] PACKAGES_NAME …
[select-options]
PACKAGE_NAME:查询指定的程序包是否已经安装,以及安装
-a —all查询所有安装的包
-f —file FILE:查询指定的文件由哪个程序包安装生成
-p,—package PACKAGE_FILE:对于未安装的程序包执行查询操作
—whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供
—whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包依赖
[query-options]
—changelog:查询rpm包的changelog
-l —list:查询程序包生成的所有文件
-i —info:显示程序包的详细信息,版本号、大小、所属的包组等
-c —configfiles:查询指定程序的配置文件
-d —docfiles:查询指定的程序包提供的文件
—provides:列出指定的程序包提供的所有的CAPABILITY
-R,—requires;查询执行的程序包的依赖关系
—scripts;查询程序包自带的脚本片段
用法:
-qi PACKAGE_NAME
-qf PACKAGE_FILE
-qc PACKAGE_NAME
-ql PACKAGE_NAME
-qd PACKAGE_NAME
-qpi PACKAGE_FILE
-qpf PACKAGE_FILE
-qpc PACKAGE_FILE
-qpl PACKAGE_FILE
-qpd PACKAGE_FILE
-ql 列出rpm生成的所有文件
[root@localhost ~]# rpm -ql zsh
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
/usr/lib64/zsh
.....
-qf 查看指定文件由哪个rpm包提供
[root@localhost ~]# rpm -qf /etc/zshrc
zsh-5.0.2-33.el7.x86_64
-qc 查看配置文件
[root@localhost ~]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
-qd 查询指定的程序包提供的文件
[root@localhost ~]# rpm -qd zsh
/usr/share/doc/zsh-5.0.2/BUGS
/usr/share/doc/zsh-5.0.2/CONTRIBUTORS
/usr/share/doc/zsh-5.0.2/FAQ
/usr/share/doc/zsh-5.0.2/FEATURES
/usr/share/doc/zsh-5.0.2/LICENCE
/usr/share/doc/zsh-5.0.2/MACHINES
/usr/share/doc/zsh-5.0.2/NEWS
/usr/share/doc/zsh-5.0.2/README
/usr/share/doc/zsh-5.0.2/completion-style-guide
/usr/share/doc/zsh-5.0.2/zsh-development-guide
/usr/share/doc/zsh-5.0.2/zshprompt.pl
....
-qi 查看程序的包详细信息
[root@localhost ~]# rpm -qi zsh
Name : zsh
Version : 5.0.2
Release : 33.el7
Architecture: x86_64
Install Date: Fri 03 Apr 2020 09:35:11 AM CST
Group : System Environment/Shells
Size : 5856382
License : MIT
Signature : RSA/SHA256, Fri 23 Aug 2019 05:45:54 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : zsh-5.0.2-33.el7.src.rpm
Build Date : Fri 23 Aug 2019 01:13:36 AM CST
Build Host : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://zsh.sourceforge.net/
Summary : Powerful interactive shell
-qa 查询所有程序包
[root@localhost ~]# rpm -qa | more
dmraid-1.0.0.rc16-28.el7.x86_64
libcollection-0.7.0-32.el7.x86_64
system-config-printer-libs-1.4.1-21.el7.noarch
libXft-2.3.2-2.el7.x86_64
lohit-gujarati-fonts-2.5.3-2.el7.noarch
telepathy-filesystem-0.0.2-6.el7.noarch
-q --whatprovides
[root@localhost ~]# rpm -q --whatprovides zsh
zsh-5.0.2-33.el7.x86_64
--provides
[root@localhost ~]# rpm -q --provides zsh
config(zsh) = 5.0.2-33.el7
zsh = 5.0.2-33.el7
zsh(x86-64) = 5.0.2-33.el7
--whatrequires 查看bash被那些包依赖
[root@localhost ~]# rpm -q --whatrequires bash
bash-completion-2.1-6.el7.noarch
dracut-033-564.el7.x86_64
initscripts-9.49.47-1.el7.x86_64
lvm2-2.02.185-2.el7.x86_64
jline-1.0-8.el7.noarch
rsyslog-8.24.0-38.el7.x86_64
PackageKit-command-not-found-1.1.10-1.el7.centos.x86_64
kpatch-0.6.1-4.el7.noarch
-R 查询bash依赖的包
[root@localhost ~]# rpm -qR bash
/bin/sh
config(bash) = 4.2.46-33.el7
libc.so.6()(64bit)
libc.so.6(GLIBC_2.11)(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.15)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
--scripts bash自带的脚本片段
[root@localhost ~]# rpm -q --scripts bash
postinstall scriptlet (using <lua>):
nl = '\n'
sh = '/bin/sh'..nl
bash = '/bin/bash'..nl
f = io.open('/etc/shells', 'a+')
if f then
local shells = nl..f:read('*all')..nl
if not shells:find(nl..sh) then f:write(sh) end
if not shells:find(nl..bash) then f:write(bash) end
f:close()
end
postuninstall scriptlet (using <lua>):
-- Run it only if we are uninstalling
if arg[2] == "0"
then
t={}
for line in io.lines("/etc/shells")
do
if line ~= "/bin/bash" and line ~= "/bin/sh"
then
table.insert(t,line)
end
end
f = io.open("/etc/shells", "w+")
for n,line in pairs(t)
do
f:write(line.."\n")
end
f:close()
end
5、校验
rpm {-V|—verify} [select-options][verify-options]
当我们对zsh相关文件做了修改之后,在做校验时,就会提示相应的修改
S file Size differs
M Mode differs (Includes permisslons and file type)
5 dlgest (formerly MD5 sum) dlffers
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
来源合法性验证和完整性验证:
来源合法性验证:
数字签名:
完整性验证
获取并导入信任的包制作作者的密钥
对于CentOS发行版本来说:rpm —import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
验证:
1)安装此组织签名的程序时,会自动执行验证
2)手动验证:rpm -K PACKAGES_FILE
6、数据库重建
rpm管理数据库路径:/var/lib/rpm/<br />查询操作:通过此处的数据库进行<br /> 获取帮助:<br /> CentOS7:man rpmdb<br /> rpm {--initdb|--rebulidb} [--dppath DIRECTORY] [--root DIRECTORY]<br /> --initdb:初始化数据库,当前无任何数据库时,初始化创建一个新的,当前有时不执行任何操作<br /> --rebuliddb:重新构建,通过读取当前系统上的所有已经安装过的程序包进行重新构建<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/913070/1585893700966-320c2115-7f11-4fa9-89ac-9a5b09a1423c.png#align=left&display=inline&height=90&name=image.png&originHeight=90&originWidth=559&size=9066&status=done&style=none&width=559)